diff options
| author | Chris McDonough <chrism@agendaless.com> | 2009-01-22 17:32:56 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2009-01-22 17:32:56 +0000 |
| commit | dc16fa3fed6bfde513cdf2f9ebdccb23e1a4e5f4 (patch) | |
| tree | 5182e38b6250622d629b2dcf0aaf4b288b61974d /repoze/bfg/traversal.py | |
| parent | 74db82d177093f4b1102d70832f8abd9b894dd61 (diff) | |
| download | pyramid-dc16fa3fed6bfde513cdf2f9ebdccb23e1a4e5f4.tar.gz pyramid-dc16fa3fed6bfde513cdf2f9ebdccb23e1a4e5f4.tar.bz2 pyramid-dc16fa3fed6bfde513cdf2f9ebdccb23e1a4e5f4.zip | |
- ``repoze.bfg.traversal.split_path`` now also handles decoding
path segments to unicode (for speed, because its results are
LRU cached).
- ``repoze.bfg.traversal.step`` was made a method of the
ModelGraphTraverser.
Diffstat (limited to 'repoze/bfg/traversal.py')
| -rw-r--r-- | repoze/bfg/traversal.py | 34 |
1 files changed, 17 insertions, 17 deletions
diff --git a/repoze/bfg/traversal.py b/repoze/bfg/traversal.py index c86e5b457..4c1cb0eb3 100644 --- a/repoze/bfg/traversal.py +++ b/repoze/bfg/traversal.py @@ -114,24 +114,14 @@ def split_path(path): elif segment == '..': del clean[-1] else: + try: + segment = segment.decode('utf-8') + except UnicodeDecodeError: + raise TypeError('Could not decode path segment %r using the ' + 'UTF-8 decoding scheme' % segment) clean.append(segment) return clean -def step(ob, name, default): - try: - name = name.decode('utf-8') - except UnicodeDecodeError: - raise TypeError('Could not decode path segment "%s" using the ' - 'UTF-8 decoding scheme' % name) - 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 - _marker = object() class ModelGraphTraverser(object): @@ -145,14 +135,14 @@ class ModelGraphTraverser(object): path = environ.get('PATH_INFO', '/') path = list(split_path(path)) locatable = self.locatable - _step = step + step = self._step ob = self.root name = '' while path: segment = path.pop(0) - segment, next = _step(ob, segment, _marker) + segment, next = step(ob, segment, _marker) if next is _marker: name = segment break @@ -162,6 +152,16 @@ class ModelGraphTraverser(object): 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 + class RoutesModelTraverser(object): classProvides(ITraverserFactory) implements(ITraverser) |
