summaryrefslogtreecommitdiff
path: root/repoze/bfg/traversal.py
diff options
context:
space:
mode:
Diffstat (limited to 'repoze/bfg/traversal.py')
-rw-r--r--repoze/bfg/traversal.py19
1 files changed, 16 insertions, 3 deletions
diff --git a/repoze/bfg/traversal.py b/repoze/bfg/traversal.py
index 43adcdebb..d48627e7e 100644
--- a/repoze/bfg/traversal.py
+++ b/repoze/bfg/traversal.py
@@ -268,12 +268,12 @@ def traverse(model, path):
if path and path[0] == '/':
model = find_root(model)
- environ = {'PATH_INFO':path}
+ request = FakeRequest({'PATH_INFO':path})
traverser = queryAdapter(model, ITraverser)
if traverser is None:
traverser = ModelGraphTraverser(model)
- return traverser(environ)
+ return traverser(request)
def model_path_tuple(model, *elements):
"""
@@ -474,7 +474,15 @@ class ModelGraphTraverser(object):
def __init__(self, root):
self.root = root
- def __call__(self, environ):
+ def __call__(self, request):
+ try:
+ environ = request.environ
+ except AttributeError:
+ # In BFG 1.0 and before, this API expected an environ
+ # rather than a request; some bit of code may still be
+ # passing us an environ. If so, deal.
+ environ = request
+
if 'bfg.routes.matchdict' in environ:
matchdict = environ['bfg.routes.matchdict']
@@ -623,3 +631,8 @@ class TraversalContextURL(object):
def _join_path_tuple(tuple):
return tuple and '/'.join([quote_path_segment(x) for x in tuple]) or '/'
+class FakeRequest(dict):
+ def __init__(self, environ):
+ self.update(environ)
+ self.environ = self # XXX circref?
+