Parameter values of None should be treated as missing.
Fixes issue #144.
Reviewed in http://codereview.appspot.com/6295108/.
diff --git a/apiclient/discovery.py b/apiclient/discovery.py
index c2429d9..ce54f88 100644
--- a/apiclient/discovery.py
+++ b/apiclient/discovery.py
@@ -268,8 +268,6 @@
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 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)
diff --git a/tests/test_discovery.py b/tests/test_discovery.py
index 8d45e2d..8d8effd 100644
--- a/tests/test_discovery.py
+++ b/tests/test_discovery.py
@@ -136,6 +136,13 @@
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 @@
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'})