[Checkins] SVN: z3c.traverser/trunk/src/z3c/traverser/stackinfo/
implemented unconsumed_url,
which returns the absolute_url but with the stack info
Bernd Dorn
bernd.dorn at fhv.at
Mon Oct 2 15:48:35 EDT 2006
Log message for revision 70500:
implemented unconsumed_url, which returns the absolute_url but with the stack info
Changed:
U z3c.traverser/trunk/src/z3c/traverser/stackinfo/README.txt
U z3c.traverser/trunk/src/z3c/traverser/stackinfo/configure.zcml
U z3c.traverser/trunk/src/z3c/traverser/stackinfo/consumer.py
U z3c.traverser/trunk/src/z3c/traverser/stackinfo/tests.py
U z3c.traverser/trunk/src/z3c/traverser/stackinfo/traversing.py
-=-
Modified: z3c.traverser/trunk/src/z3c/traverser/stackinfo/README.txt
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/README.txt 2006-10-02 18:13:35 UTC (rev 70499)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/README.txt 2006-10-02 19:48:34 UTC (rev 70500)
@@ -140,7 +140,7 @@
>>> 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]
+ >>> request.annotations[traversing.CONSUMERS_ANNOTATION_KEY]
[<KeyValueConsumer named u'kv'>,
<KeyValueConsumer named u'kv'>]
@@ -154,7 +154,7 @@
>>> len(ti)
2
-
+
The adapter always returs an empty TraversalStackInfoObject if there
is no traversalstack information.
@@ -162,3 +162,26 @@
>>> ti = interfaces.ITraversalStackInfo(request)
>>> len(ti)
0
+
+URL Handling
+============
+
+Let us try these things with a real url, in our test the root is the site.
+
+ >>> from zope.traversing.browser.absoluteurl import absoluteURL
+ >>> absoluteURL(root, request)
+ 'http://127.0.0.1'
+
+There is an unconsumedURL function which returns the url of an object
+with the traversal information, which is normally omitted.
+
+ >>> request = TestRequest()
+ >>> root['content'] = content
+ >>> absoluteURL(root['content'], request)
+ 'http://127.0.0.1/content'
+ >>> stack = [u'index.html', u'v2 space', u'k2', u'kv', u'v1', u'k1', u'kv']
+ >>> request.setTraversalStack(stack)
+ >>> traversing.applyStackConsumers(root['content'], request)
+ >>> traversing.unconsumedURL(root['content'], request)
+ 'http://127.0.0.1/content/kv/k1/v1/kv/k2/v2%20space'
+
Modified: z3c.traverser/trunk/src/z3c/traverser/stackinfo/configure.zcml
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/configure.zcml 2006-10-02 18:13:35 UTC (rev 70499)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/configure.zcml 2006-10-02 19:48:34 UTC (rev 70500)
@@ -7,5 +7,13 @@
<class class=".consumer.TraversalStackInfo">
<allow interface=".interfaces.ITraversalStackInfo"/>
</class>
+
+ <view
+ for="*"
+ name="unconsumed_url"
+ factory=".traversing.UnconsumedURL"
+ type="zope.publisher.interfaces.http.IHTTPRequest"
+ permission="zope.Public"
+ />
</configure>
\ No newline at end of file
Modified: z3c.traverser/trunk/src/z3c/traverser/stackinfo/consumer.py
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/consumer.py 2006-10-02 18:13:35 UTC (rev 70499)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/consumer.py 2006-10-02 19:48:34 UTC (rev 70500)
@@ -6,7 +6,7 @@
@component.adapter(IBrowserRequest)
@interface.implementer(interfaces.ITraversalStackInfo)
def requestTraversalStackInfo(request):
- cons = request.annotations.get(traversing.ANNOTATION_KEY, [])
+ cons = request.annotations.get(traversing.CONSUMERS_ANNOTATION_KEY, [])
return TraversalStackInfo(cons)
class TraversalStackInfo(tuple):
@@ -25,9 +25,13 @@
def consume(self):
stack = self.request.getTraversalStack()
self.__name__ = stack.pop()
+ consumed = [self.__name__]
for name in self.arguments:
- setattr(self, name, stack.pop())
+ v = stack.pop()
+ consumed.append(v)
+ setattr(self, name, v)
self.request.setTraversalStack(stack)
+ return consumed
def __repr__(self):
return '<%s named %r>' % (self.__class__.__name__,
Modified: z3c.traverser/trunk/src/z3c/traverser/stackinfo/tests.py
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/tests.py 2006-10-02 18:13:35 UTC (rev 70499)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/tests.py 2006-10-02 19:48:34 UTC (rev 70500)
@@ -2,9 +2,12 @@
import unittest
from zope.testing.doctestunit import DocFileSuite, DocFileSuite
from zope.app.testing import setup
+import zope.traversing.testing
def setUp(test):
- setup.placefulSetUp()
+ root = setup.placefulSetUp(True)
+ zope.traversing.testing.setUp()
+ test.globs['root'] = root
def tearDown(test):
setup.placefulTearDown()
@@ -14,6 +17,7 @@
return unittest.TestSuite(
(
DocFileSuite('README.txt',
+ setUp=setUp, tearDown=tearDown,
optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS,
),
))
Modified: z3c.traverser/trunk/src/z3c/traverser/stackinfo/traversing.py
===================================================================
--- z3c.traverser/trunk/src/z3c/traverser/stackinfo/traversing.py 2006-10-02 18:13:35 UTC (rev 70499)
+++ z3c.traverser/trunk/src/z3c/traverser/stackinfo/traversing.py 2006-10-02 19:48:34 UTC (rev 70500)
@@ -1,8 +1,12 @@
from zope import component
import interfaces
from zope.publisher.interfaces import NotFound
+from zope.traversing.browser.absoluteurl import absoluteURL
+import urllib
+from zope.publisher.browser import BrowserView
-ANNOTATION_KEY='z3c.traverser.consumers'
+CONSUMERS_ANNOTATION_KEY='z3c.traverser.consumers'
+CONSUMED_ANNOTATION_KEY='z3c.traverser.consumed'
def getStackConsumers(context, request):
"""consumes the stack"""
@@ -25,5 +29,55 @@
break
def applyStackConsumers(context, request):
- cons = [cons for name, cons in getStackConsumers(context, request)]
- request.annotations[ANNOTATION_KEY] = cons
+ if not request.annotations.has_key(CONSUMED_ANNOTATION_KEY):
+ request.annotations[CONSUMED_ANNOTATION_KEY] = []
+ orgStack = request.getTraversalStack()
+ cons = [cons for name, cons in getStackConsumers(
+ context, request)]
+ newStack = request.getTraversalStack()
+ if newStack != orgStack:
+ consumed = request.annotations[CONSUMED_ANNOTATION_KEY]
+ items = orgStack[len(newStack):]
+ items.reverse()
+ consumed.append((context, items))
+ request.annotations[CONSUMERS_ANNOTATION_KEY] = cons
+
+def _encode(v, _safe='@+'):
+ return urllib.quote(v.encode('utf-8'), _safe)
+
+def unconsumedURL(context, request):
+
+ consumed = list(request.annotations.get(CONSUMED_ANNOTATION_KEY))
+ if not consumed:
+ return absoluteURL(context, request)
+ from zope.traversing import api
+
+ from zope.traversing.interfaces import IContainmentRoot
+ name = api.getName(context)
+ items = name and [name] or []
+ for obj, names in consumed:
+ if obj == context:
+ items.extend(names)
+ break
+ if IContainmentRoot.providedBy(context):
+ base = absoluteURL(context, request)
+ else:
+ base = unconsumedURL(api.getParent(context), request)
+ items = map(_encode, items)
+ if not base.endswith('/'):
+ base += '/'
+ return base + '/'.join(items)
+
+class UnconsumedURL(BrowserView):
+ # XXX test this
+ def __unicode__(self):
+ return urllib.unquote(self.__str__()).decode('utf-8')
+
+ def __str__(self):
+ return unconsumedURL(self.context, self.request)
+
+ __call__ = __str__
+
+
+
+
More information about the Checkins
mailing list