[Checkins] SVN: z3c.vcsync/trunk/src/z3c/vcsync/ Move some things into tests so we can import them. Use imports instead of

Martijn Faassen faassen at infrae.com
Mon Apr 28 13:26:07 EDT 2008


Log message for revision 85825:
  Move some things into tests so we can import them. Use imports instead of
  globs where we can.
  

Changed:
  U   z3c.vcsync/trunk/src/z3c/vcsync/README.txt
  U   z3c.vcsync/trunk/src/z3c/vcsync/importexport.txt
  U   z3c.vcsync/trunk/src/z3c/vcsync/internal.txt
  U   z3c.vcsync/trunk/src/z3c/vcsync/tests.py

-=-
Modified: z3c.vcsync/trunk/src/z3c/vcsync/README.txt
===================================================================
--- z3c.vcsync/trunk/src/z3c/vcsync/README.txt	2008-04-28 15:58:51 UTC (rev 85824)
+++ z3c.vcsync/trunk/src/z3c/vcsync/README.txt	2008-04-28 17:26:06 UTC (rev 85825)
@@ -83,40 +83,8 @@
 that goes through a content to find changes. It tracks the
 revision number as a special attribute of the root object::
 
-  >>> from zope.interface import implements
-  >>> from z3c.vcsync.interfaces import IState
-  >>> class TestState(object):
-  ...     implements(IState)
-  ...     def __init__(self, root):
-  ...         self.root = root
-  ...         self._removed = []
-  ...     def set_revision_nr(self, nr):
-  ...         self.root.nr = nr
-  ...     def get_revision_nr(self):
-  ...         try:
-  ...             return self.root.nr
-  ...         except AttributeError:
-  ...             return 0
-  ...     def removed(self, revision_nr):
-  ...         return self._removed
-  ...     def objects(self, revision_nr):
-  ...         for container in self._containers(revision_nr):
-  ...             for value in container.values():
-  ...                 if isinstance(value, Container):
-  ...                     continue
-  ...                 if value.revision_nr >= revision_nr:
-  ...                     yield value
-  ...     def _containers(self, revision_nr):
-  ...         return self._containers_helper(self.root)
-  ...     def _containers_helper(self, container):
-  ...         yield container
-  ...         for obj in container.values():
-  ...             if not isinstance(obj, Container):
-  ...                 continue
-  ...             for sub_container in self._containers_helper(obj):
-  ...                 yield sub_container
+  >>> from z3c.vcsync.tests import TestState
 
-
 The content
 -----------
 
@@ -129,29 +97,24 @@
 listening to ``IObjectModifiedEvent``, but we will use a property
 here::
 
-  >>> class Item(object):
-  ...   def __init__(self, payload):
-  ...     self.payload = payload
-  ...   def _get_payload(self):
-  ...     return self._payload
-  ...   def _set_payload(self, value):
-  ...     self._payload = value
-  ...     self.revision_nr = get_revision_nr()
-  ...   payload = property(_get_payload, _set_payload)
+  >>> from z3c.vcsync.tests import Item
 
-This code needs a global ``get_revision_nr`` function available to get access
+This code needs a ``get_revision_nr`` method available to get access
 to the revision number of last synchronization. For now we'll just define
 this to return 0, but we will change this later::
 
-  >>> def get_revision_nr():
+  >>> def get_revision_nr(self):
   ...    return 0
+  >>> Item.get_revision_nr = get_revision_nr
 
-Besides the ``Item`` class, we also have a ``Container`` class, set up
-before this test started. It is a class that implements enough of the
-dictionary API and implements the ``IContainer`` interface. A normal
-Zope 3 folder or Grok container will also work. Let's now set up the
-tree::
+Besides the ``Item`` class, we also have a ``Container`` class::
 
+  >>> from z3c.vcsync.tests import Container
+
+It is a class that implements enough of the dictionary API and
+implements the ``IContainer`` interface. A normal Zope 3 folder or
+Grok container will also work. Let's now set up the tree::
+
   >>> data = Container()
   >>> data.__name__ = 'root'
   >>> data['foo'] = Item(payload=1)
@@ -185,45 +148,22 @@
 and writes it to the filesystem to a file with a particular extension
 (``.test``)::
 
-  >>> import grok
-  >>> from z3c.vcsync.interfaces import ISerializer
-  >>> class ItemSerializer(grok.Adapter):
-  ...     grok.provides(ISerializer)
-  ...     grok.context(Item)
-  ...     def serialize(self, f):
-  ...         f.write(str(self.context.payload))
-  ...         f.write('\n')
-  ...     def name(self):
-  ...         return self.context.__name__ + '.test'
+  >>> from z3c.vcsync.tests import ItemSerializer
 
 We also need to provide a parser to load an object from the filesystem
 back into Python, overwriting the previously existing object::
 
-  >>> from z3c.vcsync.interfaces import IParser
-  >>> class ItemParser(grok.GlobalUtility):
-  ...   grok.provides(IParser)
-  ...   grok.name('.test')
-  ...   def __call__(self, object, path):
-  ...      object.payload = int(path.read())
+  >>> from z3c.vcsync.tests import ItemParser
 
 Sometimes there is no previously existing object in the Python tree,
 and we need to add it. To do this we implement a factory (where we use
 the parser for the real work)::
 
