From b71f718e3cb32583ea10affe7f819702281c2dca Mon Sep 17 00:00:00 2001 From: Forest Tong Date: Wed, 10 Feb 2021 11:19:30 -0500 Subject: [PATCH 1/2] Fix union of inline models --- .../custom_e2e/models/__init__.py | 5 +- .../custom_e2e/models/a_model.py | 4 +- .../models/model_with_any_json_properties.py | 26 ++++--- ...n_properties_additional_property_item0.py} | 10 +-- .../models/model_with_union_property.py | 14 ++-- .../model_with_union_property_inlined.py | 68 +++++++++++++++++++ ...with_union_property_inlined_fruit_item0.py | 54 +++++++++++++++ ...with_union_property_inlined_fruit_item1.py | 54 +++++++++++++++ .../my_test_api_client/models/__init__.py | 5 +- .../my_test_api_client/models/a_model.py | 4 +- .../models/model_with_any_json_properties.py | 26 ++++--- ...n_properties_additional_property_item0.py} | 10 +-- .../models/model_with_union_property.py | 14 ++-- .../model_with_union_property_inlined.py | 68 +++++++++++++++++++ ...with_union_property_inlined_fruit_item0.py | 54 +++++++++++++++ ...with_union_property_inlined_fruit_item1.py | 54 +++++++++++++++ end_to_end_tests/openapi.json | 23 +++++++ .../parser/properties/__init__.py | 4 +- 18 files changed, 443 insertions(+), 54 deletions(-) rename end_to_end_tests/golden-record-custom/custom_e2e/models/{model_with_any_json_properties_additional_property.py => model_with_any_json_properties_additional_property_item0.py} (82%) create mode 100644 end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_union_property_inlined.py create mode 100644 end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_union_property_inlined_fruit_item0.py create mode 100644 end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_union_property_inlined_fruit_item1.py rename end_to_end_tests/golden-record/my_test_api_client/models/{model_with_any_json_properties_additional_property.py => model_with_any_json_properties_additional_property_item0.py} (82%) create mode 100644 end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined.py create mode 100644 end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined_fruit_item0.py create mode 100644 end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined_fruit_item1.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..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..ef383ae6f 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 @@ -113,12 +113,12 @@ def _parse_a_camel_date_time(data: Any) -> Union[datetime.datetime, datetime.dat data = None if isinstance(data, Unset) else data a_camel_date_time: Union[datetime.datetime, datetime.date] try: - a_camel_date_time = isoparse(data) + isoparse(data) return a_camel_date_time except: # noqa: E722 pass - a_camel_date_time = isoparse(data).date() + isoparse(data).date() return a_camel_date_time 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..f411ddea8 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,26 @@ 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 + ModelWithAnyJsonPropertiesAdditionalPropertyItem0, List[str], str, float, int, bool ] try: - additional_property = ModelWithAnyJsonPropertiesAdditionalProperty.from_dict(data) + ModelWithAnyJsonPropertiesAdditionalPropertyItem0.from_dict(data) return additional_property except: # noqa: E722 pass try: - additional_property = cast(List[str], data) + cast(List[str], data) return additional_property 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 +79,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..bf6b357b2 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 @@ -44,18 +44,16 @@ 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 = data + if _a_property_item0 is not None and _a_property_item0 is not UNSET: + AnEnum(_a_property_item0) return a_property 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 = data + if _a_property_item1 is not None and _a_property_item1 is not UNSET: + AnIntEnum(_a_property_item1) return a_property 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..e9c90b4d2 --- /dev/null +++ b/end_to_end_tests/golden-record-custom/custom_e2e/models/model_with_union_property_inlined.py @@ -0,0 +1,68 @@ +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 + fruit: Union[Unset, ModelWithUnionPropertyInlinedFruitItem0, ModelWithUnionPropertyInlinedFruitItem1] + try: + _fruit_item0 = data + if not isinstance(_fruit_item0, Unset): + ModelWithUnionPropertyInlinedFruitItem0.from_dict(cast(Dict[str, Any], _fruit_item0)) + + return fruit + except: # noqa: E722 + pass + _fruit_item1 = data + if not isinstance(_fruit_item1, Unset): + ModelWithUnionPropertyInlinedFruitItem1.from_dict(cast(Dict[str, Any], _fruit_item1)) + + return fruit + + 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..ef383ae6f 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 @@ -113,12 +113,12 @@ def _parse_a_camel_date_time(data: Any) -> Union[datetime.datetime, datetime.dat data = None if isinstance(data, Unset) else data a_camel_date_time: Union[datetime.datetime, datetime.date] try: - a_camel_date_time = isoparse(data) + isoparse(data) return a_camel_date_time except: # noqa: E722 pass - a_camel_date_time = isoparse(data).date() + isoparse(data).date() return a_camel_date_time 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..f411ddea8 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,26 @@ 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 + ModelWithAnyJsonPropertiesAdditionalPropertyItem0, List[str], str, float, int, bool ] try: - additional_property = ModelWithAnyJsonPropertiesAdditionalProperty.from_dict(data) + ModelWithAnyJsonPropertiesAdditionalPropertyItem0.from_dict(data) return additional_property except: # noqa: E722 pass try: - additional_property = cast(List[str], data) + cast(List[str], data) return additional_property 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 +79,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..bf6b357b2 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 @@ -44,18 +44,16 @@ 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 = data + if _a_property_item0 is not None and _a_property_item0 is not UNSET: + AnEnum(_a_property_item0) return a_property 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 = data + if _a_property_item1 is not None and _a_property_item1 is not UNSET: + AnIntEnum(_a_property_item1) return a_property 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..e9c90b4d2 --- /dev/null +++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_union_property_inlined.py @@ -0,0 +1,68 @@ +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 + fruit: Union[Unset, ModelWithUnionPropertyInlinedFruitItem0, ModelWithUnionPropertyInlinedFruitItem1] + try: + _fruit_item0 = data + if not isinstance(_fruit_item0, Unset): + ModelWithUnionPropertyInlinedFruitItem0.from_dict(cast(Dict[str, Any], _fruit_item0)) + + return fruit + except: # noqa: E722 + pass + _fruit_item1 = data + if not isinstance(_fruit_item1, Unset): + ModelWithUnionPropertyInlinedFruitItem1.from_dict(cast(Dict[str, Any], _fruit_item1)) + + return fruit + + 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 From c25156057a29546597f8c8c047ab794939e15651 Mon Sep 17 00:00:00 2001 From: Forest Tong Date: Wed, 10 Feb 2021 11:34:52 -0500 Subject: [PATCH 2/2] Fix union --- .../custom_e2e/models/a_model.py | 11 ++++++----- .../models/model_with_any_json_properties.py | 13 ++++++------- .../custom_e2e/models/model_with_union_property.py | 13 ++++++++----- .../models/model_with_union_property_inlined.py | 13 ++++++++----- .../my_test_api_client/models/a_model.py | 11 ++++++----- .../models/model_with_any_json_properties.py | 13 ++++++------- .../models/model_with_union_property.py | 13 ++++++++----- .../models/model_with_union_property_inlined.py | 13 ++++++++----- .../property_templates/union_property.py.jinja | 7 ++++--- 9 files changed, 60 insertions(+), 47 deletions(-) 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 ef383ae6f..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: - 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 - 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 f411ddea8..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 @@ -47,19 +47,18 @@ def _parse_additional_property( data: Any, ) -> Union[ModelWithAnyJsonPropertiesAdditionalPropertyItem0, List[str], str, float, int, bool]: data = None if isinstance(data, Unset) else data - additional_property: Union[ - ModelWithAnyJsonPropertiesAdditionalPropertyItem0, List[str], str, float, int, bool - ] try: - ModelWithAnyJsonPropertiesAdditionalPropertyItem0.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: - 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( 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 bf6b357b2..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,20 +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_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: - AnEnum(_a_property_item0) + a_property_item0 = AnEnum(_a_property_item0) - return a_property + return a_property_item0 except: # noqa: E722 pass + 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: - AnIntEnum(_a_property_item1) + 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 index e9c90b4d2..7c7ff77bc 100644 --- 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 @@ -44,20 +44,23 @@ def _parse_fruit( data: Any, ) -> Union[Unset, ModelWithUnionPropertyInlinedFruitItem0, ModelWithUnionPropertyInlinedFruitItem1]: data = None if isinstance(data, Unset) else data - fruit: Union[Unset, ModelWithUnionPropertyInlinedFruitItem0, ModelWithUnionPropertyInlinedFruitItem1] try: + fruit_item0: Union[ModelWithUnionPropertyInlinedFruitItem0, Unset] + fruit_item0 = UNSET _fruit_item0 = data if not isinstance(_fruit_item0, Unset): - ModelWithUnionPropertyInlinedFruitItem0.from_dict(cast(Dict[str, Any], _fruit_item0)) + fruit_item0 = ModelWithUnionPropertyInlinedFruitItem0.from_dict(cast(Dict[str, Any], _fruit_item0)) - return fruit + return fruit_item0 except: # noqa: E722 pass + fruit_item1: Union[ModelWithUnionPropertyInlinedFruitItem1, Unset] + fruit_item1 = UNSET _fruit_item1 = data if not isinstance(_fruit_item1, Unset): - ModelWithUnionPropertyInlinedFruitItem1.from_dict(cast(Dict[str, Any], _fruit_item1)) + fruit_item1 = ModelWithUnionPropertyInlinedFruitItem1.from_dict(cast(Dict[str, Any], _fruit_item1)) - return fruit + return fruit_item1 fruit = _parse_fruit(d.pop("fruit", UNSET)) 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 ef383ae6f..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: - 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 - 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 f411ddea8..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 @@ -47,19 +47,18 @@ def _parse_additional_property( data: Any, ) -> Union[ModelWithAnyJsonPropertiesAdditionalPropertyItem0, List[str], str, float, int, bool]: data = None if isinstance(data, Unset) else data - additional_property: Union[ - ModelWithAnyJsonPropertiesAdditionalPropertyItem0, List[str], str, float, int, bool - ] try: - ModelWithAnyJsonPropertiesAdditionalPropertyItem0.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: - 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( 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 bf6b357b2..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,20 +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_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: - AnEnum(_a_property_item0) + a_property_item0 = AnEnum(_a_property_item0) - return a_property + return a_property_item0 except: # noqa: E722 pass + 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: - AnIntEnum(_a_property_item1) + 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 index e9c90b4d2..7c7ff77bc 100644 --- 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 @@ -44,20 +44,23 @@ def _parse_fruit( data: Any, ) -> Union[Unset, ModelWithUnionPropertyInlinedFruitItem0, ModelWithUnionPropertyInlinedFruitItem1]: data = None if isinstance(data, Unset) else data - fruit: Union[Unset, ModelWithUnionPropertyInlinedFruitItem0, ModelWithUnionPropertyInlinedFruitItem1] try: + fruit_item0: Union[ModelWithUnionPropertyInlinedFruitItem0, Unset] + fruit_item0 = UNSET _fruit_item0 = data if not isinstance(_fruit_item0, Unset): - ModelWithUnionPropertyInlinedFruitItem0.from_dict(cast(Dict[str, Any], _fruit_item0)) + fruit_item0 = ModelWithUnionPropertyInlinedFruitItem0.from_dict(cast(Dict[str, Any], _fruit_item0)) - return fruit + return fruit_item0 except: # noqa: E722 pass + fruit_item1: Union[ModelWithUnionPropertyInlinedFruitItem1, Unset] + fruit_item1 = UNSET _fruit_item1 = data if not isinstance(_fruit_item1, Unset): - ModelWithUnionPropertyInlinedFruitItem1.from_dict(cast(Dict[str, Any], _fruit_item1)) + fruit_item1 = ModelWithUnionPropertyInlinedFruitItem1.from_dict(cast(Dict[str, Any], _fruit_item1)) - return fruit + return fruit_item1 fruit = _parse_fruit(d.pop("fruit", UNSET)) 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 %}