forked from loafle/openapi-generator-original
python: enable more mypy checks 1/n (#17556)
* python: more mypy checks * mypy: check_untyped_defs * mypy: disallow_subclassing_any * mypy: disallow_untyped_decorators * mypy: disallow_any_generics
This commit is contained in:
@@ -20,7 +20,7 @@ from pydantic import Field
|
||||
from typing_extensions import Annotated
|
||||
from petstore_api.models.client import Client
|
||||
|
||||
from petstore_api.api_client import ApiClient
|
||||
from petstore_api.api_client import ApiClient, RequestSerialized
|
||||
from petstore_api.api_response import ApiResponse
|
||||
from petstore_api.rest import RESTResponseType
|
||||
|
||||
@@ -242,7 +242,7 @@ class AnotherFakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ from typing_extensions import Annotated
|
||||
|
||||
from petstore_api.models.foo_get_default_response import FooGetDefaultResponse
|
||||
|
||||
from petstore_api.api_client import ApiClient
|
||||
from petstore_api.api_client import ApiClient, RequestSerialized
|
||||
from petstore_api.api_response import ApiResponse
|
||||
from petstore_api.rest import RESTResponseType
|
||||
|
||||
@@ -221,7 +221,7 @@ class DefaultApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ from petstore_api.models.tag import Tag
|
||||
from petstore_api.models.test_inline_freeform_additional_properties_request import TestInlineFreeformAdditionalPropertiesRequest
|
||||
from petstore_api.models.user import User
|
||||
|
||||
from petstore_api.api_client import ApiClient
|
||||
from petstore_api.api_client import ApiClient, RequestSerialized
|
||||
from petstore_api.api_response import ApiResponse
|
||||
from petstore_api.rest import RESTResponseType
|
||||
|
||||
@@ -250,7 +250,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -511,7 +511,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -748,7 +748,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -1026,7 +1026,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -1298,7 +1298,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -1568,7 +1568,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -1838,7 +1838,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -2108,7 +2108,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -2378,7 +2378,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -2632,7 +2632,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -2871,7 +2871,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -3123,7 +3123,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -3376,7 +3376,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -3640,7 +3640,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -3909,7 +3909,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -4183,7 +4183,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -4451,7 +4451,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -4731,7 +4731,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -4987,7 +4987,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -5427,7 +5427,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -5710,7 +5710,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -6030,7 +6030,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -6300,7 +6300,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -6564,7 +6564,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -6841,7 +6841,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -7185,7 +7185,7 @@ class FakeApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ from pydantic import Field
|
||||
from typing_extensions import Annotated
|
||||
from petstore_api.models.client import Client
|
||||
|
||||
from petstore_api.api_client import ApiClient
|
||||
from petstore_api.api_client import ApiClient, RequestSerialized
|
||||
from petstore_api.api_response import ApiResponse
|
||||
from petstore_api.rest import RESTResponseType
|
||||
|
||||
@@ -242,7 +242,7 @@ class FakeClassnameTags123Api:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ from typing_extensions import Annotated
|
||||
from petstore_api.models.model_api_response import ModelApiResponse
|
||||
from petstore_api.models.pet import Pet
|
||||
|
||||
from petstore_api.api_client import ApiClient
|
||||
from petstore_api.api_client import ApiClient, RequestSerialized
|
||||
from petstore_api.api_response import ApiResponse
|
||||
from petstore_api.rest import RESTResponseType
|
||||
|
||||
@@ -247,7 +247,7 @@ class PetApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -530,7 +530,7 @@ class PetApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -787,7 +787,7 @@ class PetApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -1056,7 +1056,7 @@ class PetApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -1325,7 +1325,7 @@ class PetApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -1593,7 +1593,7 @@ class PetApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -1889,7 +1889,7 @@ class PetApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -2184,7 +2184,7 @@ class PetApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -2485,7 +2485,7 @@ class PetApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ from pydantic import Field, StrictStr
|
||||
from typing_extensions import Annotated
|
||||
from petstore_api.models.order import Order
|
||||
|
||||
from petstore_api.api_client import ApiClient
|
||||
from petstore_api.api_client import ApiClient, RequestSerialized
|
||||
from petstore_api.api_response import ApiResponse
|
||||
from petstore_api.rest import RESTResponseType
|
||||
|
||||
@@ -245,7 +245,7 @@ class StoreApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -483,7 +483,7 @@ class StoreApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -745,7 +745,7 @@ class StoreApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -1006,7 +1006,7 @@ class StoreApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ from typing import List
|
||||
from typing_extensions import Annotated
|
||||
from petstore_api.models.user import User
|
||||
|
||||
from petstore_api.api_client import ApiClient
|
||||
from petstore_api.api_client import ApiClient, RequestSerialized
|
||||
from petstore_api.api_response import ApiResponse
|
||||
from petstore_api.rest import RESTResponseType
|
||||
|
||||
@@ -240,7 +240,7 @@ class UserApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_hosts = [
|
||||
'http://petstore.swagger.io/v2',
|
||||
@@ -506,7 +506,7 @@ class UserApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -768,7 +768,7 @@ class UserApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -1036,7 +1036,7 @@ class UserApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -1293,7 +1293,7 @@ class UserApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -1567,7 +1567,7 @@ class UserApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -1815,7 +1815,7 @@ class UserApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
@@ -2080,7 +2080,7 @@ class UserApi:
|
||||
_content_type,
|
||||
_headers,
|
||||
_host_index,
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
_host = None
|
||||
|
||||
|
||||
@@ -21,10 +21,10 @@ import re
|
||||
import tempfile
|
||||
|
||||
from urllib.parse import quote
|
||||
from typing import Tuple, Optional, List
|
||||
from typing import Tuple, Optional, List, Dict
|
||||
|
||||
from petstore_api.configuration import Configuration
|
||||
from petstore_api.api_response import ApiResponse
|
||||
from petstore_api.api_response import ApiResponse, T as ApiResponseT
|
||||
import petstore_api.models
|
||||
from petstore_api import rest
|
||||
from petstore_api.exceptions import (
|
||||
@@ -37,6 +37,7 @@ from petstore_api.exceptions import (
|
||||
ServiceException
|
||||
)
|
||||
|
||||
RequestSerialized = Tuple[str, str, Dict[str, str], Optional[str], List[str]]
|
||||
|
||||
class ApiClient:
|
||||
"""Generic API client for OpenAPI client library builds.
|
||||
@@ -146,7 +147,7 @@ class ApiClient:
|
||||
collection_formats=None,
|
||||
_host=None,
|
||||
_request_auth=None
|
||||
) -> Tuple:
|
||||
) -> RequestSerialized:
|
||||
|
||||
"""Builds the HTTP request params needed by the request.
|
||||
:param method: Method to call.
|
||||
@@ -279,8 +280,8 @@ class ApiClient:
|
||||
def response_deserialize(
|
||||
self,
|
||||
response_data: rest.RESTResponse,
|
||||
response_types_map=None
|
||||
) -> ApiResponse:
|
||||
response_types_map: Optional[Dict[str, ApiResponseT]]=None
|
||||
) -> ApiResponse[ApiResponseT]:
|
||||
"""Deserializes response into an object.
|
||||
:param response_data: RESTResponse object to be deserialized.
|
||||
:param response_types_map: dict of response types.
|
||||
@@ -401,12 +402,16 @@ class ApiClient:
|
||||
|
||||
if isinstance(klass, str):
|
||||
if klass.startswith('List['):
|
||||
sub_kls = re.match(r'List\[(.*)]', klass).group(1)
|
||||
m = re.match(r'List\[(.*)]', klass)
|
||||
assert m is not None, "Malformed List type definition"
|
||||
sub_kls = m.group(1)
|
||||
return [self.__deserialize(sub_data, sub_kls)
|
||||
for sub_data in data]
|
||||
|
||||
if klass.startswith('Dict['):
|
||||
sub_kls = re.match(r'Dict\[([^,]*), (.*)]', klass).group(2)
|
||||
m = re.match(r'Dict\[([^,]*), (.*)]', klass)
|
||||
assert m is not None, "Malformed Dict type definition"
|
||||
sub_kls = m.group(2)
|
||||
return {k: self.__deserialize(v, sub_kls)
|
||||
for k, v in data.items()}
|
||||
|
||||
@@ -434,7 +439,7 @@ class ApiClient:
|
||||
:param dict collection_formats: Parameter collection formats
|
||||
:return: Parameters as list of tuples, collections formatted
|
||||
"""
|
||||
new_params = []
|
||||
new_params: List[Tuple[str, str]] = []
|
||||
if collection_formats is None:
|
||||
collection_formats = {}
|
||||
for k, v in params.items() if isinstance(params, dict) else params:
|
||||
@@ -464,7 +469,7 @@ class ApiClient:
|
||||
:param dict collection_formats: Parameter collection formats
|
||||
:return: URL query string (e.g. a=Hello%20World&b=123)
|
||||
"""
|
||||
new_params = []
|
||||
new_params: List[Tuple[str, str]] = []
|
||||
if collection_formats is None:
|
||||
collection_formats = {}
|
||||
for k, v in params.items() if isinstance(params, dict) else params:
|
||||
@@ -656,10 +661,12 @@ class ApiClient:
|
||||
|
||||
content_disposition = response.getheader("Content-Disposition")
|
||||
if content_disposition:
|
||||
filename = re.search(
|
||||
m = re.search(
|
||||
r'filename=[\'"]?([^\'"\s]+)[\'"]?',
|
||||
content_disposition
|
||||
).group(1)
|
||||
)
|
||||
assert m is not None, "Unexpected 'content-disposition' header value"
|
||||
filename = m.group(1)
|
||||
path = os.path.join(os.path.dirname(path), filename)
|
||||
|
||||
with open(path, "wb") as f:
|
||||
|
||||
@@ -14,8 +14,10 @@
|
||||
|
||||
import copy
|
||||
import logging
|
||||
from logging import FileHandler
|
||||
import multiprocessing
|
||||
import sys
|
||||
from typing import Optional
|
||||
import urllib3
|
||||
|
||||
import http.client as httplib
|
||||
@@ -198,7 +200,7 @@ conf = petstore_api.Configuration(
|
||||
self.logger_stream_handler = None
|
||||
"""Log stream handler
|
||||
"""
|
||||
self.logger_file_handler = None
|
||||
self.logger_file_handler: Optional[FileHandler] = None
|
||||
"""Log file handler
|
||||
"""
|
||||
self.logger_file = None
|
||||
@@ -238,7 +240,7 @@ conf = petstore_api.Configuration(
|
||||
cpu_count * 5 is used as default value to increase performance.
|
||||
"""
|
||||
|
||||
self.proxy = None
|
||||
self.proxy: Optional[str] = None
|
||||
"""Proxy URL
|
||||
"""
|
||||
self.proxy_headers = None
|
||||
|
||||
@@ -79,7 +79,7 @@ class AdditionalPropertiesAnyType(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of AdditionalPropertiesAnyType from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -80,7 +80,7 @@ class AdditionalPropertiesClass(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of AdditionalPropertiesClass from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -79,7 +79,7 @@ class AdditionalPropertiesObject(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of AdditionalPropertiesObject from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -79,7 +79,7 @@ class AdditionalPropertiesWithDescriptionOnly(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of AdditionalPropertiesWithDescriptionOnly from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -81,7 +81,7 @@ class AllOfWithSingleRef(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of AllOfWithSingleRef from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -47,7 +47,7 @@ class Animal(BaseModel):
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def get_discriminator_value(cls, obj: Dict) -> Optional[str]:
|
||||
def get_discriminator_value(cls, obj: Dict[str, Any]) -> Optional[str]:
|
||||
"""Returns the discriminator value (object type) of the data"""
|
||||
discriminator_value = obj[cls.__discriminator_property_name]
|
||||
if discriminator_value:
|
||||
@@ -97,7 +97,7 @@ class Animal(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Dict) -> Optional[Union[Self, Self]]:
|
||||
def from_dict(cls, obj: Dict[str, Any]) -> Optional[Union[Self, Self]]:
|
||||
"""Create an instance of Animal from a dict"""
|
||||
# look up the object type based on discriminator mapping
|
||||
object_type = cls.get_discriminator_value(obj)
|
||||
|
||||
@@ -87,7 +87,7 @@ class AnyOfColor(BaseModel):
|
||||
return v
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: dict) -> Self:
|
||||
def from_dict(cls, obj: Dict[str, Any]) -> Self:
|
||||
return cls.from_json(json.dumps(obj))
|
||||
|
||||
@classmethod
|
||||
@@ -139,7 +139,7 @@ class AnyOfColor(BaseModel):
|
||||
else:
|
||||
return json.dumps(self.actual_instance)
|
||||
|
||||
def to_dict(self) -> Optional[Union[Dict, List[int], str]]:
|
||||
def to_dict(self) -> Optional[Union[Dict[str, Any], List[int], str]]:
|
||||
"""Returns the dict representation of the actual instance"""
|
||||
if self.actual_instance is None:
|
||||
return None
|
||||
|
||||
@@ -80,7 +80,7 @@ class AnyOfPig(BaseModel):
|
||||
return v
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: dict) -> Self:
|
||||
def from_dict(cls, obj: Dict[str, Any]) -> Self:
|
||||
return cls.from_json(json.dumps(obj))
|
||||
|
||||
@classmethod
|
||||
@@ -117,7 +117,7 @@ class AnyOfPig(BaseModel):
|
||||
else:
|
||||
return json.dumps(self.actual_instance)
|
||||
|
||||
def to_dict(self) -> Optional[Union[Dict, BasquePig, DanishPig]]:
|
||||
def to_dict(self) -> Optional[Union[Dict[str, Any], BasquePig, DanishPig]]:
|
||||
"""Returns the dict representation of the actual instance"""
|
||||
if self.actual_instance is None:
|
||||
return None
|
||||
|
||||
@@ -89,7 +89,7 @@ class ArrayOfArrayOfModel(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of ArrayOfArrayOfModel from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -79,7 +79,7 @@ class ArrayOfArrayOfNumberOnly(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of ArrayOfArrayOfNumberOnly from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -79,7 +79,7 @@ class ArrayOfNumberOnly(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of ArrayOfNumberOnly from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -92,7 +92,7 @@ class ArrayTest(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of ArrayTest from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -80,7 +80,7 @@ class BasquePig(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of BasquePig from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -84,7 +84,7 @@ class Capitalization(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of Capitalization from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -80,7 +80,7 @@ class Cat(Animal):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of Cat from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -80,7 +80,7 @@ class Category(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of Category from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -83,7 +83,7 @@ class CircularReferenceModel(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of CircularReferenceModel from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -79,7 +79,7 @@ class ClassModel(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of ClassModel from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -79,7 +79,7 @@ class Client(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of Client from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -89,11 +89,11 @@ class Color(BaseModel):
|
||||
return v
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: dict) -> Self:
|
||||
def from_dict(cls, obj: Union[str, Dict[str, Any]]) -> Self:
|
||||
return cls.from_json(json.dumps(obj))
|
||||
|
||||
@classmethod
|
||||
def from_json(cls, json_str: str) -> Self:
|
||||
def from_json(cls, json_str: Optional[str]) -> Self:
|
||||
"""Returns the object represented by the json string"""
|
||||
instance = cls.model_construct()
|
||||
if json_str is None:
|
||||
@@ -149,7 +149,7 @@ class Color(BaseModel):
|
||||
else:
|
||||
return json.dumps(self.actual_instance)
|
||||
|
||||
def to_dict(self) -> Optional[Union[Dict, List[int], str]]:
|
||||
def to_dict(self) -> Optional[Union[Dict[str, Any], List[int], str]]:
|
||||
"""Returns the dict representation of the actual instance"""
|
||||
if self.actual_instance is None:
|
||||
return None
|
||||
|
||||
@@ -84,7 +84,7 @@ class Creature(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of Creature from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -79,7 +79,7 @@ class CreatureInfo(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of CreatureInfo from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -80,7 +80,7 @@ class DanishPig(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of DanishPig from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -79,7 +79,7 @@ class DeprecatedObject(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of DeprecatedObject from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -80,7 +80,7 @@ class Dog(Animal):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of Dog from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -83,7 +83,7 @@ class DummyModel(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of DummyModel from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -101,7 +101,7 @@ class EnumArrays(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of EnumArrays from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -143,7 +143,7 @@ class EnumTest(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of EnumTest from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -79,7 +79,7 @@ class File(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of File from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -91,7 +91,7 @@ class FileSchemaTestClass(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of FileSchemaTestClass from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -83,7 +83,7 @@ class FirstRef(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of FirstRef from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -79,7 +79,7 @@ class Foo(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of Foo from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -83,7 +83,7 @@ class FooGetDefaultResponse(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of FooGetDefaultResponse from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -138,7 +138,7 @@ class FormatTest(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of FormatTest from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -84,7 +84,7 @@ class HasOnlyReadOnly(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of HasOnlyReadOnly from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -84,7 +84,7 @@ class HealthCheckResult(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of HealthCheckResult from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -79,7 +79,7 @@ class InnerDictWithProperty(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of InnerDictWithProperty from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -78,7 +78,7 @@ class IntOrString(BaseModel):
|
||||
return v
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: dict) -> Self:
|
||||
def from_dict(cls, obj: Union[str, Dict[str, Any]]) -> Self:
|
||||
return cls.from_json(json.dumps(obj))
|
||||
|
||||
@classmethod
|
||||
@@ -126,7 +126,7 @@ class IntOrString(BaseModel):
|
||||
else:
|
||||
return json.dumps(self.actual_instance)
|
||||
|
||||
def to_dict(self) -> Optional[Union[Dict, int, str]]:
|
||||
def to_dict(self) -> Optional[Union[Dict[str, Any], int, str]]:
|
||||
"""Returns the dict representation of the actual instance"""
|
||||
if self.actual_instance is None:
|
||||
return None
|
||||
|
||||
@@ -79,7 +79,7 @@ class ListClass(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of ListClass from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -89,7 +89,7 @@ class MapOfArrayOfModel(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of MapOfArrayOfModel from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -92,7 +92,7 @@ class MapTest(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of MapTest from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -90,7 +90,7 @@ class MixedPropertiesAndAdditionalPropertiesClass(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of MixedPropertiesAndAdditionalPropertiesClass from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -80,7 +80,7 @@ class Model200Response(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of Model200Response from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -81,7 +81,7 @@ class ModelApiResponse(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of ModelApiResponse from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -79,7 +79,7 @@ class ModelReturn(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of ModelReturn from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -86,7 +86,7 @@ class Name(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of Name from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -147,7 +147,7 @@ class NullableClass(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of NullableClass from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -96,7 +96,7 @@ class NullableProperty(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of NullableProperty from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -79,7 +79,7 @@ class NumberOnly(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of NumberOnly from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -79,7 +79,7 @@ class ObjectToTestAdditionalProperties(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of ObjectToTestAdditionalProperties from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -86,7 +86,7 @@ class ObjectWithDeprecatedFields(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of ObjectWithDeprecatedFields from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -77,7 +77,7 @@ class OneOfEnumString(BaseModel):
|
||||
return v
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: dict) -> Self:
|
||||
def from_dict(cls, obj: Union[str, Dict[str, Any]]) -> Self:
|
||||
return cls.from_json(json.dumps(obj))
|
||||
|
||||
@classmethod
|
||||
@@ -119,7 +119,7 @@ class OneOfEnumString(BaseModel):
|
||||
else:
|
||||
return json.dumps(self.actual_instance)
|
||||
|
||||
def to_dict(self) -> Optional[Union[Dict, EnumString1, EnumString2]]:
|
||||
def to_dict(self) -> Optional[Union[Dict[str, Any], EnumString1, EnumString2]]:
|
||||
"""Returns the dict representation of the actual instance"""
|
||||
if self.actual_instance is None:
|
||||
return None
|
||||
|
||||
@@ -95,7 +95,7 @@ class Order(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of Order from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -81,7 +81,7 @@ class OuterComposite(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of OuterComposite from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -87,7 +87,7 @@ class OuterObjectWithEnumProperty(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of OuterObjectWithEnumProperty from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -87,7 +87,7 @@ class Parent(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of Parent from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -87,7 +87,7 @@ class ParentWithOptionalDict(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of ParentWithOptionalDict from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -107,7 +107,7 @@ class Pet(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of Pet from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -80,7 +80,7 @@ class Pig(BaseModel):
|
||||
return v
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: dict) -> Self:
|
||||
def from_dict(cls, obj: Union[str, Dict[str, Any]]) -> Self:
|
||||
return cls.from_json(json.dumps(obj))
|
||||
|
||||
@classmethod
|
||||
@@ -137,7 +137,7 @@ class Pig(BaseModel):
|
||||
else:
|
||||
return json.dumps(self.actual_instance)
|
||||
|
||||
def to_dict(self) -> Optional[Union[Dict, BasquePig, DanishPig]]:
|
||||
def to_dict(self) -> Optional[Union[Dict[str, Any], BasquePig, DanishPig]]:
|
||||
"""Returns the dict representation of the actual instance"""
|
||||
if self.actual_instance is None:
|
||||
return None
|
||||
|
||||
@@ -81,7 +81,7 @@ class PropertyNameCollision(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of PropertyNameCollision from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -82,7 +82,7 @@ class ReadOnlyFirst(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of ReadOnlyFirst from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -83,7 +83,7 @@ class SecondRef(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of SecondRef from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -83,7 +83,7 @@ class SelfReferenceModel(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of SelfReferenceModel from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -79,7 +79,7 @@ class SpecialModelName(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of SpecialModelName from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -95,7 +95,7 @@ class SpecialName(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of SpecialName from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -80,7 +80,7 @@ class Tag(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of Tag from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -79,7 +79,7 @@ class TestErrorResponsesWithModel400Response(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of TestErrorResponsesWithModel400Response from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -79,7 +79,7 @@ class TestErrorResponsesWithModel404Response(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of TestErrorResponsesWithModel404Response from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -79,7 +79,7 @@ class TestInlineFreeformAdditionalPropertiesRequest(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of TestInlineFreeformAdditionalPropertiesRequest from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -79,7 +79,7 @@ class Tiger(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of Tiger from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -89,7 +89,7 @@ class UnnamedDictWithAdditionalModelListProperties(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of UnnamedDictWithAdditionalModelListProperties from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -79,7 +79,7 @@ class UnnamedDictWithAdditionalStringListProperties(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of UnnamedDictWithAdditionalStringListProperties from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -86,7 +86,7 @@ class User(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of User from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -89,7 +89,7 @@ class WithNestedOneOf(BaseModel):
|
||||
return _dict
|
||||
|
||||
@classmethod
|
||||
def from_dict(cls, obj: Optional[Dict]) -> Optional[Self]:
|
||||
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
||||
"""Create an instance of WithNestedOneOf from a dict"""
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
@@ -212,14 +212,13 @@ class RESTClientObject:
|
||||
preload_content=False
|
||||
)
|
||||
# Pass a `string` parameter directly in the body to support
|
||||
# other content types than Json when `body` argument is
|
||||
# provided in serialized form
|
||||
# other content types than JSON when `body` argument is
|
||||
# provided in serialized form.
|
||||
elif isinstance(body, str) or isinstance(body, bytes):
|
||||
request_body = body
|
||||
r = self.pool_manager.request(
|
||||
method,
|
||||
url,
|
||||
body=request_body,
|
||||
body=body,
|
||||
timeout=timeout,
|
||||
headers=headers,
|
||||
preload_content=False
|
||||
|
||||
@@ -13,12 +13,16 @@
|
||||
from base64 import b64encode
|
||||
from Crypto.IO import PEM, PKCS8
|
||||
from Crypto.Hash import SHA256, SHA512
|
||||
from Crypto.Hash.SHA512 import SHA512Hash
|
||||
from Crypto.Hash.SHA256 import SHA256Hash
|
||||
from Crypto.PublicKey import RSA, ECC
|
||||
from Crypto.Signature import PKCS1_v1_5, pss, DSS
|
||||
from datetime import timedelta
|
||||
from email.utils import formatdate
|
||||
import os
|
||||
import re
|
||||
from time import time
|
||||
from typing import List, Optional, Union
|
||||
from urllib.parse import urlencode, urlparse
|
||||
|
||||
# The constants below define a subset of HTTP headers that can be included in the
|
||||
@@ -67,18 +71,20 @@ HASH_SHA512 = 'sha512'
|
||||
|
||||
class HttpSigningConfiguration:
|
||||
"""The configuration parameters for the HTTP signature security scheme.
|
||||
|
||||
The HTTP signature security scheme is used to sign HTTP requests with a private key
|
||||
which is in possession of the API client.
|
||||
An 'Authorization' header is calculated by creating a hash of select headers,
|
||||
|
||||
An ``Authorization`` header is calculated by creating a hash of select headers,
|
||||
and optionally the body of the HTTP request, then signing the hash value using
|
||||
a private key. The 'Authorization' header is added to outbound HTTP requests.
|
||||
a private key. The ``Authorization`` header is added to outbound HTTP requests.
|
||||
|
||||
:param key_id: A string value specifying the identifier of the cryptographic key,
|
||||
when signing HTTP requests.
|
||||
:param signing_scheme: A string value specifying the signature scheme, when
|
||||
signing HTTP requests.
|
||||
Supported value are hs2019, rsa-sha256, rsa-sha512.
|
||||
Avoid using rsa-sha256, rsa-sha512 as they are deprecated. These values are
|
||||
Supported value are: ``hs2019``, ``rsa-sha256``, ``rsa-sha512``.
|
||||
Avoid using ``rsa-sha256``, ``rsa-sha512`` as they are deprecated. These values are
|
||||
available for server-side applications that only support the older
|
||||
HTTP signature algorithms.
|
||||
:param private_key_path: A string value specifying the path of the file containing
|
||||
@@ -87,18 +93,19 @@ class HttpSigningConfiguration:
|
||||
the private key.
|
||||
:param signed_headers: A list of strings. Each value is the name of a HTTP header
|
||||
that must be included in the HTTP signature calculation.
|
||||
The two special signature headers '(request-target)' and '(created)' SHOULD be
|
||||
The two special signature headers ``(request-target)`` and ``(created)`` SHOULD be
|
||||
included in SignedHeaders.
|
||||
The '(created)' header expresses when the signature was created.
|
||||
The '(request-target)' header is a concatenation of the lowercased :method, an
|
||||
The ``(created)`` header expresses when the signature was created.
|
||||
The ``(request-target)`` header is a concatenation of the lowercased :method, an
|
||||
ASCII space, and the :path pseudo-headers.
|
||||
When signed_headers is not specified, the client defaults to a single value,
|
||||
'(created)', in the list of HTTP headers.
|
||||
``(created)``, in the list of HTTP headers.
|
||||
When SignedHeaders contains the 'Digest' value, the client performs the
|
||||
following operations:
|
||||
1. Calculate a digest of request body, as specified in RFC3230, section 4.3.2.
|
||||
2. Set the 'Digest' header in the request body.
|
||||
3. Include the 'Digest' header and value in the HTTP signature.
|
||||
1. Calculate a digest of request body, as specified in `RFC3230,
|
||||
section 4.3.2<https://datatracker.ietf.org/doc/html/rfc3230#section-4.3.2>`_.
|
||||
2. Set the ``Digest`` header in the request body.
|
||||
3. Include the ``Digest`` header and value in the HTTP signature.
|
||||
:param signing_algorithm: A string value specifying the signature algorithm, when
|
||||
signing HTTP requests.
|
||||
Supported values are:
|
||||
@@ -116,12 +123,16 @@ class HttpSigningConfiguration:
|
||||
:param signature_max_validity: The signature max validity, expressed as
|
||||
a datetime.timedelta value. It must be a positive value.
|
||||
"""
|
||||
def __init__(self, key_id, signing_scheme, private_key_path,
|
||||
private_key_passphrase=None,
|
||||
signed_headers=None,
|
||||
signing_algorithm=None,
|
||||
hash_algorithm=None,
|
||||
signature_max_validity=None) -> None:
|
||||
def __init__(self,
|
||||
key_id: str,
|
||||
signing_scheme: str,
|
||||
private_key_path: str,
|
||||
private_key_passphrase: Union[None, str]=None,
|
||||
signed_headers: Optional[List[str]]=None,
|
||||
signing_algorithm: Optional[str]=None,
|
||||
hash_algorithm: Optional[str]=None,
|
||||
signature_max_validity: Optional[timedelta]=None,
|
||||
) -> None:
|
||||
self.key_id = key_id
|
||||
if signing_scheme not in {SCHEME_HS2019, SCHEME_RSA_SHA256, SCHEME_RSA_SHA512}:
|
||||
raise Exception("Unsupported security scheme: {0}".format(signing_scheme))
|
||||
@@ -165,11 +176,11 @@ class HttpSigningConfiguration:
|
||||
if HEADER_AUTHORIZATION in signed_headers:
|
||||
raise Exception("'Authorization' header cannot be included in signed headers")
|
||||
self.signed_headers = signed_headers
|
||||
self.private_key = None
|
||||
self.private_key: Optional[Union[ECC.EccKey, RSA.RsaKey]] = None
|
||||
"""The private key used to sign HTTP requests.
|
||||
Initialized when the PEM-encoded private key is loaded from a file.
|
||||
"""
|
||||
self.host = None
|
||||
self.host: Optional[str] = None
|
||||
"""The host name, optionally followed by a colon and TCP port number.
|
||||
"""
|
||||
self._load_private_key()
|
||||
@@ -207,7 +218,7 @@ class HttpSigningConfiguration:
|
||||
def get_public_key(self):
|
||||
"""Returns the public key object associated with the private key.
|
||||
"""
|
||||
pubkey = None
|
||||
pubkey: Optional[Union[ECC.EccKey, RSA.RsaKey]] = None
|
||||
if isinstance(self.private_key, RSA.RsaKey):
|
||||
pubkey = self.private_key.publickey()
|
||||
elif isinstance(self.private_key, ECC.EccKey):
|
||||
@@ -236,8 +247,11 @@ class HttpSigningConfiguration:
|
||||
elif pem_header in {'PRIVATE KEY', 'ENCRYPTED PRIVATE KEY'}:
|
||||
# Key is in PKCS8 format, which is capable of holding many different
|
||||
# types of private keys, not just EC keys.
|
||||
(key_binary, pem_header, is_encrypted) = \
|
||||
PEM.decode(pem_data, self.private_key_passphrase)
|
||||
if self.private_key_passphrase is not None:
|
||||
passphrase = self.private_key_passphrase.encode("utf-8")
|
||||
else:
|
||||
passphrase = None
|
||||
(key_binary, pem_header, is_encrypted) = PEM.decode(pem_data, passphrase)
|
||||
(oid, privkey, params) = \
|
||||
PKCS8.unwrap(key_binary, passphrase=self.private_key_passphrase)
|
||||
if oid == '1.2.840.10045.2.1':
|
||||
@@ -318,8 +332,11 @@ class HttpSigningConfiguration:
|
||||
request_headers_dict[HEADER_DIGEST] = '{0}{1}'.format(
|
||||
digest_prefix, b64_body_digest.decode('ascii'))
|
||||
elif hdr_key == HEADER_HOST.lower():
|
||||
value = target_host
|
||||
request_headers_dict[HEADER_HOST] = '{0}'.format(target_host)
|
||||
if isinstance(target_host, bytes):
|
||||
value = target_host.decode('ascii')
|
||||
else:
|
||||
value = target_host
|
||||
request_headers_dict[HEADER_HOST] = value
|
||||
else:
|
||||
value = next((v for k, v in headers.items() if k.lower() == hdr_key), None)
|
||||
if value is None:
|
||||
@@ -340,6 +357,9 @@ class HttpSigningConfiguration:
|
||||
The prefix is a string that identifies the cryptographic hash. It is used
|
||||
to generate the 'Digest' header as specified in RFC 3230.
|
||||
"""
|
||||
|
||||
digest: Union[SHA256Hash, SHA512Hash]
|
||||
|
||||
if self.hash_algorithm == HASH_SHA512:
|
||||
digest = SHA512.new()
|
||||
prefix = 'SHA-512='
|
||||
|
||||
@@ -40,3 +40,34 @@ files = [
|
||||
#"test", # auto-generated tests
|
||||
"tests", # hand-written tests
|
||||
]
|
||||
# TODO: enable "strict" once all these individual checks are passing
|
||||
# strict = true
|
||||
|
||||
# List from: https://mypy.readthedocs.io/en/stable/existing_code.html#introduce-stricter-options
|
||||
warn_unused_configs = true
|
||||
warn_redundant_casts = true
|
||||
warn_unused_ignores = true
|
||||
|
||||
## Getting these passing should be easy
|
||||
strict_equality = true
|
||||
strict_concatenate = true
|
||||
|
||||
## Strongly recommend enabling this one as soon as you can
|
||||
check_untyped_defs = true
|
||||
|
||||
## These shouldn't be too much additional work, but may be tricky to
|
||||
## get passing if you use a lot of untyped libraries
|
||||
disallow_subclassing_any = true
|
||||
disallow_untyped_decorators = true
|
||||
disallow_any_generics = true
|
||||
|
||||
### These next few are various gradations of forcing use of type annotations
|
||||
#disallow_untyped_calls = true
|
||||
#disallow_incomplete_defs = true
|
||||
#disallow_untyped_defs = true
|
||||
#
|
||||
### This one isn't too hard to get passing, but return on investment is lower
|
||||
#no_implicit_reexport = true
|
||||
#
|
||||
### This one can be tricky to get passing if you use a lot of untyped libraries
|
||||
#warn_return_any = true
|
||||
|
||||
@@ -125,48 +125,47 @@ class ApiClientTests(unittest.TestCase):
|
||||
content_type = self.api_client.select_header_content_type(content_types)
|
||||
self.assertEqual(content_type, None)
|
||||
|
||||
def test_sanitize_for_serialization(self):
|
||||
# None
|
||||
def test_sanitize_for_serialization_none(self):
|
||||
data = None
|
||||
result = self.api_client.sanitize_for_serialization(None)
|
||||
self.assertEqual(result, data)
|
||||
|
||||
# str
|
||||
def test_sanitize_for_serialization_str(self):
|
||||
data = "test string"
|
||||
result = self.api_client.sanitize_for_serialization(data)
|
||||
self.assertEqual(result, data)
|
||||
|
||||
# int
|
||||
def test_sanitize_for_serialization_int(self):
|
||||
data = 1
|
||||
result = self.api_client.sanitize_for_serialization(data)
|
||||
self.assertEqual(result, data)
|
||||
|
||||
# bool
|
||||
def test_sanitize_for_serialization_bool(self):
|
||||
data = True
|
||||
result = self.api_client.sanitize_for_serialization(data)
|
||||
self.assertEqual(result, data)
|
||||
|
||||
# date
|
||||
def test_sanitize_for_serialization_date(self):
|
||||
data = parse("1997-07-16").date() # date
|
||||
result = self.api_client.sanitize_for_serialization(data)
|
||||
self.assertEqual(result, "1997-07-16")
|
||||
|
||||
# datetime
|
||||
def test_sanitize_for_serialization_datetime(self):
|
||||
data = parse("1997-07-16T19:20:30.45+01:00") # datetime
|
||||
result = self.api_client.sanitize_for_serialization(data)
|
||||
self.assertEqual(result, "1997-07-16T19:20:30.450000+01:00")
|
||||
|
||||
# list
|
||||
def test_sanitize_for_serialization_list(self):
|
||||
data = [1]
|
||||
result = self.api_client.sanitize_for_serialization(data)
|
||||
self.assertEqual(result, data)
|
||||
|
||||
# dict
|
||||
def test_sanitize_for_serialization_dict(self):
|
||||
data = {"test key": "test value"}
|
||||
result = self.api_client.sanitize_for_serialization(data)
|
||||
self.assertEqual(result, data)
|
||||
|
||||
# model
|
||||
def test_sanitize_for_serialization_model(self):
|
||||
pet_dict = {"id": 1, "name": "monkey",
|
||||
"category": {"id": 1, "name": "test category"},
|
||||
"tags": [{"id": 1, "name": "test tag1"},
|
||||
@@ -174,20 +173,19 @@ class ApiClientTests(unittest.TestCase):
|
||||
"status": "available",
|
||||
"photoUrls": ["http://foo.bar.com/3",
|
||||
"http://foo.bar.com/4"]}
|
||||
pet = petstore_api.Pet(name=pet_dict["name"], photoUrls=pet_dict["photoUrls"])
|
||||
pet.id = pet_dict["id"]
|
||||
cate = petstore_api.Category(name="something")
|
||||
cate.id = pet_dict["category"]["id"]
|
||||
cate.name = pet_dict["category"]["name"]
|
||||
pet = petstore_api.Pet(name="monkey", photoUrls=["http://foo.bar.com/3", "http://foo.bar.com/4"])
|
||||
pet.id = 1
|
||||
cate = petstore_api.Category(name="test category")
|
||||
cate.id = 1
|
||||
pet.category = cate
|
||||
tag1 = petstore_api.Tag()
|
||||
tag1.id = pet_dict["tags"][0]["id"]
|
||||
tag1.name = pet_dict["tags"][0]["name"]
|
||||
tag1.id = 1
|
||||
tag1.name = "test tag1"
|
||||
tag2 = petstore_api.Tag()
|
||||
tag2.id = pet_dict["tags"][1]["id"]
|
||||
tag2.name = pet_dict["tags"][1]["name"]
|
||||
tag2.id = 2
|
||||
tag2.name = "test tag2"
|
||||
pet.tags = [tag1, tag2]
|
||||
pet.status = pet_dict["status"]
|
||||
pet.status = "available"
|
||||
|
||||
data = pet
|
||||
result = self.api_client.sanitize_for_serialization(data)
|
||||
@@ -195,11 +193,10 @@ class ApiClientTests(unittest.TestCase):
|
||||
|
||||
# list of models
|
||||
list_of_pet_dict = [pet_dict]
|
||||
data = [pet]
|
||||
result = self.api_client.sanitize_for_serialization(data)
|
||||
result = self.api_client.sanitize_for_serialization([pet])
|
||||
self.assertEqual(result, list_of_pet_dict)
|
||||
|
||||
def test_parameters_to_url_query(self):
|
||||
def test_parameters_to_url_query_simple_values(self):
|
||||
data = 'value={"category": "example", "category2": "example2"}'
|
||||
dictionary = {
|
||||
"category": "example",
|
||||
@@ -208,6 +205,7 @@ class ApiClientTests(unittest.TestCase):
|
||||
result = self.api_client.parameters_to_url_query([('value', dictionary)], {})
|
||||
self.assertEqual(result, "value=%7B%22category%22%3A%20%22example%22%2C%20%22category2%22%3A%20%22example2%22%7D")
|
||||
|
||||
def test_parameters_to_url_query_complex_values(self):
|
||||
data='value={"number": 1, "string": "str", "bool": true, "dict": {"number": 1, "string": "str", "bool": true}}'
|
||||
dictionary = {
|
||||
"number": 1,
|
||||
@@ -222,6 +220,7 @@ class ApiClientTests(unittest.TestCase):
|
||||
result = self.api_client.parameters_to_url_query([('value', dictionary)], {})
|
||||
self.assertEqual(result, 'value=%7B%22number%22%3A%201%2C%20%22string%22%3A%20%22str%22%2C%20%22bool%22%3A%20true%2C%20%22dict%22%3A%20%7B%22number%22%3A%201%2C%20%22string%22%3A%20%22str%22%2C%20%22bool%22%3A%20true%7D%7D')
|
||||
|
||||
def test_parameters_to_url_query_dict_values(self):
|
||||
data='value={"strValues": ["one", "two", "three"], "dictValues": [{"name": "value1", "age": 14}, {"name": "value2", "age": 12}]}'
|
||||
dictionary = {
|
||||
"strValues": [
|
||||
|
||||
@@ -41,6 +41,7 @@ class ApiExceptionTests(unittest.TestCase):
|
||||
|
||||
def test_404_error(self):
|
||||
self.pet_api.add_pet(self.pet)
|
||||
assert self.pet.id is not None
|
||||
self.pet_api.delete_pet(pet_id=self.pet.id)
|
||||
|
||||
with self.checkRaiseRegex(ApiException, "Pet not found"):
|
||||
@@ -55,6 +56,7 @@ class ApiExceptionTests(unittest.TestCase):
|
||||
|
||||
def test_500_error(self):
|
||||
self.pet_api.add_pet(self.pet)
|
||||
assert self.pet.id is not None
|
||||
|
||||
with self.checkRaiseRegex(ApiException, "Internal Server Error"):
|
||||
self.pet_api.upload_file(
|
||||
|
||||
@@ -48,14 +48,14 @@ class ApiExceptionTests(unittest.TestCase):
|
||||
|
||||
def test_required_param_validation(self):
|
||||
try:
|
||||
self.pet_api.get_pet_by_id()
|
||||
self.pet_api.get_pet_by_id() # type: ignore
|
||||
except ValidationError as e:
|
||||
self.assertIn("1 validation error for get_pet_by_id", str(e))
|
||||
self.assertIn("Missing required argument", str(e))
|
||||
|
||||
def test_integer_validation(self):
|
||||
try:
|
||||
self.pet_api.get_pet_by_id("123")
|
||||
self.pet_api.get_pet_by_id("123") # type: ignore
|
||||
except ValidationError as e:
|
||||
# 1 validation error for get_pet_by_id
|
||||
# pet_id
|
||||
@@ -75,25 +75,32 @@ class ApiExceptionTests(unittest.TestCase):
|
||||
self.assertIn("unexpected value; permitted: 'available', 'pending', 'sold'", str(e))
|
||||
|
||||
def test_request_timeout_validation(self):
|
||||
assert self.pet.id is not None
|
||||
try:
|
||||
self.pet_api.get_pet_by_id(self.pet.id, _request_timeout="1.0")
|
||||
# should be a number
|
||||
self.pet_api.get_pet_by_id(self.pet.id, _request_timeout="1.0") # type: ignore
|
||||
self.assertTrue(False)
|
||||
except ValidationError as e:
|
||||
pass
|
||||
try:
|
||||
self.pet_api.get_pet_by_id(self.pet.id, _request_timeout=())
|
||||
# should be a number or a pair
|
||||
self.pet_api.get_pet_by_id(self.pet.id, _request_timeout=()) # type: ignore
|
||||
self.assertTrue(False)
|
||||
except ValidationError as e:
|
||||
pass
|
||||
try:
|
||||
self.pet_api.get_pet_by_id(self.pet.id, _request_timeout=(1.0, 1.0, 1.0))
|
||||
# should be a a pair
|
||||
self.pet_api.get_pet_by_id(self.pet.id, _request_timeout=(1.0, 1.0, 1.0)) # type: ignore
|
||||
self.assertTrue(False)
|
||||
except ValidationError as e:
|
||||
pass
|
||||
|
||||
|
||||
def test_host_index_validation(self):
|
||||
assert self.pet.id is not None
|
||||
try:
|
||||
self.pet_api.get_pet_by_id(self.pet.id, _host_index="1")
|
||||
# should be a number
|
||||
self.pet_api.get_pet_by_id(self.pet.id, _host_index="1") # type: ignore
|
||||
self.assertTrue(False)
|
||||
except ValidationError as e:
|
||||
pass
|
||||
|
||||
@@ -17,11 +17,14 @@ import json
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
from typing import Union
|
||||
import unittest
|
||||
from urllib.parse import urlencode, urlparse
|
||||
|
||||
from Crypto.Hash import SHA256, SHA512
|
||||
from Crypto.PublicKey import ECC, RSA
|
||||
from Crypto.Hash.SHA512 import SHA512Hash
|
||||
from Crypto.Hash.SHA256 import SHA256Hash
|
||||
from Crypto.Signature import pkcs1_15, pss, DSS
|
||||
|
||||
import petstore_api
|
||||
@@ -73,7 +76,7 @@ class TimeoutWithEqual(urllib3.Timeout):
|
||||
def __eq__(self, other):
|
||||
return self._read == other._read and self._connect == other._connect and self.total == other.total
|
||||
|
||||
class MockPoolManager(object):
|
||||
class MockPoolManager(urllib3.PoolManager):
|
||||
def __init__(self, tc):
|
||||
self._tc = tc
|
||||
self._reqs = []
|
||||
@@ -83,9 +86,9 @@ class MockPoolManager(object):
|
||||
|
||||
def set_signing_config(self, signing_cfg):
|
||||
self.signing_cfg = signing_cfg
|
||||
self._tc.assertIsNotNone(self.signing_cfg)
|
||||
assert self.signing_cfg is not None
|
||||
self.pubkey = self.signing_cfg.get_public_key()
|
||||
self._tc.assertIsNotNone(self.pubkey)
|
||||
assert self.pubkey is not None
|
||||
|
||||
def request(self, *actual_request_target, **actual_request_headers_and_body):
|
||||
self._tc.assertTrue(len(self._reqs) > 0)
|
||||
@@ -124,13 +127,13 @@ class MockPoolManager(object):
|
||||
# Extract (created)
|
||||
r1 = re.compile(r'created=([0-9]+)')
|
||||
m1 = r1.search(authorization_header)
|
||||
self._tc.assertIsNotNone(m1)
|
||||
assert m1 is not None
|
||||
created = m1.group(1)
|
||||
|
||||
# Extract list of signed headers
|
||||
r1 = re.compile(r'headers="([^"]+)"')
|
||||
m1 = r1.search(authorization_header)
|
||||
self._tc.assertIsNotNone(m1)
|
||||
assert m1 is not None
|
||||
headers = m1.group(1).split(' ')
|
||||
signed_headers_list = []
|
||||
for h in headers:
|
||||
@@ -142,25 +145,26 @@ class MockPoolManager(object):
|
||||
signed_headers_list.append((h, "{0} {1}".format(request_target[0].lower(), target_path)))
|
||||
else:
|
||||
value = next((v for k, v in actual_headers.items() if k.lower() == h), None)
|
||||
self._tc.assertIsNotNone(value)
|
||||
assert value is not None
|
||||
signed_headers_list.append((h, value))
|
||||
header_items = [
|
||||
"{0}: {1}".format(key.lower(), value) for key, value in signed_headers_list]
|
||||
string_to_sign = "\n".join(header_items)
|
||||
digest = None
|
||||
digest: Union[SHA512Hash, SHA256Hash]
|
||||
if self.signing_cfg.hash_algorithm == signing.HASH_SHA512:
|
||||
digest = SHA512.new()
|
||||
elif self.signing_cfg.hash_algorithm == signing.HASH_SHA256:
|
||||
digest = SHA256.new()
|
||||
else:
|
||||
self._tc.fail("Unsupported hash algorithm: {0}".format(self.signing_cfg.hash_algorithm))
|
||||
|
||||
digest.update(string_to_sign.encode())
|
||||
b64_body_digest = base64.b64encode(digest.digest()).decode()
|
||||
|
||||
# Extract the signature
|
||||
r2 = re.compile(r'signature="([^"]+)"')
|
||||
m2 = r2.search(authorization_header)
|
||||
self._tc.assertIsNotNone(m2)
|
||||
assert m2 is not None
|
||||
b64_signature = m2.group(1)
|
||||
signature = base64.b64decode(b64_signature)
|
||||
# Build the message
|
||||
@@ -190,6 +194,12 @@ class MockPoolManager(object):
|
||||
self._tc.fail("Unsupported signing algorithm: {0}".format(signing_alg))
|
||||
|
||||
class PetApiTests(unittest.TestCase):
|
||||
rsa_key_path: str
|
||||
rsa4096_key_path: str
|
||||
ec_p521_key_path: str
|
||||
pet: petstore_api.Pet
|
||||
test_file_dir: str
|
||||
private_key_passphrase: str
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
@@ -208,19 +218,19 @@ class PetApiTests(unittest.TestCase):
|
||||
|
||||
@classmethod
|
||||
def setUpModels(cls):
|
||||
cls.category = petstore_api.Category(name="dog")
|
||||
cls.category.id = id_gen()
|
||||
cls.tag = petstore_api.Tag()
|
||||
cls.tag.id = id_gen()
|
||||
cls.tag.name = "python-pet-tag"
|
||||
category = petstore_api.Category(name="dog")
|
||||
category.id = id_gen()
|
||||
tag = petstore_api.Tag()
|
||||
tag.id = id_gen()
|
||||
tag.name = "python-pet-tag"
|
||||
cls.pet = petstore_api.Pet(
|
||||
name="hello kity",
|
||||
photoUrls=["http://foo.bar.com/1", "http://foo.bar.com/2"]
|
||||
)
|
||||
cls.pet.id = id_gen()
|
||||
cls.pet.status = "sold"
|
||||
cls.pet.category = cls.category
|
||||
cls.pet.tags = [cls.tag]
|
||||
cls.pet.category = category
|
||||
cls.pet.tags = [tag]
|
||||
|
||||
@classmethod
|
||||
def setUpFiles(cls):
|
||||
@@ -239,6 +249,8 @@ class PetApiTests(unittest.TestCase):
|
||||
with open(cls.rsa_key_path, 'w') as f:
|
||||
f.write(RSA_TEST_PRIVATE_KEY)
|
||||
|
||||
key: Union[RSA.RsaKey, ECC.EccKey]
|
||||
|
||||
if not os.path.exists(cls.rsa4096_key_path):
|
||||
key = RSA.generate(4096)
|
||||
private_key = key.export_key(
|
||||
@@ -250,13 +262,17 @@ class PetApiTests(unittest.TestCase):
|
||||
|
||||
if not os.path.exists(cls.ec_p521_key_path):
|
||||
key = ECC.generate(curve='P-521')
|
||||
private_key = key.export_key(
|
||||
pkey = key.export_key(
|
||||
format='PEM',
|
||||
passphrase=cls.private_key_passphrase,
|
||||
use_pkcs8=True,
|
||||
protection='PBKDF2WithHMAC-SHA1AndAES128-CBC'
|
||||
)
|
||||
with open(cls.ec_p521_key_path, "wt") as f:
|
||||
if isinstance(pkey, str):
|
||||
private_key = pkey.encode("ascii")
|
||||
else:
|
||||
private_key = pkey
|
||||
with open(cls.ec_p521_key_path, "wb") as f:
|
||||
f.write(private_key)
|
||||
|
||||
def test_valid_http_signature(self):
|
||||
@@ -459,7 +475,7 @@ class PetApiTests(unittest.TestCase):
|
||||
signing_cfg = signing.HttpSigningConfiguration(
|
||||
key_id="my-key-id",
|
||||
private_key_path=self.ec_p521_key_path,
|
||||
signing_scheme=None
|
||||
signing_scheme=None # type: ignore
|
||||
)
|
||||
self.assertTrue(re.match('Unsupported security scheme', str(cm.exception)),
|
||||
'Exception message: {0}'.format(str(cm.exception)))
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
# flake8: noqa
|
||||
|
||||
from datetime import date
|
||||
import json
|
||||
import os
|
||||
import time
|
||||
@@ -134,28 +135,36 @@ class ModelTests(unittest.TestCase):
|
||||
p = petstore_api.Color.from_json(None)
|
||||
self.assertEqual(p.actual_instance, None)
|
||||
|
||||
def test_oneof_enum_string(self):
|
||||
enum_string1 = petstore_api.EnumString1('a')
|
||||
def test_oneof_enum_string_from_json(self):
|
||||
# test from_json
|
||||
oneof_enum = petstore_api.OneOfEnumString.from_json('"a"')
|
||||
|
||||
def test_oneof_nested_from_enum_string(self):
|
||||
# test from_dict
|
||||
oneof_enum = petstore_api.OneOfEnumString.from_dict("a")
|
||||
assert oneof_enum is not None
|
||||
nested = petstore_api.WithNestedOneOf(size = 1, nested_oneof_enum_string = oneof_enum)
|
||||
# test to_json
|
||||
self.assertEqual(nested.to_json(), '{"size": 1, "nested_oneof_enum_string": "a"}')
|
||||
# test from_json
|
||||
|
||||
def test_oneof_nested_from_json(self):
|
||||
nested = petstore_api.WithNestedOneOf.from_json('{"size": 1, "nested_oneof_enum_string": "c"}')
|
||||
assert nested is not None
|
||||
self.assertEqual(nested.to_json(), '{"size": 1, "nested_oneof_enum_string": "c"}')
|
||||
# test from_dict
|
||||
|
||||
def test_oneof_nested_from_dict(self):
|
||||
nested = petstore_api.WithNestedOneOf.from_dict({"size": 1, "nested_oneof_enum_string": "c"})
|
||||
assert nested is not None
|
||||
# test to_dict
|
||||
self.assertEqual(nested.to_dict(), {"size": 1, "nested_oneof_enum_string": "c"})
|
||||
# invalid enum value
|
||||
|
||||
def test_oneof_nested_from_json_invalid(self):
|
||||
try:
|
||||
nested2 = petstore_api.WithNestedOneOf.from_json('{"size": 1, "nested_oneof_enum_string": "e"}')
|
||||
except ValueError as e:
|
||||
self.assertTrue("'e' is not a valid EnumString1, 'e' is not a valid EnumString" in str(e))
|
||||
|
||||
def test_oneof_enum_string(self):
|
||||
# test the constructor
|
||||
enum_string1 = petstore_api.EnumString1('a')
|
||||
constructor1 = petstore_api.OneOfEnumString(actual_instance=enum_string1)
|
||||
@@ -276,6 +285,7 @@ class ModelTests(unittest.TestCase):
|
||||
|
||||
nested_json = nested.to_json()
|
||||
nested2 = petstore_api.WithNestedOneOf.from_json(nested_json)
|
||||
assert nested2 is not None
|
||||
self.assertEqual(nested2.to_json(), nested_json)
|
||||
|
||||
def test_anyOf(self):
|
||||
@@ -328,30 +338,30 @@ class ModelTests(unittest.TestCase):
|
||||
self.assertEqual(dog.to_dict(), {'breed': 'bulldog', 'className':
|
||||
'dog', 'color': 'white'})
|
||||
dog2 = petstore_api.Dog.from_json(dog.to_json())
|
||||
assert dog2 is not None
|
||||
self.assertEqual(dog2.breed, 'bulldog')
|
||||
self.assertEqual(dog2.class_name, "dog")
|
||||
self.assertEqual(dog2.color, 'white')
|
||||
|
||||
def test_list(self):
|
||||
# should throw exception as var_123_list should be string
|
||||
kw = {"123-list": 123}
|
||||
try:
|
||||
l3 = petstore_api.ListClass(**kw)
|
||||
# Don't check the typing, because we are actually testing a typing error.
|
||||
l3 = petstore_api.ListClass(**{"123-list": 123}) # type: ignore
|
||||
self.assertTrue(False) # this line shouldn't execute
|
||||
breakpoint()
|
||||
except ValueError as e:
|
||||
# var_123_list
|
||||
# Input should be a valid string [type=string_type, input_value=123, input_type=int]
|
||||
# For further information visit https://errors.pydantic.dev/2.3/v/string_type
|
||||
self.assertTrue("Input should be a valid string" in str(e))
|
||||
|
||||
kw = {"123-list": "bulldog"}
|
||||
l = petstore_api.ListClass(**kw)
|
||||
l = petstore_api.ListClass(**{"123-list": "bulldog"}) # type: ignore
|
||||
self.assertEqual(l.to_json(), '{"123-list": "bulldog"}')
|
||||
self.assertEqual(l.to_dict(), {'123-list': 'bulldog'})
|
||||
l2 = petstore_api.ListClass.from_json(l.to_json())
|
||||
self.assertEqual(l2.var_123_list, 'bulldog')
|
||||
|
||||
l2 = petstore_api.ListClass.from_json(l.to_json())
|
||||
assert l2 is not None
|
||||
self.assertEqual(l2.var_123_list, 'bulldog')
|
||||
self.assertTrue(isinstance(l2, petstore_api.ListClass))
|
||||
|
||||
def test_enum_ref_property(self):
|
||||
@@ -363,6 +373,7 @@ class ModelTests(unittest.TestCase):
|
||||
self.assertEqual(d2.to_json(), '{"str_value": "delivered", "value": 1}')
|
||||
# test from_json (round trip)
|
||||
d3 = petstore_api.OuterObjectWithEnumProperty.from_json(d2.to_json())
|
||||
assert d3 is not None
|
||||
self.assertEqual(d3.str_value, petstore_api.OuterEnum.DELIVERED)
|
||||
self.assertEqual(d3.value, petstore_api.OuterEnumInteger.NUMBER_1)
|
||||
self.assertEqual(d3.to_json(), '{"str_value": "delivered", "value": 1}')
|
||||
@@ -376,7 +387,7 @@ class ModelTests(unittest.TestCase):
|
||||
|
||||
def test_valdiator(self):
|
||||
# test regular expression
|
||||
a = petstore_api.FormatTest(number=123.45, byte=bytes("string", 'utf-8'), date="2013-09-17", password="testing09876")
|
||||
a = petstore_api.FormatTest(number=123.45, byte=bytes("string", 'utf-8'), date=date(2013, 9, 17), password="testing09876")
|
||||
try:
|
||||
a.pattern_with_digits_and_delimiter = "123"
|
||||
self.assertTrue(False) # this line shouldn't execute
|
||||
@@ -384,7 +395,7 @@ class ModelTests(unittest.TestCase):
|
||||
self.assertTrue(r"must validate the regular expression /^image_\d{1,3}$/i" in str(e))
|
||||
|
||||
# test None with optional string (with regualr expression)
|
||||
a = petstore_api.FormatTest(number=123.45, byte=bytes("string", 'utf-8'), date="2013-09-17", password="testing09876")
|
||||
a = petstore_api.FormatTest(number=123.45, byte=bytes("string", 'utf-8'), date=date(2013, 9, 17), password="testing09876")
|
||||
a.string = None # shouldn't throw an exception
|
||||
|
||||
a.pattern_with_digits_and_delimiter = "IMAGE_123"
|
||||
@@ -475,11 +486,12 @@ class ModelTests(unittest.TestCase):
|
||||
pet_ap_dict["array"] = ["a", "b"]
|
||||
pet_ap_dict["dict"] = {"key999": "value999"}
|
||||
|
||||
pet_ap2 = petstore_api.Pet.from_dict(pet_ap_dict)
|
||||
pet_ap3 = petstore_api.Pet.from_dict(pet_ap_dict)
|
||||
assert pet_ap3 is not None
|
||||
|
||||
self.assertEqual(pet_ap2.additional_properties["array"], ["a", "b"])
|
||||
self.assertEqual(pet_ap2.additional_properties["something-new"], 123)
|
||||
self.assertEqual(pet_ap2.additional_properties["dict"], {"key999": "value999"})
|
||||
self.assertEqual(pet_ap3.additional_properties["array"], ["a", "b"])
|
||||
self.assertEqual(pet_ap3.additional_properties["something-new"], 123)
|
||||
self.assertEqual(pet_ap3.additional_properties["dict"], {"key999": "value999"})
|
||||
|
||||
def test_nullable(self):
|
||||
h = petstore_api.HealthCheckResult(NullableMessage="Not none")
|
||||
@@ -507,10 +519,11 @@ class ModelTests(unittest.TestCase):
|
||||
# for https://github.com/OpenAPITools/openapi-generator/issues/14913
|
||||
# shouldn't throw exception by the optional dict property
|
||||
a = petstore_api.ParentWithOptionalDict.from_dict({})
|
||||
self.assertFalse(a is None)
|
||||
|
||||
b = petstore_api.ParentWithOptionalDict.from_dict({"optionalDict": {"key": {"aProperty": {"a": "b"}}}})
|
||||
self.assertFalse(b is None)
|
||||
assert b is not None
|
||||
assert b.optional_dict is not None
|
||||
assert b.optional_dict["key"].a_property is not None
|
||||
self.assertEqual(b.optional_dict["key"].a_property["a"], "b")
|
||||
|
||||
def test_freeform_object(self):
|
||||
@@ -530,6 +543,7 @@ class ModelTests(unittest.TestCase):
|
||||
# for https://github.com/OpenAPITools/openapi-generator/issues/15135
|
||||
d = {"optionalDict": {"a": {"b": {"aProperty": "value"}}}}
|
||||
a = petstore_api.Parent.from_dict(d)
|
||||
assert a is not None
|
||||
self.assertEqual(a.to_dict(), d)
|
||||
|
||||
def test_eum_class(self):
|
||||
@@ -561,6 +575,7 @@ class ModelTests(unittest.TestCase):
|
||||
self.assertEqual(a.to_dict(), {'shopIdToOrgOnlineLipMap': {'somekey': [{'id': 123, 'name': 'tag name'}]}})
|
||||
self.assertEqual(a.to_json(), '{"shopIdToOrgOnlineLipMap": {"somekey": [{"id": 123, "name": "tag name"}]}}')
|
||||
a2 = petstore_api.MapOfArrayOfModel.from_dict(a.to_dict())
|
||||
assert a2 is not None
|
||||
self.assertEqual(a.to_dict(), a2.to_dict())
|
||||
|
||||
def test_array_of_array_of_model(self):
|
||||
@@ -570,6 +585,7 @@ class ModelTests(unittest.TestCase):
|
||||
self.assertEqual(a.to_dict(), {'another_property': [[ {'id': 123, 'name': 'tag name'} ]]})
|
||||
self.assertEqual(a.to_json(), '{"another_property": [[{"id": 123, "name": "tag name"}]]}')
|
||||
a2 = petstore_api.ArrayOfArrayOfModel.from_dict(a.to_dict())
|
||||
assert a2 is not None
|
||||
self.assertEqual(a.to_dict(), a2.to_dict())
|
||||
|
||||
def test_object_with_additional_properties(self):
|
||||
@@ -581,12 +597,14 @@ class ModelTests(unittest.TestCase):
|
||||
def test_first_ref(self):
|
||||
# shouldn't throw "still a ForwardRef" error
|
||||
a = petstore_api.FirstRef.from_dict({})
|
||||
assert a is not None
|
||||
self.assertEqual(a.to_json(), "{}")
|
||||
|
||||
def test_allof(self):
|
||||
# for issue 16104
|
||||
model = petstore_api.Tiger.from_json('{"skill": "none", "type": "tiger", "info": {"name": "creature info"}}')
|
||||
# shouldn't throw NameError
|
||||
assert model is not None
|
||||
self.assertEqual(model.to_json(), '{"skill": "none", "type": "tiger", "info": {"name": "creature info"}}')
|
||||
|
||||
|
||||
@@ -609,27 +627,29 @@ class TestdditionalPropertiesAnyType(unittest.TestCase):
|
||||
|
||||
class TestUnnamedDictWithAdditionalStringListProperties:
|
||||
def test_empty_dict(self):
|
||||
a = petstore_api.UnnamedDictWithAdditionalStringListProperties(dict_property={})
|
||||
a = petstore_api.UnnamedDictWithAdditionalStringListProperties(dictProperty={})
|
||||
assert a is not None
|
||||
assert a.to_dict() == {"dictProperty": {}}
|
||||
|
||||
def test_empty_list(self):
|
||||
a = petstore_api.UnnamedDictWithAdditionalStringListProperties(dict_property={"b": []})
|
||||
a = petstore_api.UnnamedDictWithAdditionalStringListProperties(dictProperty={"b": []})
|
||||
assert a is not None
|
||||
assert a.to_dict() == {"dictProperty": {"b": []}}
|
||||
|
||||
def test_single_string_item(self):
|
||||
a = petstore_api.UnnamedDictWithAdditionalStringListProperties(dict_property={"b": ["c"]})
|
||||
a = petstore_api.UnnamedDictWithAdditionalStringListProperties(dictProperty={"b": ["c"]})
|
||||
assert a.to_dict() == {"dictProperty": {"b": ["c"]}}
|
||||
|
||||
class TestUnnamedDictWithAdditionalModelListProperties:
|
||||
def test_empty_dict(self):
|
||||
a = petstore_api.UnnamedDictWithAdditionalModelListProperties(dict_property={})
|
||||
a = petstore_api.UnnamedDictWithAdditionalModelListProperties(dictProperty={})
|
||||
assert a.to_dict() == {"dictProperty": {}}
|
||||
|
||||
def test_empty_list(self):
|
||||
a = petstore_api.UnnamedDictWithAdditionalModelListProperties(dict_property={"b": []})
|
||||
a = petstore_api.UnnamedDictWithAdditionalModelListProperties(dictProperty={"b": []})
|
||||
assert a.to_dict() == {"dictProperty": {"b": []}}
|
||||
|
||||
def test_single_string_item(self):
|
||||
value = {"b": [petstore_api.CreatureInfo(name="creature_name")]}
|
||||
a = petstore_api.UnnamedDictWithAdditionalModelListProperties(dict_property=value)
|
||||
a = petstore_api.UnnamedDictWithAdditionalModelListProperties(dictProperty=value)
|
||||
assert a.to_dict() == {"dictProperty": {"b": [{"name": "creature_name"}]}}
|
||||
|
||||
@@ -35,7 +35,7 @@ class TimeoutWithEqual(urllib3.Timeout):
|
||||
return self._read == other._read and self._connect == other._connect and self.total == other.total
|
||||
|
||||
|
||||
class MockPoolManager(object):
|
||||
class MockPoolManager(urllib3.PoolManager):
|
||||
def __init__(self, tc):
|
||||
self._tc = tc
|
||||
self._reqs = []
|
||||
@@ -117,16 +117,19 @@ class PetApiTests(unittest.TestCase):
|
||||
|
||||
def test_add_pet_and_get_pet_by_id(self):
|
||||
self.pet_api.add_pet(self.pet)
|
||||
assert self.pet.id is not None
|
||||
|
||||
fetched = self.pet_api.get_pet_by_id(pet_id=self.pet.id)
|
||||
self.assertIsNotNone(fetched)
|
||||
assert fetched is not None
|
||||
self.assertEqual(self.pet.id, fetched.id)
|
||||
self.assertIsNotNone(fetched.category)
|
||||
assert fetched.category is not None
|
||||
assert self.pet.category is not None
|
||||
self.assertEqual(self.pet.category.name, fetched.category.name)
|
||||
|
||||
def test_add_pet_and_get_pet_by_id_without_preload_content_flag(self):
|
||||
|
||||
self.pet_api.add_pet(self.pet)
|
||||
assert self.pet.id is not None
|
||||
|
||||
fetched = self.pet_api.get_pet_by_id_without_preload_content(pet_id=self.pet.id)
|
||||
|
||||
self.assertIsInstance(fetched, urllib3.HTTPResponse)
|
||||
@@ -141,30 +144,35 @@ class PetApiTests(unittest.TestCase):
|
||||
|
||||
def test_add_pet_and_get_pet_by_id_with_http_info(self):
|
||||
self.pet_api.add_pet(self.pet)
|
||||
assert self.pet.id is not None
|
||||
|
||||
# fetched is an ApiResponse object
|
||||
fetched = self.pet_api.get_pet_by_id_with_http_info(pet_id=self.pet.id)
|
||||
self.assertIsNotNone(fetched.data)
|
||||
assert fetched.data is not None
|
||||
self.assertEqual(self.pet.id, fetched.data.id)
|
||||
self.assertIsNotNone(fetched.data.category)
|
||||
assert fetched.data.category is not None
|
||||
assert self.pet.category is not None
|
||||
self.assertEqual(self.pet.category.name, fetched.data.category.name)
|
||||
|
||||
def test_get_pet_by_id_serialize(self):
|
||||
self.pet_api.add_pet(self.pet)
|
||||
assert self.pet.id is not None
|
||||
|
||||
fetched = self.pet_api._get_pet_by_id_serialize(self.pet.id, None, None, None, None)
|
||||
self.assertIsNotNone(fetched)
|
||||
assert fetched is not None
|
||||
self.assertIsInstance(fetched, tuple)
|
||||
|
||||
def test_update_pet(self):
|
||||
self.pet.name = "hello kity with updated"
|
||||
self.pet_api.update_pet(self.pet)
|
||||
assert self.pet.id is not None
|
||||
|
||||
fetched = self.pet_api.get_pet_by_id(pet_id=self.pet.id)
|
||||
self.assertIsNotNone(fetched)
|
||||
assert fetched is not None
|
||||
self.assertEqual(self.pet.id, fetched.id)
|
||||
self.assertEqual(self.pet.name, fetched.name)
|
||||
self.assertIsNotNone(fetched.category)
|
||||
assert fetched.category is not None
|
||||
assert self.pet.category is not None
|
||||
self.assertEqual(fetched.category.name, self.pet.category.name)
|
||||
|
||||
def test_find_pets_by_status(self):
|
||||
@@ -180,6 +188,8 @@ class PetApiTests(unittest.TestCase):
|
||||
|
||||
def test_find_pets_by_tags(self):
|
||||
self.pet_api.add_pet(self.pet)
|
||||
assert self.pet.id is not None
|
||||
assert self.tag.name is not None
|
||||
|
||||
self.assertIn(
|
||||
self.pet.id,
|
||||
@@ -188,6 +198,7 @@ class PetApiTests(unittest.TestCase):
|
||||
|
||||
def test_update_pet_with_form(self):
|
||||
self.pet_api.add_pet(self.pet)
|
||||
assert self.pet.id is not None
|
||||
|
||||
name = "hello kity with form updated abc"
|
||||
status = "pending"
|
||||
@@ -199,6 +210,7 @@ class PetApiTests(unittest.TestCase):
|
||||
self.assertEqual(status, fetched.status)
|
||||
|
||||
def test_upload_file(self):
|
||||
assert self.pet.id is not None
|
||||
# upload file with form parameter
|
||||
try:
|
||||
additional_metadata = "special data 123"
|
||||
@@ -218,6 +230,7 @@ class PetApiTests(unittest.TestCase):
|
||||
|
||||
def test_delete_pet(self):
|
||||
self.pet_api.add_pet(self.pet)
|
||||
assert self.pet.id is not None
|
||||
self.pet_api.delete_pet(pet_id=self.pet.id, api_key="special-key")
|
||||
|
||||
try:
|
||||
|
||||
@@ -73,11 +73,14 @@ class PetModelTests(unittest.TestCase):
|
||||
" \"status\": \"available\",\n"
|
||||
" \"tags\": [{\"id\": 1, \"name\": \"None\"}]}")
|
||||
pet = petstore_api.Pet.from_json(json_str)
|
||||
assert pet is not None
|
||||
self.assertEqual(pet.id, 1)
|
||||
self.assertEqual(pet.status, "available")
|
||||
self.assertEqual(pet.photo_urls, ["string"])
|
||||
assert pet.tags is not None
|
||||
self.assertEqual(pet.tags[0].id, 1)
|
||||
self.assertEqual(pet.tags[0].name, "None")
|
||||
assert pet.category is not None
|
||||
self.assertEqual(pet.category.id, 1)
|
||||
# test to_json
|
||||
self.assertEqual(pet.to_json(),
|
||||
@@ -91,16 +94,18 @@ class PetModelTests(unittest.TestCase):
|
||||
|
||||
# test from_dict
|
||||
pet2 = petstore_api.Pet.from_dict(pet.to_dict())
|
||||
assert pet2 is not None
|
||||
self.assertEqual(pet2.id, 1)
|
||||
self.assertEqual(pet2.status, "available")
|
||||
self.assertEqual(pet2.photo_urls, ["string"])
|
||||
assert pet2.tags is not None
|
||||
self.assertEqual(pet2.tags[0].id, 1)
|
||||
self.assertEqual(pet2.tags[0].name, "None")
|
||||
assert pet2.category is not None
|
||||
self.assertEqual(pet2.category.id, 1)
|
||||
|
||||
def test_unpack_operator(self):
|
||||
d = {"name": "required name", "id": 123, "photoUrls": ["https://a.com", "https://b.com"]}
|
||||
pet = petstore_api.Pet(**d)
|
||||
pet = petstore_api.Pet(name="required name", id=123, photoUrls=["https://a.com", "https://b.com"])
|
||||
self.assertEqual(pet.to_json(), '{"id": 123, "name": "required name", "photoUrls": ["https://a.com", "https://b.com"]}')
|
||||
self.assertEqual(pet.to_dict(), {"id": 123, "name": "required name", "photoUrls": ["https://a.com", "https://b.com"]})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user