-  >>> from z3c.vcsync.interfaces import IFactory
-  >>> from zope import component
-  >>> class ItemFactory(grok.GlobalUtility):
-  ...   grok.provides(IFactory)
-  ...   grok.name('.test')
-  ...   def __call__(self, path):
-  ...       parser = component.getUtility(IParser, '.test')
-  ...       item = Item(None) # dummy payload
-  ...       parser(item, path)
-  ...       return item
-
 Both parser and factory are registered per extension, in this case
 ``.test``. This is the name of the utility.
 
+  >>> from z3c.vcsync.tests import ItemFactory
+
 We register these components::
 
   >>> grok.testing.grok_component('ItemSerializer', ItemSerializer)
@@ -237,16 +177,7 @@
 empty extension (thus no special utility name). These can be very
 simple::
 
-  >>> class ContainerParser(grok.GlobalUtility):
-  ...     grok.provides(IParser)
-  ...     def __call__(self, object, path):
-  ...         pass
-
-  >>> class ContainerFactory(grok.GlobalUtility):
-  ...     grok.provides(IFactory)
-  ...     def __call__(self, path):
-  ...         return Container()
-
+  >>> from z3c.vcsync.tests import ContainerParser, ContainerFactory
   >>> grok.testing.grok_component('ContainerParser', ContainerParser)
   True
   >>> grok.testing.grok_component('ContainerFactory', ContainerFactory)
@@ -258,6 +189,7 @@
 Now we need an SVN repository to synchronize with. We create a test
 SVN repository now and create a svn path to a checkout::
 
+  >>> from z3c.vcsync.tests import svn_repo_wc
   >>> repo, wc = svn_repo_wc()
 
 We can now initialize the ``SvnCheckout`` object with the SVN path to
@@ -279,14 +211,15 @@
 
   >>> current_synchronizer = s
 
