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.
@@ -149,7 +150,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.
@@ -282,8 +283,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.
@@ -404,12 +405,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()}
@@ -437,7 +442,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:
@@ -467,7 +472,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:
@@ -659,10 +664,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,7 +14,9 @@
import copy
import logging
from logging import FileHandler
import sys
from typing import Optional
import urllib3
import http.client as httplib
@@ -197,7 +199,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
@@ -234,7 +236,7 @@ conf = petstore_api.Configuration(
Default values is 100, None means no-limit.
"""
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

@@ -72,7 +72,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

@@ -73,7 +73,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

@@ -46,7 +46,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:
@@ -89,7 +89,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

@@ -81,7 +81,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

@@ -71,7 +71,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

@@ -71,7 +71,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

@@ -84,7 +84,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

@@ -72,7 +72,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

@@ -76,7 +76,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

@@ -72,7 +72,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

@@ -72,7 +72,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

@@ -75,7 +75,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

@@ -71,7 +71,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

@@ -71,7 +71,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

@@ -76,7 +76,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

@@ -71,7 +71,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

@@ -72,7 +72,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

@@ -71,7 +71,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

@@ -72,7 +72,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

@@ -75,7 +75,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

@@ -93,7 +93,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

@@ -135,7 +135,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

@@ -71,7 +71,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

@@ -83,7 +83,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

@@ -75,7 +75,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

@@ -71,7 +71,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

@@ -75,7 +75,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

@@ -130,7 +130,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

@@ -76,7 +76,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

@@ -76,7 +76,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

@@ -71,7 +71,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

@@ -71,7 +71,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

@@ -81,7 +81,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

@@ -84,7 +84,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

@@ -82,7 +82,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

@@ -72,7 +72,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

@@ -73,7 +73,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

@@ -71,7 +71,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

@@ -78,7 +78,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

@@ -88,7 +88,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

@@ -71,7 +71,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

@@ -71,7 +71,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

@@ -78,7 +78,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

@@ -87,7 +87,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

@@ -73,7 +73,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

@@ -79,7 +79,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

@@ -79,7 +79,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

@@ -79,7 +79,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

@@ -99,7 +99,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
@@ -122,7 +122,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

@@ -73,7 +73,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

@@ -74,7 +74,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

@@ -75,7 +75,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

@@ -75,7 +75,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

@@ -71,7 +71,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

@@ -87,7 +87,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

@@ -72,7 +72,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

@@ -71,7 +71,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

@@ -71,7 +71,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

@@ -71,7 +71,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

@@ -81,7 +81,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

@@ -71,7 +71,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

@@ -78,7 +78,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

@@ -81,7 +81,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

@@ -16,7 +16,7 @@ import io
import json
import re
import ssl
from typing import Optional
from typing import Optional, Union
import aiohttp
import aiohttp_retry
@@ -199,6 +199,7 @@ class RESTClientObject:
declared content type."""
raise ApiException(status=0, reason=msg)
pool_manager: Union[aiohttp.ClientSession, aiohttp_retry.RetryClient]
if self.retry_client is not None and method in ALLOW_RETRY_METHODS:
pool_manager = self.retry_client
else:

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

@@ -42,3 +42,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

@@ -3,6 +3,7 @@
# flake8: noqa
from datetime import date
import os
import time
import unittest
@@ -118,6 +119,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):
@@ -172,6 +174,7 @@ 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')
@@ -180,7 +183,8 @@ class ModelTests(unittest.TestCase):
def test_list(self):
# should throw exception as var_123_list should be string
try:
l3 = petstore_api.List(var_123_list=123)
# 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
except ValueError as e:
#error_message = (
@@ -189,13 +193,14 @@ class ModelTests(unittest.TestCase):
# " str type expected (type=type_error.str)\n")
self.assertTrue("str type expected" in str(e))
l = petstore_api.List(var_123_list="bulldog")
l = petstore_api.ListClass(**{"123-list": "bulldog"})
self.assertEqual(l.to_json(), '{"123-list":"bulldog"}')
self.assertEqual(l.to_dict(), {'123-list': 'bulldog'})
l2 = petstore_api.List.from_json(l.to_json())
self.assertEqual(l2.var_123_list, 'bulldog')
self.assertTrue(isinstance(l2, petstore_api.List))
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):
# test enum ref property
@@ -204,26 +209,28 @@ class ModelTests(unittest.TestCase):
self.assertEqual(d.to_json(), '{"value": 1}')
d2 = petstore_api.OuterObjectWithEnumProperty(value=petstore_api.OuterEnumInteger.NUMBER_1, str_value=petstore_api.OuterEnum.DELIVERED)
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}')
@unittest.skip("TODO: pydantic v2: 'float' field alias the 'float' type used by 'number'")
def test_float_strict_type(self):
# assigning 123 to float shouldn't throw an exception
a = petstore_api.FormatTest(number=39.8, float=123, byte=bytes("string", 'utf-8'), date="2013-09-17", password="testing09876")
self.assertEqual(a.float, 123.0)
a = petstore_api.FormatTest(number=39.8, float=123, byte=bytes("string", 'utf-8'), date=date(2013, 9, 17), password="testing09876")
self.assertEqual(a.var_float, 123.0)
json_str = "{\"number\": 34.5, \"float\": \"456\", \"date\": \"2013-12-08\", \"password\": \"empty1234567\", \"pattern_with_digits\": \"1234567890\", \"pattern_with_digits_and_delimiter\": \"image_123\", \"string_with_double_quote_pattern\": \"this is \\\"something\\\"\", \"string\": \"string\"}"
# no exception thrown when assigning 456 (integer) to float type since strict is set to false
f = petstore_api.FormatTest.from_json(json_str)
self.assertEqual(f.float, 456.0)
assert f is not None
self.assertEqual(f.var_float, 456.0)
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

