summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES.txt18
-rw-r--r--repoze/bfg/router.py4
-rw-r--r--repoze/bfg/tests/test_router.py16
-rw-r--r--repoze/bfg/tests/test_traversal.py43
-rw-r--r--repoze/bfg/traversal.py31
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):