[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