Parameter values of None should be treated as missing.

Fixes issue #144.

Reviewed in http://codereview.appspot.com/6295108/.
This commit is contained in:
Joe Gregorio
2012-06-20 12:21:25 -04:00
parent 46675d2a8d
commit 2467afac0b
2 changed files with 20 additions and 9 deletions

View File

@@ -268,8 +268,6 @@ def _cast(value, schema_type):
if type(value) == type('') or type(value) == type(u''):
return value
else:
if value is None:
raise ValueError('String parameters can not be None.')
return str(value)
elif schema_type == 'integer':
return str(int(value))
@@ -443,10 +441,17 @@ def _createResource(http, baseUrl, model, requestBuilder,
def method(self, **kwargs):
# Don't bother with doc string, it will be over-written by createMethod.
for name in kwargs.iterkeys():
if name not in argmap:
raise TypeError('Got an unexpected keyword argument "%s"' % name)
# Remove args that have a value of None.
keys = kwargs.keys()
for name in keys:
if kwargs[name] is None:
del kwargs[name]
for name in required_params:
if name not in kwargs:
raise TypeError('Missing required parameter "%s"' % name)

View File

@@ -136,6 +136,13 @@ class Discovery(unittest.TestCase):
except TypeError, e:
self.assertTrue('Missing' in str(e))
# Missing required parameters even if supplied as None.
try:
plus.activities().list(collection=None, userId=None)
self.fail()
except TypeError, e:
self.assertTrue('Missing' in str(e))
# Parameter doesn't match regex
try:
plus.activities().list(collection='not_a_collection_name', userId='me')
@@ -193,15 +200,14 @@ class Discovery(unittest.TestCase):
self.assertEqual(q['trace'], ['html'])
self.assertEqual(q['fields'], ['description'])
def test_string_params_none_is_invalid(self):
def test_string_params_value_of_none_get_dropped(self):
http = HttpMock(datafile('zoo.json'), {'status': '200'})
zoo = build('zoo', 'v1', http)
# String isn't None
try:
request = zoo.query(trace=None, fields='description')
self.fail()
except ValueError, e:
self.assertTrue('None' in str(e))
request = zoo.query(trace=None, fields='description')
parsed = urlparse.urlparse(request.uri)
q = parse_qs(parsed[4])
self.assertFalse('trace' in q)
def test_model_added_query_parameters(self):
http = HttpMock(datafile('zoo.json'), {'status': '200'})