Skip to content

Commit 3177277

Browse files
authored
[python-experimental] adds more base class mixins, preparation for v3.1.0 type arrays (#13436)
* Removes unnecesary typing.Unions * Adds qty 3 mixin * Adds qty4 mixin * Adds mixins for 3-5 type combinations * Regenerates samples
1 parent 44d500c commit 3177277

File tree

3 files changed

+492
-60
lines changed
  • modules/openapi-generator/src/main/resources/python-experimental
  • samples/openapi3/client
    • 3_0_3_unit_test/python-experimental/unit_test_api
    • petstore/python-experimental/petstore_api

3 files changed

+492
-60
lines changed

modules/openapi-generator/src/main/resources/python-experimental/schemas.handlebars

Lines changed: 164 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -484,17 +484,31 @@ class Schema:
484484
"""
485485
import itertools
486486
data_types = ('None', 'FrozenDict', 'Tuple', 'Str', 'Decimal', 'Bool')
487-
[v for v in itertools.combinations(data_types, 2)]
487+
type_to_cls = {
488+
'None': 'NoneClass',
489+
'FrozenDict': 'frozendict.frozendict',
490+
'Tuple': 'tuple',
491+
'Str': 'str',
492+
'Decimal': 'decimal.Decimal',
493+
'Bool': 'BoolClass'
494+
}
495+
cls_tuples = [v for v in itertools.combinations(data_types, 5)]
496+
typed_classes = [f"class {''.join(cls_tuple)}Mixin({', '.join(type_to_cls[typ] for typ in cls_tuple)}):\n pass" for cls_tuple in cls_tuples]
497+
for cls in typed_classes:
498+
print(cls)
499+
object_classes = [f"{''.join(cls_tuple)}Mixin = object" for cls_tuple in cls_tuples]
500+
for cls in object_classes:
501+
print(cls)
488502
"""
489503
if typing.TYPE_CHECKING:
490-
# qty 1 mixin
504+
# qty 1
491505
NoneMixin = NoneClass
492506
FrozenDictMixin = frozendict.frozendict
493507
TupleMixin = tuple
494508
StrMixin = str
495509
DecimalMixin = decimal.Decimal
496510
BoolMixin = BoolClass
497-
# qty 2 mixin
511+
# qty 2
498512
class BinaryMixin(bytes, FileIO):
499513
pass
500514
class NoneFrozenDictMixin(NoneClass, frozendict.frozendict):
@@ -527,18 +541,103 @@ if typing.TYPE_CHECKING:
527541
pass
528542
class DecimalBoolMixin(decimal.Decimal, BoolClass):
529543
pass
544+
# qty 3
545+
class NoneFrozenDictTupleMixin(NoneClass, frozendict.frozendict, tuple):
546+
pass
547+
class NoneFrozenDictStrMixin(NoneClass, frozendict.frozendict, str):
548+
pass
549+
class NoneFrozenDictDecimalMixin(NoneClass, frozendict.frozendict, decimal.Decimal):
550+
pass
551+
class NoneFrozenDictBoolMixin(NoneClass, frozendict.frozendict, BoolClass):
552+
pass
553+
class NoneTupleStrMixin(NoneClass, tuple, str):
554+
pass
555+
class NoneTupleDecimalMixin(NoneClass, tuple, decimal.Decimal):
556+
pass
557+
class NoneTupleBoolMixin(NoneClass, tuple, BoolClass):
558+
pass
559+
class NoneStrDecimalMixin(NoneClass, str, decimal.Decimal):
560+
pass
561+
class NoneStrBoolMixin(NoneClass, str, BoolClass):
562+
pass
563+
class NoneDecimalBoolMixin(NoneClass, decimal.Decimal, BoolClass):
564+
pass
565+
class FrozenDictTupleStrMixin(frozendict.frozendict, tuple, str):
566+
pass
567+
class FrozenDictTupleDecimalMixin(frozendict.frozendict, tuple, decimal.Decimal):
568+
pass
569+
class FrozenDictTupleBoolMixin(frozendict.frozendict, tuple, BoolClass):
570+
pass
571+
class FrozenDictStrDecimalMixin(frozendict.frozendict, str, decimal.Decimal):
572+
pass
573+
class FrozenDictStrBoolMixin(frozendict.frozendict, str, BoolClass):
574+
pass
575+
class FrozenDictDecimalBoolMixin(frozendict.frozendict, decimal.Decimal, BoolClass):
576+
pass
577+
class TupleStrDecimalMixin(tuple, str, decimal.Decimal):
578+
pass
579+
class TupleStrBoolMixin(tuple, str, BoolClass):
580+
pass
581+
class TupleDecimalBoolMixin(tuple, decimal.Decimal, BoolClass):
582+
pass
583+
class StrDecimalBoolMixin(str, decimal.Decimal, BoolClass):
584+
pass
585+
# qty 4
586+
class NoneFrozenDictTupleStrMixin(NoneClass, frozendict.frozendict, tuple, str):
587+
pass
588+
class NoneFrozenDictTupleDecimalMixin(NoneClass, frozendict.frozendict, tuple, decimal.Decimal):
589+
pass
590+
class NoneFrozenDictTupleBoolMixin(NoneClass, frozendict.frozendict, tuple, BoolClass):
591+
pass
592+
class NoneFrozenDictStrDecimalMixin(NoneClass, frozendict.frozendict, str, decimal.Decimal):
593+
pass
594+
class NoneFrozenDictStrBoolMixin(NoneClass, frozendict.frozendict, str, BoolClass):
595+
pass
596+
class NoneFrozenDictDecimalBoolMixin(NoneClass, frozendict.frozendict, decimal.Decimal, BoolClass):
597+
pass
598+
class NoneTupleStrDecimalMixin(NoneClass, tuple, str, decimal.Decimal):
599+
pass
600+
class NoneTupleStrBoolMixin(NoneClass, tuple, str, BoolClass):
601+
pass
602+
class NoneTupleDecimalBoolMixin(NoneClass, tuple, decimal.Decimal, BoolClass):
603+
pass
604+
class NoneStrDecimalBoolMixin(NoneClass, str, decimal.Decimal, BoolClass):
605+
pass
606+
class FrozenDictTupleStrDecimalMixin(frozendict.frozendict, tuple, str, decimal.Decimal):
607+
pass
608+
class FrozenDictTupleStrBoolMixin(frozendict.frozendict, tuple, str, BoolClass):
609+
pass
610+
class FrozenDictTupleDecimalBoolMixin(frozendict.frozendict, tuple, decimal.Decimal, BoolClass):
611+
pass
612+
class FrozenDictStrDecimalBoolMixin(frozendict.frozendict, str, decimal.Decimal, BoolClass):
613+
pass
614+
class TupleStrDecimalBoolMixin(tuple, str, decimal.Decimal, BoolClass):
615+
pass
616+
# qty 5
617+
class NoneFrozenDictTupleStrDecimalMixin(NoneClass, frozendict.frozendict, tuple, str, decimal.Decimal):
618+
pass
619+
class NoneFrozenDictTupleStrBoolMixin(NoneClass, frozendict.frozendict, tuple, str, BoolClass):
620+
pass
621+
class NoneFrozenDictTupleDecimalBoolMixin(NoneClass, frozendict.frozendict, tuple, decimal.Decimal, BoolClass):
622+
pass
623+
class NoneFrozenDictStrDecimalBoolMixin(NoneClass, frozendict.frozendict, str, decimal.Decimal, BoolClass):
624+
pass
625+
class NoneTupleStrDecimalBoolMixin(NoneClass, tuple, str, decimal.Decimal, BoolClass):
626+
pass
627+
class FrozenDictTupleStrDecimalBoolMixin(frozendict.frozendict, tuple, str, decimal.Decimal, BoolClass):
628+
pass
530629
# qty 6
531630
class NoneFrozenDictTupleStrDecimalBoolMixin(NoneClass, frozendict.frozendict, tuple, str, decimal.Decimal, BoolClass):
532631
pass
533632
else:
534-
# qty 1 mixin
633+
# qty 1
535634
NoneMixin = object
536635
FrozenDictMixin = object
537636
TupleMixin = object
538637
StrMixin = object
539638
DecimalMixin = object
540639
BoolMixin = object
541-
# qty 2 mixin
640+
# qty 2
542641
BinaryMixin = object
543642
NoneFrozenDictMixin = object
544643
NoneTupleMixin = object
@@ -555,6 +654,51 @@ else:
555654
StrDecimalMixin = object
556655
StrBoolMixin = object
557656
DecimalBoolMixin = object
657+
# qty 3
658+
NoneFrozenDictTupleMixin = object
659+
NoneFrozenDictStrMixin = object
660+
NoneFrozenDictDecimalMixin = object
661+
NoneFrozenDictBoolMixin = object
662+
NoneTupleStrMixin = object
663+
NoneTupleDecimalMixin = object
664+
NoneTupleBoolMixin = object
665+
NoneStrDecimalMixin = object
666+
NoneStrBoolMixin = object
667+
NoneDecimalBoolMixin = object
668+
FrozenDictTupleStrMixin = object
669+
FrozenDictTupleDecimalMixin = object
670+
FrozenDictTupleBoolMixin = object
671+
FrozenDictStrDecimalMixin = object
672+
FrozenDictStrBoolMixin = object
673+
FrozenDictDecimalBoolMixin = object
674+
TupleStrDecimalMixin = object
675+
TupleStrBoolMixin = object
676+
TupleDecimalBoolMixin = object
677+
StrDecimalBoolMixin = object
678+
# qty 4
679+
NoneFrozenDictTupleStrMixin = object
680+
NoneFrozenDictTupleDecimalMixin = object
681+
NoneFrozenDictTupleBoolMixin = object
682+
NoneFrozenDictStrDecimalMixin = object
683+
NoneFrozenDictStrBoolMixin = object
684+
NoneFrozenDictDecimalBoolMixin = object
685+
NoneTupleStrDecimalMixin = object
686+
NoneTupleStrBoolMixin = object
687+
NoneTupleDecimalBoolMixin = object
688+
NoneStrDecimalBoolMixin = object
689+
FrozenDictTupleStrDecimalMixin = object
690+
FrozenDictTupleStrBoolMixin = object
691+
FrozenDictTupleDecimalBoolMixin = object
692+
FrozenDictStrDecimalBoolMixin = object
693+
TupleStrDecimalBoolMixin = object
694+
# qty 5
695+
NoneFrozenDictTupleStrDecimalMixin = object
696+
NoneFrozenDictTupleStrBoolMixin = object
697+
NoneFrozenDictTupleDecimalBoolMixin = object
698+
NoneFrozenDictStrDecimalBoolMixin = object
699+
NoneTupleStrDecimalBoolMixin = object
700+
FrozenDictTupleStrDecimalBoolMixin = object
701+
# qty 6
558702
NoneFrozenDictTupleStrDecimalBoolMixin = object
559703

560704

@@ -599,7 +743,7 @@ class Validator(typing.Protocol):
599743
pass
600744

601745

602-
def SchemaTypeCheckerClsFactory(union_type_cls: typing.Union[typing.Any]) -> Validator:
746+
def SchemaTypeCheckerClsFactory(union_type_cls: typing.Any) -> Validator:
603747
if typing.get_origin(union_type_cls) is typing.Union:
604748
union_classes = typing.get_args(union_type_cls)
605749
else:
@@ -1866,7 +2010,7 @@ class ComposedSchema(
18662010

18672011

18682012
class ListSchema(
1869-
SchemaTypeCheckerClsFactory(typing.Union[tuple]),
2013+
SchemaTypeCheckerClsFactory(tuple),
18702014
ListBase,
18712015
Schema,
18722016
TupleMixin
@@ -1881,7 +2025,7 @@ class ListSchema(
18812025

18822026

18832027
class NoneSchema(
1884-
SchemaTypeCheckerClsFactory(typing.Union[NoneClass]),
2028+
SchemaTypeCheckerClsFactory(NoneClass),
18852029
NoneBase,
18862030
Schema,
18872031
NoneMixin
@@ -1896,7 +2040,7 @@ class NoneSchema(
18962040

18972041

18982042
class NumberSchema(
1899-
SchemaTypeCheckerClsFactory(typing.Union[decimal.Decimal]),
2043+
SchemaTypeCheckerClsFactory(decimal.Decimal),
19002044
NumberBase,
19012045
Schema,
19022046
DecimalMixin
@@ -1907,7 +2051,7 @@ class NumberSchema(
19072051
"""
19082052

19092053
@classmethod
1910-
def from_openapi_data_oapg(cls, arg: typing.Union[int, float, decimal.Decimal], _configuration: typing.Optional[Configuration] = None):
2054+
def from_openapi_data_oapg(cls, arg: typing.Union[int, float], _configuration: typing.Optional[Configuration] = None):
19112055
return super().from_openapi_data_oapg(arg, _configuration=_configuration)
19122056

19132057
def __new__(cls, arg: typing.Union[decimal.Decimal, int, float], **kwargs: Configuration):
@@ -2052,7 +2196,7 @@ class Float32Schema(
20522196
):
20532197

20542198
@classmethod
2055-
def from_openapi_data_oapg(cls, arg: typing.Union[float, decimal.Decimal], _configuration: typing.Optional[Configuration] = None):
2199+
def from_openapi_data_oapg(cls, arg: float, _configuration: typing.Optional[Configuration] = None):
20562200
return super().from_openapi_data_oapg(arg, _configuration=_configuration)
20572201

20582202

@@ -2086,13 +2230,13 @@ class Float64Schema(
20862230
):
20872231

20882232
@classmethod
2089-
def from_openapi_data_oapg(cls, arg: typing.Union[float, decimal.Decimal], _configuration: typing.Optional[Configuration] = None):
2233+
def from_openapi_data_oapg(cls, arg: float, _configuration: typing.Optional[Configuration] = None):
20902234
# todo check format
20912235
return super().from_openapi_data_oapg(arg, _configuration=_configuration)
20922236

20932237

20942238
class StrSchema(
2095-
SchemaTypeCheckerClsFactory(typing.Union[str]),
2239+
SchemaTypeCheckerClsFactory(str),
20962240
StrBase,
20972241
Schema,
20982242
StrMixin
@@ -2105,7 +2249,7 @@ class StrSchema(
21052249
"""
21062250

21072251
@classmethod
2108-
def from_openapi_data_oapg(cls, arg: typing.Union[str], _configuration: typing.Optional[Configuration] = None) -> 'StrSchema':
2252+
def from_openapi_data_oapg(cls, arg: str, _configuration: typing.Optional[Configuration] = None) -> 'StrSchema':
21092253
return super().from_openapi_data_oapg(arg, _configuration=_configuration)
21102254

21112255
def __new__(cls, arg: typing.Union[str, date, datetime, uuid.UUID], **kwargs: Configuration):
@@ -2132,7 +2276,7 @@ class DateTimeSchema(DateTimeBase, StrSchema):
21322276

21332277
class DecimalSchema(DecimalBase, StrSchema):
21342278

2135-
def __new__(cls, arg: typing.Union[str], **kwargs: Configuration):
2279+
def __new__(cls, arg: str, **kwargs: Configuration):
21362280
"""
21372281
Note: Decimals may not be passed in because cast_to_allowed_types is only invoked once for payloads
21382282
which can be simple (str) or complex (dicts or lists with nested values)
@@ -2145,18 +2289,18 @@ class DecimalSchema(DecimalBase, StrSchema):
21452289

21462290

21472291
class BytesSchema(
2148-
SchemaTypeCheckerClsFactory(typing.Union[bytes]),
2292+
SchemaTypeCheckerClsFactory(bytes),
21492293
Schema,
21502294
):
21512295
"""
21522296
this class will subclass bytes and is immutable
21532297
"""
2154-
def __new__(cls, arg: typing.Union[bytes], **kwargs: Configuration):
2298+
def __new__(cls, arg: bytes, **kwargs: Configuration):
21552299
return super(Schema, cls).__new__(cls, arg)
21562300

21572301

21582302
class FileSchema(
2159-
SchemaTypeCheckerClsFactory(typing.Union[FileIO]),
2303+
SchemaTypeCheckerClsFactory(FileIO),
21602304
Schema,
21612305
):
21622306
"""
@@ -2202,7 +2346,7 @@ class BinarySchema(
22022346

22032347

22042348
class BoolSchema(
2205-
SchemaTypeCheckerClsFactory(typing.Union[BoolClass]),
2349+
SchemaTypeCheckerClsFactory(BoolClass),
22062350
BoolBase,
22072351
Schema,
22082352
BoolMixin
@@ -2263,7 +2407,7 @@ class NotAnyTypeSchema(
22632407

22642408

22652409
class DictSchema(
2266-
SchemaTypeCheckerClsFactory(typing.Union[frozendict.frozendict]),
2410+
SchemaTypeCheckerClsFactory(frozendict.frozendict),
22672411
DictBase,
22682412
Schema,
22692413
FrozenDictMixin

0 commit comments

Comments
 (0)