diff options
| author | Chris McDonough <chrism@agendaless.com> | 2008-07-07 04:44:57 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2008-07-07 04:44:57 +0000 |
| commit | 7de404bb4af2744a64c13e31a780fc0229b8f9e5 (patch) | |
| tree | 49f0b91b005777071050bf72732300f3bcd8d3ad /repoze/bfg/traversal.py | |
| parent | 93a4f5df2f74e4cbefc70733f2c0258859207106 (diff) | |
| download | pyramid-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.py | 43 |
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) |
