[Checkins] SVN: zc.vault/trunk/src/zc/vault/versions. add traversable for versions so that classic copy/paste works

Gary Poster gary at zope.com
Tue Apr 17 13:44:45 EDT 2007


Log message for revision 74206:
  add traversable for versions so that classic copy/paste works

Changed:
  U   zc.vault/trunk/src/zc/vault/versions.py
  U   zc.vault/trunk/src/zc/vault/versions.txt
  U   zc.vault/trunk/src/zc/vault/versions.zcml

-=-
Modified: zc.vault/trunk/src/zc/vault/versions.py
===================================================================
--- zc.vault/trunk/src/zc/vault/versions.py	2007-04-17 17:35:22 UTC (rev 74205)
+++ zc.vault/trunk/src/zc/vault/versions.py	2007-04-17 17:44:44 UTC (rev 74206)
@@ -7,6 +7,7 @@
 import zope.publisher.browser
 import zope.publisher.interfaces
 import zope.publisher.interfaces.browser
+import zope.traversing.interfaces
 
 class IReadVersions(zope.interface.Interface):
     """abstract: see IVersions"""
@@ -172,3 +173,30 @@
         if view is not None:
             return view
         raise zope.publisher.interfaces.NotFound(self.context, name, request)
+
+_marker = object()
+
+class Traversable(object):
+    """Traverses containers via `getattr` and `get`."""
+
+    zope.component.adapts(IVersions)
+    zope.interface.implements(zope.traversing.interfaces.ITraversable)
+
+    def __init__(self, context):
+        self.context = context
+
+
+    def traverse(self, name, furtherPath):
+        try:
+            ix = int(name)
+        except ValueError:
+            pass
+        else:
+            try:
+                return self.context[ix]
+            except IndexError:
+                pass
+        res = getattr(self, name, _marker)
+        if res is _marker:
+            raise zope.traversing.interfaces.TraversalError(name)
+        return res

Modified: zc.vault/trunk/src/zc/vault/versions.txt
===================================================================
--- zc.vault/trunk/src/zc/vault/versions.txt	2007-04-17 17:35:22 UTC (rev 74205)
+++ zc.vault/trunk/src/zc/vault/versions.txt	2007-04-17 17:44:44 UTC (rev 74206)
@@ -156,6 +156,18 @@
     NotFound: Object: <zc.vault.versions.Versions object at ...>,
               name: 'index.html'
 
+Similarly, it contains a traversable.
+
+    >>> traversable = zc.vault.versions.Traversable(p.versions)
+    >>> traversable.traverse('1', []) is p.versions[1]
+    True
+    >>> traversable.traverse('0', []) is p.versions[0]
+    True
+    >>> traversable.traverse('5', [])
+    Traceback (most recent call last):
+    ...
+    TraversalError: '5'
+
 With this stuff, I usually like to make sure we can actually commit the
 transaction.
 

Modified: zc.vault/trunk/src/zc/vault/versions.zcml
===================================================================
--- zc.vault/trunk/src/zc/vault/versions.zcml	2007-04-17 17:35:22 UTC (rev 74205)
+++ zc.vault/trunk/src/zc/vault/versions.zcml	2007-04-17 17:44:44 UTC (rev 74206)
@@ -24,5 +24,12 @@
       permission="zope.Public"
       allowed_interface="zope.publisher.interfaces.browser.IBrowserPublisher"
       />
+  <!-- the following is needed to make internal traversal work, such as
+       occurs with the current copy paste code -->
+  <adapter 
+      for=".versions.IVersions"
+      factory=".versions.Traversable"
+      provides="zope.traversing.interfaces.ITraversable"
+      />
 
 </configure>



More information about the Checkins mailing list