Added support for repeating parameters
This commit is contained in:
@@ -177,7 +177,7 @@ def build_from_document(
|
|||||||
return resource
|
return resource
|
||||||
|
|
||||||
|
|
||||||
def _to_string(value, schema_type):
|
def _cast(value, schema_type):
|
||||||
"""Convert value to a string based on JSON 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
|
See http://tools.ietf.org/html/draft-zyp-json-schema-03 for more details on
|
||||||
@@ -237,6 +237,7 @@ def createResource(http, baseUrl, model, requestBuilder,
|
|||||||
|
|
||||||
argmap = {} # Map from method parameter name to query parameter name
|
argmap = {} # Map from method parameter name to query parameter name
|
||||||
required_params = [] # Required parameters
|
required_params = [] # Required parameters
|
||||||
|
repeated_params = [] # Repeated parameters
|
||||||
pattern_params = {} # Parameters that must match a regex
|
pattern_params = {} # Parameters that must match a regex
|
||||||
query_params = [] # Parameters that will be used in the query string
|
query_params = [] # Parameters that will be used in the query string
|
||||||
path_params = {} # Parameters that will be used in the base URL
|
path_params = {} # Parameters that will be used in the base URL
|
||||||
@@ -255,6 +256,8 @@ def createResource(http, baseUrl, model, requestBuilder,
|
|||||||
enum_params[param] = desc['enum']
|
enum_params[param] = desc['enum']
|
||||||
if desc.get('required', False):
|
if desc.get('required', False):
|
||||||
required_params.append(param)
|
required_params.append(param)
|
||||||
|
if desc.get('repeated', False):
|
||||||
|
repeated_params.append(param)
|
||||||
if desc.get('restParameterType') == 'query':
|
if desc.get('restParameterType') == 'query':
|
||||||
query_params.append(param)
|
query_params.append(param)
|
||||||
if desc.get('restParameterType') == 'path':
|
if desc.get('restParameterType') == 'path':
|
||||||
@@ -294,11 +297,16 @@ def createResource(http, baseUrl, model, requestBuilder,
|
|||||||
actual_query_params = {}
|
actual_query_params = {}
|
||||||
actual_path_params = {}
|
actual_path_params = {}
|
||||||
for key, value in kwargs.iteritems():
|
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:
|
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:
|
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)
|
body_value = kwargs.get('body', None)
|
||||||
|
|
||||||
if self._developerKey:
|
if self._developerKey:
|
||||||
@@ -330,17 +338,21 @@ def createResource(http, baseUrl, model, requestBuilder,
|
|||||||
|
|
||||||
docs = [methodDesc.get('description', DEFAULT_METHOD_DOC), '\n\n']
|
docs = [methodDesc.get('description', DEFAULT_METHOD_DOC), '\n\n']
|
||||||
if len(argmap) > 0:
|
if len(argmap) > 0:
|
||||||
docs.append("Args:\n")
|
docs.append('Args:\n')
|
||||||
for arg in argmap.iterkeys():
|
for arg in argmap.iterkeys():
|
||||||
if arg in STACK_QUERY_PARAMETERS:
|
if arg in STACK_QUERY_PARAMETERS:
|
||||||
continue
|
continue
|
||||||
required = ""
|
repeated = ''
|
||||||
|
if arg in repeated_params:
|
||||||
|
repeated = ' (repeated)'
|
||||||
|
required = ''
|
||||||
if arg in required_params:
|
if arg in required_params:
|
||||||
required = " (required)"
|
required = ' (required)'
|
||||||
paramdesc = methodDesc['parameters'][argmap[arg]]
|
paramdesc = methodDesc['parameters'][argmap[arg]]
|
||||||
paramdoc = paramdesc.get('description', 'A parameter')
|
paramdoc = paramdesc.get('description', 'A parameter')
|
||||||
paramtype = paramdesc.get('type', 'string')
|
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', [])
|
enum = paramdesc.get('enum', [])
|
||||||
enumDesc = paramdesc.get('enumDescriptions', [])
|
enumDesc = paramdesc.get('enumDescriptions', [])
|
||||||
if enum and enumDesc:
|
if enum and enumDesc:
|
||||||
@@ -430,7 +442,7 @@ def createResource(http, baseUrl, model, requestBuilder,
|
|||||||
if futureDesc and 'methods' in futureDesc:
|
if futureDesc and 'methods' in futureDesc:
|
||||||
for methodName, methodDesc in futureDesc['methods'].iteritems():
|
for methodName, methodDesc in futureDesc['methods'].iteritems():
|
||||||
if 'next' in methodDesc and methodName in resourceDesc['methods']:
|
if 'next' in methodDesc and methodName in resourceDesc['methods']:
|
||||||
createNextMethod(Resource, methodName + "_next",
|
createNextMethod(Resource, methodName + '_next',
|
||||||
resourceDesc['methods'][methodName],
|
resourceDesc['methods'][methodName],
|
||||||
methodDesc['next'])
|
methodDesc['next'])
|
||||||
|
|
||||||
|
|||||||
@@ -127,9 +127,14 @@ class JsonModel(Model):
|
|||||||
params.update({'alt': 'json'})
|
params.update({'alt': 'json'})
|
||||||
astuples = []
|
astuples = []
|
||||||
for key, value in params.iteritems():
|
for key, value in params.iteritems():
|
||||||
if getattr(value, 'encode', False) and callable(value.encode):
|
if type(value) == type([]):
|
||||||
value = value.encode('utf-8')
|
for x in value:
|
||||||
astuples.append((key, value))
|
x = x.encode('utf-8')
|
||||||
|
astuples.append((key, x))
|
||||||
|
else:
|
||||||
|
if getattr(value, 'encode', False) and callable(value.encode):
|
||||||
|
value = value.encode('utf-8')
|
||||||
|
astuples.append((key, value))
|
||||||
return '?' + urllib.urlencode(astuples)
|
return '?' + urllib.urlencode(astuples)
|
||||||
|
|
||||||
def response(self, resp, content):
|
def response(self, resp, content):
|
||||||
|
|||||||
@@ -21,12 +21,12 @@ import pprint
|
|||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
|
||||||
p = build("translate", "v2",
|
p = build('translate', 'v2',
|
||||||
developerKey="AIzaSyDRRpR3GS1F1_jKNNM9HCNd2wJQyPG3oN0")
|
developerKey='AIzaSyDRRpR3GS1F1_jKNNM9HCNd2wJQyPG3oN0')
|
||||||
print p.translations().list(
|
print p.translations().list(
|
||||||
source="en",
|
source='en',
|
||||||
target="fr",
|
target='fr',
|
||||||
q="flower"
|
q=['flower', 'car']
|
||||||
).execute()
|
).execute()
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|||||||
@@ -101,7 +101,9 @@ class Model(unittest.TestCase):
|
|||||||
|
|
||||||
headers = {}
|
headers = {}
|
||||||
path_params = {}
|
path_params = {}
|
||||||
query_params = {'foo': 1, 'bar': u'\N{COMET}'}
|
query_params = {'foo': 1, 'bar': u'\N{COMET}',
|
||||||
|
'baz': ['fe', 'fi', 'fo', 'fum'], # Repeated parameters
|
||||||
|
'qux': []}
|
||||||
body = {}
|
body = {}
|
||||||
|
|
||||||
headers, params, query, body = model.request(headers, path_params, query_params, body)
|
headers, params, query, body = model.request(headers, path_params, query_params, body)
|
||||||
@@ -109,9 +111,11 @@ class Model(unittest.TestCase):
|
|||||||
self.assertEqual(headers['accept'], 'application/json')
|
self.assertEqual(headers['accept'], 'application/json')
|
||||||
self.assertEqual(headers['content-type'], 'application/json')
|
self.assertEqual(headers['content-type'], 'application/json')
|
||||||
|
|
||||||
query_dict = parse_qs(query)
|
query_dict = parse_qs(query[1:])
|
||||||
self.assertEqual(query_dict['foo'], ['1'])
|
self.assertEqual(query_dict['foo'], ['1'])
|
||||||
self.assertEqual(query_dict['bar'], [u'\N{COMET}'.encode('utf-8')])
|
self.assertEqual(query_dict['bar'], [u'\N{COMET}'.encode('utf-8')])
|
||||||
|
self.assertEqual(query_dict['baz'], ['fe', 'fi', 'fo', 'fum'])
|
||||||
|
self.assertTrue('qux' not in query_dict)
|
||||||
self.assertEqual(body, '{}')
|
self.assertEqual(body, '{}')
|
||||||
|
|
||||||
def test_user_agent(self):
|
def test_user_agent(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user