-It's now time to set up our ``get_revision_nr`` function a bit better,
+It's now time to set up our ``get_revision_nr`` method a bit better,
 making use of the information in the current synchronizer. In actual
 applications we'd probably get the revision number directly from the
 content, and there would be no need to get back to the synchronizer
 (it doesn't need to be persistent but can be constructed on demand)::
 
-  >>> def get_revision_nr():
+  >>> def get_revision_nr(self):
   ...    return current_synchronizer.state.get_revision_nr()
+  >>> Item.get_revision_nr = get_revision_nr
 
 Synchronization
 ---------------
@@ -459,6 +392,8 @@
   >>> found_data['root']['sub']['qux'].payload
   36
 
+Let's recreate this conflict again.
+
 Folder conflicts
 ----------------
 

Modified: z3c.vcsync/trunk/src/z3c/vcsync/importexport.txt
===================================================================
--- z3c.vcsync/trunk/src/z3c/vcsync/importexport.txt	2008-04-28 15:58:51 UTC (rev 85824)
+++ z3c.vcsync/trunk/src/z3c/vcsync/importexport.txt	2008-04-28 17:26:06 UTC (rev 85825)
@@ -16,8 +16,10 @@
   ...   def __repr__(self):
   ...     return "<Item %s with payload %s>" % (self.__name__, self.payload)
 
-We have already defined a ``Container`` object before.
+We have already defined a ``Container`` object before::
 
+  >>> from z3c.vcsync.tests import Container
+
 Let's set up some objects to export::
 
   >>> data = Container()
@@ -61,6 +63,7 @@
 object to the ``export`` function:
 
   >>> from z3c.vcsync import export
+  >>> from z3c.vcsync.tests import create_test_dir
   >>> target = create_test_dir()
   >>> export(data, target)
 

Modified: z3c.vcsync/trunk/src/z3c/vcsync/internal.txt
===================================================================
--- z3c.vcsync/trunk/src/z3c/vcsync/internal.txt	2008-04-28 15:58:51 UTC (rev 85824)
+++ z3c.vcsync/trunk/src/z3c/vcsync/internal.txt	2008-04-28 17:26:06 UTC (rev 85825)
@@ -64,9 +64,10 @@
 Export persistent state to version control system checkout
 ----------------------------------------------------------
 
-Let's imagine we have this object structure consisting of a container
-with some items and sub-containers in it::
+We have a object structure consisting of a container with some
+items and sub-containers in it::
 
+  >>> from z3c.vcsync.tests import Container
   >>> data = Container()
   >>> data.__name__ = 'root'
   >>> data['foo'] = Item(payload=1)
@@ -83,15 +84,17 @@
 
 We have a checkout in testpath on the filesystem::
 
+  >>> from z3c.vcsync.tests import create_test_dir, TestCheckout
   >>> testpath = create_test_dir()
   >>> checkout = TestCheckout(testpath)
 
 We also have a test state representing the object data::
 
-  >>> state = TestState(data)
+  >>> from z3c.vcsync.tests import TestAllState
+  >>> state = TestAllState(data)
 
 The test state will always return a list of all objects. We pass in
-``None`` for the revision_nr here, as the TestState ignores this
+``None`` for the revision_nr here, as the ``TestAllState`` ignores this
 information anyway::
 
   >>> sorted([obj.__name__ for obj in state.objects(None)])
@@ -378,7 +381,7 @@
 In order to load into a different container, we need to set up a new
 synchronizer with a new state::
 
-  >>> s = Synchronizer(checkout, TestState(container2))
+  >>> s = Synchronizer(checkout, TestAllState(container2))
 
 We can now do the loading::
 

Modified: z3c.vcsync/trunk/src/z3c/vcsync/tests.py
===================================================================
--- z3c.vcsync/trunk/src/z3c/vcsync/tests.py	2008-04-28 15:58:51 UTC (rev 85824)
+++ z3c.vcsync/trunk/src/z3c/vcsync/tests.py	2008-04-28 17:26:06 UTC (rev 85825)
@@ -6,12 +6,13 @@
 from py.__.path.svn import svncommon
 from datetime import datetime
 import grok
+from zope import component
 
 from zope.interface import implements, Interface
 from zope.app.container.interfaces import IContainer
 from zope.exceptions.interfaces import DuplicationError
 
-from z3c.vcsync.interfaces import (ISerializer, IDump, IFactory,
+from z3c.vcsync.interfaces import (ISerializer, IDump, IFactory, IParser,
                                    IState, ICheckout)
 from z3c.vcsync import vc
 
@@ -47,15 +48,80 @@
     def revision_nr(self):
         return self._revision_nr
  
-class TestState(vc.AllState):
+class TestAllState(vc.AllState):
     
     def __init__(self, root):
-        super(TestState, self).__init__(root)
+        super(TestAllState, self).__init__(root)
         self.removed_paths = []
 
     def removed(self, revision_nr):
         return self.removed_paths
 
+class Item(object):
+    def __init__(self, payload):
+        self.payload = payload
+    def _get_payload(self):
+        return self._payload
+    def _set_payload(self, value):
+        self._payload = value
+        self.revision_nr = self.get_revision_nr()
+    payload = property(_get_payload, _set_payload)
+
+class TestState(object):
+    implements(IState)
+    def __init__(self, root):
+        self.root = root
+        self._removed = []
+    def set_revision_nr(self, nr):
+        self.root.nr = nr
+    def get_revision_nr(self):
+        try:
+            return self.root.nr
+        except AttributeError:
+            return 0
+    def removed(self, revision_nr):
+        return self._removed
+    def objects(self, revision_nr):
+        for container in self._containers(revision_nr):
+            for value in container.values():
+                if isinstance(value, Container):
+                    continue
+                if value.revision_nr >= revision_nr:
+                    yield value
+    def _containers(self, revision_nr):
+        return self._containers_helper(self.root)
+    def _containers_helper(self, container):
+        yield container
+        for obj in container.values():
+            if not isinstance(obj, Container):
+                continue
+            for sub_container in self._containers_helper(obj):
+                yield sub_container
+
+class ItemSerializer(grok.Adapter):
+    grok.provides(ISerializer)
+    grok.context(Item)
+    def serialize(self, f):
+        f.write(str(self.context.payload))
+        f.write('\n')
+    def name(self):
+        return self.context.__name__ + '.test'
+
+class ItemParser(grok.GlobalUtility):
+    grok.provides(IParser)
+    grok.name('.test')
+    def __call__(self, object, path):
+        object.payload = int(path.read())
+
+class ItemFactory(grok.GlobalUtility):
+  grok.provides(IFactory)
+  grok.name('.test')
+  def __call__(self, path):
+      parser = component.getUtility(IParser, '.test')
+      item = Item(None) # dummy payload
+      parser(item, path)
+      return item
+
 class Container(object):
     implements(IContainer)
     
@@ -89,6 +155,16 @@
     def __repr__(self):
         return "<Container %s>" % (self.__name__)
 
+class ContainerParser(grok.GlobalUtility):
+    grok.provides(IParser)
+    def __call__(self, object, path):
+        pass
+
+class ContainerFactory(grok.GlobalUtility):
+    grok.provides(IFactory)
+    def __call__(self, path):
+        return Container()
+
 def svn_repo_wc():
     """Create an empty SVN repository.
 
@@ -124,21 +200,8 @@
     _test_dirs.append(dirpath)
     return py.path.local(dirpath)
 
-def rel_paths(checkout, paths):
-    result = []
-    start = len(checkout.path.strpath)
-    for path in paths:
-        result.append(path.strpath[start:])
-    return sorted(result)
+globs = {}
 
-
-globs = {'Container': Container,
-         'TestCheckout': TestCheckout,
-         'TestState': TestState,
-         'create_test_dir': create_test_dir,
-         'rel_paths': rel_paths,
-         'svn_repo_wc': svn_repo_wc}
-
 def test_suite():
     suite = unittest.TestSuite([
         doctest.DocFileSuite(



More information about the Checkins mailing list