From b1d8a799e4b745e5e0fca0e636f35686be2e8cdc Mon Sep 17 00:00:00 2001 From: Forest Tong Date: Thu, 11 Feb 2021 09:50:03 -0500 Subject: [PATCH 1/2] Treat allOf of one reference as a reference --- .../custom_e2e/models/__init__.py | 4 - .../custom_e2e/models/a_model.py | 22 ++--- .../custom_e2e/models/a_model_model.py | 90 ------------------- .../models/a_model_not_required_model.py | 90 ------------------- .../a_model_not_required_nullable_model.py | 90 ------------------- .../models/a_model_nullable_model.py | 90 ------------------- .../my_test_api_client/models/__init__.py | 4 - .../my_test_api_client/models/a_model.py | 22 ++--- .../models/a_model_model.py | 90 ------------------- .../models/a_model_not_required_model.py | 90 ------------------- .../a_model_not_required_nullable_model.py | 90 ------------------- .../models/a_model_nullable_model.py | 90 ------------------- .../parser/properties/__init__.py | 30 +++++-- 13 files changed, 40 insertions(+), 762 deletions(-) delete mode 100644 end_to_end_tests/golden-record-custom/custom_e2e/models/a_model_model.py delete mode 100644 end_to_end_tests/golden-record-custom/custom_e2e/models/a_model_not_required_model.py delete mode 100644 end_to_end_tests/golden-record-custom/custom_e2e/models/a_model_not_required_nullable_model.py delete mode 100644 end_to_end_tests/golden-record-custom/custom_e2e/models/a_model_nullable_model.py delete mode 100644 end_to_end_tests/golden-record/my_test_api_client/models/a_model_model.py delete mode 100644 end_to_end_tests/golden-record/my_test_api_client/models/a_model_not_required_model.py delete mode 100644 end_to_end_tests/golden-record/my_test_api_client/models/a_model_not_required_nullable_model.py delete mode 100644 end_to_end_tests/golden-record/my_test_api_client/models/a_model_nullable_model.py diff --git a/end_to_end_tests/golden-record-custom/custom_e2e/models/__init__.py b/end_to_end_tests/golden-record-custom/custom_e2e/models/__init__.py index 6f5ac7423..d3ca924b3 100644 --- a/end_to_end_tests/golden-record-custom/custom_e2e/models/__init__.py +++ b/end_to_end_tests/golden-record-custom/custom_e2e/models/__init__.py @@ -1,10 +1,6 @@ """ Contains all the data models used in inputs/outputs """ from .a_model import AModel -from .a_model_model import AModelModel -from .a_model_not_required_model import AModelNotRequiredModel -from .a_model_not_required_nullable_model import AModelNotRequiredNullableModel -from .a_model_nullable_model import AModelNullableModel from .an_enum import AnEnum from .an_int_enum import AnIntEnum from .body_upload_file_tests_upload_post import BodyUploadFileTestsUploadPost diff --git a/end_to_end_tests/golden-record-custom/custom_e2e/models/a_model.py b/end_to_end_tests/golden-record-custom/custom_e2e/models/a_model.py index 83d7518a7..e658516af 100644 --- a/end_to_end_tests/golden-record-custom/custom_e2e/models/a_model.py +++ b/end_to_end_tests/golden-record-custom/custom_e2e/models/a_model.py @@ -4,10 +4,6 @@ import attr from dateutil.parser import isoparse -from ..models.a_model_model import AModelModel -from ..models.a_model_not_required_model import AModelNotRequiredModel -from ..models.a_model_not_required_nullable_model import AModelNotRequiredNullableModel -from ..models.a_model_nullable_model import AModelNullableModel from ..models.an_enum import AnEnum from ..models.different_enum import DifferentEnum from ..models.free_form_model import FreeFormModel @@ -23,18 +19,18 @@ class AModel: a_camel_date_time: Union[datetime.datetime, datetime.date] a_date: datetime.date required_not_nullable: str - model: AModelModel + model: ModelWithUnionProperty one_of_models: Union[FreeFormModel, ModelWithUnionProperty] a_nullable_date: Optional[datetime.date] required_nullable: Optional[str] - nullable_model: Optional[AModelNullableModel] + nullable_model: Optional[ModelWithUnionProperty] nullable_one_of_models: Union[None, FreeFormModel, ModelWithUnionProperty] nested_list_of_enums: Union[Unset, List[List[DifferentEnum]]] = UNSET attr_1_leading_digit: Union[Unset, str] = UNSET not_required_nullable: Union[Unset, None, str] = UNSET not_required_not_nullable: Union[Unset, str] = UNSET - not_required_model: Union[Unset, AModelNotRequiredModel] = UNSET - not_required_nullable_model: Union[Unset, None, AModelNotRequiredNullableModel] = UNSET + not_required_model: Union[Unset, ModelWithUnionProperty] = UNSET + not_required_nullable_model: Union[Unset, None, ModelWithUnionProperty] = UNSET not_required_one_of_models: Union[Unset, FreeFormModel, ModelWithUnionProperty] = UNSET not_required_nullable_one_of_models: Union[Unset, None, FreeFormModel, ModelWithUnionProperty, str] = UNSET @@ -189,7 +185,7 @@ def _parse_a_camel_date_time(data: Union[str]) -> Union[datetime.datetime, datet required_not_nullable = d.pop("required_not_nullable") - model = AModelModel.from_dict(d.pop("model")) + model = ModelWithUnionProperty.from_dict(d.pop("model")) def _parse_one_of_models(data: Union[Dict[str, Any]]) -> Union[FreeFormModel, ModelWithUnionProperty]: one_of_models: Union[FreeFormModel, ModelWithUnionProperty] @@ -237,17 +233,17 @@ def _parse_one_of_models(data: Union[Dict[str, Any]]) -> Union[FreeFormModel, Mo nullable_model = None _nullable_model = d.pop("nullable_model") if _nullable_model is not None: - nullable_model = AModelNullableModel.from_dict(_nullable_model) + nullable_model = ModelWithUnionProperty.from_dict(_nullable_model) - not_required_model: Union[Unset, AModelNotRequiredModel] = UNSET + not_required_model: Union[Unset, ModelWithUnionProperty] = UNSET _not_required_model = d.pop("not_required_model", UNSET) if not isinstance(_not_required_model, Unset): - not_required_model = AModelNotRequiredModel.from_dict(_not_required_model) + not_required_model = ModelWithUnionProperty.from_dict(_not_required_model) not_required_nullable_model = None _not_required_nullable_model = d.pop("not_required_nullable_model", UNSET) if _not_required_nullable_model is not None and not isinstance(_not_required_nullable_model, Unset): - not_required_nullable_model = AModelNotRequiredNullableModel.from_dict(_not_required_nullable_model) + not_required_nullable_model = ModelWithUnionProperty.from_dict(_not_required_nullable_model) def _parse_nullable_one_of_models( data: Union[None, Dict[str, Any]] diff --git a/end_to_end_tests/golden-record-custom/custom_e2e/models/a_model_model.py b/end_to_end_tests/golden-record-custom/custom_e2e/models/a_model_model.py deleted file mode 100644 index cef48694b..000000000 --- a/end_to_end_tests/golden-record-custom/custom_e2e/models/a_model_model.py +++ /dev/null @@ -1,90 +0,0 @@ -from typing import Any, Dict, List, Union - -import attr - -from ..models.an_enum import AnEnum -from ..models.an_int_enum import AnIntEnum -from ..types import UNSET, Unset - - -@attr.s(auto_attribs=True) -class AModelModel: - """ """ - - a_property: Union[Unset, AnEnum, AnIntEnum] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - - def to_dict(self) -> Dict[str, Any]: - a_property: Union[Unset, int] - if isinstance(self.a_property, Unset): - a_property = UNSET - elif isinstance(self.a_property, AnEnum): - a_property = UNSET - if not isinstance(self.a_property, Unset): - a_property = self.a_property.value - - else: - a_property = UNSET - if not isinstance(self.a_property, Unset): - a_property = self.a_property.value - - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if a_property is not UNSET: - field_dict["a_property"] = a_property - - return field_dict - - @staticmethod - def from_dict(src_dict: Dict[str, Any]) -> "AModelModel": - d = src_dict.copy() - - def _parse_a_property(data: Union[Unset, int]) -> Union[Unset, AnEnum, AnIntEnum]: - a_property: Union[Unset, AnEnum, AnIntEnum] - if isinstance(data, Unset): - return data - try: - if not (isinstance(data, int) or isinstance(data, str)): - raise TypeError() - a_property = UNSET - _a_property = data - if _a_property is not None: - a_property = AnEnum(_a_property) - - return a_property - except: # noqa: E722 - pass - if not (isinstance(data, int) or isinstance(data, str)): - raise TypeError() - a_property = UNSET - _a_property = data - if _a_property is not None: - a_property = AnIntEnum(_a_property) - - return a_property - - a_property = _parse_a_property(d.pop("a_property", UNSET)) - - a_model_model = AModelModel( - a_property=a_property, - ) - - a_model_model.additional_properties = d - return a_model_model - - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/end_to_end_tests/golden-record-custom/custom_e2e/models/a_model_not_required_model.py b/end_to_end_tests/golden-record-custom/custom_e2e/models/a_model_not_required_model.py deleted file mode 100644 index 3f56b7f52..000000000 --- a/end_to_end_tests/golden-record-custom/custom_e2e/models/a_model_not_required_model.py +++ /dev/null @@ -1,90 +0,0 @@ -from typing import Any, Dict, List, Union - -import attr - -from ..models.an_enum import AnEnum -from ..models.an_int_enum import AnIntEnum -from ..types import UNSET, Unset - - -@attr.s(auto_attribs=True) -class AModelNotRequiredModel: - """ """ - - a_property: Union[Unset, AnEnum, AnIntEnum] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - - def to_dict(self) -> Dict[str, Any]: - a_property: Union[Unset, int] - if isinstance(self.a_property, Unset): - a_property = UNSET - elif isinstance(self.a_property, AnEnum): - a_property = UNSET - if not isinstance(self.a_property, Unset): - a_property = self.a_property.value - - else: - a_property = UNSET - if not isinstance(self.a_property, Unset): - a_property = self.a_property.value - - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if a_property is not UNSET: - field_dict["a_property"] = a_property - - return field_dict - - @staticmethod - def from_dict(src_dict: Dict[str, Any]) -> "AModelNotRequiredModel": - d = src_dict.copy() - - def _parse_a_property(data: Union[Unset, int]) -> Union[Unset, AnEnum, AnIntEnum]: - a_property: Union[Unset, AnEnum, AnIntEnum] - if isinstance(data, Unset): - return data - try: - if not (isinstance(data, int) or isinstance(data, str)): - raise TypeError() - a_property = UNSET - _a_property = data - if _a_property is not None: - a_property = AnEnum(_a_property) - - return a_property - except: # noqa: E722 - pass - if not (isinstance(data, int) or isinstance(data, str)): - raise TypeError() - a_property = UNSET - _a_property = data - if _a_property is not None: - a_property = AnIntEnum(_a_property) - - return a_property - - a_property = _parse_a_property(d.pop("a_property", UNSET)) - - a_model_not_required_model = AModelNotRequiredModel( - a_property=a_property, - ) - - a_model_not_required_model.additional_properties = d - return a_model_not_required_model - - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/end_to_end_tests/golden-record-custom/custom_e2e/models/a_model_not_required_nullable_model.py b/end_to_end_tests/golden-record-custom/custom_e2e/models/a_model_not_required_nullable_model.py deleted file mode 100644 index 55ef6810a..000000000 --- a/end_to_end_tests/golden-record-custom/custom_e2e/models/a_model_not_required_nullable_model.py +++ /dev/null @@ -1,90 +0,0 @@ -from typing import Any, Dict, List, Union - -import attr - -from ..models.an_enum import AnEnum -from ..models.an_int_enum import AnIntEnum -from ..types import UNSET, Unset - - -@attr.s(auto_attribs=True) -class AModelNotRequiredNullableModel: - """ """ - - a_property: Union[Unset, AnEnum, AnIntEnum] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - - def to_dict(self) -> Dict[str, Any]: - a_property: Union[Unset, int] - if isinstance(self.a_property, Unset): - a_property = UNSET - elif isinstance(self.a_property, AnEnum): - a_property = UNSET - if not isinstance(self.a_property, Unset): - a_property = self.a_property.value - - else: - a_property = UNSET - if not isinstance(self.a_property, Unset): - a_property = self.a_property.value - - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if a_property is not UNSET: - field_dict["a_property"] = a_property - - return field_dict - - @staticmethod - def from_dict(src_dict: Dict[str, Any]) -> "AModelNotRequiredNullableModel": - d = src_dict.copy() - - def _parse_a_property(data: Union[Unset, int]) -> Union[Unset, AnEnum, AnIntEnum]: - a_property: Union[Unset, AnEnum, AnIntEnum] - if isinstance(data, Unset): - return data - try: - if not (isinstance(data, int) or isinstance(data, str)): - raise TypeError() - a_property = UNSET - _a_property = data - if _a_property is not None: - a_property = AnEnum(_a_property) - - return a_property - except: # noqa: E722 - pass - if not (isinstance(data, int) or isinstance(data, str)): - raise TypeError() - a_property = UNSET - _a_property = data - if _a_property is not None: - a_property = AnIntEnum(_a_property) - - return a_property - - a_property = _parse_a_property(d.pop("a_property", UNSET)) - - a_model_not_required_nullable_model = AModelNotRequiredNullableModel( - a_property=a_property, - ) - - a_model_not_required_nullable_model.additional_properties = d - return a_model_not_required_nullable_model - - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/end_to_end_tests/golden-record-custom/custom_e2e/models/a_model_nullable_model.py b/end_to_end_tests/golden-record-custom/custom_e2e/models/a_model_nullable_model.py deleted file mode 100644 index 05c4f8897..000000000 --- a/end_to_end_tests/golden-record-custom/custom_e2e/models/a_model_nullable_model.py +++ /dev/null @@ -1,90 +0,0 @@ -from typing import Any, Dict, List, Union - -import attr - -from ..models.an_enum import AnEnum -from ..models.an_int_enum import AnIntEnum -from ..types import UNSET, Unset - - -@attr.s(auto_attribs=True) -class AModelNullableModel: - """ """ - - a_property: Union[Unset, AnEnum, AnIntEnum] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - - def to_dict(self) -> Dict[str, Any]: - a_property: Union[Unset, int] - if isinstance(self.a_property, Unset): - a_property = UNSET - elif isinstance(self.a_property, AnEnum): - a_property = UNSET - if not isinstance(self.a_property, Unset): - a_property = self.a_property.value - - else: - a_property = UNSET - if not isinstance(self.a_property, Unset): - a_property = self.a_property.value - - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if a_property is not UNSET: - field_dict["a_property"] = a_property - - return field_dict - - @staticmethod - def from_dict(src_dict: Dict[str, Any]) -> "AModelNullableModel": - d = src_dict.copy() - - def _parse_a_property(data: Union[Unset, int]) -> Union[Unset, AnEnum, AnIntEnum]: - a_property: Union[Unset, AnEnum, AnIntEnum] - if isinstance(data, Unset): - return data - try: - if not (isinstance(data, int) or isinstance(data, str)): - raise TypeError() - a_property = UNSET - _a_property = data - if _a_property is not None: - a_property = AnEnum(_a_property) - - return a_property - except: # noqa: E722 - pass - if not (isinstance(data, int) or isinstance(data, str)): - raise TypeError() - a_property = UNSET - _a_property = data - if _a_property is not None: - a_property = AnIntEnum(_a_property) - - return a_property - - a_property = _parse_a_property(d.pop("a_property", UNSET)) - - a_model_nullable_model = AModelNullableModel( - a_property=a_property, - ) - - a_model_nullable_model.additional_properties = d - return a_model_nullable_model - - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/__init__.py b/end_to_end_tests/golden-record/my_test_api_client/models/__init__.py index 6f5ac7423..d3ca924b3 100644 --- a/end_to_end_tests/golden-record/my_test_api_client/models/__init__.py +++ b/end_to_end_tests/golden-record/my_test_api_client/models/__init__.py @@ -1,10 +1,6 @@ """ Contains all the data models used in inputs/outputs """ from .a_model import AModel -from .a_model_model import AModelModel -from .a_model_not_required_model import AModelNotRequiredModel -from .a_model_not_required_nullable_model import AModelNotRequiredNullableModel -from .a_model_nullable_model import AModelNullableModel from .an_enum import AnEnum from .an_int_enum import AnIntEnum from .body_upload_file_tests_upload_post import BodyUploadFileTestsUploadPost diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/a_model.py b/end_to_end_tests/golden-record/my_test_api_client/models/a_model.py index 83d7518a7..e658516af 100644 --- a/end_to_end_tests/golden-record/my_test_api_client/models/a_model.py +++ b/end_to_end_tests/golden-record/my_test_api_client/models/a_model.py @@ -4,10 +4,6 @@ import attr from dateutil.parser import isoparse -from ..models.a_model_model import AModelModel -from ..models.a_model_not_required_model import AModelNotRequiredModel -from ..models.a_model_not_required_nullable_model import AModelNotRequiredNullableModel -from ..models.a_model_nullable_model import AModelNullableModel from ..models.an_enum import AnEnum from ..models.different_enum import DifferentEnum from ..models.free_form_model import FreeFormModel @@ -23,18 +19,18 @@ class AModel: a_camel_date_time: Union[datetime.datetime, datetime.date] a_date: datetime.date required_not_nullable: str - model: AModelModel + model: ModelWithUnionProperty one_of_models: Union[FreeFormModel, ModelWithUnionProperty] a_nullable_date: Optional[datetime.date] required_nullable: Optional[str] - nullable_model: Optional[AModelNullableModel] + nullable_model: Optional[ModelWithUnionProperty] nullable_one_of_models: Union[None, FreeFormModel, ModelWithUnionProperty] nested_list_of_enums: Union[Unset, List[List[DifferentEnum]]] = UNSET attr_1_leading_digit: Union[Unset, str] = UNSET not_required_nullable: Union[Unset, None, str] = UNSET not_required_not_nullable: Union[Unset, str] = UNSET - not_required_model: Union[Unset, AModelNotRequiredModel] = UNSET - not_required_nullable_model: Union[Unset, None, AModelNotRequiredNullableModel] = UNSET + not_required_model: Union[Unset, ModelWithUnionProperty] = UNSET + not_required_nullable_model: Union[Unset, None, ModelWithUnionProperty] = UNSET not_required_one_of_models: Union[Unset, FreeFormModel, ModelWithUnionProperty] = UNSET not_required_nullable_one_of_models: Union[Unset, None, FreeFormModel, ModelWithUnionProperty, str] = UNSET @@ -189,7 +185,7 @@ def _parse_a_camel_date_time(data: Union[str]) -> Union[datetime.datetime, datet required_not_nullable = d.pop("required_not_nullable") - model = AModelModel.from_dict(d.pop("model")) + model = ModelWithUnionProperty.from_dict(d.pop("model")) def _parse_one_of_models(data: Union[Dict[str, Any]]) -> Union[FreeFormModel, ModelWithUnionProperty]: one_of_models: Union[FreeFormModel, ModelWithUnionProperty] @@ -237,17 +233,17 @@ def _parse_one_of_models(data: Union[Dict[str, Any]]) -> Union[FreeFormModel, Mo nullable_model = None _nullable_model = d.pop("nullable_model") if _nullable_model is not None: - nullable_model = AModelNullableModel.from_dict(_nullable_model) + nullable_model = ModelWithUnionProperty.from_dict(_nullable_model) - not_required_model: Union[Unset, AModelNotRequiredModel] = UNSET + not_required_model: Union[Unset, ModelWithUnionProperty] = UNSET _not_required_model = d.pop("not_required_model", UNSET) if not isinstance(_not_required_model, Unset): - not_required_model = AModelNotRequiredModel.from_dict(_not_required_model) + not_required_model = ModelWithUnionProperty.from_dict(_not_required_model) not_required_nullable_model = None _not_required_nullable_model = d.pop("not_required_nullable_model", UNSET) if _not_required_nullable_model is not None and not isinstance(_not_required_nullable_model, Unset): - not_required_nullable_model = AModelNotRequiredNullableModel.from_dict(_not_required_nullable_model) + not_required_nullable_model = ModelWithUnionProperty.from_dict(_not_required_nullable_model) def _parse_nullable_one_of_models( data: Union[None, Dict[str, Any]] diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/a_model_model.py b/end_to_end_tests/golden-record/my_test_api_client/models/a_model_model.py deleted file mode 100644 index cef48694b..000000000 --- a/end_to_end_tests/golden-record/my_test_api_client/models/a_model_model.py +++ /dev/null @@ -1,90 +0,0 @@ -from typing import Any, Dict, List, Union - -import attr - -from ..models.an_enum import AnEnum -from ..models.an_int_enum import AnIntEnum -from ..types import UNSET, Unset - - -@attr.s(auto_attribs=True) -class AModelModel: - """ """ - - a_property: Union[Unset, AnEnum, AnIntEnum] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - - def to_dict(self) -> Dict[str, Any]: - a_property: Union[Unset, int] - if isinstance(self.a_property, Unset): - a_property = UNSET - elif isinstance(self.a_property, AnEnum): - a_property = UNSET - if not isinstance(self.a_property, Unset): - a_property = self.a_property.value - - else: - a_property = UNSET - if not isinstance(self.a_property, Unset): - a_property = self.a_property.value - - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if a_property is not UNSET: - field_dict["a_property"] = a_property - - return field_dict - - @staticmethod - def from_dict(src_dict: Dict[str, Any]) -> "AModelModel": - d = src_dict.copy() - - def _parse_a_property(data: Union[Unset, int]) -> Union[Unset, AnEnum, AnIntEnum]: - a_property: Union[Unset, AnEnum, AnIntEnum] - if isinstance(data, Unset): - return data - try: - if not (isinstance(data, int) or isinstance(data, str)): - raise TypeError() - a_property = UNSET - _a_property = data - if _a_property is not None: - a_property = AnEnum(_a_property) - - return a_property - except: # noqa: E722 - pass - if not (isinstance(data, int) or isinstance(data, str)): - raise TypeError() - a_property = UNSET - _a_property = data - if _a_property is not None: - a_property = AnIntEnum(_a_property) - - return a_property - - a_property = _parse_a_property(d.pop("a_property", UNSET)) - - a_model_model = AModelModel( - a_property=a_property, - ) - - a_model_model.additional_properties = d - return a_model_model - - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/a_model_not_required_model.py b/end_to_end_tests/golden-record/my_test_api_client/models/a_model_not_required_model.py deleted file mode 100644 index 3f56b7f52..000000000 --- a/end_to_end_tests/golden-record/my_test_api_client/models/a_model_not_required_model.py +++ /dev/null @@ -1,90 +0,0 @@ -from typing import Any, Dict, List, Union - -import attr - -from ..models.an_enum import AnEnum -from ..models.an_int_enum import AnIntEnum -from ..types import UNSET, Unset - - -@attr.s(auto_attribs=True) -class AModelNotRequiredModel: - """ """ - - a_property: Union[Unset, AnEnum, AnIntEnum] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - - def to_dict(self) -> Dict[str, Any]: - a_property: Union[Unset, int] - if isinstance(self.a_property, Unset): - a_property = UNSET - elif isinstance(self.a_property, AnEnum): - a_property = UNSET - if not isinstance(self.a_property, Unset): - a_property = self.a_property.value - - else: - a_property = UNSET - if not isinstance(self.a_property, Unset): - a_property = self.a_property.value - - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if a_property is not UNSET: - field_dict["a_property"] = a_property - - return field_dict - - @staticmethod - def from_dict(src_dict: Dict[str, Any]) -> "AModelNotRequiredModel": - d = src_dict.copy() - - def _parse_a_property(data: Union[Unset, int]) -> Union[Unset, AnEnum, AnIntEnum]: - a_property: Union[Unset, AnEnum, AnIntEnum] - if isinstance(data, Unset): - return data - try: - if not (isinstance(data, int) or isinstance(data, str)): - raise TypeError() - a_property = UNSET - _a_property = data - if _a_property is not None: - a_property = AnEnum(_a_property) - - return a_property - except: # noqa: E722 - pass - if not (isinstance(data, int) or isinstance(data, str)): - raise TypeError() - a_property = UNSET - _a_property = data - if _a_property is not None: - a_property = AnIntEnum(_a_property) - - return a_property - - a_property = _parse_a_property(d.pop("a_property", UNSET)) - - a_model_not_required_model = AModelNotRequiredModel( - a_property=a_property, - ) - - a_model_not_required_model.additional_properties = d - return a_model_not_required_model - - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/a_model_not_required_nullable_model.py b/end_to_end_tests/golden-record/my_test_api_client/models/a_model_not_required_nullable_model.py deleted file mode 100644 index 55ef6810a..000000000 --- a/end_to_end_tests/golden-record/my_test_api_client/models/a_model_not_required_nullable_model.py +++ /dev/null @@ -1,90 +0,0 @@ -from typing import Any, Dict, List, Union - -import attr - -from ..models.an_enum import AnEnum -from ..models.an_int_enum import AnIntEnum -from ..types import UNSET, Unset - - -@attr.s(auto_attribs=True) -class AModelNotRequiredNullableModel: - """ """ - - a_property: Union[Unset, AnEnum, AnIntEnum] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - - def to_dict(self) -> Dict[str, Any]: - a_property: Union[Unset, int] - if isinstance(self.a_property, Unset): - a_property = UNSET - elif isinstance(self.a_property, AnEnum): - a_property = UNSET - if not isinstance(self.a_property, Unset): - a_property = self.a_property.value - - else: - a_property = UNSET - if not isinstance(self.a_property, Unset): - a_property = self.a_property.value - - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if a_property is not UNSET: - field_dict["a_property"] = a_property - - return field_dict - - @staticmethod - def from_dict(src_dict: Dict[str, Any]) -> "AModelNotRequiredNullableModel": - d = src_dict.copy() - - def _parse_a_property(data: Union[Unset, int]) -> Union[Unset, AnEnum, AnIntEnum]: - a_property: Union[Unset, AnEnum, AnIntEnum] - if isinstance(data, Unset): - return data - try: - if not (isinstance(data, int) or isinstance(data, str)): - raise TypeError() - a_property = UNSET - _a_property = data - if _a_property is not None: - a_property = AnEnum(_a_property) - - return a_property - except: # noqa: E722 - pass - if not (isinstance(data, int) or isinstance(data, str)): - raise TypeError() - a_property = UNSET - _a_property = data - if _a_property is not None: - a_property = AnIntEnum(_a_property) - - return a_property - - a_property = _parse_a_property(d.pop("a_property", UNSET)) - - a_model_not_required_nullable_model = AModelNotRequiredNullableModel( - a_property=a_property, - ) - - a_model_not_required_nullable_model.additional_properties = d - return a_model_not_required_nullable_model - - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/a_model_nullable_model.py b/end_to_end_tests/golden-record/my_test_api_client/models/a_model_nullable_model.py deleted file mode 100644 index 05c4f8897..000000000 --- a/end_to_end_tests/golden-record/my_test_api_client/models/a_model_nullable_model.py +++ /dev/null @@ -1,90 +0,0 @@ -from typing import Any, Dict, List, Union - -import attr - -from ..models.an_enum import AnEnum -from ..models.an_int_enum import AnIntEnum -from ..types import UNSET, Unset - - -@attr.s(auto_attribs=True) -class AModelNullableModel: - """ """ - - a_property: Union[Unset, AnEnum, AnIntEnum] = UNSET - additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) - - def to_dict(self) -> Dict[str, Any]: - a_property: Union[Unset, int] - if isinstance(self.a_property, Unset): - a_property = UNSET - elif isinstance(self.a_property, AnEnum): - a_property = UNSET - if not isinstance(self.a_property, Unset): - a_property = self.a_property.value - - else: - a_property = UNSET - if not isinstance(self.a_property, Unset): - a_property = self.a_property.value - - field_dict: Dict[str, Any] = {} - field_dict.update(self.additional_properties) - field_dict.update({}) - if a_property is not UNSET: - field_dict["a_property"] = a_property - - return field_dict - - @staticmethod - def from_dict(src_dict: Dict[str, Any]) -> "AModelNullableModel": - d = src_dict.copy() - - def _parse_a_property(data: Union[Unset, int]) -> Union[Unset, AnEnum, AnIntEnum]: - a_property: Union[Unset, AnEnum, AnIntEnum] - if isinstance(data, Unset): - return data - try: - if not (isinstance(data, int) or isinstance(data, str)): - raise TypeError() - a_property = UNSET - _a_property = data - if _a_property is not None: - a_property = AnEnum(_a_property) - - return a_property - except: # noqa: E722 - pass - if not (isinstance(data, int) or isinstance(data, str)): - raise TypeError() - a_property = UNSET - _a_property = data - if _a_property is not None: - a_property = AnIntEnum(_a_property) - - return a_property - - a_property = _parse_a_property(d.pop("a_property", UNSET)) - - a_model_nullable_model = AModelNullableModel( - a_property=a_property, - ) - - a_model_nullable_model.additional_properties = d - return a_model_nullable_model - - @property - def additional_keys(self) -> List[str]: - return list(self.additional_properties.keys()) - - def __getitem__(self, key: str) -> Any: - return self.additional_properties[key] - - def __setitem__(self, key: str, value: Any) -> None: - self.additional_properties[key] = value - - def __delitem__(self, key: str) -> None: - del self.additional_properties[key] - - def __contains__(self, key: str) -> bool: - return key in self.additional_properties diff --git a/openapi_python_client/parser/properties/__init__.py b/openapi_python_client/parser/properties/__init__.py index 1794cf6ed..b6380bc4e 100644 --- a/openapi_python_client/parser/properties/__init__.py +++ b/openapi_python_client/parser/properties/__init__.py @@ -466,6 +466,23 @@ def build_list_property( ) +def _property_from_ref( + name: str, + required: bool, + nullable: bool, + data: oai.Reference, + schemas: Schemas, +) -> Tuple[Union[Property, PropertyError], Schemas]: + reference = Reference.from_ref(data.ref) + existing = schemas.enums.get(reference.class_name) or schemas.models.get(reference.class_name) + if existing: + return ( + attr.evolve(existing, required=required, name=name, nullable=nullable), + schemas, + ) + return PropertyError(data=data, detail="Could not find reference in parsed models or enums"), schemas + + def _property_from_data( name: str, required: bool, @@ -476,14 +493,11 @@ def _property_from_data( """ Generate a Property from the OpenAPI dictionary representation of it """ name = utils.remove_string_escapes(name) if isinstance(data, oai.Reference): - reference = Reference.from_ref(data.ref) - existing = schemas.enums.get(reference.class_name) or schemas.models.get(reference.class_name) - if existing: - return ( - attr.evolve(existing, required=required, name=name), - schemas, - ) - return PropertyError(data=data, detail="Could not find reference in parsed models or enums"), schemas + return _property_from_ref(name=name, required=required, nullable=False, data=data, schemas=schemas) + + if data.allOf and len(data.allOf) == 1 and isinstance(data.allOf[0], oai.Reference): + return _property_from_ref(name=name, required=required, nullable=data.nullable, data=data.allOf[0], schemas=schemas) + if data.enum: return build_enum_property( data=data, name=name, required=required, schemas=schemas, enum=data.enum, parent_name=parent_name From f2bd8ae26871938e9f1e88a96deb1f14c77220cc Mon Sep 17 00:00:00 2001 From: Forest Tong Date: Thu, 11 Feb 2021 09:54:18 -0500 Subject: [PATCH 2/2] Support oneOf and anyOf too --- openapi_python_client/parser/properties/__init__.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/openapi_python_client/parser/properties/__init__.py b/openapi_python_client/parser/properties/__init__.py index b6380bc4e..58beacf1f 100644 --- a/openapi_python_client/parser/properties/__init__.py +++ b/openapi_python_client/parser/properties/__init__.py @@ -495,8 +495,10 @@ def _property_from_data( if isinstance(data, oai.Reference): return _property_from_ref(name=name, required=required, nullable=False, data=data, schemas=schemas) - if data.allOf and len(data.allOf) == 1 and isinstance(data.allOf[0], oai.Reference): - return _property_from_ref(name=name, required=required, nullable=data.nullable, data=data.allOf[0], schemas=schemas) + for attribute in ["allOf", "anyOf", "oneOf"]: + sub_data = getattr(data, attribute) + if sub_data and len(sub_data) == 1 and isinstance(sub_data[0], oai.Reference): + return _property_from_ref(name=name, required=required, nullable=data.nullable, data=sub_data[0], schemas=schemas) if data.enum: return build_enum_property(