From 8e7d3d1a7203a062627ab1ffe7cc0b01315287c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ville=20Skytt=C3=A4?= Date: Thu, 1 Sep 2016 10:05:52 +0300 Subject: [PATCH] Python fixes (#3689) * python: Fix unsupported method exception message * python: Implement form data collection formatting --- .../src/main/resources/python/api.mustache | 2 +- .../main/resources/python/api_client.mustache | 27 +++++++++++++++- .../python/petstore_api/api_client.py | 27 +++++++++++++++- .../python/petstore_api/apis/fake_api.py | 32 +++++++++---------- .../python/petstore_api/apis/pet_api.py | 6 ++-- 5 files changed, 72 insertions(+), 22 deletions(-) diff --git a/modules/swagger-codegen/src/main/resources/python/api.mustache b/modules/swagger-codegen/src/main/resources/python/api.mustache index 37e842a06ff6..b6b7ac400ec1 100644 --- a/modules/swagger-codegen/src/main/resources/python/api.mustache +++ b/modules/swagger-codegen/src/main/resources/python/api.mustache @@ -163,7 +163,7 @@ class {{classname}}(object): local_var_files = {} {{#formParams}} if '{{paramName}}' in params: - {{#notFile}}form_params.append(('{{baseName}}', params['{{paramName}}'])){{/notFile}}{{#isFile}}local_var_files['{{baseName}}'] = params['{{paramName}}']{{/isFile}} + {{#notFile}}form_params.extend(self.api_client.parameter_to_tuples('{{collectionFormat}}', '{{baseName}}', params['{{paramName}}'])){{/notFile}}{{#isFile}}local_var_files['{{baseName}}'] = params['{{paramName}}']{{/isFile}} {{/formParams}} body_params = None diff --git a/modules/swagger-codegen/src/main/resources/python/api_client.mustache b/modules/swagger-codegen/src/main/resources/python/api_client.mustache index ea721a1bc3e2..5abc2a360d95 100644 --- a/modules/swagger-codegen/src/main/resources/python/api_client.mustache +++ b/modules/swagger-codegen/src/main/resources/python/api_client.mustache @@ -370,10 +370,35 @@ class ApiClient(object): body=body) else: raise ValueError( - "http method must be `GET`, `HEAD`," + "http method must be `GET`, `HEAD`, `OPTIONS`," " `POST`, `PATCH`, `PUT` or `DELETE`." ) + def parameter_to_tuples(self, collection_format, name, value): + """ + Get parameter as list of tuples according to collection format. + + :param str collection_format: Collection format + :param str name: Parameter name + :param value: Parameter value + :return: Parameter as list of tuples + """ + if isinstance(value, (list, tuple)): + if collection_format == "multi": + return [(name, v) for v in value] + else: + if collection_format == "ssv": + delimiter = " " + elif collection_format == "tsv": + delimiter = "\t" + elif collection_format == "pipes": + delimiter = "|" + else: # csv is the default + delimiter = "," + return [(name, delimiter.join(value))] + else: + return [(name, value)] + def prepare_post_parameters(self, post_params=None, files=None): """ Builds form parameters. diff --git a/samples/client/petstore/python/petstore_api/api_client.py b/samples/client/petstore/python/petstore_api/api_client.py index c4096d4bc638..e36a115e0d60 100644 --- a/samples/client/petstore/python/petstore_api/api_client.py +++ b/samples/client/petstore/python/petstore_api/api_client.py @@ -370,10 +370,35 @@ class ApiClient(object): body=body) else: raise ValueError( - "http method must be `GET`, `HEAD`," + "http method must be `GET`, `HEAD`, `OPTIONS`," " `POST`, `PATCH`, `PUT` or `DELETE`." ) + def parameter_to_tuples(self, collection_format, name, value): + """ + Get parameter as list of tuples according to collection format. + + :param str collection_format: Collection format + :param str name: Parameter name + :param value: Parameter value + :return: Parameter as list of tuples + """ + if isinstance(value, (list, tuple)): + if collection_format == "multi": + return [(name, v) for v in value] + else: + if collection_format == "ssv": + delimiter = " " + elif collection_format == "tsv": + delimiter = "\t" + elif collection_format == "pipes": + delimiter = "|" + else: # csv is the default + delimiter = "," + return [(name, delimiter.join(value))] + else: + return [(name, value)] + def prepare_post_parameters(self, post_params=None, files=None): """ Builds form parameters. diff --git a/samples/client/petstore/python/petstore_api/apis/fake_api.py b/samples/client/petstore/python/petstore_api/apis/fake_api.py index 6a2dd0b852af..5dd2a3270217 100644 --- a/samples/client/petstore/python/petstore_api/apis/fake_api.py +++ b/samples/client/petstore/python/petstore_api/apis/fake_api.py @@ -289,31 +289,31 @@ class FakeApi(object): form_params = [] local_var_files = {} if 'integer' in params: - form_params.append(('integer', params['integer'])) + form_params.extend(self.api_client.parameter_to_tuples('', 'integer', params['integer'])) if 'int32' in params: - form_params.append(('int32', params['int32'])) + form_params.extend(self.api_client.parameter_to_tuples('', 'int32', params['int32'])) if 'int64' in params: - form_params.append(('int64', params['int64'])) + form_params.extend(self.api_client.parameter_to_tuples('', 'int64', params['int64'])) if 'number' in params: - form_params.append(('number', params['number'])) + form_params.extend(self.api_client.parameter_to_tuples('', 'number', params['number'])) if 'float' in params: - form_params.append(('float', params['float'])) + form_params.extend(self.api_client.parameter_to_tuples('', 'float', params['float'])) if 'double' in params: - form_params.append(('double', params['double'])) + form_params.extend(self.api_client.parameter_to_tuples('', 'double', params['double'])) if 'string' in params: - form_params.append(('string', params['string'])) + form_params.extend(self.api_client.parameter_to_tuples('', 'string', params['string'])) if 'pattern_without_delimiter' in params: - form_params.append(('pattern_without_delimiter', params['pattern_without_delimiter'])) + form_params.extend(self.api_client.parameter_to_tuples('', 'pattern_without_delimiter', params['pattern_without_delimiter'])) if 'byte' in params: - form_params.append(('byte', params['byte'])) + form_params.extend(self.api_client.parameter_to_tuples('', 'byte', params['byte'])) if 'binary' in params: - form_params.append(('binary', params['binary'])) + form_params.extend(self.api_client.parameter_to_tuples('', 'binary', params['binary'])) if 'date' in params: - form_params.append(('date', params['date'])) + form_params.extend(self.api_client.parameter_to_tuples('', 'date', params['date'])) if 'date_time' in params: - form_params.append(('dateTime', params['date_time'])) + form_params.extend(self.api_client.parameter_to_tuples('', 'dateTime', params['date_time'])) if 'password' in params: - form_params.append(('password', params['password'])) + form_params.extend(self.api_client.parameter_to_tuples('', 'password', params['password'])) body_params = None @@ -438,11 +438,11 @@ class FakeApi(object): form_params = [] local_var_files = {} if 'enum_form_string_array' in params: - form_params.append(('enum_form_string_array', params['enum_form_string_array'])) + form_params.extend(self.api_client.parameter_to_tuples('csv', 'enum_form_string_array', params['enum_form_string_array'])) if 'enum_form_string' in params: - form_params.append(('enum_form_string', params['enum_form_string'])) + form_params.extend(self.api_client.parameter_to_tuples('', 'enum_form_string', params['enum_form_string'])) if 'enum_query_double' in params: - form_params.append(('enum_query_double', params['enum_query_double'])) + form_params.extend(self.api_client.parameter_to_tuples('', 'enum_query_double', params['enum_query_double'])) body_params = None diff --git a/samples/client/petstore/python/petstore_api/apis/pet_api.py b/samples/client/petstore/python/petstore_api/apis/pet_api.py index a186727b9589..9357e8e70e15 100644 --- a/samples/client/petstore/python/petstore_api/apis/pet_api.py +++ b/samples/client/petstore/python/petstore_api/apis/pet_api.py @@ -760,9 +760,9 @@ class PetApi(object): form_params = [] local_var_files = {} if 'name' in params: - form_params.append(('name', params['name'])) + form_params.extend(self.api_client.parameter_to_tuples('', 'name', params['name'])) if 'status' in params: - form_params.append(('status', params['status'])) + form_params.extend(self.api_client.parameter_to_tuples('', 'status', params['status'])) body_params = None @@ -872,7 +872,7 @@ class PetApi(object): form_params = [] local_var_files = {} if 'additional_metadata' in params: - form_params.append(('additionalMetadata', params['additional_metadata'])) + form_params.extend(self.api_client.parameter_to_tuples('', 'additionalMetadata', params['additional_metadata'])) if 'file' in params: local_var_files['file'] = params['file']