summaryrefslogtreecommitdiff
path: root/repoze/bfg/traversal.py
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2008-07-07 04:44:57 +0000
committerChris McDonough <chrism@agendaless.com>2008-07-07 04:44:57 +0000
commit7de404bb4af2744a64c13e31a780fc0229b8f9e5 (patch)
tree49f0b91b005777071050bf72732300f3bcd8d3ad /repoze/bfg/traversal.py
parent93a4f5df2f74e4cbefc70733f2c0258859207106 (diff)
downloadpyramid-7de404bb4af2744a64c13e31a780fc0229b8f9e5.tar.gz
pyramid-7de404bb4af2744a64c13e31a780fc0229b8f9e5.tar.bz2
pyramid-7de404bb4af2744a64c13e31a780fc0229b8f9e5.zip
Look up a view after traversal; adapt it to IWSGIApplication.
Diffstat (limited to 'repoze/bfg/traversal.py')
-rw-r--r--repoze/bfg/traversal.py43
1 files changed, 27 insertions, 16 deletions
diff --git a/repoze/bfg/traversal.py b/repoze/bfg/traversal.py
index 1b9cfb332..9380b2a0a 100644
--- a/repoze/bfg/traversal.py
+++ b/repoze/bfg/traversal.py
@@ -1,9 +1,10 @@
import urllib
+from zope.interface import classProvides
from zope.interface import implements
-from repoze.bfg.interfaces import ITraversalPolicy
-from repoze.bfg.interfaces import ITraverser
+from repoze.bfg.interfaces import IPublishTraverser
+from repoze.bfg.interfaces import IPublishTraverserFactory
def split_path(path):
if path.startswith('/'):
@@ -21,27 +22,37 @@ def split_path(path):
clean.append(segment)
return clean
-class NaiveTraversalPolicy:
- implements(ITraversalPolicy)
+def step(ob, name, default):
+ if not hasattr(ob, '__getitem__'):
+ return default
+ try:
+ return ob[name]
+ except KeyError:
+ return default
- def __call__(self, environ, root):
- path = split_path(environ['PATH_INFO'])
-
- ob = root
+_marker = ()
+
+class NaivePublishTraverser:
+ classProvides(IPublishTraverserFactory)
+ implements(IPublishTraverser)
+ def __init__(self, root, request):
+ self.root = root
+ self.request = request
+
+ def __call__(self, path):
+ path = split_path(path)
+
+ ob = self.root
name = ''
while path:
- segment = pop(path)
- traverser = ITraverser(ob)
- next = traverser(environ, segment)
- if next is None:
- if path:
- name = pop(path)
+ segment = path.pop(0)
+ next = step(ob, segment, _marker)
+ if next is _marker:
+ name = segment
break
ob = next
return ob, name, path
-def pop(path):
- return path.pop(0)