summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-06-24 06:10:14 +0000
committerChris McDonough <chrism@agendaless.com>2009-06-24 06:10:14 +0000
commit5a11c03834cf4aedf2c21c050d2dea0b2d229076 (patch)
tree9f0caf887678c0248d59a35f38597a3c50e6c32e
parent5e3e39bfb3fe6d5252e428f2eea4e34498b24ba1 (diff)
downloadpyramid-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.rst5
-rw-r--r--docs/tutorials/bfgwiki2/src/authorization/tutorial/login.py4
-rw-r--r--docs/tutorials/bfgwiki2/src/authorization/tutorial/views.py23
-rw-r--r--docs/tutorials/bfgwiki2/src/views/tutorial/views.py23
-rw-r--r--repoze/bfg/tests/test_url.py77
-rw-r--r--repoze/bfg/url.py28
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))