summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2008-07-15 02:35:18 +0000
committerChris McDonough <chrism@agendaless.com>2008-07-15 02:35:18 +0000
commite609857f291d9d31d9f766ed3cac350c22681939 (patch)
tree80c9aa671bde1e7cf964ea70166ba5dc8850b04f
parent7c87eb2da206f0578ce19628f7319156561f74da (diff)
downloadpyramid-e609857f291d9d31d9f766ed3cac350c22681939.tar.gz
pyramid-e609857f291d9d31d9f766ed3cac350c22681939.tar.bz2
pyramid-e609857f291d9d31d9f766ed3cac350c22681939.zip
If the root object provides ILocation, wrap items in location proxies
as necessary as we traverse.
-rw-r--r--repoze/bfg/tests/test_traversal.py30
-rw-r--r--repoze/bfg/traversal.py9
2 files changed, 36 insertions, 3 deletions
diff --git a/repoze/bfg/tests/test_traversal.py b/repoze/bfg/tests/test_traversal.py
index b5a2e746d..528ca0bf4 100644
--- a/repoze/bfg/tests/test_traversal.py
+++ b/repoze/bfg/tests/test_traversal.py
@@ -102,7 +102,35 @@ class NaivePublishTraverserTests(unittest.TestCase, PlacelessSetup):
self.assertEqual(name, 'foo')
self.assertEqual(subpath, [])
-class DummyContext:
+ def test_call_with_ILocation_root(self):
+ baz = DummyContext()
+ bar = DummyContext(baz)
+ foo = DummyContext(bar)
+ root = DummyContext(foo)
+ request = DummyRequest()
+ from zope.interface import directlyProvides
+ from zope.location.interfaces import ILocation
+ directlyProvides(root, ILocation)
+ root.__name__ = None
+ root.__parent__ = None
+ # give bar a direct parent and name to mix things up a bit
+ bar.__name__ = 'bar'
+ bar.__parent__ = foo
+ policy = self._makeOne(root, request)
+ ctx, name, subpath = policy('/foo/bar/baz')
+ self.assertEqual(ctx, baz)
+ self.assertEqual(name, '')
+ self.assertEqual(subpath, [])
+ self.assertEqual(ctx.__name__, 'baz')
+ self.assertEqual(ctx.__parent__, bar)
+ self.assertEqual(ctx.__parent__.__name__, 'bar')
+ self.assertEqual(ctx.__parent__.__parent__, foo)
+ self.assertEqual(ctx.__parent__.__parent__.__name__, 'foo')
+ self.assertEqual(ctx.__parent__.__parent__.__parent__, root)
+ self.assertEqual(ctx.__parent__.__parent__.__parent__.__name__, None)
+ self.assertEqual(ctx.__parent__.__parent__.__parent__.__parent__, None)
+
+class DummyContext(object):
def __init__(self, next=None):
self.next = next
diff --git a/repoze/bfg/traversal.py b/repoze/bfg/traversal.py
index 521044d5e..b59379db7 100644
--- a/repoze/bfg/traversal.py
+++ b/repoze/bfg/traversal.py
@@ -2,6 +2,8 @@ import urllib
from zope.interface import classProvides
from zope.interface import implements
+from zope.location.location import located
+from zope.location.interfaces import ILocation
from repoze.bfg.interfaces import IPublishTraverser
from repoze.bfg.interfaces import IPublishTraverserFactory
@@ -34,14 +36,16 @@ def step(ob, name, default):
_marker = ()
-class NaivePublishTraverser:
+class NaivePublishTraverser(object):
classProvides(IPublishTraverserFactory)
implements(IPublishTraverser)
def __init__(self, root, request):
self.root = root
+ self.locatable = ILocation.providedBy(root)
self.request = request
def __call__(self, path):
+ root = self.root
path = split_path(path)
ob = self.root
@@ -53,8 +57,9 @@ class NaivePublishTraverser:
if next is _marker:
name = segment
break
+ if self.locatable:
+ next = located(next, ob, segment)
ob = next
return ob, name, path
-