Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add basic support for type hints with Python #12053

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -397,7 +397,7 @@ public String getTypeDeclaration(Property p) {
MapProperty mp = (MapProperty) p;
Property inner = mp.getAdditionalProperties();

return getSwaggerType(p) + "(str, " + getTypeDeclaration(inner) + ")";
return getSwaggerType(p) + "[str, " + getTypeDeclaration(inner) + "]";
}
return super.getTypeDeclaration(p);
}
Expand All @@ -406,7 +406,15 @@ public String getTypeDeclaration(Property p) {
public String getSwaggerType(Property p) {
String swaggerType = super.getSwaggerType(p);
String type = null;
if (typeMapping.containsKey(swaggerType)) {
if (swaggerType == "array") {
return "typing.List";
} else if (swaggerType == "map") {
return "typing.Dict";
} else if (swaggerType == "DateTime") {
return "datetime.datetime";
} else if (swaggerType == "Date") {
return "datetime.date";
} else if (typeMapping.containsKey(swaggerType)) {
type = typeMapping.get(swaggerType);
if (languageSpecificPrimitives.contains(type)) {
return type;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ class {{classname}}(object):
Ref: https://github.com/swagger-api/swagger-codegen
"""

def __init__(self, api_client=None):
def __init__(self, api_client: ApiClient=None) -> None:
if api_client is None:
api_client = ApiClient()
self.api_client = api_client
self.api_client: ApiClient = api_client
{{#operation}}

def {{operationId}}(self, {{#sortParamsByRequiredFlag}}{{#allParams}}{{#required}}{{paramName}}, {{/required}}{{/allParams}}{{/sortParamsByRequiredFlag}}**kwargs): # noqa: E501
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ from six.moves.urllib.parse import quote
{{#tornado}}
import tornado.gen
{{/tornado}}
from typing import TYPE_CHECKING, overload

if TYPE_CHECKING:
import typing
from .rest import RESTResponse

from {{packageName}}.configuration import Configuration
import {{modelPackage}}
Expand Down Expand Up @@ -54,19 +59,19 @@ class ApiClient(object):
'object': object,
}

def __init__(self, configuration=None, header_name=None, header_value=None,
cookie=None):
def __init__(self, configuration: "typing.Optional[Configuration]"=None, header_name=None, header_value=None,
cookie: "typing.Optional[str]"=None):
if configuration is None:
configuration = Configuration()
self.configuration = configuration
self.configuration: "Configuration" = configuration

# Use the pool property to lazily initialize the ThreadPool.
self._pool = None
self.rest_client = rest.RESTClientObject(configuration)
self.default_headers = {}
self.default_headers: "typing.Dict[str, str]" = {}
if header_name is not None:
self.default_headers[header_name] = header_value
self.cookie = cookie
self.cookie: "typing.Optional[str]" = cookie
# Set default User-Agent.
self.user_agent = '{{#httpUserAgent}}{{{.}}}{{/httpUserAgent}}{{^httpUserAgent}}Swagger-Codegen/{{{packageVersion}}}/python{{/httpUserAgent}}'
self.client_side_validation = configuration.client_side_validation
Expand All @@ -77,21 +82,21 @@ class ApiClient(object):
self._pool.join()

@property
def pool(self):
def pool(self) -> ThreadPool:
if self._pool is None:
self._pool = ThreadPool()
return self._pool

@property
def user_agent(self):
def user_agent(self) -> str:
"""User agent for this API client"""
return self.default_headers['User-Agent']

@user_agent.setter
def user_agent(self, value):
def user_agent(self, value: str):
self.default_headers['User-Agent'] = value

def set_default_header(self, header_name, header_value):
def set_default_header(self, header_name: str, header_value: str) -> None:
self.default_headers[header_name] = header_value

{{#tornado}}
Expand Down Expand Up @@ -225,7 +230,7 @@ class ApiClient(object):
return {key: self.sanitize_for_serialization(val)
for key, val in six.iteritems(obj_dict)}

def deserialize(self, response, response_type):
def deserialize(self, response: "RESTResponse", response_type):
"""Deserializes response into an object.

:param response: RESTResponse object to be deserialized.
Expand All @@ -247,7 +252,7 @@ class ApiClient(object):

return self.__deserialize(data, response_type)

def __deserialize(self, data, klass):
def __deserialize(self, data: "typing.Union[str, typing.Dict, typing.List]", klass):
"""Deserializes dict, list, str into an object.

:param data: dict, list or str.
Expand Down Expand Up @@ -521,7 +526,7 @@ class ApiClient(object):
'Authentication token must be in `query` or `header`'
)

def __deserialize_file(self, response):
def __deserialize_file(self, response: "RESTResponse") -> str:
"""Deserializes body to file

Saves response body into a file in a temporary folder,
Expand Down
30 changes: 18 additions & 12 deletions modules/swagger-codegen/src/main/resources/python/model.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@

import pprint
import re # noqa: F401
from typing import TYPE_CHECKING

if TYPE_CHECKING:
import typing
import datetime # noqa: F401
from {{packageName}}.models import *

import six

Expand Down Expand Up @@ -52,20 +58,20 @@ class {{classname}}(object):
}
{{/discriminator}}

def __init__(self{{#vars}}, {{name}}={{#defaultValue}}{{{defaultValue}}}{{/defaultValue}}{{^defaultValue}}None{{/defaultValue}}{{/vars}}, _configuration=None): # noqa: E501
def __init__(self{{#vars}}, {{name}}: {{#defaultValue}}"{{{datatype}}}"{{/defaultValue}}{{^defaultValue}}"typing.Optional[{{{datatype}}}]"{{/defaultValue}}={{#defaultValue}}{{{defaultValue}}}{{/defaultValue}}{{^defaultValue}}None{{/defaultValue}}{{/vars}}, _configuration: "typing.Optional[Configuration]"=None) -> None: # noqa: E501
"""{{classname}} - a model defined in Swagger""" # noqa: E501
if _configuration is None:
_configuration = Configuration()
self._configuration = _configuration
self._configuration: Configuration = _configuration
{{#vars}}{{#-first}}
{{/-first}}
self._{{name}} = None
self._{{name}}: "{{datatype}}" = None
{{/vars}}
self.discriminator = {{#discriminator}}'{{discriminator}}'{{/discriminator}}{{^discriminator}}None{{/discriminator}}
self.discriminator: {{#discriminator}}str{{/discriminator}}{{^discriminator}}None{{/discriminator}} = {{#discriminator}}'{{discriminator}}'{{/discriminator}}{{^discriminator}}None{{/discriminator}}
{{#vars}}{{#-first}}
{{/-first}}
{{#required}}
self.{{name}} = {{name}}
self.{{name}}: "{{datatype}}" = {{name}}
{{/required}}
{{^required}}
if {{name}} is not None:
Expand All @@ -75,7 +81,7 @@ class {{classname}}(object):

{{#vars}}
@property
def {{name}}(self):
def {{name}}(self) -> "{{{datatype}}}":
"""Gets the {{name}} of this {{classname}}. # noqa: E501

{{#description}}
Expand All @@ -88,7 +94,7 @@ class {{classname}}(object):
return self._{{name}}

@{{name}}.setter
def {{name}}(self, {{name}}):
def {{name}}(self, {{name}}: "{{{datatype}}}") -> None:
"""Sets the {{name}} of this {{classname}}.

{{#description}}
Expand Down Expand Up @@ -184,7 +190,7 @@ class {{classname}}(object):
return self.discriminator_value_class_map.get(discriminator_value)

{{/discriminator}}
def to_dict(self):
def to_dict(self) -> "typing.Dict[str, typing.Any]":
"""Returns the model properties as a dict"""
result = {}

Expand All @@ -211,22 +217,22 @@ class {{classname}}(object):

return result

def to_str(self):
def to_str(self) -> str:
"""Returns the string representation of the model"""
return pprint.pformat(self.to_dict())

def __repr__(self):
def __repr__(self) -> str:
"""For `print` and `pprint`"""
return self.to_str()

def __eq__(self, other):
def __eq__(self, other: "typing.Any") -> bool:
"""Returns true if both objects are equal"""
if not isinstance(other, {{classname}}):
return False

return self.to_dict() == other.to_dict()

def __ne__(self, other):
def __ne__(self, other: "typing.Any") -> bool:
"""Returns true if both objects are not equal"""
if not isinstance(other, {{classname}}):
return True
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2.4.9-SNAPSHOT
2.4.30-SNAPSHOT
18 changes: 0 additions & 18 deletions samples/client/petstore/python-asyncio/Makefile

This file was deleted.

7 changes: 5 additions & 2 deletions samples/client/petstore/python-asyncio/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,22 +113,27 @@ Class | Method | HTTP request | Description
- [ArrayOfArrayOfNumberOnly](docs/ArrayOfArrayOfNumberOnly.md)
- [ArrayOfNumberOnly](docs/ArrayOfNumberOnly.md)
- [ArrayTest](docs/ArrayTest.md)
- [Boolean](docs/Boolean.md)
- [Capitalization](docs/Capitalization.md)
- [Cat](docs/Cat.md)
- [Category](docs/Category.md)
- [ClassModel](docs/ClassModel.md)
- [Client](docs/Client.md)
- [Dog](docs/Dog.md)
- [EnumArrays](docs/EnumArrays.md)
- [EnumClass](docs/EnumClass.md)
- [EnumTest](docs/EnumTest.md)
- [FormatTest](docs/FormatTest.md)
- [HasOnlyReadOnly](docs/HasOnlyReadOnly.md)
- [Ints](docs/Ints.md)
- [List](docs/List.md)
- [MapTest](docs/MapTest.md)
- [MixedPropertiesAndAdditionalPropertiesClass](docs/MixedPropertiesAndAdditionalPropertiesClass.md)
- [Model200Response](docs/Model200Response.md)
- [ModelReturn](docs/ModelReturn.md)
- [Name](docs/Name.md)
- [NumberOnly](docs/NumberOnly.md)
- [Numbers](docs/Numbers.md)
- [Order](docs/Order.md)
- [OuterBoolean](docs/OuterBoolean.md)
- [OuterComposite](docs/OuterComposite.md)
Expand All @@ -140,8 +145,6 @@ Class | Method | HTTP request | Description
- [SpecialModelName](docs/SpecialModelName.md)
- [Tag](docs/Tag.md)
- [User](docs/User.md)
- [Cat](docs/Cat.md)
- [Dog](docs/Dog.md)


## Documentation For Authorization
Expand Down
4 changes: 0 additions & 4 deletions samples/client/petstore/python-asyncio/dev-requirements.txt

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**map_property** | **dict(str, str)** | | [optional]
**map_of_map_property** | **dict(str, dict(str, str))** | | [optional]
**map_property** | **typing.Dict[str, str]** | | [optional]
**map_of_map_property** | [**typing.Dict[str, typing.Dict[str, str]]**](typing.Dict.md) | | [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)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**array_array_number** | **list[list[float]]** | | [optional]
**array_array_number** | [**typing.List[typing.List[float]]**](typing.List.md) | | [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)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**array_number** | **list[float]** | | [optional]
**array_number** | **typing.List[float]** | | [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)

Expand Down
6 changes: 3 additions & 3 deletions samples/client/petstore/python-asyncio/docs/ArrayTest.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**array_of_string** | **list[str]** | | [optional]
**array_array_of_integer** | **list[list[int]]** | | [optional]
**array_array_of_model** | **list[list[ReadOnlyFirst]]** | | [optional]
**array_of_string** | **typing.List[str]** | | [optional]
**array_array_of_integer** | [**typing.List[typing.List[int]]**](typing.List.md) | | [optional]
**array_array_of_model** | [**typing.List[typing.List[ReadOnlyFirst]]**](typing.List.md) | | [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)

Expand Down
9 changes: 9 additions & 0 deletions samples/client/petstore/python-asyncio/docs/Boolean.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Boolean

## Properties
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------

[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)


2 changes: 1 addition & 1 deletion samples/client/petstore/python-asyncio/docs/EnumArrays.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**just_symbol** | **str** | | [optional]
**array_enum** | **list[str]** | | [optional]
**array_enum** | **typing.List[str]** | | [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)

Expand Down
16 changes: 8 additions & 8 deletions samples/client/petstore/python-asyncio/docs/FakeApi.md
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,7 @@ _float = 3.4 # float | None (optional)
string = 'string_example' # str | None (optional)
binary = 'B' # str | None (optional)
_date = '2013-10-20' # date | None (optional)
date_time = '2013-10-20T19:20:30+01:00' # datetime | None (optional)
date_time = petstore_api.datetime.datetime() # datetime.datetime | None (optional)
password = 'password_example' # str | None (optional)
param_callback = 'param_callback_example' # str | None (optional)

Expand All @@ -357,7 +357,7 @@ Name | Type | Description | Notes
**string** | **str**| None | [optional]
**binary** | **str**| None | [optional]
**_date** | **date**| None | [optional]
**date_time** | **datetime**| None | [optional]
**date_time** | **datetime.datetime**| None | [optional]
**password** | **str**| None | [optional]
**param_callback** | **str**| None | [optional]

Expand Down Expand Up @@ -393,11 +393,11 @@ from pprint import pprint

# create an instance of the API class
api_instance = petstore_api.FakeApi()
enum_form_string_array = ['enum_form_string_array_example'] # list[str] | Form parameter enum test (string array) (optional)
enum_form_string_array = ['enum_form_string_array_example'] # typing.List[str] | Form parameter enum test (string array) (optional)
enum_form_string = '-efg' # str | Form parameter enum test (string) (optional) (default to -efg)
enum_header_string_array = ['enum_header_string_array_example'] # list[str] | Header parameter enum test (string array) (optional)
enum_header_string_array = ['enum_header_string_array_example'] # typing.List[str] | Header parameter enum test (string array) (optional)
enum_header_string = '-efg' # str | Header parameter enum test (string) (optional) (default to -efg)
enum_query_string_array = ['enum_query_string_array_example'] # list[str] | Query parameter enum test (string array) (optional)
enum_query_string_array = ['enum_query_string_array_example'] # typing.List[str] | Query parameter enum test (string array) (optional)
enum_query_string = '-efg' # str | Query parameter enum test (string) (optional) (default to -efg)
enum_query_integer = 56 # int | Query parameter enum test (double) (optional)
enum_query_double = 1.2 # float | Query parameter enum test (double) (optional)
Expand All @@ -413,11 +413,11 @@ except ApiException as e:

Name | Type | Description | Notes
------------- | ------------- | ------------- | -------------
**enum_form_string_array** | [**list[str]**](str.md)| Form parameter enum test (string array) | [optional]
**enum_form_string_array** | [**typing.List[str]**](str.md)| Form parameter enum test (string array) | [optional]
**enum_form_string** | **str**| Form parameter enum test (string) | [optional] [default to -efg]
**enum_header_string_array** | [**list[str]**](str.md)| Header parameter enum test (string array) | [optional]
**enum_header_string_array** | [**typing.List[str]**](str.md)| Header parameter enum test (string array) | [optional]
**enum_header_string** | **str**| Header parameter enum test (string) | [optional] [default to -efg]
**enum_query_string_array** | [**list[str]**](str.md)| Query parameter enum test (string array) | [optional]
**enum_query_string_array** | [**typing.List[str]**](str.md)| Query parameter enum test (string array) | [optional]
**enum_query_string** | **str**| Query parameter enum test (string) | [optional] [default to -efg]
**enum_query_integer** | **int**| Query parameter enum test (double) | [optional]
**enum_query_double** | **float**| Query parameter enum test (double) | [optional]
Expand Down
Loading