changeset 6:161239cbd12b

add iteration, automatic session updating and some tests
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Sat, 14 May 2011 00:02:10 +0200
parents 0be8ec7b9717
children d041efb32a6c
files hgstorage.py test_repo.py
diffstat 2 files changed, 50 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/hgstorage.py	Fri May 13 23:28:54 2011 +0200
+++ b/hgstorage.py	Sat May 14 00:02:10 2011 +0200
@@ -5,6 +5,7 @@
 import thread
 import urllib
 import datetime
+import weakref
 
 os.environ['HGENCODING'] = 'utf8'
 os.environ['HGMERGE'] = "internal:merge"
@@ -23,6 +24,7 @@
         self.prefix = prefix or ''
         self.ui = self.ui()
         self._repos = {}
+        self.sessions = weakref.WeakKeyDictionary()
 
     def create(self):
         repo = mercurial.hg.repository(self.ui, self.path, create=True)
@@ -68,7 +70,13 @@
         return key
 
     def session(self):
-        return Session(self)
+        session = Session(self)
+        self.sessions[session] = None
+        return session
+
+    def update_sessions(self):
+        for session in self.sessions:
+            session._update()
 
 
 class Session(object):
@@ -81,7 +89,11 @@
         return filename in self.tip
 
     def __getitem__(self, key):
-        return Item(self, key)
+        return self.meta(key)
+
+    def __iter__(self):
+        for filename in self.tip:
+            yield self.storage._file_to_key(filename)
 
     def _update(self):
         """Reset the tip of the repository."""
@@ -124,6 +136,19 @@
                                       end_marker='>>>>>>>',
                                       base_marker='|||||||'))
 
+    def _filectx(self, key, rev=None):
+        filename = self.storage._key_to_file(key)
+        try:
+            filetip = self.tip[filename]
+        except mercurial.revlog.LookupError:
+            raise KeyError("item %r doesn't exist" % key )
+        if rev is None:
+            return filetip
+        try:
+            return filetip.filectx(rev)
+        except mercurial.revlog.LookupError:
+            raise KeyError()
+
     def save(self, key, data, user=None, message=None, parent_rev=None,
              encoding=None, force=False):
         """Save a new revision of the item."""
@@ -145,32 +170,21 @@
             text=message or "saved", files=[filename],
             filectxfn=filectxfn, user=user or "user")
         self.storage.repo.commitctx(ctx)
-        self._update()
-
-    def filectx(self, key, rev=None):
-        filename = self.storage._key_to_file(key)
-        try:
-            filetip = self.tip[filename]
-        except mercurial.revlog.LookupError:
-            raise KeyError("item %r doesn't exist" % key )
-        if rev is None:
-            filectx = filetip
-        else:
-            try:
-                filectx = filetip.filectx(rev)
-            except mercurial.revlog.LookupError:
-                raise KeyError()
-        return filectx
+        self.storage.update_sessions()
 
     def load(self, key, rev=None, encoding=None):
-        filectx = self.filectx(key, rev)
+        """Load the content of an item."""
+
+        filectx = self._filectx(key, rev)
         data = filectx.data()
         if encoding:
             data = unicode(data, encoding)
         return data
 
     def meta(self, key, rev=None):
-        filectx = self.filectx(key, rev)
+        """Provide meta information about an item."""
+
+        filectx = self._filectx(key, rev)
         if rev is None:
             rev = filectx.filerev()
         date = datetime.datetime.fromtimestamp(filectx.date()[0])
--- a/test_repo.py	Fri May 13 23:28:54 2011 +0200
+++ b/test_repo.py	Sat May 14 00:02:10 2011 +0200
@@ -96,3 +96,19 @@
         data = s.load('title')
         assert 'a\ntext\n<<<<<<<\nbb|||||||\nb=======\na>>>>>>>\n' == data
 
+    def test_silly_parents(self, storage):
+        s = storage.session()
+        with py.test.raises(IndexError):
+            s.save('title', 'text', 'user', 'message', 0)
+        s.save('title', 'text', 'user', 'message', -1)
+        with py.test.raises(IndexError):
+            s.save('title', 'text', 'user', 'message', 1)
+
+    def test_iteration(self, storage):
+        s = storage.session()
+        s.save('title', 'text', 'user', 'message', -1)
+        s.save('title1', 'text', 'user', 'message', -1)
+        s.save('title2', 'text', 'user', 'message', -1)
+        items = sorted(s)
+        assert ['title', 'title1', 'title2'] == items
+