From f0b74a1701e990ea8e6dda55307d6b3ff737ad45 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Wed, 2 Dec 2009 14:38:18 +0000 Subject: - The ``repoze.bfg.url.route_url`` function inappropriately passed along ``_query`` and/or ``_anchor`` arguments to the ``mapper.generate`` function, resulting in blowups. --- CHANGES.txt | 7 +++++++ repoze/bfg/tests/test_url.py | 6 ++++-- repoze/bfg/tests/test_urldispatch.py | 4 ---- repoze/bfg/url.py | 7 ++++--- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index 26ca58e7c..9e3b3324e 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,6 +1,13 @@ Next Release ============ +Bug Fixes +--------- + +- The ``repoze.bfg.url.route_url`` function inappropriately passed + along ``_query`` and/or ``_anchor`` arguments to the + ``mapper.generate`` function, resulting in blowups. + Backwards Incompatibilities --------------------------- diff --git a/repoze/bfg/tests/test_url.py b/repoze/bfg/tests/test_url.py index 86c1cdf11..0f5050cd4 100644 --- a/repoze/bfg/tests/test_url.py +++ b/repoze/bfg/tests/test_url.py @@ -176,7 +176,7 @@ class TestRouteUrl(unittest.TestCase): mapper.raise_exc = KeyError self.assertRaises(KeyError, self._callFUT, 'flub', request, a=1) - def test_malthe_wiggy_add_your_bug_here(self): + def test_generate_doesnt_receive_query_or_anchor(self): from repoze.bfg.interfaces import IRoutesMapper mapper = DummyRoutesMapper(result='') from zope.component import getSiteManager @@ -184,6 +184,7 @@ class TestRouteUrl(unittest.TestCase): sm.registerUtility(mapper, IRoutesMapper) request = DummyRequest() result = self._callFUT('flub', request, _query=dict(name='some_name')) + self.assertEqual(mapper.kw, {}) # shouldnt have anchor/query self.assertEqual(result, 'http://example.com:5432?name=some_name') class TestStaticUrl(unittest.TestCase): @@ -266,7 +267,8 @@ class DummyRoutesMapper: def get_routes(self): return self.routes - def generate(self, *route_args, **newargs): + def generate(self, *route_args, **kw): + self.kw = kw if self.raise_exc: raise self.raise_exc return self.result diff --git a/repoze/bfg/tests/test_urldispatch.py b/repoze/bfg/tests/test_urldispatch.py index 5e84b88b2..84484b692 100644 --- a/repoze/bfg/tests/test_urldispatch.py +++ b/repoze/bfg/tests/test_urldispatch.py @@ -35,10 +35,6 @@ class TestRoute(unittest.TestCase): route = self._makeOne(':path') self.assertEqual(route.generate({'path':'abc'}), '/abc') - def test_generate_with_query(self): - route = self._makeOne('foo') - self.assertEqual(route.generate({'_query': dict(foo=1)}), '/?foo=1') - class RoutesMapperTests(unittest.TestCase): def setUp(self): testing.setUp() diff --git a/repoze/bfg/url.py b/repoze/bfg/url.py index 961d9423c..2079b41cd 100644 --- a/repoze/bfg/url.py +++ b/repoze/bfg/url.py @@ -92,20 +92,21 @@ def route_url(route_name, request, *elements, **kw): except AttributeError: reg = get_current_registry() # b/c mapper = reg.getUtility(IRoutesMapper) - path = mapper.generate(route_name, kw) # raises KeyError if generate fails anchor = '' qs = '' if '_query' in kw: - qs = '?' + urlencode(kw['_query'], doseq=True) + qs = '?' + urlencode(kw.pop('_query'), doseq=True) if '_anchor' in kw: - anchor = kw['_anchor'] + anchor = kw.pop('_anchor') if isinstance(anchor, unicode): anchor = anchor.encode('utf-8') anchor = '#' + anchor + path = mapper.generate(route_name, kw) # raises KeyError if generate fails + if elements: suffix = _join_elements(elements) if not path.endswith('/'): -- cgit v1.2.3