[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