summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Merickel <michael@merickel.org>2013-11-07 01:29:10 -0600
committerMichael Merickel <michael@merickel.org>2013-11-07 01:29:10 -0600
commite967a9da69291d603a395550b0f30868a25c4ea5 (patch)
treef30f90c02c947b8c62b0c681c1267fa9462db6b4
parent86946fde64505c55424eed4cf891b8c4a98cefd3 (diff)
downloadpyramid-e967a9da69291d603a395550b0f30868a25c4ea5.tar.gz
pyramid-e967a9da69291d603a395550b0f30868a25c4ea5.tar.bz2
pyramid-e967a9da69291d603a395550b0f30868a25c4ea5.zip
tests for custom query strings
-rw-r--r--pyramid/encode.py13
-rw-r--r--pyramid/tests/test_url.py17
-rw-r--r--pyramid/url.py14
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)