summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-06-24 01:14:04 +0000
committerChris McDonough <chrism@agendaless.com>2009-06-24 01:14:04 +0000
commit3d38927015524fb7e8c582894912d74392bc25fa (patch)
tree224782858f97d35708d6667bc5cd5e6b69a10d0c
parent732b751cb5b4479637d3ecb2411e3f706d792583 (diff)
downloadpyramid-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.txt6
-rw-r--r--repoze/bfg/tests/test_traversal.py48
-rw-r--r--repoze/bfg/tests/test_zcml.py19
-rw-r--r--repoze/bfg/traversal.py20
-rw-r--r--repoze/bfg/zcml.py4
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: