diff options
| author | Chris McDonough <chrism@agendaless.com> | 2009-06-24 01:14:04 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2009-06-24 01:14:04 +0000 |
| commit | 3d38927015524fb7e8c582894912d74392bc25fa (patch) | |
| tree | 224782858f97d35708d6667bc5cd5e6b69a10d0c | |
| parent | 732b751cb5b4479637d3ecb2411e3f706d792583 (diff) | |
| download | pyramid-3d38927015524fb7e8c582894912d74392bc25fa.tar.gz pyramid-3d38927015524fb7e8c582894912d74392bc25fa.tar.bz2 pyramid-3d38927015524fb7e8c582894912d74392bc25fa.zip | |
- ``model_url`` when passed a request that was generated as a result
of a route match would fail in a call to ``route.generate``.
| -rw-r--r-- | CHANGES.txt | 6 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_traversal.py | 48 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_zcml.py | 19 | ||||
| -rw-r--r-- | repoze/bfg/traversal.py | 20 | ||||
| -rw-r--r-- | repoze/bfg/zcml.py | 4 |
5 files changed, 77 insertions, 20 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index 33c1282e7..506035673 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,7 +1,11 @@ Next release ============ -- ... +Bug Fixes +--------- + +- ``model_url`` when passed a request that was generated as a result + of a route match would fail in a call to ``route.generate``. 1.0a2 (2009-06-23) ================== diff --git a/repoze/bfg/tests/test_traversal.py b/repoze/bfg/tests/test_traversal.py index 7d24cb9bc..081105f88 100644 --- a/repoze/bfg/tests/test_traversal.py +++ b/repoze/bfg/tests/test_traversal.py @@ -745,7 +745,7 @@ class TraversalContextURLTests(unittest.TestCase): result = context_url() self.assertEqual(result, 'http://example.com:5432//bar/') - def test_with_route(self): + def test_with_minimized_route(self): root = DummyContext() root.__name__ = None root.__parent__ = None @@ -753,13 +753,44 @@ class TraversalContextURLTests(unittest.TestCase): one.__name__ = 'one' one.__parent__ = root route = DummyRoute() + route.minimization = True request = DummyRequest({'bfg.routes.route':route, 'bfg.routes.matchdict':{'a':1}}) context_url = self._makeOne(one, request) result = context_url() - self.assertEqual(result, 'http://example.com/one/') + self.assertEqual(result, 'http://example.com:5432/example/') self.assertEqual(route.generate_kw, {'a':1, 'traverse':'/one/'}) + def test_with_non_minimized_route(self): + root = DummyContext() + root.__name__ = None + root.__parent__ = None + one = DummyContext() + one.__name__ = 'one' + one.__parent__ = root + route = DummyRoute() + route.minimization = False + request = DummyRequest({'bfg.routes.route':route, + 'bfg.routes.matchdict':{'a':1}}) + context_url = self._makeOne(one, request) + result = context_url() + self.assertEqual(result, 'http://example.com:5432/example/') + self.assertEqual(route.generate_kw, {'a':1, 'traverse':'/one/'}) + + def test_with_route_generation_fail(self): + root = DummyContext() + root.__name__ = None + root.__parent__ = None + one = DummyContext() + one.__name__ = 'one' + one.__parent__ = root + route = DummyRoute() + route.non_minimized_result = False + request = DummyRequest({'bfg.routes.route':route, + 'bfg.routes.matchdict':{'a':1}}) + context_url = self._makeOne(one, request) + self.assertRaises(ValueError, context_url) + class TestVirtualRoot(unittest.TestCase): def setUp(self): cleanUp() @@ -974,6 +1005,15 @@ class DummyContextURL: return '123' class DummyRoute: - def generate(self, **kw): + minimization = False + + minimized_result = 'example/' + non_minimized_result = '/example/' + + def generate_minimized(self, kw): + self.generate_kw = kw + return self.minimized_result + + def generate_non_minimized(self, kw): self.generate_kw = kw - return 'http://example.com' + return self.non_minimized_result diff --git a/repoze/bfg/tests/test_zcml.py b/repoze/bfg/tests/test_zcml.py index 9302486b6..84c794e89 100644 --- a/repoze/bfg/tests/test_zcml.py +++ b/repoze/bfg/tests/test_zcml.py @@ -728,7 +728,7 @@ class TestConnectRouteFunction(unittest.TestCase): def foo(): """ """ directive = DummyRouteDirective( - minimize=True, explicit=True, encoding='utf-8', static=True, + minimize=False, explicit=True, encoding='utf-8', static=True, filter=foo, absolute=True, member_name='m', collection_name='c', parent_member_name='p', parent_collection_name='c', condition_method='GET', condition_subdomain=True, @@ -743,7 +743,7 @@ class TestConnectRouteFunction(unittest.TestCase): D = mapper.connections[0][1] self.assertEqual(D['requirements'], {}) - self.assertEqual(D['_minimize'],True) + self.assertEqual(D['_minimize'],False) self.assertEqual(D['_explicit'],True) self.assertEqual(D['_encoding'],'utf-8') self.assertEqual(D['_static'],True) @@ -1364,24 +1364,25 @@ class DummyRouteDirective: path = 'path' name = 'name' view = None - factory = None + view_for = None permission = None + factory = None + minimize = True encoding = None static = False - minimize = False - explicit = False - static = False filter = None absolute = False - member_name = False + member_name = None collection_name = None - parent_member_name = None - parent_collection_name = None condition_method = None request_type = None condition_subdomain = None condition_function = None + parent_member_name = None + parent_collection_name = None subdomains = None + explicit = False + def __init__(self, **kw): if not 'requirements' in kw: kw['requirements'] = {} diff --git a/repoze/bfg/traversal.py b/repoze/bfg/traversal.py index 2c78ecdc9..e15bb8f20 100644 --- a/repoze/bfg/traversal.py +++ b/repoze/bfg/traversal.py @@ -611,14 +611,26 @@ class TraversalContextURL(object): environ = request.environ if 'bfg.routes.route' in environ: + route = environ['bfg.routes.route'] matchdict = environ['bfg.routes.matchdict'].copy() matchdict['traverse'] = path - route = environ['bfg.routes.route'] - app_url = route.generate(**matchdict) + # we can't use route.generate here because our matchdict + # keys are Unicode + if route.minimization: + segments = route.generate_minimized(matchdict) + else: + segments = route.generate_non_minimized(matchdict) + if segments is False: + raise ValueError( + "Couldn't generate URL for matchdict %r" % matchdict) + app_url = request.application_url + if segments.startswith('/'): + return app_url + segments + else: + return app_url + '/' + segments else: app_url = request.application_url # never ends in a slash - - return app_url + path + return app_url + path always_safe = ('ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' diff --git a/repoze/bfg/zcml.py b/repoze/bfg/zcml.py index 7b122e416..8d842fbfa 100644 --- a/repoze/bfg/zcml.py +++ b/repoze/bfg/zcml.py @@ -259,8 +259,8 @@ def connect_route(directive): return args = [directive.name, directive.path] kw = dict(requirements=directive.requirements) - if directive.minimize: - kw['_minimize'] = True + if not directive.minimize: + kw['_minimize'] = False if directive.explicit: kw['_explicit'] = True if directive.encoding: |