View File

@@ -71,6 +71,7 @@ class TestPetApiTests(unittest.TestCase):
@async_test
async def test_async_with_result(self):
await self.pet_api.add_pet(self.pet)
assert self.pet.id is not None
tasks = [
asyncio.create_task(coro)
@@ -100,31 +101,32 @@ class TestPetApiTests(unittest.TestCase):
@async_test
async def test_add_pet_and_get_pet_by_id(self):
await self.pet_api.add_pet(self.pet)
assert self.pet.id is not None
fetched = await self.pet_api.get_pet_by_id(pet_id=self.pet.id)
self.assertIsNotNone(fetched)
self.assertEqual(self.pet.id, fetched.id)
self.assertIsNotNone(fetched.category)
assert self.pet.category is not None
assert fetched.category is not None
self.assertEqual(self.pet.category.name, fetched.category.name)
@async_test
async def test_add_pet_and_get_pet_by_id_with_http_info(self):
await self.pet_api.add_pet(self.pet)
assert self.pet.id is not None
fetched = await self.pet_api.get_pet_by_id_with_http_info(pet_id=self.pet.id)
self.assertIsNotNone(fetched)
self.assertEqual(self.pet.id, fetched.data.id)
self.assertIsNotNone(fetched.data.category)
assert self.pet.category is not None
assert fetched.data.category is not None
self.assertEqual(self.pet.category.name, fetched.data.category.name)
@async_test
async def test_add_pet_and_get_pet_by_id_without_preload_content(self):
await self.pet_api.add_pet(self.pet)
assert self.pet.id is not None
fetched = await self.pet_api.get_pet_by_id_without_preload_content(pet_id=self.pet.id)
self.assertIsInstance(fetched, aiohttp.ClientResponse)
# self.assertFalse(fetched.closed)
# self.assertFalse(fetched.content._eof)
read = await fetched.content.read()
self.assertTrue(fetched.closed)
self.assertTrue(fetched.content._eof)
@@ -136,17 +138,19 @@ class TestPetApiTests(unittest.TestCase):
async def test_update_pet(self):
self.pet.name = "hello kity with updated"
await self.pet_api.update_pet(self.pet)
assert self.pet.id is not None
fetched = await self.pet_api.get_pet_by_id(pet_id=self.pet.id)
self.assertIsNotNone(fetched)
self.assertEqual(self.pet.id, fetched.id)
self.assertEqual(self.pet.name, fetched.name)
self.assertIsNotNone(fetched.category)
assert self.pet.category is not None
assert fetched.category is not None
self.assertEqual(fetched.category.name, self.pet.category.name)
@async_test
async def test_find_pets_by_status(self):
await self.pet_api.add_pet(self.pet)
assert self.pet.status is not None
pets = await self.pet_api.find_pets_by_status(status=[self.pet.status])
self.assertIn(
self.pet.id,
@@ -156,6 +160,7 @@ class TestPetApiTests(unittest.TestCase):
@async_test
async def test_find_pets_by_tags(self):
await self.pet_api.add_pet(self.pet)
assert self.tag.name is not None
pets = await self.pet_api.find_pets_by_tags(tags=[self.tag.name])
self.assertIn(
self.pet.id,
@@ -165,6 +170,7 @@ class TestPetApiTests(unittest.TestCase):
@async_test
async def test_update_pet_with_form(self):
await self.pet_api.add_pet(self.pet)
assert self.pet.id is not None
name = "hello kity with form updated"
status = "pending"
@@ -180,6 +186,7 @@ class TestPetApiTests(unittest.TestCase):
# upload file with form parameter
try:
additional_metadata = "special"
assert self.pet.id is not None
await self.pet_api.upload_file(
pet_id=self.pet.id,
additional_metadata=additional_metadata,
@@ -197,6 +204,7 @@ class TestPetApiTests(unittest.TestCase):
@async_test
async def test_delete_pet(self):
await self.pet_api.add_pet(self.pet)
assert self.pet.id is not None
await self.pet_api.delete_pet(pet_id=self.pet.id, api_key="special-key")
try:
@@ -213,6 +221,7 @@ class TestPetApiTests(unittest.TestCase):
config.proxy = 'http://localhost:8080/proxy'
async with petstore_api.ApiClient(config) as client:
pet_api = petstore_api.PetApi(client)
assert self.pet.id is not None
with self.assertRaisesRegex(petstore_api.rest.aiohttp.client_exceptions.ClientProxyConnectionError,
'Cannot connect to host localhost:8080'):

View File

@@ -72,11 +72,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(),
@@ -90,16 +93,22 @@ 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"]})
def test_optional_fields(self):