@typespec/http-client-python 0.15.1 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/emitter/code-model.d.ts.map +1 -1
- package/dist/emitter/code-model.js +8 -1
- package/dist/emitter/code-model.js.map +1 -1
- package/dist/emitter/http.d.ts +5 -0
- package/dist/emitter/http.d.ts.map +1 -1
- package/dist/emitter/http.js +20 -1
- package/dist/emitter/http.js.map +1 -1
- package/emitter/src/code-model.ts +12 -0
- package/emitter/src/http.ts +23 -1
- package/emitter/temp/tsconfig.tsbuildinfo +1 -1
- package/eng/scripts/ci/regenerate.ts +4 -2
- package/eng/scripts/ci/util.py +1 -1
- package/eng/scripts/setup/__pycache__/package_manager.cpython-39.pyc +0 -0
- package/eng/scripts/setup/__pycache__/venvtools.cpython-39.pyc +0 -0
- package/generator/build/lib/pygen/__init__.py +14 -23
- package/generator/build/lib/pygen/codegen/__init__.py +4 -4
- package/generator/build/lib/pygen/codegen/models/__init__.py +2 -2
- package/generator/build/lib/pygen/codegen/models/base.py +9 -12
- package/generator/build/lib/pygen/codegen/models/base_builder.py +4 -6
- package/generator/build/lib/pygen/codegen/models/client.py +61 -102
- package/generator/build/lib/pygen/codegen/models/code_model.py +29 -29
- package/generator/build/lib/pygen/codegen/models/combined_type.py +7 -7
- package/generator/build/lib/pygen/codegen/models/constant_type.py +4 -11
- package/generator/build/lib/pygen/codegen/models/credential_types.py +9 -11
- package/generator/build/lib/pygen/codegen/models/dictionary_type.py +7 -8
- package/generator/build/lib/pygen/codegen/models/enum_type.py +7 -7
- package/generator/build/lib/pygen/codegen/models/imports.py +24 -29
- package/generator/build/lib/pygen/codegen/models/list_type.py +15 -14
- package/generator/build/lib/pygen/codegen/models/lro_operation.py +6 -6
- package/generator/build/lib/pygen/codegen/models/lro_paging_operation.py +2 -2
- package/generator/build/lib/pygen/codegen/models/model_type.py +11 -11
- package/generator/build/lib/pygen/codegen/models/operation.py +26 -56
- package/generator/build/lib/pygen/codegen/models/operation_group.py +11 -22
- package/generator/build/lib/pygen/codegen/models/paging_operation.py +15 -19
- package/generator/build/lib/pygen/codegen/models/parameter.py +12 -21
- package/generator/build/lib/pygen/codegen/models/parameter_list.py +37 -39
- package/generator/build/lib/pygen/codegen/models/primitive_types.py +24 -18
- package/generator/build/lib/pygen/codegen/models/property.py +10 -10
- package/generator/build/lib/pygen/codegen/models/request_builder.py +7 -8
- package/generator/build/lib/pygen/codegen/models/request_builder_parameter.py +3 -3
- package/generator/build/lib/pygen/codegen/models/response.py +15 -40
- package/generator/build/lib/pygen/codegen/models/utils.py +2 -2
- package/generator/build/lib/pygen/codegen/serializers/__init__.py +26 -42
- package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +103 -100
- package/generator/build/lib/pygen/codegen/serializers/client_serializer.py +22 -25
- package/generator/build/lib/pygen/codegen/serializers/enum_serializer.py +2 -2
- package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +49 -61
- package/generator/build/lib/pygen/codegen/serializers/import_serializer.py +6 -7
- package/generator/build/lib/pygen/codegen/serializers/model_init_serializer.py +1 -2
- package/generator/build/lib/pygen/codegen/serializers/model_serializer.py +15 -17
- package/generator/build/lib/pygen/codegen/serializers/operation_groups_serializer.py +3 -3
- package/generator/build/lib/pygen/codegen/serializers/operations_init_serializer.py +5 -6
- package/generator/build/lib/pygen/codegen/serializers/parameter_serializer.py +28 -18
- package/generator/build/lib/pygen/codegen/serializers/patch_serializer.py +1 -2
- package/generator/build/lib/pygen/codegen/serializers/request_builders_serializer.py +1 -2
- package/generator/build/lib/pygen/codegen/serializers/sample_serializer.py +9 -14
- package/generator/build/lib/pygen/codegen/serializers/test_serializer.py +7 -7
- package/generator/build/lib/pygen/codegen/serializers/utils.py +2 -2
- package/generator/build/lib/pygen/codegen/templates/model_base.py.jinja2 +30 -24
- package/generator/build/lib/pygen/codegen/templates/model_dpg.py.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/operation_group.py.jinja2 +1 -11
- package/generator/build/lib/pygen/codegen/templates/operations_folder_init.py.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/CHANGELOG.md.jinja2 +2 -1
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +13 -2
- package/generator/build/lib/pygen/codegen/templates/patch.py.jinja2 +1 -1
- package/generator/build/lib/pygen/codegen/templates/serialization.py.jinja2 +11 -13
- package/generator/build/lib/pygen/codegen/templates/utils.py.jinja2 +6 -6
- package/generator/build/lib/pygen/preprocess/__init__.py +47 -30
- package/generator/build/lib/pygen/preprocess/helpers.py +2 -2
- package/generator/build/lib/pygen/utils.py +6 -6
- package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
- package/generator/pygen/__init__.py +14 -23
- package/generator/pygen/codegen/__init__.py +4 -4
- package/generator/pygen/codegen/models/__init__.py +2 -2
- package/generator/pygen/codegen/models/base.py +9 -12
- package/generator/pygen/codegen/models/base_builder.py +4 -6
- package/generator/pygen/codegen/models/client.py +61 -102
- package/generator/pygen/codegen/models/code_model.py +29 -29
- package/generator/pygen/codegen/models/combined_type.py +7 -7
- package/generator/pygen/codegen/models/constant_type.py +4 -11
- package/generator/pygen/codegen/models/credential_types.py +9 -11
- package/generator/pygen/codegen/models/dictionary_type.py +7 -8
- package/generator/pygen/codegen/models/enum_type.py +7 -7
- package/generator/pygen/codegen/models/imports.py +24 -29
- package/generator/pygen/codegen/models/list_type.py +15 -14
- package/generator/pygen/codegen/models/lro_operation.py +6 -6
- package/generator/pygen/codegen/models/lro_paging_operation.py +2 -2
- package/generator/pygen/codegen/models/model_type.py +11 -11
- package/generator/pygen/codegen/models/operation.py +26 -56
- package/generator/pygen/codegen/models/operation_group.py +11 -22
- package/generator/pygen/codegen/models/paging_operation.py +15 -19
- package/generator/pygen/codegen/models/parameter.py +12 -21
- package/generator/pygen/codegen/models/parameter_list.py +37 -39
- package/generator/pygen/codegen/models/primitive_types.py +24 -18
- package/generator/pygen/codegen/models/property.py +10 -10
- package/generator/pygen/codegen/models/request_builder.py +7 -8
- package/generator/pygen/codegen/models/request_builder_parameter.py +3 -3
- package/generator/pygen/codegen/models/response.py +15 -40
- package/generator/pygen/codegen/models/utils.py +2 -2
- package/generator/pygen/codegen/serializers/__init__.py +26 -42
- package/generator/pygen/codegen/serializers/builder_serializer.py +103 -100
- package/generator/pygen/codegen/serializers/client_serializer.py +22 -25
- package/generator/pygen/codegen/serializers/enum_serializer.py +2 -2
- package/generator/pygen/codegen/serializers/general_serializer.py +49 -61
- package/generator/pygen/codegen/serializers/import_serializer.py +6 -7
- package/generator/pygen/codegen/serializers/model_init_serializer.py +1 -2
- package/generator/pygen/codegen/serializers/model_serializer.py +15 -17
- package/generator/pygen/codegen/serializers/operation_groups_serializer.py +3 -3
- package/generator/pygen/codegen/serializers/operations_init_serializer.py +5 -6
- package/generator/pygen/codegen/serializers/parameter_serializer.py +28 -18
- package/generator/pygen/codegen/serializers/patch_serializer.py +1 -2
- package/generator/pygen/codegen/serializers/request_builders_serializer.py +1 -2
- package/generator/pygen/codegen/serializers/sample_serializer.py +9 -14
- package/generator/pygen/codegen/serializers/test_serializer.py +7 -7
- package/generator/pygen/codegen/serializers/utils.py +2 -2
- package/generator/pygen/codegen/templates/model_base.py.jinja2 +30 -24
- package/generator/pygen/codegen/templates/model_dpg.py.jinja2 +1 -1
- package/generator/pygen/codegen/templates/operation_group.py.jinja2 +1 -11
- package/generator/pygen/codegen/templates/operations_folder_init.py.jinja2 +1 -1
- package/generator/pygen/codegen/templates/packaging_templates/CHANGELOG.md.jinja2 +2 -1
- package/generator/pygen/codegen/templates/packaging_templates/dev_requirements.txt.jinja2 +1 -1
- package/generator/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +13 -2
- package/generator/pygen/codegen/templates/patch.py.jinja2 +1 -1
- package/generator/pygen/codegen/templates/serialization.py.jinja2 +11 -13
- package/generator/pygen/codegen/templates/utils.py.jinja2 +6 -6
- package/generator/pygen/preprocess/__init__.py +47 -30
- package/generator/pygen/preprocess/helpers.py +2 -2
- package/generator/pygen/utils.py +6 -6
- package/generator/pygen.egg-info/SOURCES.txt +0 -2
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_operationtemplates_async.py +79 -0
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_api_version_header_async.py +18 -0
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_api_version_path_async.py +18 -0
- package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_api_version_query_async.py +18 -0
- package/generator/test/azure/mock_api_tests/asynctests/test_client_naming_async.py +4 -4
- package/generator/test/azure/mock_api_tests/asynctests/test_client_naming_enum_conflict_async.py +37 -0
- package/generator/test/azure/mock_api_tests/asynctests/test_client_overload_async.py +27 -0
- package/generator/test/azure/mock_api_tests/conftest.py +2 -2
- package/generator/test/azure/mock_api_tests/test_azure_arm_operationtemplates.py +72 -0
- package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_api_version_header.py +17 -0
- package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_api_version_path.py +17 -0
- package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_api_version_query.py +17 -0
- package/generator/test/azure/mock_api_tests/test_client_naming.py +3 -3
- package/generator/test/azure/mock_api_tests/test_client_naming_enum_conflict.py +35 -0
- package/generator/test/azure/mock_api_tests/test_client_overload.py +25 -0
- package/generator/test/azure/requirements.txt +5 -0
- package/generator/test/unbranded/mock_api_tests/conftest.py +1 -2
- package/generator/test/unittests/test_model_base_serialization.py +88 -92
- package/generator/test/unittests/test_model_base_xml_serialization.py +19 -23
- package/package.json +8 -8
- package/generator/build/lib/pygen/codegen/serializers/metadata_serializer.py +0 -216
- package/generator/build/lib/pygen/codegen/templates/metadata.json.jinja2 +0 -167
- package/generator/pygen/codegen/serializers/metadata_serializer.py +0 -216
- package/generator/pygen/codegen/templates/metadata.json.jinja2 +0 -167
|
@@ -10,13 +10,9 @@ from pathlib import Path
|
|
|
10
10
|
from typing import (
|
|
11
11
|
Any,
|
|
12
12
|
Iterable,
|
|
13
|
-
List,
|
|
14
13
|
Literal,
|
|
15
|
-
Dict,
|
|
16
14
|
Mapping,
|
|
17
15
|
Sequence,
|
|
18
|
-
Set,
|
|
19
|
-
Tuple,
|
|
20
16
|
Optional,
|
|
21
17
|
overload,
|
|
22
18
|
Union,
|
|
@@ -49,7 +45,7 @@ class BasicResource(Model):
|
|
|
49
45
|
platform_fault_domain_count: int = rest_field(
|
|
50
46
|
name="platformFaultDomainCount"
|
|
51
47
|
) # How many times the platform fault domain has been counted
|
|
52
|
-
virtual_machines:
|
|
48
|
+
virtual_machines: list[Any] = rest_field(name="virtualMachines") # List of virtual machines
|
|
53
49
|
|
|
54
50
|
@overload
|
|
55
51
|
def __init__(
|
|
@@ -57,7 +53,7 @@ class BasicResource(Model):
|
|
|
57
53
|
*,
|
|
58
54
|
platform_update_domain_count: int,
|
|
59
55
|
platform_fault_domain_count: int,
|
|
60
|
-
virtual_machines:
|
|
56
|
+
virtual_machines: list[Any],
|
|
61
57
|
): ...
|
|
62
58
|
|
|
63
59
|
@overload
|
|
@@ -185,7 +181,7 @@ def test_original_and_attr_name_same():
|
|
|
185
181
|
class OptionalModel(Model):
|
|
186
182
|
optional_str: Optional[str] = rest_field()
|
|
187
183
|
optional_time: Optional[datetime.time] = rest_field()
|
|
188
|
-
optional_dict: Optional[
|
|
184
|
+
optional_dict: Optional[dict[str, Optional[Pet]]] = rest_field(name="optionalDict")
|
|
189
185
|
optional_model: Optional[Pet] = rest_field()
|
|
190
186
|
optional_myself: Optional["OptionalModel"] = rest_field()
|
|
191
187
|
|
|
@@ -195,7 +191,7 @@ class OptionalModel(Model):
|
|
|
195
191
|
*,
|
|
196
192
|
optional_str: Optional[str] = None,
|
|
197
193
|
optional_time: Optional[datetime.time] = None,
|
|
198
|
-
optional_dict: Optional[
|
|
194
|
+
optional_dict: Optional[dict[str, Optional[Pet]]] = None,
|
|
199
195
|
optional_myself: Optional["OptionalModel"] = None,
|
|
200
196
|
): ...
|
|
201
197
|
|
|
@@ -448,7 +444,7 @@ def test_model_recursion():
|
|
|
448
444
|
|
|
449
445
|
def test_dictionary_deserialization():
|
|
450
446
|
class DictionaryModel(Model):
|
|
451
|
-
prop:
|
|
447
|
+
prop: dict[str, datetime.datetime] = rest_field()
|
|
452
448
|
|
|
453
449
|
@overload
|
|
454
450
|
def __init__(self, *, prop: datetime.datetime): ...
|
|
@@ -492,10 +488,10 @@ def test_attr_and_rest_case():
|
|
|
492
488
|
|
|
493
489
|
def test_dictionary_deserialization_model():
|
|
494
490
|
class DictionaryModel(Model):
|
|
495
|
-
prop:
|
|
491
|
+
prop: dict[str, Pet] = rest_field()
|
|
496
492
|
|
|
497
493
|
@overload
|
|
498
|
-
def __init__(self, *, prop:
|
|
494
|
+
def __init__(self, *, prop: dict[str, Pet]): ...
|
|
499
495
|
|
|
500
496
|
@overload
|
|
501
497
|
def __init__(self, mapping: Mapping[str, Any], /): ...
|
|
@@ -539,10 +535,10 @@ def test_dictionary_deserialization_model():
|
|
|
539
535
|
|
|
540
536
|
def test_list_deserialization():
|
|
541
537
|
class ListModel(Model):
|
|
542
|
-
prop:
|
|
538
|
+
prop: list[datetime.datetime] = rest_field()
|
|
543
539
|
|
|
544
540
|
@overload
|
|
545
|
-
def __init__(self, *, prop:
|
|
541
|
+
def __init__(self, *, prop: list[datetime.datetime]): ...
|
|
546
542
|
|
|
547
543
|
@overload
|
|
548
544
|
def __init__(self, mapping: Mapping[str, Any], /): ...
|
|
@@ -560,10 +556,10 @@ def test_list_deserialization():
|
|
|
560
556
|
|
|
561
557
|
def test_list_deserialization_model():
|
|
562
558
|
class ListModel(Model):
|
|
563
|
-
prop:
|
|
559
|
+
prop: list[Pet] = rest_field()
|
|
564
560
|
|
|
565
561
|
@overload
|
|
566
|
-
def __init__(self, *, prop:
|
|
562
|
+
def __init__(self, *, prop: list[Pet]): ...
|
|
567
563
|
|
|
568
564
|
@overload
|
|
569
565
|
def __init__(self, mapping: Mapping[str, Any], /): ...
|
|
@@ -595,10 +591,10 @@ def test_list_deserialization_model():
|
|
|
595
591
|
|
|
596
592
|
def test_set_deserialization():
|
|
597
593
|
class SetModel(Model):
|
|
598
|
-
prop:
|
|
594
|
+
prop: set[datetime.datetime] = rest_field()
|
|
599
595
|
|
|
600
596
|
@overload
|
|
601
|
-
def __init__(self, *, prop:
|
|
597
|
+
def __init__(self, *, prop: set[datetime.datetime]): ...
|
|
602
598
|
|
|
603
599
|
@overload
|
|
604
600
|
def __init__(self, mapping: Mapping[str, Any], /): ...
|
|
@@ -616,10 +612,10 @@ def test_set_deserialization():
|
|
|
616
612
|
|
|
617
613
|
def test_tuple_deserialization():
|
|
618
614
|
class TupleModel(Model):
|
|
619
|
-
prop:
|
|
615
|
+
prop: tuple[str, datetime.datetime] = rest_field()
|
|
620
616
|
|
|
621
617
|
@overload
|
|
622
|
-
def __init__(self, *, prop:
|
|
618
|
+
def __init__(self, *, prop: tuple[str, datetime.datetime]): ...
|
|
623
619
|
|
|
624
620
|
@overload
|
|
625
621
|
def __init__(self, mapping: Mapping[str, Any], /): ...
|
|
@@ -650,10 +646,10 @@ def test_list_of_tuple_deserialization_model():
|
|
|
650
646
|
super().__init__(*args, **kwargs)
|
|
651
647
|
|
|
652
648
|
class ListOfTupleModel(Model):
|
|
653
|
-
prop:
|
|
649
|
+
prop: list[tuple[Pet, Owner]] = rest_field()
|
|
654
650
|
|
|
655
651
|
@overload
|
|
656
|
-
def __init__(self, *, prop:
|
|
652
|
+
def __init__(self, *, prop: list[tuple[Pet, Owner]]): ...
|
|
657
653
|
|
|
658
654
|
@overload
|
|
659
655
|
def __init__(self, mapping: Mapping[str, Any], /): ...
|
|
@@ -666,7 +662,7 @@ def test_list_of_tuple_deserialization_model():
|
|
|
666
662
|
giacamo = {"name": "Giacamo", "pet": eugene}
|
|
667
663
|
elizabeth = {"name": "Elizabeth", "pet": lady}
|
|
668
664
|
|
|
669
|
-
dict_response:
|
|
665
|
+
dict_response: dict[str, Any] = {"prop": [(eugene, giacamo), (lady, elizabeth)]}
|
|
670
666
|
model = ListOfTupleModel(dict_response)
|
|
671
667
|
assert (
|
|
672
668
|
model["prop"]
|
|
@@ -685,20 +681,20 @@ def test_list_of_tuple_deserialization_model():
|
|
|
685
681
|
|
|
686
682
|
class RecursiveModel(Model):
|
|
687
683
|
name: str = rest_field()
|
|
688
|
-
list_of_me: Optional[
|
|
689
|
-
dict_of_me: Optional[
|
|
690
|
-
dict_of_list_of_me: Optional[
|
|
691
|
-
list_of_dict_of_me: Optional[
|
|
684
|
+
list_of_me: Optional[list["RecursiveModel"]] = rest_field(name="listOfMe")
|
|
685
|
+
dict_of_me: Optional[dict[str, "RecursiveModel"]] = rest_field(name="dictOfMe")
|
|
686
|
+
dict_of_list_of_me: Optional[dict[str, list["RecursiveModel"]]] = rest_field(name="dictOfListOfMe")
|
|
687
|
+
list_of_dict_of_me: Optional[list[dict[str, "RecursiveModel"]]] = rest_field(name="listOfDictOfMe")
|
|
692
688
|
|
|
693
689
|
@overload
|
|
694
690
|
def __init__(
|
|
695
691
|
self,
|
|
696
692
|
*,
|
|
697
693
|
name: str,
|
|
698
|
-
list_of_me: Optional[
|
|
699
|
-
dict_of_me: Optional[
|
|
700
|
-
dict_of_list_of_me: Optional[
|
|
701
|
-
list_of_dict_of_me: Optional[
|
|
694
|
+
list_of_me: Optional[list["RecursiveModel"]] = None,
|
|
695
|
+
dict_of_me: Optional[dict[str, "RecursiveModel"]] = None,
|
|
696
|
+
dict_of_list_of_me: Optional[dict[str, list["RecursiveModel"]]] = None,
|
|
697
|
+
list_of_dict_of_me: Optional[list[dict[str, "RecursiveModel"]]] = None,
|
|
702
698
|
): ...
|
|
703
699
|
|
|
704
700
|
@overload
|
|
@@ -778,7 +774,7 @@ def test_model_recursion_complex():
|
|
|
778
774
|
assert model.list_of_me
|
|
779
775
|
assert model.list_of_me[0].name == "it's me!"
|
|
780
776
|
assert model.list_of_me[0].list_of_me is None
|
|
781
|
-
assert isinstance(model.list_of_me,
|
|
777
|
+
assert isinstance(model.list_of_me, list)
|
|
782
778
|
assert isinstance(model.list_of_me[0], RecursiveModel)
|
|
783
779
|
|
|
784
780
|
assert model["dictOfMe"] == {
|
|
@@ -802,7 +798,7 @@ def test_model_recursion_complex():
|
|
|
802
798
|
)
|
|
803
799
|
}
|
|
804
800
|
|
|
805
|
-
assert isinstance(model.dict_of_me,
|
|
801
|
+
assert isinstance(model.dict_of_me, dict)
|
|
806
802
|
assert isinstance(model.dict_of_me["me"], RecursiveModel)
|
|
807
803
|
|
|
808
804
|
assert model["dictOfListOfMe"] == {
|
|
@@ -829,8 +825,8 @@ def test_model_recursion_complex():
|
|
|
829
825
|
)
|
|
830
826
|
]
|
|
831
827
|
}
|
|
832
|
-
assert isinstance(model.dict_of_list_of_me,
|
|
833
|
-
assert isinstance(model.dict_of_list_of_me["many mes"],
|
|
828
|
+
assert isinstance(model.dict_of_list_of_me, dict)
|
|
829
|
+
assert isinstance(model.dict_of_list_of_me["many mes"], list)
|
|
834
830
|
assert isinstance(model.dict_of_list_of_me["many mes"][0], RecursiveModel)
|
|
835
831
|
|
|
836
832
|
assert model["listOfDictOfMe"] == [
|
|
@@ -857,8 +853,8 @@ def test_model_recursion_complex():
|
|
|
857
853
|
)
|
|
858
854
|
}
|
|
859
855
|
]
|
|
860
|
-
assert isinstance(model.list_of_dict_of_me,
|
|
861
|
-
assert isinstance(model.list_of_dict_of_me[0],
|
|
856
|
+
assert isinstance(model.list_of_dict_of_me, list)
|
|
857
|
+
assert isinstance(model.list_of_dict_of_me[0], dict)
|
|
862
858
|
assert isinstance(model.list_of_dict_of_me[0]["me"], RecursiveModel)
|
|
863
859
|
|
|
864
860
|
assert model.as_dict() == model == dict_response
|
|
@@ -978,11 +974,11 @@ def test_inheritance_basic():
|
|
|
978
974
|
return [str(e) for e in obj]
|
|
979
975
|
|
|
980
976
|
class Parent(Model):
|
|
981
|
-
parent_prop:
|
|
977
|
+
parent_prop: list[int] = rest_field(name="parentProp", type=_callback)
|
|
982
978
|
prop: str = rest_field()
|
|
983
979
|
|
|
984
980
|
@overload
|
|
985
|
-
def __init__(self, *, parent_prop:
|
|
981
|
+
def __init__(self, *, parent_prop: list[int], prop: str): ...
|
|
986
982
|
|
|
987
983
|
@overload
|
|
988
984
|
def __init__(self, mapping: Mapping[str, Any], /): ...
|
|
@@ -1014,10 +1010,10 @@ class ParentA(Model):
|
|
|
1014
1010
|
|
|
1015
1011
|
class ParentB(ParentA):
|
|
1016
1012
|
prop: str = rest_field()
|
|
1017
|
-
bcd_prop: Optional[
|
|
1013
|
+
bcd_prop: Optional[list["ParentB"]] = rest_field(name="bcdProp")
|
|
1018
1014
|
|
|
1019
1015
|
@overload
|
|
1020
|
-
def __init__(self, *, prop: Any, bcd_prop: Optional[
|
|
1016
|
+
def __init__(self, *, prop: Any, bcd_prop: Optional[list["ParentB"]] = None): ...
|
|
1021
1017
|
|
|
1022
1018
|
@overload
|
|
1023
1019
|
def __init__(self, mapping: Mapping[str, Any], /): ...
|
|
@@ -1031,7 +1027,7 @@ class ParentC(ParentB):
|
|
|
1031
1027
|
cd_prop: ParentA = rest_field(name="cdProp")
|
|
1032
1028
|
|
|
1033
1029
|
@overload
|
|
1034
|
-
def __init__(self, *, prop: Any, bcd_prop:
|
|
1030
|
+
def __init__(self, *, prop: Any, bcd_prop: list[ParentB], cd_prop: ParentA, **kwargs): ...
|
|
1035
1031
|
|
|
1036
1032
|
@overload
|
|
1037
1033
|
def __init__(self, mapping: Mapping[str, Any], /): ...
|
|
@@ -1041,16 +1037,16 @@ class ParentC(ParentB):
|
|
|
1041
1037
|
|
|
1042
1038
|
|
|
1043
1039
|
class ChildD(ParentC):
|
|
1044
|
-
d_prop:
|
|
1040
|
+
d_prop: tuple[ParentA, ParentB, ParentC, Optional["ChildD"]] = rest_field(name="dProp")
|
|
1045
1041
|
|
|
1046
1042
|
@overload
|
|
1047
1043
|
def __init__(
|
|
1048
1044
|
self,
|
|
1049
1045
|
*,
|
|
1050
1046
|
prop: Any,
|
|
1051
|
-
bcd_prop:
|
|
1047
|
+
bcd_prop: list[ParentB],
|
|
1052
1048
|
cd_prop: ParentA,
|
|
1053
|
-
d_prop:
|
|
1049
|
+
d_prop: tuple[ParentA, ParentB, ParentC, Optional["ChildD"]],
|
|
1054
1050
|
): ...
|
|
1055
1051
|
|
|
1056
1052
|
@overload
|
|
@@ -1120,13 +1116,13 @@ def test_model_dict_comparisons_list():
|
|
|
1120
1116
|
super().__init__(*args, **kwargs)
|
|
1121
1117
|
|
|
1122
1118
|
class Outer(Model):
|
|
1123
|
-
inner:
|
|
1119
|
+
inner: list[Inner] = rest_field()
|
|
1124
1120
|
|
|
1125
1121
|
@overload
|
|
1126
1122
|
def __init__(
|
|
1127
1123
|
self,
|
|
1128
1124
|
*,
|
|
1129
|
-
inner:
|
|
1125
|
+
inner: list[Inner],
|
|
1130
1126
|
): ...
|
|
1131
1127
|
|
|
1132
1128
|
@overload
|
|
@@ -1168,13 +1164,13 @@ def test_model_dict_comparisons_dict():
|
|
|
1168
1164
|
super().__init__(*args, **kwargs)
|
|
1169
1165
|
|
|
1170
1166
|
class Outer(Model):
|
|
1171
|
-
inner:
|
|
1167
|
+
inner: dict[str, Inner] = rest_field()
|
|
1172
1168
|
|
|
1173
1169
|
@overload
|
|
1174
1170
|
def __init__(
|
|
1175
1171
|
self,
|
|
1176
1172
|
*,
|
|
1177
|
-
inner:
|
|
1173
|
+
inner: dict[str, Inner],
|
|
1178
1174
|
): ...
|
|
1179
1175
|
|
|
1180
1176
|
@overload
|
|
@@ -1366,7 +1362,7 @@ def test_multiple_inheritance_mro():
|
|
|
1366
1362
|
class Feline(Model):
|
|
1367
1363
|
meows: bool = rest_field()
|
|
1368
1364
|
hisses: bool = rest_field()
|
|
1369
|
-
siblings: Optional[
|
|
1365
|
+
siblings: Optional[list["Feline"]] = rest_field()
|
|
1370
1366
|
|
|
1371
1367
|
@overload
|
|
1372
1368
|
def __init__(
|
|
@@ -1374,7 +1370,7 @@ class Feline(Model):
|
|
|
1374
1370
|
*,
|
|
1375
1371
|
meows: bool,
|
|
1376
1372
|
hisses: bool,
|
|
1377
|
-
siblings: Optional[
|
|
1373
|
+
siblings: Optional[list["Feline"]] = None,
|
|
1378
1374
|
): ...
|
|
1379
1375
|
|
|
1380
1376
|
@overload
|
|
@@ -1429,7 +1425,7 @@ class Cat(PetModel, Feline):
|
|
|
1429
1425
|
meows: bool,
|
|
1430
1426
|
hisses: bool,
|
|
1431
1427
|
likes_milk: bool,
|
|
1432
|
-
siblings: Optional[
|
|
1428
|
+
siblings: Optional[list[Feline]],
|
|
1433
1429
|
): ...
|
|
1434
1430
|
|
|
1435
1431
|
@overload
|
|
@@ -1464,7 +1460,7 @@ class Kitten(Cat, CuteThing):
|
|
|
1464
1460
|
meows: bool,
|
|
1465
1461
|
hisses: bool,
|
|
1466
1462
|
likes_milk: bool,
|
|
1467
|
-
siblings: Optional[
|
|
1463
|
+
siblings: Optional[list[Feline]],
|
|
1468
1464
|
how_cute_am_i: float,
|
|
1469
1465
|
eats_mice_yet: bool,
|
|
1470
1466
|
): ...
|
|
@@ -1900,10 +1896,10 @@ def test_serialization_initialization_and_setting():
|
|
|
1900
1896
|
|
|
1901
1897
|
def test_copy_of_input():
|
|
1902
1898
|
class TestModel(Model):
|
|
1903
|
-
data:
|
|
1899
|
+
data: list[int] = rest_field()
|
|
1904
1900
|
|
|
1905
1901
|
@overload
|
|
1906
|
-
def __init__(self, *, data:
|
|
1902
|
+
def __init__(self, *, data: list[int]): ...
|
|
1907
1903
|
|
|
1908
1904
|
@overload
|
|
1909
1905
|
def __init__(self, mapping: Mapping[str, Any], /): ...
|
|
@@ -2092,14 +2088,14 @@ def test_mutability_list():
|
|
|
2092
2088
|
super().__init__(*args, **kwargs)
|
|
2093
2089
|
|
|
2094
2090
|
class Middle(Model):
|
|
2095
|
-
inner_property:
|
|
2091
|
+
inner_property: list[Inner] = rest_field(name="innerProperty")
|
|
2096
2092
|
prop: str = rest_field()
|
|
2097
2093
|
|
|
2098
2094
|
@overload
|
|
2099
2095
|
def __init__(
|
|
2100
2096
|
self,
|
|
2101
2097
|
*,
|
|
2102
|
-
inner_property:
|
|
2098
|
+
inner_property: list[Inner],
|
|
2103
2099
|
prop: str,
|
|
2104
2100
|
): ...
|
|
2105
2101
|
|
|
@@ -2195,14 +2191,14 @@ def test_mutability_dict():
|
|
|
2195
2191
|
super().__init__(*args, **kwargs)
|
|
2196
2192
|
|
|
2197
2193
|
class Middle(Model):
|
|
2198
|
-
inner_property:
|
|
2194
|
+
inner_property: dict[str, Inner] = rest_field(name="innerProperty")
|
|
2199
2195
|
prop: str = rest_field()
|
|
2200
2196
|
|
|
2201
2197
|
@overload
|
|
2202
2198
|
def __init__(
|
|
2203
2199
|
self,
|
|
2204
2200
|
*,
|
|
2205
|
-
inner_property:
|
|
2201
|
+
inner_property: dict[str, Inner],
|
|
2206
2202
|
prop: str,
|
|
2207
2203
|
): ...
|
|
2208
2204
|
|
|
@@ -2339,14 +2335,14 @@ def test_pop_model():
|
|
|
2339
2335
|
super().__init__(*args, **kwargs)
|
|
2340
2336
|
|
|
2341
2337
|
class Middle(Model):
|
|
2342
|
-
inner_property:
|
|
2338
|
+
inner_property: dict[str, Inner] = rest_field(name="innerProperty")
|
|
2343
2339
|
prop: str = rest_field()
|
|
2344
2340
|
|
|
2345
2341
|
@overload
|
|
2346
2342
|
def __init__(
|
|
2347
2343
|
self,
|
|
2348
2344
|
*,
|
|
2349
|
-
inner_property:
|
|
2345
|
+
inner_property: dict[str, Inner],
|
|
2350
2346
|
prop: str,
|
|
2351
2347
|
): ...
|
|
2352
2348
|
|
|
@@ -2665,7 +2661,7 @@ def test_popitem():
|
|
|
2665
2661
|
"cProp": {"cStrProp": "c"},
|
|
2666
2662
|
}
|
|
2667
2663
|
|
|
2668
|
-
def _tests(my_dict:
|
|
2664
|
+
def _tests(my_dict: dict[str, Any], my_model: MainModel):
|
|
2669
2665
|
my_dict = copy.deepcopy(my_dict) # so we don't get rid of the dict each time we run tests
|
|
2670
2666
|
|
|
2671
2667
|
# pop c prop
|
|
@@ -2724,7 +2720,7 @@ def test_clear():
|
|
|
2724
2720
|
"cProp": {"cStrProp": "c"},
|
|
2725
2721
|
}
|
|
2726
2722
|
|
|
2727
|
-
def _tests(my_dict:
|
|
2723
|
+
def _tests(my_dict: dict[str, Any], my_model: MainModel):
|
|
2728
2724
|
my_dict = copy.deepcopy(my_dict) # so we don't get rid of the dict each time we run tests
|
|
2729
2725
|
|
|
2730
2726
|
assert my_dict["aProp"] == my_model.a_prop == my_model["aProp"] == {"aStrProp": "a"}
|
|
@@ -2772,7 +2768,7 @@ def test_update():
|
|
|
2772
2768
|
"cProp": {"cStrProp": "c"},
|
|
2773
2769
|
}
|
|
2774
2770
|
|
|
2775
|
-
def _tests(my_dict:
|
|
2771
|
+
def _tests(my_dict: dict[str, Any], my_model: MainModel):
|
|
2776
2772
|
my_dict = copy.deepcopy(my_dict) # so we don't get rid of the dict each time we run tests
|
|
2777
2773
|
|
|
2778
2774
|
assert my_dict["aProp"] == my_model.a_prop == my_model["aProp"] == {"aStrProp": "a"}
|
|
@@ -2925,8 +2921,8 @@ def test_complex_byte_wrapper():
|
|
|
2925
2921
|
default: Optional[bytes] = rest_field(default=None)
|
|
2926
2922
|
base64: Optional[bytes] = rest_field(default=None, format="base64")
|
|
2927
2923
|
base64url: Optional[bytes] = rest_field(default=None, format="base64url")
|
|
2928
|
-
list_base64: Optional[
|
|
2929
|
-
map_base64url: Optional[
|
|
2924
|
+
list_base64: Optional[list[bytes]] = rest_field(default=None, format="base64")
|
|
2925
|
+
map_base64url: Optional[dict[str, bytes]] = rest_field(default=None, format="base64url")
|
|
2930
2926
|
|
|
2931
2927
|
@overload
|
|
2932
2928
|
def __init__(
|
|
@@ -2935,8 +2931,8 @@ def test_complex_byte_wrapper():
|
|
|
2935
2931
|
default: Optional[bytes] = None,
|
|
2936
2932
|
base64: Optional[bytes] = None,
|
|
2937
2933
|
base64url: Optional[bytes] = None,
|
|
2938
|
-
list_base64: Optional[
|
|
2939
|
-
map_base64url: Optional[
|
|
2934
|
+
list_base64: Optional[list[bytes]] = None,
|
|
2935
|
+
map_base64url: Optional[dict[str, bytes]] = None,
|
|
2940
2936
|
): ...
|
|
2941
2937
|
|
|
2942
2938
|
@overload
|
|
@@ -2998,8 +2994,8 @@ def test_complex_byte_array_wrapper():
|
|
|
2998
2994
|
default: Optional[bytearray] = rest_field(default=None)
|
|
2999
2995
|
base64: Optional[bytearray] = rest_field(default=None, format="base64")
|
|
3000
2996
|
base64url: Optional[bytearray] = rest_field(default=None, format="base64url")
|
|
3001
|
-
list_base64: Optional[
|
|
3002
|
-
map_base64url: Optional[
|
|
2997
|
+
list_base64: Optional[list[bytearray]] = rest_field(default=None, format="base64")
|
|
2998
|
+
map_base64url: Optional[dict[str, bytearray]] = rest_field(default=None, format="base64url")
|
|
3003
2999
|
|
|
3004
3000
|
@overload
|
|
3005
3001
|
def __init__(
|
|
@@ -3008,8 +3004,8 @@ def test_complex_byte_array_wrapper():
|
|
|
3008
3004
|
default: Optional[bytearray] = None,
|
|
3009
3005
|
base64: Optional[bytearray] = None,
|
|
3010
3006
|
base64url: Optional[bytearray] = None,
|
|
3011
|
-
list_base64: Optional[
|
|
3012
|
-
map_base64url: Optional[
|
|
3007
|
+
list_base64: Optional[list[bytearray]] = None,
|
|
3008
|
+
map_base64url: Optional[dict[str, bytearray]] = None,
|
|
3013
3009
|
): ...
|
|
3014
3010
|
|
|
3015
3011
|
@overload
|
|
@@ -3072,8 +3068,8 @@ def test_complex_datetime_wrapper():
|
|
|
3072
3068
|
rfc3339: datetime.datetime = rest_field(default=None, format="rfc3339")
|
|
3073
3069
|
rfc7231: datetime.datetime = rest_field(default=None, format="rfc7231")
|
|
3074
3070
|
unix: datetime.datetime = rest_field(default=None, format="unix-timestamp")
|
|
3075
|
-
list_rfc3339:
|
|
3076
|
-
dict_rfc7231:
|
|
3071
|
+
list_rfc3339: list[datetime.datetime] = rest_field(default=None, format="rfc3339")
|
|
3072
|
+
dict_rfc7231: dict[str, datetime.datetime] = rest_field(default=None, format="rfc7231")
|
|
3077
3073
|
|
|
3078
3074
|
@overload
|
|
3079
3075
|
def __init__(
|
|
@@ -3083,8 +3079,8 @@ def test_complex_datetime_wrapper():
|
|
|
3083
3079
|
rfc3339: Optional[datetime.datetime] = None,
|
|
3084
3080
|
rfc7231: Optional[datetime.datetime] = None,
|
|
3085
3081
|
unix: Optional[datetime.datetime] = None,
|
|
3086
|
-
list_rfc3339: Optional[
|
|
3087
|
-
dict_rfc7231: Optional[
|
|
3082
|
+
list_rfc3339: Optional[list[datetime.datetime]] = None,
|
|
3083
|
+
dict_rfc7231: Optional[dict[str, datetime.datetime]] = None,
|
|
3088
3084
|
): ...
|
|
3089
3085
|
|
|
3090
3086
|
@overload
|
|
@@ -3175,13 +3171,13 @@ def test_complex_date_wrapper():
|
|
|
3175
3171
|
|
|
3176
3172
|
|
|
3177
3173
|
class DictionaryWrapper(Model):
|
|
3178
|
-
default_program:
|
|
3174
|
+
default_program: dict[str, str] = rest_field(name="defaultProgram", default=None)
|
|
3179
3175
|
|
|
3180
3176
|
@overload
|
|
3181
3177
|
def __init__(
|
|
3182
3178
|
self,
|
|
3183
3179
|
*,
|
|
3184
|
-
default_program: Optional[
|
|
3180
|
+
default_program: Optional[dict[str, str]] = None,
|
|
3185
3181
|
): ...
|
|
3186
3182
|
|
|
3187
3183
|
@overload
|
|
@@ -3234,13 +3230,13 @@ def test_complex_dictionary_wrapper_none(model: DictionaryWrapper):
|
|
|
3234
3230
|
|
|
3235
3231
|
|
|
3236
3232
|
class ArrayWrapper(Model):
|
|
3237
|
-
array: Optional[
|
|
3233
|
+
array: Optional[list[str]] = rest_field(default=None)
|
|
3238
3234
|
|
|
3239
3235
|
@overload
|
|
3240
3236
|
def __init__(
|
|
3241
3237
|
self,
|
|
3242
3238
|
*,
|
|
3243
|
-
array: Optional[
|
|
3239
|
+
array: Optional[list[str]] = None,
|
|
3244
3240
|
): ...
|
|
3245
3241
|
|
|
3246
3242
|
@overload
|
|
@@ -3332,7 +3328,7 @@ class DogComplex(PetComplex):
|
|
|
3332
3328
|
|
|
3333
3329
|
class CatComplex(PetComplex):
|
|
3334
3330
|
color: Optional[str] = rest_field(default=None)
|
|
3335
|
-
hates: Optional[
|
|
3331
|
+
hates: Optional[list[DogComplex]] = rest_field(default=None)
|
|
3336
3332
|
|
|
3337
3333
|
@overload
|
|
3338
3334
|
def __init__(
|
|
@@ -3342,7 +3338,7 @@ class CatComplex(PetComplex):
|
|
|
3342
3338
|
name: Optional[str] = None,
|
|
3343
3339
|
food: Optional[str] = None,
|
|
3344
3340
|
color: Optional[str] = None,
|
|
3345
|
-
hates: Optional[
|
|
3341
|
+
hates: Optional[list[DogComplex]] = None,
|
|
3346
3342
|
): ...
|
|
3347
3343
|
|
|
3348
3344
|
@overload
|
|
@@ -3570,10 +3566,10 @@ class ModelWithNamedUnionProperty(Model):
|
|
|
3570
3566
|
|
|
3571
3567
|
|
|
3572
3568
|
class ModelWithSimpleUnionProperty(Model):
|
|
3573
|
-
simple_union: Union[int,
|
|
3569
|
+
simple_union: Union[int, list[int]] = rest_field(name="simpleUnion")
|
|
3574
3570
|
|
|
3575
3571
|
@overload
|
|
3576
|
-
def __init__(self, *, simple_union: Union[int,
|
|
3572
|
+
def __init__(self, *, simple_union: Union[int, list[int]]): ...
|
|
3577
3573
|
|
|
3578
3574
|
@overload
|
|
3579
3575
|
def __init__(self, mapping: Mapping[str, Any]): ...
|
|
@@ -3601,7 +3597,7 @@ def test_union():
|
|
|
3601
3597
|
def test_as_dict():
|
|
3602
3598
|
class CatComplex(PetComplex):
|
|
3603
3599
|
color: Optional[str] = rest_field(default=None)
|
|
3604
|
-
hates: Optional[
|
|
3600
|
+
hates: Optional[list[DogComplex]] = rest_field(default=None, visibility=["read"])
|
|
3605
3601
|
|
|
3606
3602
|
@overload
|
|
3607
3603
|
def __init__(
|
|
@@ -3611,7 +3607,7 @@ def test_as_dict():
|
|
|
3611
3607
|
name: Optional[str] = None,
|
|
3612
3608
|
food: Optional[str] = None,
|
|
3613
3609
|
color: Optional[str] = None,
|
|
3614
|
-
hates: Optional[
|
|
3610
|
+
hates: Optional[list[DogComplex]] = None,
|
|
3615
3611
|
): ...
|
|
3616
3612
|
|
|
3617
3613
|
@overload
|
|
@@ -3636,7 +3632,7 @@ def test_as_dict():
|
|
|
3636
3632
|
|
|
3637
3633
|
|
|
3638
3634
|
class Fish(Model):
|
|
3639
|
-
__mapping__:
|
|
3635
|
+
__mapping__: dict[str, Model] = {}
|
|
3640
3636
|
age: int = rest_field()
|
|
3641
3637
|
kind: Literal[None] = rest_discriminator(name="kind")
|
|
3642
3638
|
|
|
@@ -3656,7 +3652,7 @@ class Fish(Model):
|
|
|
3656
3652
|
|
|
3657
3653
|
|
|
3658
3654
|
class Shark(Fish, discriminator="shark"):
|
|
3659
|
-
__mapping__:
|
|
3655
|
+
__mapping__: dict[str, Model] = {}
|
|
3660
3656
|
kind: Literal["shark"] = rest_discriminator(name="kind")
|
|
3661
3657
|
sharktype: Literal[None] = rest_discriminator(name="sharktype")
|
|
3662
3658
|
|
|
@@ -3696,8 +3692,8 @@ class GoblinShark(Shark, discriminator="goblin"):
|
|
|
3696
3692
|
|
|
3697
3693
|
class Salmon(Fish, discriminator="salmon"):
|
|
3698
3694
|
kind: Literal["salmon"] = rest_discriminator(name="kind")
|
|
3699
|
-
friends: Optional[
|
|
3700
|
-
hate: Optional[
|
|
3695
|
+
friends: Optional[list["Fish"]] = rest_field()
|
|
3696
|
+
hate: Optional[dict[str, "Fish"]] = rest_field()
|
|
3701
3697
|
partner: Optional["Fish"] = rest_field()
|
|
3702
3698
|
|
|
3703
3699
|
@overload
|
|
@@ -3705,8 +3701,8 @@ class Salmon(Fish, discriminator="salmon"):
|
|
|
3705
3701
|
self,
|
|
3706
3702
|
*,
|
|
3707
3703
|
age: int,
|
|
3708
|
-
friends: Optional[
|
|
3709
|
-
hate: Optional[
|
|
3704
|
+
friends: Optional[list["Fish"]] = None,
|
|
3705
|
+
hate: Optional[dict[str, "Fish"]] = None,
|
|
3710
3706
|
partner: Optional["Fish"] = None,
|
|
3711
3707
|
): ...
|
|
3712
3708
|
|
|
@@ -3994,7 +3990,7 @@ def test_enum_deserialization():
|
|
|
3994
3990
|
model = ModelWithEnumProperty(raw_input)
|
|
3995
3991
|
check_func(model)
|
|
3996
3992
|
|
|
3997
|
-
result = _deserialize(
|
|
3993
|
+
result = _deserialize(list[ModelWithEnumProperty], [raw_input])
|
|
3998
3994
|
for item in result:
|
|
3999
3995
|
check_func(item)
|
|
4000
3996
|
|