Support repeated enum arguments for clients built by discovery.
diff --git a/apiclient/discovery.py b/apiclient/discovery.py
index 82629ee..02ab99e 100644
--- a/apiclient/discovery.py
+++ b/apiclient/discovery.py
@@ -424,10 +424,19 @@
for name, enums in enum_params.iteritems():
if name in kwargs:
- if kwargs[name] not in enums:
- raise TypeError(
- 'Parameter "%s" value "%s" is not an allowed value in "%s"' %
- (name, kwargs[name], str(enums)))
+ # We need to handle the case of a repeated enum
+ # name differently, since we want to handle both
+ # arg='value' and arg=['value1', 'value2']
+ if (name in repeated_params and
+ not isinstance(kwargs[name], basestring)):
+ values = kwargs[name]
+ else:
+ values = [kwargs[name]]
+ for value in values:
+ if value not in enums:
+ raise TypeError(
+ 'Parameter "%s" value "%s" is not an allowed value in "%s"' %
+ (name, value, str(enums)))
actual_query_params = {}
actual_path_params = {}
diff --git a/tests/data/zoo.json b/tests/data/zoo.json
index 9ead92a..7ef0f24 100644
--- a/tests/data/zoo.json
+++ b/tests/data/zoo.json
@@ -178,6 +178,17 @@
"bar"
]
},
+ "er": {
+ "type": "string",
+ "location": "query",
+ "required": false,
+ "repeated": true,
+ "enum": [
+ "one",
+ "two",
+ "three"
+ ]
+ },
"rr": {
"type": "string",
"location": "query",
diff --git a/tests/test_discovery.py b/tests/test_discovery.py
index f15ec62..36d9c8a 100644
--- a/tests/test_discovery.py
+++ b/tests/test_discovery.py
@@ -170,13 +170,18 @@
self._check_query_types(request)
request = zoo.query(
- q="foo", i="1", n="1", b="", a=[1,2,3], o={'a':1}, e='bar')
+ q="foo", i="1", n="1", b="", a=[1,2,3], o={'a':1}, e='bar', er='two')
request = zoo.query(
- q="foo", i="1", n="1", b="", a=[1,2,3], o={'a':1}, e='bar', rr=['foo',
- 'bar'])
+ q="foo", i="1", n="1", b="", a=[1,2,3], o={'a':1}, e='bar',
+ er=['one', 'three'], rr=['foo', 'bar'])
self._check_query_types(request)
+ # Five is right out.
+ self.assertRaisesRegexp(
+ TypeError, '"five" is not an allowed value in',
+ zoo.query, er=['one', 'five'])
+
def test_optional_stack_query_parameters(self):
http = HttpMock(datafile('zoo.json'), {'status': '200'})
zoo = build('zoo', 'v1', http)