diff options
| -rw-r--r-- | CHANGES.txt | 18 | ||||
| -rw-r--r-- | repoze/bfg/router.py | 4 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_router.py | 16 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_traversal.py | 43 | ||||
| -rw-r--r-- | repoze/bfg/traversal.py | 31 |
5 files changed, 27 insertions, 85 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index 8e8a901f1..96f5a8355 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -9,8 +9,11 @@ Features - Speed up ``repoze.bfg.encode.urlencode`` (nee' ``repoze.bfg.url.urlencode``) slightly. -- Speed up ``repoze.bfg.traversal.model_path`` and - ``repoze.bfg.traversal.model_path_tuple`` slightly. +- Speed up ``repoze.bfg.traversal.model_path``. + +- Speed up ``repoze.bfg.traversal.model_path_tuple`` slightly. + +- Speed up ``repoze.bfg.traversal.traverse`` slightly. Internal -------- @@ -30,13 +33,22 @@ Backwards Incompatibilities The replacement diverges from the stdlib implementation and the previous ``repoze.bfg.url`` url implementation inasmuch as its - ``doseq`` argument is a decoy: it always behaves in the + ``doseq`` argument is now a decoy: it always behaves in the ``doseq=True`` way (which is the only sane behavior) for speed purposes. The old import location (``repoze.bfg.url.urlencode``) still functions and has not been deprecated. +- In 0.8a7, the return value expected from an object implementing + ``ITraverserFactory`` was changed from a sequence of values to a + dictionary containing the keys ``context``, ``view_name``, + ``subpath``, ``traversed``, ``virtual_root``, ``virtual_root_path``, + and ``root``. Until now, old-style traversers which returned a + sequence have continued to work but have generated a deprecation + warning. In this release, traversers which return a sequence + instead of a dictionary will no longer work. + 1.1a4 (2009-09-23) ================== diff --git a/repoze/bfg/router.py b/repoze/bfg/router.py index 17879b674..4d44647be 100644 --- a/repoze/bfg/router.py +++ b/repoze/bfg/router.py @@ -82,10 +82,6 @@ class Router(object): if traverser is None: traverser = ModelGraphTraverser(root) tdict = _traverse(root, environ, traverser=traverser) - if '_deprecation_warning' in tdict: - warning = tdict.pop('_deprecation_warning') - if not warning in self.traverser_warned: - self.logger and self.logger.warn(warning) context, view_name, subpath, traversed, vroot, vroot_path = ( tdict['context'], tdict['view_name'], tdict['subpath'], tdict['traversed'], tdict['virtual_root'], diff --git a/repoze/bfg/tests/test_router.py b/repoze/bfg/tests/test_router.py index 1333390c5..3116d2572 100644 --- a/repoze/bfg/tests/test_router.py +++ b/repoze/bfg/tests/test_router.py @@ -265,22 +265,6 @@ class RouterTests(unittest.TestCase): self.assertEqual(environ['webob.adhoc_attrs']['context'], context) self.assertEqual(environ['webob.adhoc_attrs']['root'], context) - def test_call_deprecation_warning(self): - context = DummyContext() - self._registerTraverserFactory(context, _deprecation_warning='abc') - response = DummyResponse() - response.app_iter = ['Hello world'] - view = DummyView(response) - environ = self._makeEnviron() - self._registerView(view, '', None, None) - router = self._makeOne() - logger = self._registerLogger() - router.logger = logger - start_response = DummyStartResponse() - router(environ, start_response) - self.assertEqual(len(logger.messages), 1) - self.assertEqual(logger.messages[0], 'abc') - def test_call_view_registered_nonspecific_nondefault_path_and_subpath(self): context = DummyContext() self._registerTraverserFactory(context, view_name='foo', diff --git a/repoze/bfg/tests/test_traversal.py b/repoze/bfg/tests/test_traversal.py index 3f347dc22..a4e90bc07 100644 --- a/repoze/bfg/tests/test_traversal.py +++ b/repoze/bfg/tests/test_traversal.py @@ -953,6 +953,17 @@ class TraverseTests(unittest.TestCase): self.assertEqual(root.wascontext, True) self.assertEqual(root.environ['PATH_INFO'], '/') + def test_empty_sequence(self): + root = DummyContext() + model = DummyContext() + model.__parent__ = root + model.__name__ = 'baz' + traverser = make_traverser({'context':root, 'view_name':''}) + self._registerTraverserFactory(traverser) + self._callFUT(model, []) + self.assertEqual(model.wascontext, True) + self.assertEqual(model.environ['PATH_INFO'], '') + class UnderTraverseTests(unittest.TestCase): def setUp(self): cleanUp() @@ -990,38 +1001,6 @@ class UnderTraverseTests(unittest.TestCase): result = self._callFUT(context, None, traverser) self.assertEqual(result, {'a':'1'}) - def test_issixtuple(self): - traverser = make_traverser((1,2,3,4,5,6)) - self._registerTraverserFactory(traverser) - context = DummyContext() - result = self._callFUT(context, None) - self.assertEqual(result['context'], 1) - self.assertEqual(result['view_name'], 2) - self.assertEqual(result['subpath'], 3) - self.assertEqual(result['traversed'], 4) - self.assertEqual(result['virtual_root'], 5) - self.assertEqual(result['virtual_root_path'], 6) - self.assertEqual(result['root'], None) - self.failUnless(result['_deprecation_warning'].startswith( - "<class 'repoze.bfg.tests.test_traversal.DummyTraverser'>")) - self.failUnless("6-argument tuple" in result['_deprecation_warning']) - - def test_isthreetuple(self): - traverser = make_traverser((1,2,3)) - self._registerTraverserFactory(traverser) - context = DummyContext() - result = self._callFUT(context, None) - self.assertEqual(result['context'], 1) - self.assertEqual(result['view_name'], 2) - self.assertEqual(result['subpath'], 3) - self.assertEqual(result['traversed'], None) - self.assertEqual(result['virtual_root'], None) - self.assertEqual(result['virtual_root_path'], None) - self.assertEqual(result['root'], None) - self.failUnless(result['_deprecation_warning'].startswith( - "<class 'repoze.bfg.tests.test_traversal.DummyTraverser'>")) - self.failUnless("3-argument tuple" in result['_deprecation_warning']) - def make_traverser(result): class DummyTraverser(object): def __init__(self, context): diff --git a/repoze/bfg/traversal.py b/repoze/bfg/traversal.py index b43bbc295..01a5b9321 100644 --- a/repoze/bfg/traversal.py +++ b/repoze/bfg/traversal.py @@ -141,10 +141,6 @@ def model_path(model, *elements): # which caches the joined result for us return _join_path_tuple(model_path_tuple(model, *elements)) -@lru_cache(1000) -def _join_path_tuple(tuple): - return tuple and '/'.join([quote_path_segment(x) for x in tuple]) or '/' - def traverse(model, path): """Given a model object as ``model`` and a string or tuple representing a path as ``path`` (such as the return value of @@ -265,9 +261,8 @@ def traverse(model, path): # unicode and it expects path segments to be utf-8 and # urlencoded (it's the same traverser which accepts PATH_INFO # from user agents; user agents always send strings). - path = [quote_path_segment(name) for name in path] if path: - path = '/'.join(path) or '/' + path = _join_path_tuple(tuple(path)) else: path = '' @@ -283,30 +278,6 @@ def _traverse(model, environ, traverser=None): traverser = ModelGraphTraverser(model) result = traverser(environ) - - if result.__class__ is not dict: # isinstance slightly slower - deprecation_warning = None - try: - # b/w compat for 6-arg returning ITraversers (0.7.1 til 0.8a7) - ctx, view_name, subpath, traversed, vroot, vroot_path = result - except ValueError: - # b/w compat for 3-arg returning ITraversers (0.7.0-style - # and below) - ctx, view_name, subpath = result - traversed = None - vroot = None - vroot_path = None - deprecation_warning = ( - '%r is an pre-0.8-style ITraverser returning a %s-argument tuple; ' - 'please update it to the new ITraverser interface which returns ' - 'a dictionary for improved functionality. See the ' - '"repoze.bfg.interfaces" module for the new ITraverser interface ' - 'definition.' % (traverser.__class__, len(result))) - - result = {'context':ctx, 'view_name':view_name, 'subpath':subpath, - 'traversed':traversed, 'virtual_root':vroot, - 'virtual_root_path':vroot_path, 'root':None, - '_deprecation_warning':deprecation_warning} return result def model_path_tuple(model, *elements): |
