[Checkins] SVN: z3c.traverser/trunk/src/z3c/traverser/stackinfo/
added stackinfo package
Bernd Dorn
bernd.dorn at fhv.at
Fri Sep 22 11:41:35 EDT 2006
Log message for revision 70339:
added stackinfo package
Changed:
A z3c.traverser/trunk/src/z3c/traverser/stackinfo/
A z3c.traverser/trunk/src/z3c/traverser/stackinfo/BROWSER.txt
A z3c.traverser/trunk/src/z3c/traverser/stackinfo/README.txt
A z3c.traverser/trunk/src/z3c/traverser/stackinfo/SETUP.cfg
A z3c.traverser/trunk/src/z3c/traverser/stackinfo/__init__.py
A z3c.traverser/trunk/src/z3c/traverser/stackinfo/adapter.py
A z3c.traverser/trunk/src/z3c/traverser/stackinfo/configure.zcml
A z3c.traverser/trunk/src/z3c/traverser/stackinfo/consumer.py
A z3c.traverser/trunk/src/z3c/traverser/stackinfo/ftesting.zcml
A z3c.traverser/trunk/src/z3c/traverser/stackinfo/ftests.py
A z3c.traverser/trunk/src/z3c/traverser/stackinfo/interfaces.py
A z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/
A z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/__init__.py
A z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/configure.zcml
A z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/consumer.py
A z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/event.py
A z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/views.py
A z3c.traverser/trunk/src/z3c/traverser/stackinfo/tests.py
A z3c.traverser/trunk/src/z3c/traverser/stackinfo/traversing.py
A z3c.traverser/trunk/src/z3c/traverser/stackinfo/z3c.traverser.stackinfo-configure.zcml
-=-
Added: z3c.traverser/trunk/src/z3c/traverser/stackinfo/BROWSER.txt
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/BROWSER.txt 2006-09-22 15:09:41 UTC (rev 70338)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/BROWSER.txt 2006-09-22 15:41:33 UTC (rev 70339)
@@ -0,0 +1,48 @@
+===============================================
+Extracting Information from the Traversal Stack
+===============================================
+
+This is a simple example to demonstrate the usage of this
+package. Please take a look into the testing directory to see how
+things should be set up.
+
+ >>> from zope.testbrowser.testing import Browser
+ >>> browser = Browser()
+ >>> browser.handleErrors = False
+
+ >>> browser.open('http://localhost/@@stackinfo.html')
+
+So basically we have no stack info.
+
+ >>> print browser.contents
+ Stack Info from object at http://localhost/stackinfo.html:
+
+Let us try to set foo to bar.
+
+ >>> browser.open('http://localhost/kv/foo/bar/@@stackinfo.html')
+ >>> print browser.contents
+ Stack Info from object at http://localhost/stackinfo.html:
+ consumer kv:
+ key = u'foo'
+ value = u'bar'
+
+Two consumers.
+
+ >>> browser.open('http://localhost/kv/foo/bar/kv/time/late/@@stackinfo.html')
+ >>> print browser.contents
+ Stack Info from object at http://localhost/stackinfo.html:
+ consumer kv:
+ key = u'foo'
+ value = u'bar'
+ consumer kv:
+ key = u'time'
+ value = u'late'
+
+Invalid url:
+
+ >>> browser.open('http://localhost/kv/foo/bar/kv/@@stackinfo.html')
+ Traceback (most recent call last):
+ ...
+ NotFound: Object: <...Folder object at ...>, name: u'kv'
+
+
Property changes on: z3c.traverser/trunk/src/z3c/traverser/stackinfo/BROWSER.txt
___________________________________________________________________
Name: svn:eol-style
+ native
Added: z3c.traverser/trunk/src/z3c/traverser/stackinfo/README.txt
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/README.txt 2006-09-22 15:09:41 UTC (rev 70338)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/README.txt 2006-09-22 15:41:33 UTC (rev 70339)
@@ -0,0 +1,164 @@
+===============================================
+Extracting Information from the Traversal Stack
+===============================================
+
+This package allows to define virtal traversal paths for collecting
+arbitrary information from the traversal stack instead of, for example,
+query strings.
+
+In contrast to the common way of defining custom Traversers, this
+implementation does not require to go through the whole traversal
+process step by step. The traversal information needed is taken from
+the traversalstack directly and the used parts of the stack are
+consumed. This way one don't have to define proxy classes just for
+traversal.
+
+This implementation does not work in tales because it requires the
+traversalstack of the request.
+
+For each name in the traversal stack a named multiadapter is looked up
+for ITraversalStackConsumer, if found the item gets removed from the
+stack and the adapter is added to the request annotation.
+
+ >>> from z3c.traverser.stackinfo import traversing
+ >>> from z3c.traverser.stackinfo import interfaces
+
+If there are no adapters defined, the traversalstack is kept as is. To
+show this behaviour we define some sample classes.
+
+ >>> from zope import interface
+ >>> class IContent(interface.Interface):
+ ... pass
+ >>> class Content(object):
+ ... interface.implements(IContent)
+
+There is a convinience function which returns an iterator which
+iterates over tuples of adapterName, adapter. Additionally the
+traversal stack of the request is consumed if needed.
+
+ >>> from zope.publisher.browser import TestRequest
+ >>> from zope.publisher.interfaces.browser import IBrowserRequest
+ >>> request = TestRequest()
+
+We set the traversal stack manually for testing here.
+
+ >>> request.setTraversalStack([u'index.html', u'path', u'some'])
+ >>> content = Content()
+
+So if no ITraversalStackConsumer adapters are found the stack is left
+untouched.
+
+ >>> list(traversing.getStackConsumers(content, request))
+ []
+ >>> request.getTraversalStack()
+ [u'index.html', u'path', u'some']
+
+There is a base class for consumer implementations. Let us define a
+custom consumer.
+
+ >>> from z3c.traverser.stackinfo import consumer
+ >>> from zope import component
+ >>> class DummyConsumer(consumer.BaseConsumer):
+ ... component.adapts(IContent, IBrowserRequest)
+
+ >>> component.provideAdapter(DummyConsumer, name='some')
+
+Now we will find the newly registered consumer and the 'some' part of
+the stack is consumed.
+
+ >>> consumers = list(traversing.getStackConsumers(content, request))
+ >>> consumers
+ [(u'some', <DummyConsumer named u'some'>)]
+ >>> request.getTraversalStack()
+ [u'index.html', u'path']
+
+Each consumer at least has to consume one element, which is always
+the name under which the adapter was registered under.
+
+ >>> name, cons = consumers[0]
+ >>> cons.__name__
+ u'some'
+
+Let us provide another adapter, to demonstrate that the adpaters
+always have the reverse order of the traversal stack. This is actually
+the order in the url.
+
+ >>> component.provideAdapter(DummyConsumer, name='other')
+ >>> stack = [u'index.html', u'path', u'some', u'other']
+ >>> request.setTraversalStack(stack)
+ >>> consumers = list(traversing.getStackConsumers(content, request))
+ >>> consumers
+ [(u'other', <DummyConsumer named u'other'>),
+ (u'some', <DummyConsumer named u'some'>)]
+
+ >>> [c.__name__ for name, c in consumers]
+ [u'other', u'some']
+
+The arguments attribute of the consumer class defines how many
+arguments are consumed/needed from the stack. Let us create a KeyValue
+consumer, that should extract key value pairs from the stack.
+
+ >>> class KeyValueConsumer(DummyConsumer):
+ ... arguments=('key', 'value')
+ >>> component.provideAdapter(KeyValueConsumer, name='kv')
+ >>> stack = [u'index.html', u'value', u'key', u'kv']
+ >>> request.setTraversalStack(stack)
+ >>> consumers = list(traversing.getStackConsumers(content, request))
+ >>> consumers
+ [(u'kv', <KeyValueConsumer named u'kv'>)]
+ >>> request.getTraversalStack()
+ [u'index.html']
+ >>> name, cons = consumers[0]
+ >>> cons.key
+ u'key'
+ >>> cons.value
+ u'value'
+
+We can of course use multiple consumers of the same type.
+
+ >>> stack = [u'index.html', u'v2', u'k2', u'kv', u'v1', u'k1', u'kv']
+ >>> request.setTraversalStack(stack)
+ >>> consumers = list(traversing.getStackConsumers(content, request))
+ >>> [(c.__name__, c.key, c.value) for name, c in consumers]
+ [(u'kv', u'k1', u'v1'), (u'kv', u'k2', u'v2')]
+
+If we have too less arguments a NotFound exception.
+
+ >>> stack = [u'k2', u'kv', u'v1', u'k1', u'kv']
+ >>> request.setTraversalStack(stack)
+ >>> consumers = list(traversing.getStackConsumers(content, request))
+ Traceback (most recent call last):
+ ...
+ NotFound: Object: <Content object at ...>, name: u'kv'
+
+
+In order to actually use the stack consumers to retrieve information,
+there is another convinience function which stores the consumers in
+the requests annotations. This should noramlly be called on
+BeforeTraverseEvents.
+
+ >>> stack = [u'index.html', u'v2', u'k2', u'kv', u'v1', u'k1', u'kv']
+ >>> request.setTraversalStack(stack)
+ >>> traversing.applyStackConsumers(content, request)
+ >>> request.annotations[traversing.ANNOTATION_KEY]
+ [<KeyValueConsumer named u'kv'>,
+ <KeyValueConsumer named u'kv'>]
+
+Instead of messing with the annotations one just can adapt the request
+to ITraversalStackInfo.
+
+ >>> component.provideAdapter(consumer.requestTraversalStackInfo)
+ >>> ti = interfaces.ITraversalStackInfo(request)
+ >>> ti
+ (<KeyValueConsumer named u'kv'>, <KeyValueConsumer named u'kv'>)
+
+ >>> len(ti)
+ 2
+
+The adapter always returs an empty TraversalStackInfoObject if there
+is no traversalstack information.
+
+ >>> request = TestRequest()
+ >>> ti = interfaces.ITraversalStackInfo(request)
+ >>> len(ti)
+ 0
Property changes on: z3c.traverser/trunk/src/z3c/traverser/stackinfo/README.txt
___________________________________________________________________
Name: svn:eol-style
+ native
Added: z3c.traverser/trunk/src/z3c/traverser/stackinfo/SETUP.cfg
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/SETUP.cfg 2006-09-22 15:09:41 UTC (rev 70338)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/SETUP.cfg 2006-09-22 15:41:33 UTC (rev 70339)
@@ -0,0 +1,3 @@
+<data-files zopeskel/etc/package-includes>
+ z3c.traverser.stackinfo-*.zcml
+</data-files>
\ No newline at end of file
Property changes on: z3c.traverser/trunk/src/z3c/traverser/stackinfo/SETUP.cfg
___________________________________________________________________
Name: svn:eol-style
+ native
Added: z3c.traverser/trunk/src/z3c/traverser/stackinfo/__init__.py
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/__init__.py 2006-09-22 15:09:41 UTC (rev 70338)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/__init__.py 2006-09-22 15:41:33 UTC (rev 70339)
@@ -0,0 +1 @@
+#
Property changes on: z3c.traverser/trunk/src/z3c/traverser/stackinfo/__init__.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: z3c.traverser/trunk/src/z3c/traverser/stackinfo/adapter.py
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/adapter.py 2006-09-22 15:09:41 UTC (rev 70338)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/adapter.py 2006-09-22 15:41:33 UTC (rev 70339)
@@ -0,0 +1 @@
+
Property changes on: z3c.traverser/trunk/src/z3c/traverser/stackinfo/adapter.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: z3c.traverser/trunk/src/z3c/traverser/stackinfo/configure.zcml
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/configure.zcml 2006-09-22 15:09:41 UTC (rev 70338)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/configure.zcml 2006-09-22 15:41:33 UTC (rev 70339)
@@ -0,0 +1,11 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+ xmlns:i18n="http://namespaces.zope.org/i18n"
+ i18n_domain="zope">
+
+ <adapter factory=".consumer.requestTraversalStackInfo"/>
+
+ <class class=".consumer.TraversalStackInfo">
+ <allow interface=".interfaces.ITraversalStackInfo"/>
+ </class>
+
+</configure>
\ No newline at end of file
Property changes on: z3c.traverser/trunk/src/z3c/traverser/stackinfo/configure.zcml
___________________________________________________________________
Name: svn:eol-style
+ native
Added: z3c.traverser/trunk/src/z3c/traverser/stackinfo/consumer.py
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/consumer.py 2006-09-22 15:09:41 UTC (rev 70338)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/consumer.py 2006-09-22 15:41:33 UTC (rev 70339)
@@ -0,0 +1,36 @@
+from zope import interface, component
+import interfaces
+import traversing
+from zope.publisher.interfaces.browser import IBrowserRequest
+
+ at component.adapter(IBrowserRequest)
+ at interface.implementer(interfaces.ITraversalStackInfo)
+def requestTraversalStackInfo(request):
+ cons = request.annotations.get(traversing.ANNOTATION_KEY, [])
+ return TraversalStackInfo(cons)
+
+class TraversalStackInfo(tuple):
+ interface.implements(interfaces.ITraversalStackInfo)
+
+class BaseConsumer(object):
+ interface.implements(interfaces.ITraversalStackConsumer)
+
+ arguments = ()
+ __name__ = None
+
+ def __init__(self, context, request):
+ self.context=context
+ self.request=request
+
+ def consume(self):
+ stack = self.request.getTraversalStack()
+ self.__name__ = stack.pop()
+ for name in self.arguments:
+ setattr(self, name, stack.pop())
+ self.request.setTraversalStack(stack)
+
+ def __repr__(self):
+ return '<%s named %r>' % (self.__class__.__name__,
+ self.__name__)
+
+
Property changes on: z3c.traverser/trunk/src/z3c/traverser/stackinfo/consumer.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: z3c.traverser/trunk/src/z3c/traverser/stackinfo/ftesting.zcml
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/ftesting.zcml 2006-09-22 15:09:41 UTC (rev 70338)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/ftesting.zcml 2006-09-22 15:41:33 UTC (rev 70339)
@@ -0,0 +1,60 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+ xmlns:browser="http://namespaces.zope.org/browser"
+ i18n_domain="zope">
+
+ <include package="zope.app" />
+
+ <include package="zope.viewlet" file="meta.zcml"/>
+ <include package="zope.app.securitypolicy" file="meta.zcml" />
+
+ <include package="zope.app.server" />
+ <include package="zope.app.authentication" />
+ <securityPolicy
+ component="zope.app.securitypolicy.zopepolicy.ZopeSecurityPolicy" />
+ <include package="zope.app.securitypolicy" />
+ <include package="zope.app.session" />
+
+ <include package="z3c.traverser.stackinfo"/>
+ <include package="z3c.traverser.stackinfo.testing"/>
+
+ <role id="zope.Anonymous" title="Everybody"
+ description="All users have this role implicitly" />
+ <role id="zope.Manager" title="Site Manager" />
+ <grantAll role="zope.Manager" />
+ <principal
+ id="zope.manager"
+ title="Administrator"
+ login="mgr"
+ password="mgrpw" />
+ <grant
+ role="zope.Manager"
+ principal="zope.manager"
+ />
+
+ <unauthenticatedPrincipal
+ id="zope.anybody"
+ title="Unauthenticated User" />
+
+ <unauthenticatedGroup
+ id="zope.Anybody"
+ title="Unauthenticated Users"
+ />
+
+ <authenticatedGroup
+ id="zope.Authenticated"
+ title="Authenticated Users"
+ />
+
+ <everybodyGroup
+ id="zope.Everybody"
+ title="All Users"
+ />
+
+ <grant permission="zope.View"
+ role="zope.Anonymous" />
+ <grant permission="zope.app.dublincore.view"
+ role="zope.Anonymous" />
+
+
+
+</configure>
Property changes on: z3c.traverser/trunk/src/z3c/traverser/stackinfo/ftesting.zcml
___________________________________________________________________
Name: svn:eol-style
+ native
Added: z3c.traverser/trunk/src/z3c/traverser/stackinfo/ftests.py
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/ftests.py 2006-09-22 15:09:41 UTC (rev 70338)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/ftests.py 2006-09-22 15:41:33 UTC (rev 70339)
@@ -0,0 +1,17 @@
+import unittest
+
+from zope.app.testing import functional
+functional.defineLayer('TestLayer', 'ftesting.zcml')
+
+def test_suite():
+ suite = unittest.TestSuite()
+ suites = (
+ functional.FunctionalDocFileSuite('BROWSER.txt')
+ )
+ for s in suites:
+ s.layer=TestLayer
+ suite.addTest(s)
+ return suite
+
+if __name__ == '__main__':
+ unittest.main(defaultTest='test_suite')
Property changes on: z3c.traverser/trunk/src/z3c/traverser/stackinfo/ftests.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: z3c.traverser/trunk/src/z3c/traverser/stackinfo/interfaces.py
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/interfaces.py 2006-09-22 15:09:41 UTC (rev 70338)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/interfaces.py 2006-09-22 15:41:33 UTC (rev 70339)
@@ -0,0 +1,18 @@
+from zope import interface, schema
+from zope.interface.common.sequence import IExtendedReadSequence
+
+class ITraversalStackInfo(IExtendedReadSequence):
+ """A list of collected traversal stack consumers"""
+
+class ITraversalStackConsumer(interface.Interface):
+ """A traversal stack consumer"""
+
+ __name__ = schema.TextLine(title=u'Name',
+ description=u'The name under which the consumer is registered')
+
+ arguments = schema.Tuple(title=u'Arguments',
+ description=u'The argument names to be consumed')
+
+ def consume(stack):
+ """consumes the items from the stack, and sets the __name__
+ and attributes"""
Property changes on: z3c.traverser/trunk/src/z3c/traverser/stackinfo/interfaces.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/__init__.py
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/__init__.py 2006-09-22 15:09:41 UTC (rev 70338)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/__init__.py 2006-09-22 15:41:33 UTC (rev 70339)
@@ -0,0 +1 @@
+#
Property changes on: z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/__init__.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/configure.zcml
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/configure.zcml 2006-09-22 15:09:41 UTC (rev 70338)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/configure.zcml 2006-09-22 15:41:33 UTC (rev 70339)
@@ -0,0 +1,21 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+ xmlns:browser="http://namespaces.zope.org/browser"
+ xmlns:i18n="http://namespaces.zope.org/i18n"
+ i18n_domain="zope">
+
+ <browser:page
+ for="zope.app.component.interfaces.ISite"
+ name="stackinfo.html"
+ permission="zope.Public"
+ class=".views.StackInfoView"/>
+
+ <subscriber
+ for="zope.app.component.interfaces.ISite
+ zope.app.publication.interfaces.IBeforeTraverseEvent"
+ handler=".event.handleSiteBeforeTraverse"
+ />
+
+ <adapter factory=".consumer.KeyValueConsumer"
+ name="kv"/>
+
+ </configure>
\ No newline at end of file
Property changes on: z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/configure.zcml
___________________________________________________________________
Name: svn:eol-style
+ native
Added: z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/consumer.py
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/consumer.py 2006-09-22 15:09:41 UTC (rev 70338)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/consumer.py 2006-09-22 15:41:33 UTC (rev 70339)
@@ -0,0 +1,11 @@
+from z3c.traverser.stackinfo.consumer import BaseConsumer
+from z3c.traverser.stackinfo import interfaces
+from zope import interface, component
+from zope.app.component.interfaces import ISite
+from zope.publisher.interfaces.browser import IBrowserRequest
+
+class KeyValueConsumer(BaseConsumer):
+ interface.implements(interfaces.ITraversalStackConsumer)
+ component.adapts(ISite, IBrowserRequest)
+ arguments=('key', 'value')
+
Property changes on: z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/consumer.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/event.py
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/event.py 2006-09-22 15:09:41 UTC (rev 70338)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/event.py 2006-09-22 15:41:33 UTC (rev 70339)
@@ -0,0 +1,6 @@
+from z3c.traverser.stackinfo import traversing
+
+# example event handler
+def handleSiteBeforeTraverse(obj, event):
+ traversing.applyStackConsumers(obj, event.request)
+
Property changes on: z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/event.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/views.py
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/views.py 2006-09-22 15:09:41 UTC (rev 70338)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/views.py 2006-09-22 15:41:33 UTC (rev 70339)
@@ -0,0 +1,16 @@
+from z3c.traverser.stackinfo import interfaces
+from zope.traversing.browser.absoluteurl import absoluteURL
+
+class StackInfoView(object):
+
+ def __call__(self):
+ url = absoluteURL(self, self.request)
+ res = [u'Stack Info from object at %s:' % url]
+ for consumer in interfaces.ITraversalStackInfo(
+ self.request):
+ res.append(u'consumer %s:' % consumer.__name__)
+ for arg in consumer.arguments:
+ res.append(u'%s = %r' % (arg, getattr(consumer, arg)))
+ return u'\n'.join(res)
+
+
Property changes on: z3c.traverser/trunk/src/z3c/traverser/stackinfo/testing/views.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: z3c.traverser/trunk/src/z3c/traverser/stackinfo/tests.py
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/tests.py 2006-09-22 15:09:41 UTC (rev 70338)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/tests.py 2006-09-22 15:41:33 UTC (rev 70339)
@@ -0,0 +1,22 @@
+import doctest
+import unittest
+from zope.testing.doctestunit import DocFileSuite, DocFileSuite
+from zope.app.testing import setup
+
+def setUp(test):
+ setup.placefulSetUp()
+
+def tearDown(test):
+ setup.placefulTearDown()
+
+def test_suite():
+
+ return unittest.TestSuite(
+ (
+ DocFileSuite('README.txt',
+ optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,
+ ),
+ ))
+
+if __name__ == '__main__':
+ unittest.main(defaultTest='test_suite')
Property changes on: z3c.traverser/trunk/src/z3c/traverser/stackinfo/tests.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: z3c.traverser/trunk/src/z3c/traverser/stackinfo/traversing.py
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/traversing.py 2006-09-22 15:09:41 UTC (rev 70338)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/traversing.py 2006-09-22 15:41:33 UTC (rev 70339)
@@ -0,0 +1,29 @@
+from zope import component
+import interfaces
+from zope.publisher.interfaces import NotFound
+
+ANNOTATION_KEY='z3c.traverser.consumers'
+
+def getStackConsumers(context, request):
+ """consumes the stack"""
+ while True:
+ stack = request.getTraversalStack()
+ if not stack:
+ break
+ name = stack[-1]
+ consumer = component.queryMultiAdapter(
+ (context, request),
+ interface=interfaces.ITraversalStackConsumer,
+ name=name)
+ if consumer is not None:
+ try:
+ consumer.consume()
+ except IndexError:
+ raise NotFound(context, name, request)
+ yield (name, consumer)
+ continue
+ break
+
+def applyStackConsumers(context, request):
+ cons = [cons for name, cons in getStackConsumers(context, request)]
+ request.annotations[ANNOTATION_KEY] = cons
Property changes on: z3c.traverser/trunk/src/z3c/traverser/stackinfo/traversing.py
___________________________________________________________________
Name: svn:keywords
+ Id
Name: svn:eol-style
+ native
Added: z3c.traverser/trunk/src/z3c/traverser/stackinfo/z3c.traverser.stackinfo-configure.zcml
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/z3c.traverser.stackinfo-configure.zcml 2006-09-22 15:09:41 UTC (rev 70338)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/z3c.traverser.stackinfo-configure.zcml 2006-09-22 15:41:33 UTC (rev 70339)
@@ -0,0 +1 @@
+<include package="z3c.traverser.stackinfo"/>
\ No newline at end of file
Property changes on: z3c.traverser/trunk/src/z3c/traverser/stackinfo/z3c.traverser.stackinfo-configure.zcml
___________________________________________________________________
Name: svn:eol-style
+ native
More information about the Checkins
mailing list