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..391bca440 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 @@ -17,10 +17,13 @@ ) from .model_with_additional_properties_refed import ModelWithAdditionalPropertiesRefed from .model_with_any_json_properties import ModelWithAnyJsonProperties -from .model_with_any_json_properties_additional_property import ModelWithAnyJsonPropertiesAdditionalProperty +from .model_with_any_json_properties_additional_property_item0 import ModelWithAnyJsonPropertiesAdditionalPropertyItem0 from .model_with_primitive_additional_properties import ModelWithPrimitiveAdditionalProperties from .model_with_primitive_additional_properties_a_date_holder import ModelWithPrimitiveAdditionalPropertiesADateHolder from .model_with_union_property import ModelWithUnionProperty +from .model_with_union_property_inlined import ModelWithUnionPropertyInlined +from .model_with_union_property_inlined_fruit_item0 import ModelWithUnionPropertyInlinedFruitItem0 +from .model_with_union_property_inlined_fruit_item1 import ModelWithUnionPropertyInlinedFruitItem1 from .test_inline_objects_json_body import TestInlineObjectsJsonBody from .test_inline_objects_response_200 import TestInlineObjectsResponse_200 from .validation_error import ValidationError 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 1533aaf86..5a63f52e3 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 @@ -111,16 +111,17 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: def _parse_a_camel_date_time(data: Any) -> Union[datetime.datetime, datetime.date]: data = None if isinstance(data, Unset) else data - a_camel_date_time: Union[datetime.datetime, datetime.date] try: - a_camel_date_time = isoparse(data) + a_camel_date_time_item0: datetime.datetime + a_camel_date_time_item0 = isoparse(data) - return a_camel_date_time + return a_camel_date_time_item0 except: # noqa: E722 pass - a_camel_date_time = isoparse(data).date() + a_camel_date_time_item1: datetime.date + a_camel_date_time_item1 = isoparse(data).date() - return a_camel_date_time + return a_camel_date_time_item1 a_camel_date_time = _parse_a_camel_date_time(d.pop("aCamelDateTime")) diff --git a/end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_any_json_properties.py b/end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_any_json_properties.py index 7696b9753..0cba269f2 100644 --- a/end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_any_json_properties.py +++ b/end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_any_json_properties.py @@ -2,7 +2,9 @@ import attr -from ..models.model_with_any_json_properties_additional_property import ModelWithAnyJsonPropertiesAdditionalProperty +from ..models.model_with_any_json_properties_additional_property_item0 import ( + ModelWithAnyJsonPropertiesAdditionalPropertyItem0, +) from ..types import Unset T = TypeVar("T", bound="ModelWithAnyJsonProperties") @@ -13,14 +15,14 @@ class ModelWithAnyJsonProperties: """ """ additional_properties: Dict[ - str, Union[ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool] + str, Union[ModelWithAnyJsonPropertiesAdditionalPropertyItem0, List[str], str, float, int, bool] ] = attr.ib(init=False, factory=dict) def to_dict(self) -> Dict[str, Any]: field_dict: Dict[str, Any] = {} for prop_name, prop in self.additional_properties.items(): - if isinstance(prop, ModelWithAnyJsonPropertiesAdditionalProperty): + if isinstance(prop, ModelWithAnyJsonPropertiesAdditionalPropertyItem0): field_dict[prop_name] = prop.to_dict() elif isinstance(prop, list): @@ -43,24 +45,25 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: def _parse_additional_property( data: Any, - ) -> Union[ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool]: + ) -> Union[ModelWithAnyJsonPropertiesAdditionalPropertyItem0, List[str], str, float, int, bool]: data = None if isinstance(data, Unset) else data - additional_property: Union[ - ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool - ] try: - additional_property = ModelWithAnyJsonPropertiesAdditionalProperty.from_dict(data) + additional_property_item0: ModelWithAnyJsonPropertiesAdditionalPropertyItem0 + additional_property_item0 = ModelWithAnyJsonPropertiesAdditionalPropertyItem0.from_dict(data) - return additional_property + return additional_property_item0 except: # noqa: E722 pass try: - additional_property = cast(List[str], data) + additional_property_item1: List[str] + additional_property_item1 = cast(List[str], data) - return additional_property + return additional_property_item1 except: # noqa: E722 pass - return cast(Union[ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool], data) + return cast( + Union[ModelWithAnyJsonPropertiesAdditionalPropertyItem0, List[str], str, float, int, bool], data + ) additional_property = _parse_additional_property(prop_dict) @@ -75,11 +78,13 @@ def additional_keys(self) -> List[str]: def __getitem__( self, key: str - ) -> Union[ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool]: + ) -> Union[ModelWithAnyJsonPropertiesAdditionalPropertyItem0, List[str], str, float, int, bool]: return self.additional_properties[key] def __setitem__( - self, key: str, value: Union[ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool] + self, + key: str, + value: Union[ModelWithAnyJsonPropertiesAdditionalPropertyItem0, List[str], str, float, int, bool], ) -> None: self.additional_properties[key] = value diff --git a/end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_any_json_properties_additional_property.py b/end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_any_json_properties_additional_property_item0.py similarity index 82% rename from end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_any_json_properties_additional_property.py rename to end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_any_json_properties_additional_property_item0.py index 69aa84641..3a8334ae4 100644 --- a/end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_any_json_properties_additional_property.py +++ b/end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_any_json_properties_additional_property_item0.py @@ -2,11 +2,11 @@ import attr -T = TypeVar("T", bound="ModelWithAnyJsonPropertiesAdditionalProperty") +T = TypeVar("T", bound="ModelWithAnyJsonPropertiesAdditionalPropertyItem0") @attr.s(auto_attribs=True) -class ModelWithAnyJsonPropertiesAdditionalProperty: +class ModelWithAnyJsonPropertiesAdditionalPropertyItem0: """ """ additional_properties: Dict[str, str] = attr.ib(init=False, factory=dict) @@ -22,10 +22,10 @@ def to_dict(self) -> Dict[str, Any]: @classmethod def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: d = src_dict.copy() - model_with_any_json_properties_additional_property = cls() + model_with_any_json_properties_additional_property_item0 = cls() - model_with_any_json_properties_additional_property.additional_properties = d - return model_with_any_json_properties_additional_property + model_with_any_json_properties_additional_property_item0.additional_properties = d + return model_with_any_json_properties_additional_property_item0 @property def additional_keys(self) -> List[str]: diff --git a/end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_union_property.py b/end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_union_property.py index ed8deec19..a478ee462 100644 --- a/end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_union_property.py +++ b/end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_union_property.py @@ -42,22 +42,23 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: def _parse_a_property(data: Any) -> Union[Unset, AnEnum, AnIntEnum]: data = None if isinstance(data, Unset) else data - a_property: Union[Unset, AnEnum, AnIntEnum] try: - a_property = UNSET - _a_property = data - if _a_property is not None and _a_property is not UNSET: - a_property = AnEnum(_a_property) + a_property_item0: Union[Unset, AnEnum] + a_property_item0 = UNSET + _a_property_item0 = data + if _a_property_item0 is not None and _a_property_item0 is not UNSET: + a_property_item0 = AnEnum(_a_property_item0) - return a_property + return a_property_item0 except: # noqa: E722 pass - a_property = UNSET - _a_property = data - if _a_property is not None and _a_property is not UNSET: - a_property = AnIntEnum(_a_property) + a_property_item1: Union[Unset, AnIntEnum] + a_property_item1 = UNSET + _a_property_item1 = data + if _a_property_item1 is not None and _a_property_item1 is not UNSET: + a_property_item1 = AnIntEnum(_a_property_item1) - return a_property + return a_property_item1 a_property = _parse_a_property(d.pop("a_property", UNSET)) diff --git a/end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_union_property_inlined.py b/end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_union_property_inlined.py new file mode 100644 index 000000000..7c7ff77bc --- /dev/null +++ b/end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_union_property_inlined.py @@ -0,0 +1,71 @@ +from typing import Any, Dict, Type, TypeVar, Union, cast + +import attr + +from ..models.model_with_union_property_inlined_fruit_item0 import ModelWithUnionPropertyInlinedFruitItem0 +from ..models.model_with_union_property_inlined_fruit_item1 import ModelWithUnionPropertyInlinedFruitItem1 +from ..types import UNSET, Unset + +T = TypeVar("T", bound="ModelWithUnionPropertyInlined") + + +@attr.s(auto_attribs=True) +class ModelWithUnionPropertyInlined: + """ """ + + fruit: Union[Unset, ModelWithUnionPropertyInlinedFruitItem0, ModelWithUnionPropertyInlinedFruitItem1] = UNSET + + def to_dict(self) -> Dict[str, Any]: + fruit: Union[Unset, ModelWithUnionPropertyInlinedFruitItem0, ModelWithUnionPropertyInlinedFruitItem1] + if isinstance(self.fruit, Unset): + fruit = UNSET + elif isinstance(self.fruit, ModelWithUnionPropertyInlinedFruitItem0): + fruit = UNSET + if not isinstance(self.fruit, Unset): + fruit = self.fruit.to_dict() + + else: + fruit = UNSET + if not isinstance(self.fruit, Unset): + fruit = self.fruit.to_dict() + + field_dict: Dict[str, Any] = {} + field_dict.update({}) + if fruit is not UNSET: + field_dict["fruit"] = fruit + + return field_dict + + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + + def _parse_fruit( + data: Any, + ) -> Union[Unset, ModelWithUnionPropertyInlinedFruitItem0, ModelWithUnionPropertyInlinedFruitItem1]: + data = None if isinstance(data, Unset) else data + try: + fruit_item0: Union[ModelWithUnionPropertyInlinedFruitItem0, Unset] + fruit_item0 = UNSET + _fruit_item0 = data + if not isinstance(_fruit_item0, Unset): + fruit_item0 = ModelWithUnionPropertyInlinedFruitItem0.from_dict(cast(Dict[str, Any], _fruit_item0)) + + return fruit_item0 + except: # noqa: E722 + pass + fruit_item1: Union[ModelWithUnionPropertyInlinedFruitItem1, Unset] + fruit_item1 = UNSET + _fruit_item1 = data + if not isinstance(_fruit_item1, Unset): + fruit_item1 = ModelWithUnionPropertyInlinedFruitItem1.from_dict(cast(Dict[str, Any], _fruit_item1)) + + return fruit_item1 + + fruit = _parse_fruit(d.pop("fruit", UNSET)) + + model_with_union_property_inlined = cls( + fruit=fruit, + ) + + return model_with_union_property_inlined diff --git a/end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_union_property_inlined_fruit_item0.py b/end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_union_property_inlined_fruit_item0.py new file mode 100644 index 000000000..ab82f5f01 --- /dev/null +++ b/end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_union_property_inlined_fruit_item0.py @@ -0,0 +1,54 @@ +from typing import Any, Dict, List, Type, TypeVar, Union + +import attr + +from ..types import UNSET, Unset + +T = TypeVar("T", bound="ModelWithUnionPropertyInlinedFruitItem0") + + +@attr.s(auto_attribs=True) +class ModelWithUnionPropertyInlinedFruitItem0: + """ """ + + apples: Union[Unset, str] = UNSET + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + + def to_dict(self) -> Dict[str, Any]: + apples = self.apples + + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if apples is not UNSET: + field_dict["apples"] = apples + + return field_dict + + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + apples = d.pop("apples", UNSET) + + model_with_union_property_inlined_fruit_item0 = cls( + apples=apples, + ) + + model_with_union_property_inlined_fruit_item0.additional_properties = d + return model_with_union_property_inlined_fruit_item0 + + @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/model_with_union_property_inlined_fruit_item1.py b/end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_union_property_inlined_fruit_item1.py new file mode 100644 index 000000000..df2f1c7bd --- /dev/null +++ b/end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_union_property_inlined_fruit_item1.py @@ -0,0 +1,54 @@ +from typing import Any, Dict, List, Type, TypeVar, Union + +import attr + +from ..types import UNSET, Unset + +T = TypeVar("T", bound="ModelWithUnionPropertyInlinedFruitItem1") + + +@attr.s(auto_attribs=True) +class ModelWithUnionPropertyInlinedFruitItem1: + """ """ + + bananas: Union[Unset, str] = UNSET + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + + def to_dict(self) -> Dict[str, Any]: + bananas = self.bananas + + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if bananas is not UNSET: + field_dict["bananas"] = bananas + + return field_dict + + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + bananas = d.pop("bananas", UNSET) + + model_with_union_property_inlined_fruit_item1 = cls( + bananas=bananas, + ) + + model_with_union_property_inlined_fruit_item1.additional_properties = d + return model_with_union_property_inlined_fruit_item1 + + @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..391bca440 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 @@ -17,10 +17,13 @@ ) from .model_with_additional_properties_refed import ModelWithAdditionalPropertiesRefed from .model_with_any_json_properties import ModelWithAnyJsonProperties -from .model_with_any_json_properties_additional_property import ModelWithAnyJsonPropertiesAdditionalProperty +from .model_with_any_json_properties_additional_property_item0 import ModelWithAnyJsonPropertiesAdditionalPropertyItem0 from .model_with_primitive_additional_properties import ModelWithPrimitiveAdditionalProperties from .model_with_primitive_additional_properties_a_date_holder import ModelWithPrimitiveAdditionalPropertiesADateHolder from .model_with_union_property import ModelWithUnionProperty +from .model_with_union_property_inlined import ModelWithUnionPropertyInlined +from .model_with_union_property_inlined_fruit_item0 import ModelWithUnionPropertyInlinedFruitItem0 +from .model_with_union_property_inlined_fruit_item1 import ModelWithUnionPropertyInlinedFruitItem1 from .test_inline_objects_json_body import TestInlineObjectsJsonBody from .test_inline_objects_response_200 import TestInlineObjectsResponse_200 from .validation_error import ValidationError 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 1533aaf86..5a63f52e3 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 @@ -111,16 +111,17 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: def _parse_a_camel_date_time(data: Any) -> Union[datetime.datetime, datetime.date]: data = None if isinstance(data, Unset) else data - a_camel_date_time: Union[datetime.datetime, datetime.date] try: - a_camel_date_time = isoparse(data) + a_camel_date_time_item0: datetime.datetime + a_camel_date_time_item0 = isoparse(data) - return a_camel_date_time + return a_camel_date_time_item0 except: # noqa: E722 pass - a_camel_date_time = isoparse(data).date() + a_camel_date_time_item1: datetime.date + a_camel_date_time_item1 = isoparse(data).date() - return a_camel_date_time + return a_camel_date_time_item1 a_camel_date_time = _parse_a_camel_date_time(d.pop("aCamelDateTime")) diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_any_json_properties.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_any_json_properties.py index 7696b9753..0cba269f2 100644 --- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_any_json_properties.py +++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_any_json_properties.py @@ -2,7 +2,9 @@ import attr -from ..models.model_with_any_json_properties_additional_property import ModelWithAnyJsonPropertiesAdditionalProperty +from ..models.model_with_any_json_properties_additional_property_item0 import ( + ModelWithAnyJsonPropertiesAdditionalPropertyItem0, +) from ..types import Unset T = TypeVar("T", bound="ModelWithAnyJsonProperties") @@ -13,14 +15,14 @@ class ModelWithAnyJsonProperties: """ """ additional_properties: Dict[ - str, Union[ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool] + str, Union[ModelWithAnyJsonPropertiesAdditionalPropertyItem0, List[str], str, float, int, bool] ] = attr.ib(init=False, factory=dict) def to_dict(self) -> Dict[str, Any]: field_dict: Dict[str, Any] = {} for prop_name, prop in self.additional_properties.items(): - if isinstance(prop, ModelWithAnyJsonPropertiesAdditionalProperty): + if isinstance(prop, ModelWithAnyJsonPropertiesAdditionalPropertyItem0): field_dict[prop_name] = prop.to_dict() elif isinstance(prop, list): @@ -43,24 +45,25 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: def _parse_additional_property( data: Any, - ) -> Union[ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool]: + ) -> Union[ModelWithAnyJsonPropertiesAdditionalPropertyItem0, List[str], str, float, int, bool]: data = None if isinstance(data, Unset) else data - additional_property: Union[ - ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool - ] try: - additional_property = ModelWithAnyJsonPropertiesAdditionalProperty.from_dict(data) + additional_property_item0: ModelWithAnyJsonPropertiesAdditionalPropertyItem0 + additional_property_item0 = ModelWithAnyJsonPropertiesAdditionalPropertyItem0.from_dict(data) - return additional_property + return additional_property_item0 except: # noqa: E722 pass try: - additional_property = cast(List[str], data) + additional_property_item1: List[str] + additional_property_item1 = cast(List[str], data) - return additional_property + return additional_property_item1 except: # noqa: E722 pass - return cast(Union[ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool], data) + return cast( + Union[ModelWithAnyJsonPropertiesAdditionalPropertyItem0, List[str], str, float, int, bool], data + ) additional_property = _parse_additional_property(prop_dict) @@ -75,11 +78,13 @@ def additional_keys(self) -> List[str]: def __getitem__( self, key: str - ) -> Union[ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool]: + ) -> Union[ModelWithAnyJsonPropertiesAdditionalPropertyItem0, List[str], str, float, int, bool]: return self.additional_properties[key] def __setitem__( - self, key: str, value: Union[ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool] + self, + key: str, + value: Union[ModelWithAnyJsonPropertiesAdditionalPropertyItem0, List[str], str, float, int, bool], ) -> None: self.additional_properties[key] = value diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_any_json_properties_additional_property.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_any_json_properties_additional_property_item0.py similarity index 82% rename from end_to_end_tests/golden-record/my_test_api_client/models/model_with_any_json_properties_additional_property.py rename to end_to_end_tests/golden-record/my_test_api_client/models/model_with_any_json_properties_additional_property_item0.py index 69aa84641..3a8334ae4 100644 --- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_any_json_properties_additional_property.py +++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_any_json_properties_additional_property_item0.py @@ -2,11 +2,11 @@ import attr -T = TypeVar("T", bound="ModelWithAnyJsonPropertiesAdditionalProperty") +T = TypeVar("T", bound="ModelWithAnyJsonPropertiesAdditionalPropertyItem0") @attr.s(auto_attribs=True) -class ModelWithAnyJsonPropertiesAdditionalProperty: +class ModelWithAnyJsonPropertiesAdditionalPropertyItem0: """ """ additional_properties: Dict[str, str] = attr.ib(init=False, factory=dict) @@ -22,10 +22,10 @@ def to_dict(self) -> Dict[str, Any]: @classmethod def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: d = src_dict.copy() - model_with_any_json_properties_additional_property = cls() + model_with_any_json_properties_additional_property_item0 = cls() - model_with_any_json_properties_additional_property.additional_properties = d - return model_with_any_json_properties_additional_property + model_with_any_json_properties_additional_property_item0.additional_properties = d + return model_with_any_json_properties_additional_property_item0 @property def additional_keys(self) -> List[str]: diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property.py index ed8deec19..a478ee462 100644 --- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property.py +++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property.py @@ -42,22 +42,23 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: def _parse_a_property(data: Any) -> Union[Unset, AnEnum, AnIntEnum]: data = None if isinstance(data, Unset) else data - a_property: Union[Unset, AnEnum, AnIntEnum] try: - a_property = UNSET - _a_property = data - if _a_property is not None and _a_property is not UNSET: - a_property = AnEnum(_a_property) + a_property_item0: Union[Unset, AnEnum] + a_property_item0 = UNSET + _a_property_item0 = data + if _a_property_item0 is not None and _a_property_item0 is not UNSET: + a_property_item0 = AnEnum(_a_property_item0) - return a_property + return a_property_item0 except: # noqa: E722 pass - a_property = UNSET - _a_property = data - if _a_property is not None and _a_property is not UNSET: - a_property = AnIntEnum(_a_property) + a_property_item1: Union[Unset, AnIntEnum] + a_property_item1 = UNSET + _a_property_item1 = data + if _a_property_item1 is not None and _a_property_item1 is not UNSET: + a_property_item1 = AnIntEnum(_a_property_item1) - return a_property + return a_property_item1 a_property = _parse_a_property(d.pop("a_property", UNSET)) diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined.py new file mode 100644 index 000000000..7c7ff77bc --- /dev/null +++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined.py @@ -0,0 +1,71 @@ +from typing import Any, Dict, Type, TypeVar, Union, cast + +import attr + +from ..models.model_with_union_property_inlined_fruit_item0 import ModelWithUnionPropertyInlinedFruitItem0 +from ..models.model_with_union_property_inlined_fruit_item1 import ModelWithUnionPropertyInlinedFruitItem1 +from ..types import UNSET, Unset + +T = TypeVar("T", bound="ModelWithUnionPropertyInlined") + + +@attr.s(auto_attribs=True) +class ModelWithUnionPropertyInlined: + """ """ + + fruit: Union[Unset, ModelWithUnionPropertyInlinedFruitItem0, ModelWithUnionPropertyInlinedFruitItem1] = UNSET + + def to_dict(self) -> Dict[str, Any]: + fruit: Union[Unset, ModelWithUnionPropertyInlinedFruitItem0, ModelWithUnionPropertyInlinedFruitItem1] + if isinstance(self.fruit, Unset): + fruit = UNSET + elif isinstance(self.fruit, ModelWithUnionPropertyInlinedFruitItem0): + fruit = UNSET + if not isinstance(self.fruit, Unset): + fruit = self.fruit.to_dict() + + else: + fruit = UNSET + if not isinstance(self.fruit, Unset): + fruit = self.fruit.to_dict() + + field_dict: Dict[str, Any] = {} + field_dict.update({}) + if fruit is not UNSET: + field_dict["fruit"] = fruit + + return field_dict + + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + + def _parse_fruit( + data: Any, + ) -> Union[Unset, ModelWithUnionPropertyInlinedFruitItem0, ModelWithUnionPropertyInlinedFruitItem1]: + data = None if isinstance(data, Unset) else data + try: + fruit_item0: Union[ModelWithUnionPropertyInlinedFruitItem0, Unset] + fruit_item0 = UNSET + _fruit_item0 = data + if not isinstance(_fruit_item0, Unset): + fruit_item0 = ModelWithUnionPropertyInlinedFruitItem0.from_dict(cast(Dict[str, Any], _fruit_item0)) + + return fruit_item0 + except: # noqa: E722 + pass + fruit_item1: Union[ModelWithUnionPropertyInlinedFruitItem1, Unset] + fruit_item1 = UNSET + _fruit_item1 = data + if not isinstance(_fruit_item1, Unset): + fruit_item1 = ModelWithUnionPropertyInlinedFruitItem1.from_dict(cast(Dict[str, Any], _fruit_item1)) + + return fruit_item1 + + fruit = _parse_fruit(d.pop("fruit", UNSET)) + + model_with_union_property_inlined = cls( + fruit=fruit, + ) + + return model_with_union_property_inlined diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined_fruit_item0.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined_fruit_item0.py new file mode 100644 index 000000000..ab82f5f01 --- /dev/null +++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined_fruit_item0.py @@ -0,0 +1,54 @@ +from typing import Any, Dict, List, Type, TypeVar, Union + +import attr + +from ..types import UNSET, Unset + +T = TypeVar("T", bound="ModelWithUnionPropertyInlinedFruitItem0") + + +@attr.s(auto_attribs=True) +class ModelWithUnionPropertyInlinedFruitItem0: + """ """ + + apples: Union[Unset, str] = UNSET + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + + def to_dict(self) -> Dict[str, Any]: + apples = self.apples + + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if apples is not UNSET: + field_dict["apples"] = apples + + return field_dict + + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + apples = d.pop("apples", UNSET) + + model_with_union_property_inlined_fruit_item0 = cls( + apples=apples, + ) + + model_with_union_property_inlined_fruit_item0.additional_properties = d + return model_with_union_property_inlined_fruit_item0 + + @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/model_with_union_property_inlined_fruit_item1.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined_fruit_item1.py new file mode 100644 index 000000000..df2f1c7bd --- /dev/null +++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined_fruit_item1.py @@ -0,0 +1,54 @@ +from typing import Any, Dict, List, Type, TypeVar, Union + +import attr + +from ..types import UNSET, Unset + +T = TypeVar("T", bound="ModelWithUnionPropertyInlinedFruitItem1") + + +@attr.s(auto_attribs=True) +class ModelWithUnionPropertyInlinedFruitItem1: + """ """ + + bananas: Union[Unset, str] = UNSET + additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict) + + def to_dict(self) -> Dict[str, Any]: + bananas = self.bananas + + field_dict: Dict[str, Any] = {} + field_dict.update(self.additional_properties) + field_dict.update({}) + if bananas is not UNSET: + field_dict["bananas"] = bananas + + return field_dict + + @classmethod + def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: + d = src_dict.copy() + bananas = d.pop("bananas", UNSET) + + model_with_union_property_inlined_fruit_item1 = cls( + bananas=bananas, + ) + + model_with_union_property_inlined_fruit_item1.additional_properties = d + return model_with_union_property_inlined_fruit_item1 + + @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/openapi.json b/end_to_end_tests/openapi.json index 196538f19..46c631533 100644 --- a/end_to_end_tests/openapi.json +++ b/end_to_end_tests/openapi.json @@ -806,6 +806,29 @@ }, "additionalProperties": false }, + "ModelWithUnionPropertyInlined": { + "title": "ModelWithUnionPropertyInlined", + "type": "object", + "properties": { + "fruit": { + "oneOf": [ + { + "type": "object", + "properties": { + "apples": {"type": "string"} + } + }, + { + "type": "object", + "properties": { + "bananas": {"type": "string"} + } + } + ] + } + }, + "additionalProperties": false + }, "FreeFormModel": { "title": "FreeFormModel", "type": "object" diff --git a/openapi_python_client/parser/properties/__init__.py b/openapi_python_client/parser/properties/__init__.py index 2ea75a569..6f573bf8d 100644 --- a/openapi_python_client/parser/properties/__init__.py +++ b/openapi_python_client/parser/properties/__init__.py @@ -382,9 +382,9 @@ def build_union_property( *, data: oai.Schema, name: str, required: bool, schemas: Schemas, parent_name: str ) -> Tuple[Union[UnionProperty, PropertyError], Schemas]: sub_properties: List[Property] = [] - for sub_prop_data in chain(data.anyOf, data.oneOf): + for i, sub_prop_data in enumerate(chain(data.anyOf, data.oneOf)): sub_prop, schemas = property_from_data( - name=name, required=required, data=sub_prop_data, schemas=schemas, parent_name=parent_name + name=f"{name}_item{i}", required=required, data=sub_prop_data, schemas=schemas, parent_name=parent_name ) if isinstance(sub_prop, PropertyError): return PropertyError(detail=f"Invalid property in union {name}", data=sub_prop_data), schemas diff --git a/openapi_python_client/templates/property_templates/union_property.py.jinja b/openapi_python_client/templates/property_templates/union_property.py.jinja index 4c632c60a..056f6f4d1 100644 --- a/openapi_python_client/templates/property_templates/union_property.py.jinja +++ b/openapi_python_client/templates/property_templates/union_property.py.jinja @@ -1,19 +1,20 @@ {% macro construct(property, source, initial_value=None) %} def _parse_{{ property.python_name }}(data: Any) -> {{ property.get_type_string() }}: data = None if isinstance(data, Unset) else data - {{ property.python_name }}: {{ property.get_type_string() }} {% for inner_property in property.inner_properties_with_template() %} {% if not loop.last or property.has_properties_without_templates %} try: + {{ inner_property.python_name }}: {{ inner_property.get_type_string() }} {% from "property_templates/" + inner_property.template import construct %} {{ construct(inner_property, "data", initial_value="UNSET") | indent(8) }} - return {{ property.python_name }} + return {{ inner_property.python_name }} except: # noqa: E722 pass {% else %}{# Don't do try/except for the last one #} + {{ inner_property.python_name }}: {{ inner_property.get_type_string() }} {% from "property_templates/" + inner_property.template import construct %} {{ construct(inner_property, "data", initial_value="UNSET") | indent(4) }} - return {{ property.python_name }} + return {{ inner_property.python_name }} {% endif %} {% endfor %} {% if property.has_properties_without_templates %}