Added support for repeating parameters
diff --git a/apiclient/discovery.py b/apiclient/discovery.py
index b202913..dbaac08 100644
--- a/apiclient/discovery.py
+++ b/apiclient/discovery.py
@@ -177,7 +177,7 @@
return resource
-def _to_string(value, schema_type):
+def _cast(value, schema_type):
"""Convert value to a string based on JSON Schema type.
See http://tools.ietf.org/html/draft-zyp-json-schema-03 for more details on
@@ -237,6 +237,7 @@
argmap = {} # Map from method parameter name to query parameter name
required_params = [] # Required parameters
+ repeated_params = [] # Repeated parameters
pattern_params = {} # Parameters that must match a regex
query_params = [] # Parameters that will be used in the query string
path_params = {} # Parameters that will be used in the base URL
@@ -255,6 +256,8 @@
enum_params[param] = desc['enum']
if desc.get('required', False):
required_params.append(param)
+ if desc.get('repeated', False):
+ repeated_params.append(param)
if desc.get('restParameterType') == 'query':
query_params.append(param)
if desc.get('restParameterType') == 'path':
@@ -294,11 +297,16 @@
actual_query_params = {}
actual_path_params = {}
for key, value in kwargs.iteritems():
- value_as_str = _to_string(value, param_type.get(key, 'string'))
+ to_type = param_type.get(key, 'string')
+ # For repeated parameters we cast each member of the list.
+ if key in repeated_params and type(value) == type([]):
+ cast_value = [_cast(x, to_type) for x in value]
+ else:
+ cast_value = _cast(value, to_type)
if key in query_params:
- actual_query_params[argmap[key]] = value_as_str
+ actual_query_params[argmap[key]] = cast_value
if key in path_params:
- actual_path_params[argmap[key]] = value_as_str
+ actual_path_params[argmap[key]] = cast_value
body_value = kwargs.get('body', None)
if self._developerKey:
@@ -330,17 +338,21 @@
docs = [methodDesc.get('description', DEFAULT_METHOD_DOC), '\n\n']
if len(argmap) > 0:
- docs.append("Args:\n")
+ docs.append('Args:\n')
for arg in argmap.iterkeys():
if arg in STACK_QUERY_PARAMETERS:
continue
- required = ""
+ repeated = ''
+ if arg in repeated_params:
+ repeated = ' (repeated)'
+ required = ''
if arg in required_params:
- required = " (required)"
+ required = ' (required)'
paramdesc = methodDesc['parameters'][argmap[arg]]
paramdoc = paramdesc.get('description', 'A parameter')
paramtype = paramdesc.get('type', 'string')
- docs.append(' %s: %s, %s%s\n' % (arg, paramtype, paramdoc, required))
+ docs.append(' %s: %s, %s%s%s\n' % (arg, paramtype, paramdoc, required,
+ repeated))
enum = paramdesc.get('enum', [])
enumDesc = paramdesc.get('enumDescriptions', [])
if enum and enumDesc:
@@ -430,7 +442,7 @@
if futureDesc and 'methods' in futureDesc:
for methodName, methodDesc in futureDesc['methods'].iteritems():
if 'next' in methodDesc and methodName in resourceDesc['methods']:
- createNextMethod(Resource, methodName + "_next",
+ createNextMethod(Resource, methodName + '_next',
resourceDesc['methods'][methodName],
methodDesc['next'])