feat(Request): Make list param parsing explicity

The idea is not to have to pay for what you don't use or want. Also
makes this consistent with req.get_param_as_int.

BREAKING CHANGE: get_param will no longer return lists for
comma-separated parameter values. Use get_param_as_list instead.

Implements #18
This commit is contained in:
Kurt Griffiths
2013-02-04 17:20:15 -05:00
parent 146288a772
commit c94b924faa
3 changed files with 39 additions and 6 deletions

View File

@@ -190,3 +190,36 @@ class Request(object):
raise HTTPBadRequest('Missing query parameter',
'The "' + name + '" query parameter is required.')
def get_param_as_list(self, name, default=None, required=False):
"""Return the value of a query string parameter as an int
Args:
name: Parameter name, case-sensitive (e.g., 'limit')
default: Value to return in case the parameter is not found in the
query string, or it is not an integer (default None)
required: Set to True to raise HTTPBadRequest instead of returning
gracefully when the parameter is not found or is not an
integer (default False)
Returns:
The value of the param if it is found and can be converted to an
integer. Otherwise, returns the default value unless required is
True.
Raises
HTTPBadRequest: The param was not found in the request, but was
required.
"""
# PERF: Use if..in since it is a good all-around performer; we don't
# know how likely params are to be specified by clients.
if name in self._params:
return self._params[name].split(',')
if not required:
return default
raise HTTPBadRequest('Missing query parameter',
'The "' + name + '" query parameter is required.')

View File

@@ -44,9 +44,6 @@ def parse_query_string(query_string):
# PERF: use for loop in lieu of the dict constructor
params = {}
for k, v in QS_PATTERN.findall(query_string):
if ',' in v:
v = v.split(',')
params[k] = v
return params

View File

@@ -36,15 +36,18 @@ class TestQueryParams(helpers.TestSuite):
self._simulate_request('/', query_string=query_string)
req = self.resource.req
self.assertEquals(req.get_param('colors'),
self.assertEquals(req.get_param('colors'), 'red,green,blue')
self.assertEquals(req.get_param_as_list('colors'),
['red', 'green', 'blue'])
self.assertEquals(req.get_param('limit'), '1')
self.assertEquals(req.get_param_as_list('limit'), ['1'])
self.assertEquals(req.get_param_as_list('marker'), None)
def test_bogus_input(self):
query_string = 'colors=red,green,&limit=1&pickle'
self._simulate_request('/', query_string=query_string)
req = self.resource.req
self.assertEquals(req.get_param('colors'), ['red', 'green', ''])
self.assertEquals(req.get_param_as_list('colors'),
['red', 'green', ''])
self.assertEquals(req.get_param('limit'), '1')
self.assertEquals(req.get_param('pickle'), None)