diff options
| author | Chris McDonough <chrism@agendaless.com> | 2009-06-24 06:10:14 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2009-06-24 06:10:14 +0000 |
| commit | 5a11c03834cf4aedf2c21c050d2dea0b2d229076 (patch) | |
| tree | 9f0caf887678c0248d59a35f38597a3c50e6c32e | |
| parent | 5e3e39bfb3fe6d5252e428f2eea4e34498b24ba1 (diff) | |
| download | pyramid-5a11c03834cf4aedf2c21c050d2dea0b2d229076.tar.gz pyramid-5a11c03834cf4aedf2c21c050d2dea0b2d229076.tar.bz2 pyramid-5a11c03834cf4aedf2c21c050d2dea0b2d229076.zip | |
Change the implementation and the signature for ``route_url``.
| -rw-r--r-- | docs/narr/urldispatch.rst | 5 | ||||
| -rw-r--r-- | docs/tutorials/bfgwiki2/src/authorization/tutorial/login.py | 4 | ||||
| -rw-r--r-- | docs/tutorials/bfgwiki2/src/authorization/tutorial/views.py | 23 | ||||
| -rw-r--r-- | docs/tutorials/bfgwiki2/src/views/tutorial/views.py | 23 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_url.py | 77 | ||||
| -rw-r--r-- | repoze/bfg/url.py | 28 |
6 files changed, 96 insertions, 64 deletions
diff --git a/docs/narr/urldispatch.rst b/docs/narr/urldispatch.rst index dab026455..356a14aef 100644 --- a/docs/narr/urldispatch.rst +++ b/docs/narr/urldispatch.rst @@ -399,10 +399,11 @@ this. .. code-block:: python from repoze.bfg.url import route_url - url = route_url('foo', a='1', b='2', c='3') + url = route_url(request, 'foo', a='1', b='2', c='3') This would return something like the string -``http://example.com/1/2/3``. +``http://example.com/1/2/3`` (at least if the current protocol and +hostname implied ``http:/example.com``). Cleaning Up After a Request --------------------------- diff --git a/docs/tutorials/bfgwiki2/src/authorization/tutorial/login.py b/docs/tutorials/bfgwiki2/src/authorization/tutorial/login.py index e3b554a45..651259855 100644 --- a/docs/tutorials/bfgwiki2/src/authorization/tutorial/login.py +++ b/docs/tutorials/bfgwiki2/src/authorization/tutorial/login.py @@ -8,7 +8,7 @@ from repoze.bfg.url import route_url from tutorial.run import USERS def login(request): - login_url = route_url('login') + login_url = route_url(request, 'login') referrer = request.environ.get('HTTP_REFERER', '/') if referrer == login_url: referrer = '/' # never use the login form itself as came_from @@ -37,6 +37,6 @@ def login(request): def logout(request): headers = forget(request) - return HTTPFound(location = route_url('view_wiki'), + return HTTPFound(location = route_url(request, 'view_wiki'), headers = headers) diff --git a/docs/tutorials/bfgwiki2/src/authorization/tutorial/views.py b/docs/tutorials/bfgwiki2/src/authorization/tutorial/views.py index bd146673c..fe2be54a1 100644 --- a/docs/tutorials/bfgwiki2/src/authorization/tutorial/views.py +++ b/docs/tutorials/bfgwiki2/src/authorization/tutorial/views.py @@ -18,7 +18,8 @@ wikiwords = re.compile(r"\b([A-Z]\w+[A-Z]+\w+)") static_view = static('templates/static') def view_wiki(request): - return HTTPFound(location = route_url('view_page', pagename='FrontPage')) + return HTTPFound(location = route_url(request, 'view_page', + pagename='FrontPage')) def view_page(request): pagename = request.matchdict['pagename'] @@ -29,15 +30,15 @@ def view_page(request): word = match.group(1) exists = session.query(Page).filter_by(name=word).all() if exists: - view_url = route_url('view_page', pagename=word) + view_url = route_url(request, 'view_page', pagename=word) return '<a href="%s">%s</a>' % (view_url, word) else: - add_url = route_url('add_page', pagename=word) + add_url = route_url(request, 'add_page', pagename=word) return '<a href="%s">%s</a>' % (add_url, word) content = publish_parts(page.data, writer_name='html')['html_body'] content = wikiwords.sub(check, content) - edit_url = route_url('edit_page', pagename=pagename) + edit_url = route_url(request, 'edit_page', pagename=pagename) logged_in = authenticated_userid(request) return render_template_to_response('templates/view.pt', request = request, @@ -53,8 +54,9 @@ def add_page(request): body = request.params['body'] page = Page(name, body) session.add(page) - return HTTPFound(location = route_url('view_page', pagename=name)) - save_url = route_url('add_page', pagename=name) + return HTTPFound(location = route_url(request, 'view_page', + pagename=name)) + save_url = route_url(request, 'add_page', pagename=name) page = Page('', '') logged_in = authenticated_userid(request) return render_template_to_response('templates/edit.pt', @@ -70,14 +72,15 @@ def edit_page(request): if 'form.submitted' in request.params: page.data = request.params['body'] session.add(page) - return HTTPFound(location = route_url('view_page', - pagename=name)) + return HTTPFound(location = route_url(request, 'view_page', + pagename=name)) logged_in = authenticated_userid(request) return render_template_to_response('templates/edit.pt', request = request, page = page, logged_in = logged_in, - save_url = route_url('edit_page', - pagename=name), + save_url = route_url(request, + 'edit_page', + pagename=name), ) diff --git a/docs/tutorials/bfgwiki2/src/views/tutorial/views.py b/docs/tutorials/bfgwiki2/src/views/tutorial/views.py index aeec1ffe6..947950896 100644 --- a/docs/tutorials/bfgwiki2/src/views/tutorial/views.py +++ b/docs/tutorials/bfgwiki2/src/views/tutorial/views.py @@ -17,7 +17,8 @@ wikiwords = re.compile(r"\b([A-Z]\w+[A-Z]+\w+)") static_view = static('templates/static') def view_wiki(context, request): - return HTTPFound(location = route_url('view_page', pagename='FrontPage')) + return HTTPFound(location = route_url(request, 'view_page', + pagename='FrontPage')) def view_page(context, request): matchdict = request.matchdict @@ -28,15 +29,15 @@ def view_page(context, request): word = match.group(1) exists = session.query(Page).filter_by(name=word).all() if exists: - view_url = route_url('view_page', pagename=word) + view_url = route_url(request, 'view_page', pagename=word) return '<a href="%s">%s</a>' % (view_url, word) else: - add_url = route_url('add_page', pagename=word) + add_url = route_url(request, 'add_page', pagename=word) return '<a href="%s">%s</a>' % (add_url, word) content = publish_parts(page.data, writer_name='html')['html_body'] content = wikiwords.sub(check, content) - edit_url = route_url('edit_page', pagename=matchdict['pagename']) + edit_url = route_url(request, 'edit_page', pagename=matchdict['pagename']) return render_template_to_response('templates/view.pt', request = request, page = page, @@ -50,8 +51,9 @@ def add_page(context, request): body = request.params['body'] page = Page(name, body) session.add(page) - return HTTPFound(location = route_url('view_page', pagename=name)) - save_url = route_url('add_page', pagename=name) + return HTTPFound(location = route_url(request, 'view_page', + pagename=name)) + save_url = route_url(request, 'add_page', pagename=name) page = Page('', '') return render_template_to_response('templates/edit.pt', request = request, @@ -65,12 +67,13 @@ def edit_page(context, request): if 'form.submitted' in request.params: page.data = request.params['body'] session.add(page) - return HTTPFound(location = route_url('view_page', - pagename=name)) + return HTTPFound(location = route_url(request, 'view_page', + pagename=name)) return render_template_to_response('templates/edit.pt', request = request, page = page, - save_url = route_url('edit_page', - pagename=name), + save_url = route_url(request, + 'edit_page', + pagename=name), ) diff --git a/repoze/bfg/tests/test_url.py b/repoze/bfg/tests/test_url.py index e42089173..3c5bd7559 100644 --- a/repoze/bfg/tests/test_url.py +++ b/repoze/bfg/tests/test_url.py @@ -158,48 +158,41 @@ class UrlEncodeTests(unittest.TestCase): self.assertEqual(result, 'a=1') class TestRouteUrl(unittest.TestCase): + def setUp(self): + cleanUp() + + def tearDown(self): + cleanUp() + def _callFUT(self, *arg, **kw): from repoze.bfg.url import route_url return route_url(*arg, **kw) def test_it(self): - from routes import Mapper - mapper = Mapper(controller_scan=None, directory=None, - explicit=True, always_scan=False) + from repoze.bfg.interfaces import IRoutesMapper + mapper = DummyRoutesMapper({'flub':DummyRoute({})}) + from zope.component import getSiteManager + sm = getSiteManager() + sm.registerUtility(mapper, IRoutesMapper) args = {'a':'1', 'b':'2', 'c':'3'} - mapper.connect('flub', ':a/:b/:c') - mapper.create_regs([]) environ = {'SERVER_NAME':'example.com', 'wsgi.url_scheme':'http', 'SERVER_PORT':'80', 'wsgiorg.routing_args':((), args)} - mapper.environ = environ - from routes import request_config - config = request_config() - config.environ = environ - config.mapper = mapper - config.redirect = None - request = DummyRequest() - request.environ = environ - result = self._callFUT('flub', a=1, b=2, c=3) + request = DummyRequest(environ) + result = self._callFUT(request, 'flub', a=1, b=2, c=3) self.assertEqual(result, 'http://example.com/1/2/3') def test_it_generation_error(self): - from routes import Mapper - mapper = Mapper(controller_scan=None, directory=None, - explicit=True, always_scan=False) + from repoze.bfg.interfaces import IRoutesMapper + mapper = DummyRoutesMapper({'flub':DummyRoute({})}) + from zope.component import getSiteManager + sm = getSiteManager() + sm.registerUtility(mapper, IRoutesMapper) args = {'a':'1', 'b':'2', 'c':'3'} - mapper.connect('flub', ':a/:b/:c') - mapper.create_regs([]) + mapper.raise_exc = True environ = {'SERVER_NAME':'example.com', 'wsgi.url_scheme':'http', 'SERVER_PORT':'80', 'wsgiorg.routing_args':((), args)} - mapper.environ = environ - from routes import request_config - config = request_config() - config.environ = environ - config.mapper = mapper - config.redirect = None - request = DummyRequest() - request.environ = environ - self.assertRaises(ValueError, self._callFUT, 'flub', a=1) + request = DummyRequest(environ) + self.assertRaises(ValueError, self._callFUT, request, 'flub', a=1) class DummyContext(object): def __init__(self, next=None): @@ -207,4 +200,30 @@ class DummyContext(object): class DummyRequest: application_url = 'http://example.com:5432' # app_url never ends with slash - + def __init__(self, environ=None): + if environ is None: + environ = {} + self.environ = environ + +class DummyRoutesMapper: + encoding = 'utf-8' + hardcode_names = False + sub_domains = [] + raise_exc = False + def __init__(self, routes, generate_result='/1/2/3', raise_exc=False): + self._routenames = routes + self.generate_result = generate_result + + def generate(self, *route_args, **newargs): + if self.raise_exc: + from routes.util import GenerationException + raise GenerationException + return self.generate_result + +class DummyRoute: + filter = None + static = False + def __init__(self, defaults): + self.defaults = defaults + + diff --git a/repoze/bfg/url.py b/repoze/bfg/url.py index d3fc55203..f9927c431 100644 --- a/repoze/bfg/url.py +++ b/repoze/bfg/url.py @@ -3,28 +3,32 @@ import urllib from zope.component import queryMultiAdapter +from zope.component import getUtility from repoze.bfg.interfaces import IContextURL +from repoze.bfg.interfaces import IRoutesMapper from repoze.bfg.traversal import TraversalContextURL from repoze.bfg.traversal import quote_path_segment -from routes import url_for +from routes import URLGenerator from routes.util import GenerationException -def route_url(*arg, **kw): +def route_url(request, route_name, **kw): """Generates a fully qualified URL for a named BFG route. - Use the route's ``name`` as the first positional argument. Use - keyword arguments to supply values which match any dynamic path - elements in the route definition. Raises a ValueError exception - if the URL cannot be generated when the + Use the request object as the first positional argument. Use the + route's ``name`` as the second positional argument. Use keyword + arguments to supply values which match any dynamic path elements + in the route definition. Raises a ValueError exception if the URL + cannot be generated when the - For example, if you've defined a route named"foobar" with the path + For example, if you've defined a route named "foobar" with the path ``:foo/:bar/*traverse``:: - route_url(foo='1') => <ValueError exception> - route_url(foo='1', bar='2') => <ValueError exception> - route_url(foo='1', bar='2',traverse='a/b) => http://e.com/1/2/a/b + route_url(request, 'foobar', foo='1') => <ValueError exception> + route_url(request, 'foobar', foo='1', bar='2') => <ValueError exception> + route_url('foobar', foo='1', bar='2', + 'traverse='a/b) => http://e.com/1/2/a/b All keys given to ``route_url`` are sent to the BFG Routes "mapper" instance for generation except for:: @@ -38,7 +42,9 @@ def route_url(*arg, **kw): if not 'qualified' in kw: kw['qualified'] = True try: - return url_for(*arg, **kw) + mapper = getUtility(IRoutesMapper) + generator = URLGenerator(mapper, request.environ) + return generator(route_name, **kw) except GenerationException, why: raise ValueError(str(why)) |
