diff --git a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java index f0e9814fb12..3d838c22c7f 100755 --- a/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java +++ b/modules/swagger-codegen/src/main/java/io/swagger/codegen/languages/PythonClientCodegen.java @@ -21,13 +21,16 @@ import java.util.Map; import org.apache.commons.lang3.StringUtils; public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig { + public static final String PACKAGE_URL = "packageUrl"; + protected String packageName; protected String packageVersion; + protected String packageUrl; protected String apiDocPath = "docs/"; protected String modelDocPath = "docs/"; - + protected Map regexModifiers; - + private String testFolder; public PythonClientCodegen() { @@ -40,18 +43,18 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig modelPackage = "models"; apiPackage = "api"; outputFolder = "generated-code" + File.separatorChar + "python"; - + modelTemplateFiles.put("model.mustache", ".py"); apiTemplateFiles.put("api.mustache", ".py"); - + modelTestTemplateFiles.put("model_test.mustache", ".py"); apiTestTemplateFiles.put("api_test.mustache", ".py"); - + embeddedTemplateDir = templateDir = "python"; modelDocTemplateFiles.put("model_doc.mustache", ".md"); apiDocTemplateFiles.put("api_doc.mustache", ".md"); - + testFolder = "test"; languageSpecificPrimitives.clear(); @@ -98,7 +101,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig "assert", "else", "if", "pass", "yield", "break", "except", "import", "print", "class", "exec", "in", "raise", "continue", "finally", "is", "return", "def", "for", "lambda", "try", "self")); - + regexModifiers = new HashMap(); regexModifiers.put('i', "IGNORECASE"); regexModifiers.put('l', "LOCALE"); @@ -112,6 +115,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig .defaultValue("swagger_client")); cliOptions.add(new CliOption(CodegenConstants.PACKAGE_VERSION, "python package version.") .defaultValue("1.0.0")); + cliOptions.add(new CliOption(PACKAGE_URL, "python package URL.")); cliOptions.add(CliOption.newBoolean(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG_DESC).defaultValue(Boolean.TRUE.toString())); cliOptions.add(new CliOption(CodegenConstants.HIDE_GENERATION_TIMESTAMP, "hides the timestamp when files were generated") @@ -156,6 +160,10 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig additionalProperties.put("apiDocPath", apiDocPath); additionalProperties.put("modelDocPath", modelDocPath); + if (additionalProperties.containsKey(PACKAGE_URL)) { + setPackageUrl((String) additionalProperties.get(PACKAGE_URL)); + } + String swaggerFolder = packageName; modelPackage = swaggerFolder + File.separatorChar + "models"; @@ -163,12 +171,12 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig supportingFiles.add(new SupportingFile("README.mustache", "", "README.md")); supportingFiles.add(new SupportingFile("LICENSE", "", "LICENSE")); - + supportingFiles.add(new SupportingFile("setup.mustache", "", "setup.py")); supportingFiles.add(new SupportingFile("tox.mustache", "", "tox.ini")); supportingFiles.add(new SupportingFile("test-requirements.mustache", "", "test-requirements.txt")); supportingFiles.add(new SupportingFile("requirements.mustache", "", "requirements.txt")); - + supportingFiles.add(new SupportingFile("api_client.mustache", swaggerFolder, "api_client.py")); supportingFiles.add(new SupportingFile("rest.mustache", swaggerFolder, "rest.py")); supportingFiles.add(new SupportingFile("configuration.mustache", swaggerFolder, "configuration.py")); @@ -187,7 +195,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig private static String dropDots(String str) { return str.replaceAll("\\.", "_"); } - + @Override public void postProcessParameter(CodegenParameter parameter){ postProcessPattern(parameter.pattern, parameter.vendorExtensions); @@ -267,7 +275,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig public String toApiDocFilename(String name) { return toApiName(name); } - + @Override public String apiFileFolder() { @@ -278,7 +286,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig public String modelFileFolder() { return outputFolder + File.separatorChar + modelPackage().replace('.', File.separatorChar); } - + @Override public String apiTestFileFolder() { return outputFolder + File.separatorChar + testFolder; @@ -419,7 +427,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig // PhoneNumber => phone_number return underscore(dropDots(name)); } - + @Override public String toModelTestFilename(String name) { return "test_" + toModelFilename(name); @@ -433,7 +441,7 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig // e.g. PhoneNumberApi.rb => phone_number_api.rb return underscore(name) + "_api"; } - + @Override public String toApiTestFilename(String name) { return "test_" + toApiFilename(name); @@ -480,6 +488,10 @@ public class PythonClientCodegen extends DefaultCodegen implements CodegenConfig this.packageVersion = packageVersion; } + public void setPackageUrl(String packageUrl) { + this.packageUrl = packageUrl; + } + /** * Generate Python package name from String `packageName` * diff --git a/modules/swagger-codegen/src/main/resources/python/setup.mustache b/modules/swagger-codegen/src/main/resources/python/setup.mustache index f46265995fa..45606bf9474 100644 --- a/modules/swagger-codegen/src/main/resources/python/setup.mustache +++ b/modules/swagger-codegen/src/main/resources/python/setup.mustache @@ -22,7 +22,7 @@ setup( version=VERSION, description="{{appName}}", author_email="{{infoEmail}}", - url="{{infoUrl}}", + url="{{packageUrl}}", keywords=["Swagger", "{{appName}}"], install_requires=REQUIRES, packages=find_packages(), @@ -31,4 +31,4 @@ setup( {{appDescription}} """ ) -{{/hasMore}}{{/apis}}{{/apiInfo}} \ No newline at end of file +{{/hasMore}}{{/apis}}{{/apiInfo}} diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/PythonClientOptionsProvider.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/PythonClientOptionsProvider.java index ccdb38d7bab..7ad1a05752a 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/PythonClientOptionsProvider.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/options/PythonClientOptionsProvider.java @@ -1,6 +1,7 @@ package io.swagger.codegen.options; import io.swagger.codegen.CodegenConstants; +import io.swagger.codegen.languages.PythonClientCodegen; import com.google.common.collect.ImmutableMap; @@ -9,6 +10,7 @@ import java.util.Map; public class PythonClientOptionsProvider implements OptionsProvider { public static final String PACKAGE_NAME_VALUE = "swagger_client_python"; public static final String PACKAGE_VERSION_VALUE = "1.0.0-SNAPSHOT"; + public static final String PACKAGE_URL_VALUE = ""; @Override public String getLanguage() { @@ -18,7 +20,8 @@ public class PythonClientOptionsProvider implements OptionsProvider { @Override public Map createOptions() { ImmutableMap.Builder builder = new ImmutableMap.Builder(); - return builder.put(CodegenConstants.PACKAGE_NAME, PACKAGE_NAME_VALUE) + return builder.put(PythonClientCodegen.PACKAGE_URL, PACKAGE_URL_VALUE) + .put(CodegenConstants.PACKAGE_NAME, PACKAGE_NAME_VALUE) .put(CodegenConstants.PACKAGE_VERSION, PACKAGE_VERSION_VALUE) .put(CodegenConstants.SORT_PARAMS_BY_REQUIRED_FLAG, "true") .put(CodegenConstants.HIDE_GENERATION_TIMESTAMP, "true") diff --git a/modules/swagger-codegen/src/test/java/io/swagger/codegen/python/PythonClientOptionsTest.java b/modules/swagger-codegen/src/test/java/io/swagger/codegen/python/PythonClientOptionsTest.java index 2682200e60a..80fc53ac993 100644 --- a/modules/swagger-codegen/src/test/java/io/swagger/codegen/python/PythonClientOptionsTest.java +++ b/modules/swagger-codegen/src/test/java/io/swagger/codegen/python/PythonClientOptionsTest.java @@ -30,6 +30,8 @@ public class PythonClientOptionsTest extends AbstractOptionsTest { times = 1; clientCodegen.setPackageVersion(PythonClientOptionsProvider.PACKAGE_VERSION_VALUE); times = 1; + clientCodegen.setPackageUrl(PythonClientOptionsProvider.PACKAGE_URL_VALUE); + times = 1; }}; } } diff --git a/samples/client/petstore-security-test/python/README.md b/samples/client/petstore-security-test/python/README.md index e0b043e4fe0..9f90aa1d071 100644 --- a/samples/client/petstore-security-test/python/README.md +++ b/samples/client/petstore-security-test/python/README.md @@ -1,11 +1,10 @@ # petstore_api -This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ */ ' \" =end +This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ */ ' \" =end -- This Python package is automatically generated by the [Swagger Codegen](https://github.com/swagger-api/swagger-codegen) project: -- API version: 1.0.0 */ ' \" =end +- API version: 1.0.0 */ ' \" =end -- \\r\\n \\n \\r - Package version: 1.0.0 -- Build date: 2016-06-28T16:59:35.203+08:00 - Build package: class io.swagger.codegen.languages.PythonClientCodegen ## Requirements. @@ -46,29 +45,30 @@ import petstore_api Please follow the [installation procedure](#installation--usage) and then run the following: ```python +from __future__ import print_function import time import petstore_api from petstore_api.rest import ApiException from pprint import pprint # create an instance of the API class -api_instance = petstore_api.FakeApi -test_code_inject____end = 'test_code_inject____end_example' # str | To test code injection */ ' \" =end (optional) +api_instance = petstore_api.FakeApi() +test_code_inject____end____rn_n_r = 'test_code_inject____end____rn_n_r_example' # str | To test code injection */ ' \" =end -- \\r\\n \\n \\r (optional) try: - # To test code injection */ ' \" =end - api_instance.test_code_inject____end(test_code_inject____end=test_code_inject____end) + # To test code injection */ ' \" =end -- \\r\\n \\n \\r + api_instance.test_code_inject____end__rn_n_r(test_code_inject____end____rn_n_r=test_code_inject____end____rn_n_r) except ApiException as e: - print "Exception when calling FakeApi->test_code_inject____end: %s\n" % e + print("Exception when calling FakeApi->test_code_inject____end__rn_n_r: %s\n" % e) ``` ## Documentation for API Endpoints -All URIs are relative to *https://petstore.swagger.io */ ' " =end/v2 */ ' " =end* +All URIs are relative to *https://petstore.swagger.io */ ' \" =end -- \\r\\n \\n \\r/v2 */ ' \" =end -- \\r\\n \\n \\r* Class | Method | HTTP request | Description ------------ | ------------- | ------------- | ------------- -*FakeApi* | [**test_code_inject____end**](docs/FakeApi.md#test_code_inject____end) | **PUT** /fake | To test code injection */ ' \" =end +*FakeApi* | [**test_code_inject____end__rn_n_r**](docs/FakeApi.md#test_code_inject____end__rn_n_r) | **PUT** /fake | To test code injection */ ' \" =end -- \\r\\n \\n \\r ## Documentation For Models @@ -82,7 +82,7 @@ Class | Method | HTTP request | Description ## api_key - **Type**: API key -- **API key parameter name**: api_key */ ' " =end +- **API key parameter name**: api_key */ ' " =end -- \r\n \n \r - **Location**: HTTP header ## petstore_auth @@ -91,11 +91,11 @@ Class | Method | HTTP request | Description - **Flow**: implicit - **Authorization URL**: http://petstore.swagger.io/api/oauth/dialog - **Scopes**: - - **write:pets**: modify pets in your account */ ' " =end - - **read:pets**: read your pets */ ' " =end + - **write:pets**: modify pets in your account */ ' \" =end -- \\r\\n \\n \\r + - **read:pets**: read your pets */ ' \" =end -- \\r\\n \\n \\r ## Author -apiteam@swagger.io */ ' \" =end +apiteam@swagger.io */ ' \" =end -- \\r\\n \\n \\r diff --git a/samples/client/petstore-security-test/python/docs/FakeApi.md b/samples/client/petstore-security-test/python/docs/FakeApi.md index fb3ca4b4d73..c3f15c2b4b7 100644 --- a/samples/client/petstore-security-test/python/docs/FakeApi.md +++ b/samples/client/petstore-security-test/python/docs/FakeApi.md @@ -1,19 +1,20 @@ # petstore_api.FakeApi -All URIs are relative to *https://petstore.swagger.io */ ' " =end/v2 */ ' " =end* +All URIs are relative to *https://petstore.swagger.io */ ' \" =end -- \\r\\n \\n \\r/v2 */ ' \" =end -- \\r\\n \\n \\r* Method | HTTP request | Description ------------- | ------------- | ------------- -[**test_code_inject____end**](FakeApi.md#test_code_inject____end) | **PUT** /fake | To test code injection */ ' \" =end +[**test_code_inject____end__rn_n_r**](FakeApi.md#test_code_inject____end__rn_n_r) | **PUT** /fake | To test code injection */ ' \" =end -- \\r\\n \\n \\r -# **test_code_inject____end** -> test_code_inject____end(test_code_inject____end=test_code_inject____end) +# **test_code_inject____end__rn_n_r** +> test_code_inject____end__rn_n_r(test_code_inject____end____rn_n_r=test_code_inject____end____rn_n_r) -To test code injection */ ' \" =end +To test code injection */ ' \" =end -- \\r\\n \\n \\r ### Example ```python +from __future__ import print_statement import time import petstore_api from petstore_api.rest import ApiException @@ -21,20 +22,20 @@ from pprint import pprint # create an instance of the API class api_instance = petstore_api.FakeApi() -test_code_inject____end = 'test_code_inject____end_example' # str | To test code injection */ ' \" =end (optional) +test_code_inject____end____rn_n_r = 'test_code_inject____end____rn_n_r_example' # str | To test code injection */ ' \" =end -- \\r\\n \\n \\r (optional) try: - # To test code injection */ ' \" =end - api_instance.test_code_inject____end(test_code_inject____end=test_code_inject____end) + # To test code injection */ ' \" =end -- \\r\\n \\n \\r + api_instance.test_code_inject____end__rn_n_r(test_code_inject____end____rn_n_r=test_code_inject____end____rn_n_r) except ApiException as e: - print "Exception when calling FakeApi->test_code_inject____end: %s\n" % e + print("Exception when calling FakeApi->test_code_inject____end__rn_n_r: %s\n" % e) ``` ### Parameters Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **test_code_inject____end** | **str**| To test code injection */ ' \" =end | [optional] + **test_code_inject____end____rn_n_r** | **str**| To test code injection */ ' \" =end -- \\r\\n \\n \\r | [optional] ### Return type @@ -46,8 +47,8 @@ No authorization required ### HTTP request headers - - **Content-Type**: application/json, */ " =end - - **Accept**: application/json, */ " =end + - **Content-Type**: application/json, */ \" =end -- + - **Accept**: application/json, */ \" =end -- [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) diff --git a/samples/client/petstore-security-test/python/docs/ModelReturn.md b/samples/client/petstore-security-test/python/docs/ModelReturn.md index 8d45b479ac4..ad498239b57 100644 --- a/samples/client/petstore-security-test/python/docs/ModelReturn.md +++ b/samples/client/petstore-security-test/python/docs/ModelReturn.md @@ -3,7 +3,7 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**_return** | **int** | property description */ ' \" =end | [optional] +**_return** | **int** | property description */ ' \" =end -- \\r\\n \\n \\r | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/samples/client/petstore-security-test/python/petstore_api/__init__.py b/samples/client/petstore-security-test/python/petstore_api/__init__.py index 64a6832a631..6bfb00016ef 100644 --- a/samples/client/petstore-security-test/python/petstore_api/__init__.py +++ b/samples/client/petstore-security-test/python/petstore_api/__init__.py @@ -1,12 +1,12 @@ # coding: utf-8 """ - Swagger Petstore */ ' \" =end + Swagger Petstore */ ' \" =end -- \\r\\n \\n \\r - This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ */ ' \" =end + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ */ ' \" =end -- - OpenAPI spec version: 1.0.0 */ ' \" =end - Contact: apiteam@swagger.io */ ' \" =end + OpenAPI spec version: 1.0.0 */ ' \" =end -- \\r\\n \\n \\r + Contact: apiteam@swagger.io */ ' \" =end -- \\r\\n \\n \\r Generated by: https://github.com/swagger-api/swagger-codegen.git Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/samples/client/petstore-security-test/python/petstore_api/api_client.py b/samples/client/petstore-security-test/python/petstore_api/api_client.py index 2521ba15fd3..adf66173dbc 100644 --- a/samples/client/petstore-security-test/python/petstore_api/api_client.py +++ b/samples/client/petstore-security-test/python/petstore_api/api_client.py @@ -19,17 +19,15 @@ Copyright 2016 SmartBear Software """ from __future__ import absolute_import + from . import models from .rest import RESTClientObject from .rest import ApiException import os import re -import sys -import urllib import json import mimetypes -import random import tempfile import threading @@ -37,14 +35,8 @@ from datetime import datetime from datetime import date # python 2 and python 3 compatibility library -from six import iteritems - -try: - # for python3 - from urllib.parse import quote -except ImportError: - # for python2 - from urllib import quote +from six import PY3, integer_types, iteritems, text_type +from six.moves.urllib.parse import quote from .configuration import Configuration @@ -103,34 +95,40 @@ class ApiClient(object): def __call_api(self, resource_path, method, path_params=None, query_params=None, header_params=None, body=None, post_params=None, files=None, - response_type=None, auth_settings=None, callback=None, _return_http_data_only=None): + response_type=None, auth_settings=None, callback=None, + _return_http_data_only=None, collection_formats=None): - # headers parameters + # header parameters header_params = header_params or {} header_params.update(self.default_headers) if self.cookie: header_params['Cookie'] = self.cookie if header_params: header_params = self.sanitize_for_serialization(header_params) + header_params = dict(self.parameters_to_tuples(header_params, + collection_formats)) # path parameters if path_params: path_params = self.sanitize_for_serialization(path_params) - for k, v in iteritems(path_params): - replacement = quote(str(self.to_path_value(v))) - resource_path = resource_path.\ - replace('{' + k + '}', replacement) + path_params = self.parameters_to_tuples(path_params, + collection_formats) + for k, v in path_params: + resource_path = resource_path.replace( + '{%s}' % k, quote(str(v))) # query parameters if query_params: query_params = self.sanitize_for_serialization(query_params) - query_params = {k: self.to_path_value(v) - for k, v in iteritems(query_params)} + query_params = self.parameters_to_tuples(query_params, + collection_formats) # post parameters if post_params or files: post_params = self.prepare_post_parameters(post_params, files) post_params = self.sanitize_for_serialization(post_params) + post_params = self.parameters_to_tuples(post_params, + collection_formats) # auth setting self.update_params_for_auth(header_params, query_params, auth_settings) @@ -159,31 +157,16 @@ class ApiClient(object): if callback: callback(deserialized_data) if _return_http_data_only else callback((deserialized_data, response_data.status, response_data.getheaders())) elif _return_http_data_only: - return ( deserialized_data ); + return (deserialized_data) else: return (deserialized_data, response_data.status, response_data.getheaders()) - - - def to_path_value(self, obj): - """ - Takes value and turn it into a string suitable for inclusion in - the path, by url-encoding. - - :param obj: object or string value. - - :return string: quoted value. - """ - if type(obj) == list: - return ','.join(obj) - else: - return str(obj) def sanitize_for_serialization(self, obj): """ Builds a JSON POST object. If obj is None, return None. - If obj is str, int, float, bool, return directly. + If obj is str, int, long, float, bool, return directly. If obj is datetime.datetime, datetime.date convert to string in iso8601 format. If obj is list, sanitize each element in the list. @@ -193,9 +176,7 @@ class ApiClient(object): :param obj: The data to serialize. :return: The serialized form of data. """ - types = (str, int, float, bool, tuple) - if sys.version_info < (3, 0): - types = types + (unicode,) + types = (str, float, bool, bytes) + tuple(integer_types) + (text_type,) if isinstance(obj, type(None)): return None elif isinstance(obj, types): @@ -203,6 +184,9 @@ class ApiClient(object): elif isinstance(obj, list): return [self.sanitize_for_serialization(sub_obj) for sub_obj in obj] + elif isinstance(obj, tuple): + return tuple(self.sanitize_for_serialization(sub_obj) + for sub_obj in obj) elif isinstance(obj, (datetime, date)): return obj.isoformat() else: @@ -227,7 +211,7 @@ class ApiClient(object): :param response: RESTResponse object to be deserialized. :param response_type: class literal for - deserialzied object, or string of class name. + deserialized object, or string of class name. :return: deserialized object. """ @@ -272,11 +256,13 @@ class ApiClient(object): if klass in ['int', 'float', 'str', 'bool', "date", 'datetime', "object"]: klass = eval(klass) + elif klass == 'long': + klass = int if PY3 else long # for model types else: klass = eval('models.' + klass) - if klass in [int, float, str, bool]: + if klass in integer_types or klass in (float, str, bool): return self.__deserialize_primitive(data, klass) elif klass == object: return self.__deserialize_object(data) @@ -290,7 +276,8 @@ class ApiClient(object): def call_api(self, resource_path, method, path_params=None, query_params=None, header_params=None, body=None, post_params=None, files=None, - response_type=None, auth_settings=None, callback=None, _return_http_data_only=None): + response_type=None, auth_settings=None, callback=None, + _return_http_data_only=None, collection_formats=None): """ Makes the HTTP request (synchronous) and return the deserialized data. To make an async request, define a function for callback. @@ -312,6 +299,8 @@ class ApiClient(object): If provide this parameter, the request will be called asynchronously. :param _return_http_data_only: response data without head status code and headers + :param collection_formats: dict of collection formats for path, query, + header, and post parameters. :return: If provide parameter callback, the request will be called asynchronously. @@ -323,7 +312,8 @@ class ApiClient(object): return self.__call_api(resource_path, method, path_params, query_params, header_params, body, post_params, files, - response_type, auth_settings, callback, _return_http_data_only) + response_type, auth_settings, callback, + _return_http_data_only, collection_formats) else: thread = threading.Thread(target=self.__call_api, args=(resource_path, method, @@ -331,7 +321,8 @@ class ApiClient(object): header_params, body, post_params, files, response_type, auth_settings, - callback,_return_http_data_only)) + callback, _return_http_data_only, + collection_formats)) thread.start() return thread @@ -379,10 +370,41 @@ 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 parameters_to_tuples(self, params, collection_formats): + """ + Get parameters as list of tuples, formatting collections. + + :param params: Parameters as dict or list of two-tuples + :param dict collection_formats: Parameter collection formats + :return: Parameters as list of tuples, collections formatted + """ + new_params = [] + if collection_formats is None: + collection_formats = {} + for k, v in iteritems(params) if isinstance(params, dict) else params: + if k in collection_formats: + collection_format = collection_formats[k] + if collection_format == 'multi': + new_params.extend((k, value) for value in v) + else: + if collection_format == 'ssv': + delimiter = ' ' + elif collection_format == 'tsv': + delimiter = '\t' + elif collection_format == 'pipes': + delimiter = '|' + else: # csv is the default + delimiter = ',' + new_params.append( + (k, delimiter.join(str(value) for value in v))) + else: + new_params.append((k, v)) + return new_params + def prepare_post_parameters(self, post_params=None, files=None): """ Builds form parameters. @@ -450,7 +472,7 @@ class ApiClient(object): Updates header and query params based on authentication setting. :param headers: Header parameters dict to be updated. - :param querys: Query parameters dict to be updated. + :param querys: Query parameters tuple list to be updated. :param auth_settings: Authentication setting identifiers list. """ config = Configuration() @@ -466,7 +488,7 @@ class ApiClient(object): elif auth_setting['in'] == 'header': headers[auth_setting['key']] = auth_setting['value'] elif auth_setting['in'] == 'query': - querys[auth_setting['key']] = auth_setting['value'] + querys.append((auth_setting['key'], auth_setting['value'])) else: raise ValueError( 'Authentication token must be in `query` or `header`' @@ -505,7 +527,7 @@ class ApiClient(object): :param data: str. :param klass: class literal. - :return: int, float, str, bool. + :return: int, long, float, str, bool. """ try: value = klass(data) @@ -573,6 +595,9 @@ class ApiClient(object): """ instance = klass() + if not instance.swagger_types: + return data + for attr, attr_type in iteritems(instance.swagger_types): if data is not None \ and instance.attribute_map[attr] in data\ diff --git a/samples/client/petstore-security-test/python/petstore_api/apis/fake_api.py b/samples/client/petstore-security-test/python/petstore_api/apis/fake_api.py index 8e2719f3ea7..b2a58f84e7b 100644 --- a/samples/client/petstore-security-test/python/petstore_api/apis/fake_api.py +++ b/samples/client/petstore-security-test/python/petstore_api/apis/fake_api.py @@ -1,12 +1,12 @@ # coding: utf-8 """ - Swagger Petstore */ ' \" =end + Swagger Petstore */ ' \" =end -- \\r\\n \\n \\r - This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ */ ' \" =end + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ */ ' \" =end -- - OpenAPI spec version: 1.0.0 */ ' \" =end - Contact: apiteam@swagger.io */ ' \" =end + OpenAPI spec version: 1.0.0 */ ' \" =end -- \\r\\n \\n \\r + Contact: apiteam@swagger.io */ ' \" =end -- \\r\\n \\n \\r Generated by: https://github.com/swagger-api/swagger-codegen.git Licensed under the Apache License, Version 2.0 (the "License"); @@ -51,9 +51,9 @@ class FakeApi(object): config.api_client = ApiClient() self.api_client = config.api_client - def test_code_inject____end(self, **kwargs): + def test_code_inject____end__rn_n_r(self, **kwargs): """ - To test code injection */ ' \" =end + To test code injection */ ' \" =end -- \\r\\n \\n \\r This method makes a synchronous HTTP request by default. To make an @@ -62,25 +62,25 @@ class FakeApi(object): >>> def callback_function(response): >>> pprint(response) >>> - >>> thread = api.test_code_inject____end(callback=callback_function) + >>> thread = api.test_code_inject____end__rn_n_r(callback=callback_function) :param callback function: The callback function for asynchronous request. (optional) - :param str test_code_inject____end: To test code injection */ ' \" =end + :param str test_code_inject____end____rn_n_r: To test code injection */ ' \" =end -- \\r\\n \\n \\r :return: None If the method is called asynchronously, returns the request thread. """ kwargs['_return_http_data_only'] = True if kwargs.get('callback'): - return self.test_code_inject____end_with_http_info(**kwargs) + return self.test_code_inject____end__rn_n_r_with_http_info(**kwargs) else: - (data) = self.test_code_inject____end_with_http_info(**kwargs) + (data) = self.test_code_inject____end__rn_n_r_with_http_info(**kwargs) return data - def test_code_inject____end_with_http_info(self, **kwargs): + def test_code_inject____end__rn_n_r_with_http_info(self, **kwargs): """ - To test code injection */ ' \" =end + To test code injection */ ' \" =end -- \\r\\n \\n \\r This method makes a synchronous HTTP request by default. To make an @@ -89,17 +89,17 @@ class FakeApi(object): >>> def callback_function(response): >>> pprint(response) >>> - >>> thread = api.test_code_inject____end_with_http_info(callback=callback_function) + >>> thread = api.test_code_inject____end__rn_n_r_with_http_info(callback=callback_function) :param callback function: The callback function for asynchronous request. (optional) - :param str test_code_inject____end: To test code injection */ ' \" =end + :param str test_code_inject____end____rn_n_r: To test code injection */ ' \" =end -- \\r\\n \\n \\r :return: None If the method is called asynchronously, returns the request thread. """ - all_params = ['test_code_inject____end'] + all_params = ['test_code_inject____end____rn_n_r'] all_params.append('callback') all_params.append('_return_http_data_only') @@ -108,11 +108,14 @@ class FakeApi(object): if key not in all_params: raise TypeError( "Got an unexpected keyword argument '%s'" - " to method test_code_inject____end" % key + " to method test_code_inject____end__rn_n_r" % key ) params[key] = val del params['kwargs'] + + collection_formats = {} + resource_path = '/fake'.replace('{format}', 'json') path_params = {} @@ -122,20 +125,20 @@ class FakeApi(object): form_params = [] local_var_files = {} - if 'test_code_inject____end' in params: - form_params.append(('test code inject */ ' " =end', params['test_code_inject____end'])) + if 'test_code_inject____end____rn_n_r' in params: + form_params.append(('test code inject */ ' " =end -- \r\n \n \r', params['test_code_inject____end____rn_n_r'])) body_params = None # HTTP header `Accept` header_params['Accept'] = self.api_client.\ - select_header_accept(['application/json', '*/ " =end']) + select_header_accept(['application/json', '*/ \" =end -- ']) if not header_params['Accept']: del header_params['Accept'] # HTTP header `Content-Type` header_params['Content-Type'] = self.api_client.\ - select_header_content_type(['application/json', '*/ " =end']) + select_header_content_type(['application/json', '*/ \" =end -- ']) # Authentication setting auth_settings = [] @@ -150,4 +153,5 @@ class FakeApi(object): response_type=None, auth_settings=auth_settings, callback=params.get('callback'), - _return_http_data_only=params.get('_return_http_data_only')) + _return_http_data_only=params.get('_return_http_data_only'), + collection_formats=collection_formats) diff --git a/samples/client/petstore-security-test/python/petstore_api/configuration.py b/samples/client/petstore-security-test/python/petstore_api/configuration.py index 4966e045ba1..b612f103532 100644 --- a/samples/client/petstore-security-test/python/petstore_api/configuration.py +++ b/samples/client/petstore-security-test/python/petstore_api/configuration.py @@ -1,12 +1,12 @@ # coding: utf-8 """ - Swagger Petstore */ ' \" =end + Swagger Petstore */ ' \" =end -- \\r\\n \\n \\r - This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ */ ' \" =end + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ */ ' \" =end -- - OpenAPI spec version: 1.0.0 */ ' \" =end - Contact: apiteam@swagger.io */ ' \" =end + OpenAPI spec version: 1.0.0 */ ' \" =end -- \\r\\n \\n \\r + Contact: apiteam@swagger.io */ ' \" =end -- \\r\\n \\n \\r Generated by: https://github.com/swagger-api/swagger-codegen.git Licensed under the Apache License, Version 2.0 (the "License"); @@ -23,19 +23,14 @@ """ from __future__ import absolute_import -import base64 -import urllib3 -try: - import httplib -except ImportError: - # for python3 - import http.client as httplib +import urllib3 import sys import logging from six import iteritems +from six.moves import http_client as httplib def singleton(cls, *args, **kw): @@ -61,7 +56,7 @@ class Configuration(object): Constructor """ # Default Base url - self.host = "https://petstore.swagger.io */ ' " =end/v2 */ ' " =end" + self.host = "https://petstore.swagger.io */ ' \" =end -- \\r\\n \\n \\r/v2 */ ' \" =end -- \\r\\n \\n \\r" # Default api client self.api_client = None # Temp file folder for downloading files @@ -225,11 +220,11 @@ class Configuration(object): { 'type': 'api_key', 'in': 'header', - 'key': 'api_key */ ' " =end', - 'value': self.get_api_key_with_prefix('api_key */ ' " =end') + 'key': 'api_key */ ' " =end -- \r\n \n \r', + 'value': self.get_api_key_with_prefix('api_key */ ' " =end -- \r\n \n \r') }, - 'petstore_auth': + 'petstore_auth': { 'type': 'oauth2', 'in': 'header', @@ -248,6 +243,6 @@ class Configuration(object): return "Python SDK Debug Report:\n"\ "OS: {env}\n"\ "Python Version: {pyversion}\n"\ - "Version of the API: 1.0.0 */ ' \" =end\n"\ + "Version of the API: 1.0.0 */ ' \" =end -- \\r\\n \\n \\r\n"\ "SDK Package Version: 1.0.0".\ format(env=sys.platform, pyversion=sys.version) diff --git a/samples/client/petstore-security-test/python/petstore_api/models/__init__.py b/samples/client/petstore-security-test/python/petstore_api/models/__init__.py index ef665582431..d5006ee92c6 100644 --- a/samples/client/petstore-security-test/python/petstore_api/models/__init__.py +++ b/samples/client/petstore-security-test/python/petstore_api/models/__init__.py @@ -1,12 +1,12 @@ # coding: utf-8 """ - Swagger Petstore */ ' \" =end + Swagger Petstore */ ' \" =end -- \\r\\n \\n \\r - This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ */ ' \" =end + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ */ ' \" =end -- - OpenAPI spec version: 1.0.0 */ ' \" =end - Contact: apiteam@swagger.io */ ' \" =end + OpenAPI spec version: 1.0.0 */ ' \" =end -- \\r\\n \\n \\r + Contact: apiteam@swagger.io */ ' \" =end -- \\r\\n \\n \\r Generated by: https://github.com/swagger-api/swagger-codegen.git Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/samples/client/petstore-security-test/python/petstore_api/models/model_return.py b/samples/client/petstore-security-test/python/petstore_api/models/model_return.py index 2a5591fc2f0..886ec0d5601 100644 --- a/samples/client/petstore-security-test/python/petstore_api/models/model_return.py +++ b/samples/client/petstore-security-test/python/petstore_api/models/model_return.py @@ -1,12 +1,12 @@ # coding: utf-8 """ - Swagger Petstore */ ' \" =end + Swagger Petstore */ ' \" =end -- \\r\\n \\n \\r - This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ */ ' \" =end + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ */ ' \" =end -- - OpenAPI spec version: 1.0.0 */ ' \" =end - Contact: apiteam@swagger.io */ ' \" =end + OpenAPI spec version: 1.0.0 */ ' \" =end -- \\r\\n \\n \\r + Contact: apiteam@swagger.io */ ' \" =end -- \\r\\n \\n \\r Generated by: https://github.com/swagger-api/swagger-codegen.git Licensed under the Apache License, Version 2.0 (the "License"); @@ -51,11 +51,12 @@ class ModelReturn(object): self.__return = _return + @property def _return(self): """ Gets the _return of this ModelReturn. - property description */ ' \" =end + property description */ ' \" =end -- \\r\\n \\n \\r :return: The _return of this ModelReturn. :rtype: int @@ -66,7 +67,7 @@ class ModelReturn(object): def _return(self, _return): """ Sets the _return of this ModelReturn. - property description */ ' \" =end + property description */ ' \" =end -- \\r\\n \\n \\r :param _return: The _return of this ModelReturn. :type: int diff --git a/samples/client/petstore-security-test/python/petstore_api/rest.py b/samples/client/petstore-security-test/python/petstore_api/rest.py index dfb139190d7..fc6b878837c 100644 --- a/samples/client/petstore-security-test/python/petstore_api/rest.py +++ b/samples/client/petstore-security-test/python/petstore_api/rest.py @@ -1,12 +1,12 @@ # coding: utf-8 """ - Swagger Petstore */ ' \" =end + Swagger Petstore */ ' \" =end -- \\r\\n \\n \\r - This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ */ ' \" =end + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ */ ' \" =end -- - OpenAPI spec version: 1.0.0 */ ' \" =end - Contact: apiteam@swagger.io */ ' \" =end + OpenAPI spec version: 1.0.0 */ ' \" =end -- \\r\\n \\n \\r + Contact: apiteam@swagger.io */ ' \" =end -- \\r\\n \\n \\r Generated by: https://github.com/swagger-api/swagger-codegen.git Licensed under the Apache License, Version 2.0 (the "License"); @@ -24,15 +24,16 @@ from __future__ import absolute_import -import sys import io import json import ssl import certifi import logging +import re # python 2 and python 3 compatibility library -from six import iteritems +from six import PY3 +from six.moves.urllib.parse import urlencode from .configuration import Configuration @@ -41,13 +42,6 @@ try: except ImportError: raise ImportError('Swagger python client requires urllib3.') -try: - # for python3 - from urllib.parse import urlencode -except ImportError: - # for python2 - from urllib import urlencode - logger = logging.getLogger(__name__) @@ -119,7 +113,7 @@ class RESTClientObject(object): :param headers: http request headers :param body: request json body, for `application/json` :param post_params: request post parameters, - `application/x-www-form-urlencode` + `application/x-www-form-urlencoded` and `multipart/form-data` """ method = method.upper() @@ -141,19 +135,19 @@ class RESTClientObject(object): if method in ['POST', 'PUT', 'PATCH', 'OPTIONS', 'DELETE']: if query_params: url += '?' + urlencode(query_params) - if headers['Content-Type'] == 'application/json': + if re.search('json', headers['Content-Type'], re.IGNORECASE): request_body = None if body: request_body = json.dumps(body) r = self.pool_manager.request(method, url, body=request_body, headers=headers) - if headers['Content-Type'] == 'application/x-www-form-urlencoded': + elif headers['Content-Type'] == 'application/x-www-form-urlencoded': r = self.pool_manager.request(method, url, fields=post_params, encode_multipart=False, headers=headers) - if headers['Content-Type'] == 'multipart/form-data': + elif headers['Content-Type'] == 'multipart/form-data': # must del headers['Content-Type'], or the correct Content-Type # which generated by urllib3 will be overwritten. del headers['Content-Type'] @@ -161,6 +155,19 @@ class RESTClientObject(object): fields=post_params, encode_multipart=True, headers=headers) + # Pass a `string` parameter directly in the body to support + # other content types than Json when `body` argument is provided + # in serialized form + elif isinstance(body, str): + request_body = body + r = self.pool_manager.request(method, url, + body=request_body, + headers=headers) + else: + # Cannot generate the request from given parameters + msg = """Cannot prepare a request message for provided arguments. + Please check that your arguments match declared content type.""" + raise ApiException(status=0, reason=msg) # For `GET`, `HEAD` else: r = self.pool_manager.request(method, url, @@ -174,7 +181,7 @@ class RESTClientObject(object): # In the python 3, the response.data is bytes. # we need to decode it to string. - if sys.version_info > (3,): + if PY3: r.data = r.data.decode('utf8') # log response body diff --git a/samples/client/petstore-security-test/python/setup.py b/samples/client/petstore-security-test/python/setup.py index fa4081f84e6..21f9241b859 100644 --- a/samples/client/petstore-security-test/python/setup.py +++ b/samples/client/petstore-security-test/python/setup.py @@ -1,12 +1,12 @@ # coding: utf-8 """ - Swagger Petstore */ ' \" =end + Swagger Petstore */ ' \" =end -- \\r\\n \\n \\r - This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ */ ' \" =end + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ */ ' \" =end -- - OpenAPI spec version: 1.0.0 */ ' \" =end - Contact: apiteam@swagger.io */ ' \" =end + OpenAPI spec version: 1.0.0 */ ' \" =end -- \\r\\n \\n \\r + Contact: apiteam@swagger.io */ ' \" =end -- \\r\\n \\n \\r Generated by: https://github.com/swagger-api/swagger-codegen.git Licensed under the Apache License, Version 2.0 (the "License"); @@ -40,14 +40,15 @@ REQUIRES = ["urllib3 >= 1.15", "six >= 1.10", "certifi", "python-dateutil"] setup( name=NAME, version=VERSION, - description="Swagger Petstore */ ' \" =end", - author_email="apiteam@swagger.io */ ' \" =end", + description="Swagger Petstore */ ' \" =end -- \\r\\n \\n \\r", + author_email="apiteam@swagger.io */ ' \" =end -- \\r\\n \\n \\r", url="", - keywords=["Swagger", "Swagger Petstore */ ' \" =end"], + keywords=["Swagger", "Swagger Petstore */ ' \" =end -- \\r\\n \\n \\r"], install_requires=REQUIRES, packages=find_packages(), include_package_data=True, long_description="""\ - This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ */ ' \" =end + This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ */ ' \" =end -- """ ) + diff --git a/samples/client/petstore/python/setup.py b/samples/client/petstore/python/setup.py index d478ed45f59..abff48b0bd9 100644 --- a/samples/client/petstore/python/setup.py +++ b/samples/client/petstore/python/setup.py @@ -51,3 +51,4 @@ setup( This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\ """ ) +