diff options
| author | Chris McDonough <chrism@agendaless.com> | 2009-01-22 08:31:53 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2009-01-22 08:31:53 +0000 |
| commit | 77e32da7d3a7cdae4b85041b14e9a63578c9a5be (patch) | |
| tree | 7cb1965416d877a2bb29391bd562aeb4f73e0ee7 | |
| parent | 72c5baff65bc82e010a6f0701324e5e09c05969c (diff) | |
| download | pyramid-77e32da7d3a7cdae4b85041b14e9a63578c9a5be.tar.gz pyramid-77e32da7d3a7cdae4b85041b14e9a63578c9a5be.tar.bz2 pyramid-77e32da7d3a7cdae4b85041b14e9a63578c9a5be.zip | |
Make traversal's ``split_path`` use an LRU decorator for speed; other
minor speed tweaks.
| -rw-r--r-- | repoze/bfg/traversal.py | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/repoze/bfg/traversal.py b/repoze/bfg/traversal.py index 200deb8b7..a6c86e491 100644 --- a/repoze/bfg/traversal.py +++ b/repoze/bfg/traversal.py @@ -5,9 +5,12 @@ from zope.deferredimport import deprecated from zope.interface import classProvides from zope.interface import implements + from repoze.bfg.location import LocationProxy from repoze.bfg.location import lineage +from repoze.bfg.lru import lru_cache + from repoze.bfg.interfaces import ILocation from repoze.bfg.interfaces import ITraverser from repoze.bfg.interfaces import ITraverserFactory @@ -99,7 +102,7 @@ def model_path(model, *elements): path = '/'.join([path, suffix]) return path - +@lru_cache(500) def split_path(path): while path.startswith('/'): path = path[1:] @@ -132,34 +135,36 @@ def step(ob, name, default, as_unicode=True): except KeyError: return name, default -_marker = [] +_marker = object() class ModelGraphTraverser(object): classProvides(ITraverserFactory) implements(ITraverser) + unicode_path_segments = True def __init__(self, root): self.root = root self.locatable = ILocation.providedBy(root) - self.unicode_path_segments = True settings = queryUtility(ISettings) if settings is not None: self.unicode_path_segments = settings.unicode_path_segments - def __call__(self, environ): + def __call__(self, environ, _marker=_marker): unicode_path_segments = self.unicode_path_segments path = environ.get('PATH_INFO', '/') - path = split_path(path) - ob = self.root + path = list(split_path(path)) + locatable = self.locatable + _step = step + ob = self.root name = '' while path: segment = path.pop(0) - segment, next = step(ob, segment, _marker, unicode_path_segments) + segment, next = _step(ob, segment, _marker, unicode_path_segments) if next is _marker: name = segment break - if (self.locatable) and (not ILocation.providedBy(next)): + if locatable and (not ILocation.providedBy(next)): next = LocationProxy(next, ob, segment) ob = next |
