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:
Jonathan Ballet
2024-01-09 09:45:05 +01:00
committed by GitHub
parent c041d7e12f
commit df7976c1a3
234 changed files with 992 additions and 628 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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='

View File

@@ -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

View File

@@ -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": [

View File

@@ -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(

View 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

View File

@@ -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)))

View File

@@ -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"}]}}

View File

@@ -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:

View File

@@ -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"]})