diff options
| author | Michael Merickel <michael@merickel.org> | 2013-11-07 01:29:10 -0600 |
|---|---|---|
| committer | Michael Merickel <michael@merickel.org> | 2013-11-07 01:29:10 -0600 |
| commit | e967a9da69291d603a395550b0f30868a25c4ea5 (patch) | |
| tree | f30f90c02c947b8c62b0c681c1267fa9462db6b4 | |
| parent | 86946fde64505c55424eed4cf891b8c4a98cefd3 (diff) | |
| download | pyramid-e967a9da69291d603a395550b0f30868a25c4ea5.tar.gz pyramid-e967a9da69291d603a395550b0f30868a25c4ea5.tar.bz2 pyramid-e967a9da69291d603a395550b0f30868a25c4ea5.zip | |
tests for custom query strings
| -rw-r--r-- | pyramid/encode.py | 13 | ||||
| -rw-r--r-- | pyramid/tests/test_url.py | 17 | ||||
| -rw-r--r-- | pyramid/url.py | 14 |
3 files changed, 33 insertions, 11 deletions
diff --git a/pyramid/encode.py b/pyramid/encode.py index 9e190bc21..d2376109e 100644 --- a/pyramid/encode.py +++ b/pyramid/encode.py @@ -3,7 +3,7 @@ from pyramid.compat import ( binary_type, is_nonstr_iter, url_quote as _url_quote, - url_quote_plus as quote_plus, # bw compat api (dnr) + url_quote_plus as _quote_plus, ) def url_quote(s, safe=''): # bw compat api @@ -47,28 +47,29 @@ def urlencode(query, doseq=True): prefix = '' for (k, v) in query: - k = _enc(k) + k = quote_plus(k) if is_nonstr_iter(v): for x in v: - x = _enc(x) + x = quote_plus(x) result += '%s%s=%s' % (prefix, k, x) prefix = '&' elif v is None: result += '%s%s=' % (prefix, k) else: - v = _enc(v) + v = quote_plus(v) result += '%s%s=%s' % (prefix, k, v) prefix = '&' return result -def _enc(val): +# bw compat api (dnr) +def quote_plus(val): cls = val.__class__ if cls is text_type: val = val.encode('utf-8') elif cls is not binary_type: val = str(val).encode('utf-8') - return quote_plus(val) + return _quote_plus(val) diff --git a/pyramid/tests/test_url.py b/pyramid/tests/test_url.py index f6117777f..9cee7f61c 100644 --- a/pyramid/tests/test_url.py +++ b/pyramid/tests/test_url.py @@ -93,6 +93,14 @@ class TestURLMethodsMixin(unittest.TestCase): result = request.resource_url(context, 'a b c') self.assertEqual(result, 'http://example.com:5432/context/a%20b%20c') + def test_resource_url_with_query_str(self): + request = self._makeOne() + self._registerResourceURL(request.registry) + context = DummyContext() + result = request.resource_url(context, 'a', query='(openlayers)') + self.assertEqual(result, + 'http://example.com:5432/context/a?%28openlayers%29') + def test_resource_url_with_query_dict(self): request = self._makeOne() self._registerResourceURL(request.registry) @@ -483,6 +491,15 @@ class TestURLMethodsMixin(unittest.TestCase): self.assertEqual(result, 'http://example.com:5432/1/2/3?q=1') + def test_route_url_with_query_str(self): + from pyramid.interfaces import IRoutesMapper + request = self._makeOne() + mapper = DummyRoutesMapper(route=DummyRoute('/1/2/3')) + request.registry.registerUtility(mapper, IRoutesMapper) + result = request.route_url('flub', _query='(openlayers)') + self.assertEqual(result, + 'http://example.com:5432/1/2/3?%28openlayers%29') + def test_route_url_with_empty_query(self): from pyramid.interfaces import IRoutesMapper request = self._makeOne() diff --git a/pyramid/url.py b/pyramid/url.py index 2e3542161..4803283c3 100644 --- a/pyramid/url.py +++ b/pyramid/url.py @@ -14,10 +14,14 @@ from pyramid.interfaces import ( from pyramid.compat import ( native_, bytes_, + string_types, text_type, url_quote, ) -from pyramid.encode import urlencode +from pyramid.encode import ( + quote_plus, + urlencode, +) from pyramid.path import caller_package from pyramid.threadlocal import get_current_registry @@ -222,8 +226,8 @@ class URLMethodsMixin(object): if '_query' in kw: query = kw.pop('_query') - if isinstance(query, text_type): - qs = '?' + native_(query) + if isinstance(query, string_types): + qs = '?' + quote_plus(query) elif query: qs = '?' + urlencode(query, doseq=True) @@ -582,8 +586,8 @@ class URLMethodsMixin(object): if 'query' in kw: query = kw['query'] - if isinstance(query, text_type): - qs = '?' + native_(query) + if isinstance(query, string_types): + qs = '?' + quote_plus(query) elif query: qs = '?' + urlencode(query, doseq=True) |
