diff options
| author | Chris McDonough <chrism@agendaless.com> | 2009-01-28 05:42:41 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2009-01-28 05:42:41 +0000 |
| commit | 70cc2047b8bb358a8418c11ec0d39d09120ffd3c (patch) | |
| tree | 99eb947cb138313a915a1611cecff0d88189e8a2 | |
| parent | 3bfa35586381fc808f455696837c9fe0ebc0a0ca (diff) | |
| download | pyramid-70cc2047b8bb358a8418c11ec0d39d09120ffd3c.tar.gz pyramid-70cc2047b8bb358a8418c11ec0d39d09120ffd3c.tar.bz2 pyramid-70cc2047b8bb358a8418c11ec0d39d09120ffd3c.zip | |
Micro-optimize. _step and locatable are gone, sorry David and Malthe. On the bright side, there's nothing left to take out, so feel free to subclass now. ;-)
| -rw-r--r-- | repoze/bfg/traversal.py | 40 |
1 files changed, 15 insertions, 25 deletions
diff --git a/repoze/bfg/traversal.py b/repoze/bfg/traversal.py index 4f1ffb60d..4c9f5dfb2 100644 --- a/repoze/bfg/traversal.py +++ b/repoze/bfg/traversal.py @@ -222,12 +222,6 @@ class ModelGraphTraverser(object): def __init__(self, root): self.root = root - @property - def locatable(self): - """ Backwards compatibility for Malthe and David, even though - they're not supposed to be using this ;-)""" - return ILocation.providedBy(self.root) - def __call__(self, environ, _marker=_marker): try: path = environ['PATH_INFO'] @@ -239,34 +233,30 @@ class ModelGraphTraverser(object): except KeyError: pass - path = list(traversal_path(path)) - step = self._step + path = traversal_path(path) ob = self.root name = '' locatable = ILocation.providedBy(ob) - while path: - segment = path.pop(0) - segment, next = step(ob, segment, _marker) - if next is _marker: - name = segment - break + i = 1 + for segment in path: + if segment[:2] =='@@': + return ob, segment[2:], list(path[i:]) + try: + getitem = ob.__getitem__ + except AttributeError: + return ob, segment, list(path[i:]) + try: + next = getitem(segment) + except KeyError: + return ob, segment, list(path[i:]) if locatable and (not ILocation.providedBy(next)): next = LocationProxy(next, ob, segment) ob = next + i += 1 - return ob, name, path - - def _step(self, ob, name, default): - if name.startswith('@@'): - return name[2:], default - if not hasattr(ob, '__getitem__'): - return name, default - try: - return name, ob[name] - except KeyError: - return name, default + return ob, '', [] class TraversalContextURL(object): """ The IContextURL adapter used to generate URLs for a context |
