Skip to content

Commit 1e74282

Browse files
committed
Support repeated enum arguments for clients built by discovery.
1 parent d84d6b8 commit 1e74282

3 files changed

Lines changed: 32 additions & 7 deletions

File tree

apiclient/discovery.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -424,10 +424,19 @@ def method(self, **kwargs):
424424

425425
for name, enums in enum_params.iteritems():
426426
if name in kwargs:
427-
if kwargs[name] not in enums:
428-
raise TypeError(
429-
'Parameter "%s" value "%s" is not an allowed value in "%s"' %
430-
(name, kwargs[name], str(enums)))
427+
# We need to handle the case of a repeated enum
428+
# name differently, since we want to handle both
429+
# arg='value' and arg=['value1', 'value2']
430+
if (name in repeated_params and
431+
not isinstance(kwargs[name], basestring)):
432+
values = kwargs[name]
433+
else:
434+
values = [kwargs[name]]
435+
for value in values:
436+
if value not in enums:
437+
raise TypeError(
438+
'Parameter "%s" value "%s" is not an allowed value in "%s"' %
439+
(name, value, str(enums)))
431440

432441
actual_query_params = {}
433442
actual_path_params = {}

tests/data/zoo.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,17 @@
178178
"bar"
179179
]
180180
},
181+
"er": {
182+
"type": "string",
183+
"location": "query",
184+
"required": false,
185+
"repeated": true,
186+
"enum": [
187+
"one",
188+
"two",
189+
"three"
190+
]
191+
},
181192
"rr": {
182193
"type": "string",
183194
"location": "query",

tests/test_discovery.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,13 +170,18 @@ def test_type_coercion(self):
170170
self._check_query_types(request)
171171

172172
request = zoo.query(
173-
q="foo", i="1", n="1", b="", a=[1,2,3], o={'a':1}, e='bar')
173+
q="foo", i="1", n="1", b="", a=[1,2,3], o={'a':1}, e='bar', er='two')
174174

175175
request = zoo.query(
176-
q="foo", i="1", n="1", b="", a=[1,2,3], o={'a':1}, e='bar', rr=['foo',
177-
'bar'])
176+
q="foo", i="1", n="1", b="", a=[1,2,3], o={'a':1}, e='bar',
177+
er=['one', 'three'], rr=['foo', 'bar'])
178178
self._check_query_types(request)
179179

180+
# Five is right out.
181+
self.assertRaisesRegexp(
182+
TypeError, '"five" is not an allowed value in',
183+
zoo.query, er=['one', 'five'])
184+
180185
def test_optional_stack_query_parameters(self):
181186
http = HttpMock(datafile('zoo.json'), {'status': '200'})
182187
zoo = build('zoo', 'v1', http)

0 commit comments

Comments
 (0)