From dc16fa3fed6bfde513cdf2f9ebdccb23e1a4e5f4 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Thu, 22 Jan 2009 17:32:56 +0000 Subject: - ``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. --- repoze/bfg/traversal.py | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'repoze/bfg/traversal.py') 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) -- cgit v1.2.3