diff options
| author | Chris McDonough <chrism@agendaless.com> | 2008-07-15 02:35:18 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2008-07-15 02:35:18 +0000 |
| commit | e609857f291d9d31d9f766ed3cac350c22681939 (patch) | |
| tree | 80c9aa671bde1e7cf964ea70166ba5dc8850b04f | |
| parent | 7c87eb2da206f0578ce19628f7319156561f74da (diff) | |
| download | pyramid-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.py | 30 | ||||
| -rw-r--r-- | repoze/bfg/traversal.py | 9 |
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 - |
