Skip to content

Commit da7adb4

Browse files
author
Constantinos Symeonides
committed
fix: allOf behaviour
1 parent fd5393f commit da7adb4

17 files changed

+199
-394
lines changed

end_to_end_tests/golden-record/my_test_api_client/api/tests/defaults_tests_defaults_post.py

+20-17
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ def _get_kwargs(
2727
union_prop: Union[Unset, float, str] = "not a float",
2828
union_prop_with_ref: Union[AnEnum, Unset, float] = 0.6,
2929
enum_prop: Union[Unset, AnEnum] = UNSET,
30-
model_prop: Union[Unset, ModelWithUnionProperty] = UNSET,
31-
required_model_prop: ModelWithUnionProperty,
30+
model_prop: Union[Unset, None, ModelWithUnionProperty] = UNSET,
31+
required_model_prop: Optional[ModelWithUnionProperty],
3232
nullable_model_prop: Union[ModelWithUnionProperty, None, Unset] = UNSET,
3333
nullable_required_model_prop: Union[ModelWithUnionProperty, None],
3434
) -> Dict[str, Any]:
@@ -86,11 +86,11 @@ def _get_kwargs(
8686
if not isinstance(enum_prop, Unset):
8787
json_enum_prop = enum_prop.value
8888

89-
json_model_prop: Union[Unset, Dict[str, Any]] = UNSET
89+
json_model_prop: Union[Unset, None, Dict[str, Any]] = UNSET
9090
if not isinstance(model_prop, Unset):
91-
json_model_prop = model_prop.to_dict()
91+
json_model_prop = model_prop.to_dict() if model_prop else None
9292

93-
json_required_model_prop = required_model_prop.to_dict()
93+
json_required_model_prop = required_model_prop.to_dict() if required_model_prop else None
9494

9595
json_nullable_model_prop: Union[Dict[str, Any], None, Unset]
9696
if isinstance(nullable_model_prop, Unset):
@@ -100,13 +100,15 @@ def _get_kwargs(
100100
else:
101101
json_nullable_model_prop = UNSET
102102
if not isinstance(nullable_model_prop, Unset):
103-
json_nullable_model_prop = nullable_model_prop.to_dict()
103+
json_nullable_model_prop = nullable_model_prop.to_dict() if nullable_model_prop else None
104104

105105
json_nullable_required_model_prop: Union[Dict[str, Any], None]
106106
if nullable_required_model_prop is None:
107107
json_nullable_required_model_prop = None
108108
else:
109-
json_nullable_required_model_prop = nullable_required_model_prop.to_dict()
109+
json_nullable_required_model_prop = (
110+
nullable_required_model_prop.to_dict() if nullable_required_model_prop else None
111+
)
110112

111113
params: Dict[str, Any] = {
112114
"string_prop": string_prop,
@@ -125,9 +127,10 @@ def _get_kwargs(
125127
"nullable_model_prop": json_nullable_model_prop,
126128
"nullable_required_model_prop": json_nullable_required_model_prop,
127129
}
128-
if not isinstance(json_model_prop, Unset):
130+
if not isinstance(json_model_prop, Unset) and json_model_prop is not None:
129131
params.update(json_model_prop)
130-
params.update(json_required_model_prop)
132+
if json_required_model_prop is not None:
133+
params.update(json_required_model_prop)
131134
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
132135

133136
return {
@@ -176,8 +179,8 @@ def sync_detailed(
176179
union_prop: Union[Unset, float, str] = "not a float",
177180
union_prop_with_ref: Union[AnEnum, Unset, float] = 0.6,
178181
enum_prop: Union[Unset, AnEnum] = UNSET,
179-
model_prop: Union[Unset, ModelWithUnionProperty] = UNSET,
180-
required_model_prop: ModelWithUnionProperty,
182+
model_prop: Union[Unset, None, ModelWithUnionProperty] = UNSET,
183+
required_model_prop: Optional[ModelWithUnionProperty],
181184
nullable_model_prop: Union[ModelWithUnionProperty, None, Unset] = UNSET,
182185
nullable_required_model_prop: Union[ModelWithUnionProperty, None],
183186
) -> Response[Union[None, HTTPValidationError]]:
@@ -225,8 +228,8 @@ def sync(
225228
union_prop: Union[Unset, float, str] = "not a float",
226229
union_prop_with_ref: Union[AnEnum, Unset, float] = 0.6,
227230
enum_prop: Union[Unset, AnEnum] = UNSET,
228-
model_prop: Union[Unset, ModelWithUnionProperty] = UNSET,
229-
required_model_prop: ModelWithUnionProperty,
231+
model_prop: Union[Unset, None, ModelWithUnionProperty] = UNSET,
232+
required_model_prop: Optional[ModelWithUnionProperty],
230233
nullable_model_prop: Union[ModelWithUnionProperty, None, Unset] = UNSET,
231234
nullable_required_model_prop: Union[ModelWithUnionProperty, None],
232235
) -> Optional[Union[None, HTTPValidationError]]:
@@ -270,8 +273,8 @@ async def asyncio_detailed(
270273
union_prop: Union[Unset, float, str] = "not a float",
271274
union_prop_with_ref: Union[AnEnum, Unset, float] = 0.6,
272275
enum_prop: Union[Unset, AnEnum] = UNSET,
273-
model_prop: Union[Unset, ModelWithUnionProperty] = UNSET,
274-
required_model_prop: ModelWithUnionProperty,
276+
model_prop: Union[Unset, None, ModelWithUnionProperty] = UNSET,
277+
required_model_prop: Optional[ModelWithUnionProperty],
275278
nullable_model_prop: Union[ModelWithUnionProperty, None, Unset] = UNSET,
276279
nullable_required_model_prop: Union[ModelWithUnionProperty, None],
277280
) -> Response[Union[None, HTTPValidationError]]:
@@ -318,8 +321,8 @@ async def asyncio(
318321
union_prop: Union[Unset, float, str] = "not a float",
319322
union_prop_with_ref: Union[AnEnum, Unset, float] = 0.6,
320323
enum_prop: Union[Unset, AnEnum] = UNSET,
321-
model_prop: Union[Unset, ModelWithUnionProperty] = UNSET,
322-
required_model_prop: ModelWithUnionProperty,
324+
model_prop: Union[Unset, None, ModelWithUnionProperty] = UNSET,
325+
required_model_prop: Optional[ModelWithUnionProperty],
323326
nullable_model_prop: Union[ModelWithUnionProperty, None, Unset] = UNSET,
324327
nullable_required_model_prop: Union[ModelWithUnionProperty, None],
325328
) -> Optional[Union[None, HTTPValidationError]]:

end_to_end_tests/golden-record/my_test_api_client/models/__init__.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
""" Contains all the data models used in inputs/outputs """
22

33
from .a_model import AModel
4-
from .a_model_model import AModelModel
5-
from .a_model_not_required_model import AModelNotRequiredModel
6-
from .a_model_not_required_nullable_model import AModelNotRequiredNullableModel
7-
from .a_model_nullable_model import AModelNullableModel
4+
from .a_model_an_all_of_enum import AModelAnAllOfEnum
5+
from .a_model_model_with_union_property import AModelModelWithUnionProperty
86
from .all_of_sub_model import AllOfSubModel
7+
from .an_all_of_enum import AnAllOfEnum
98
from .an_enum import AnEnum
109
from .an_int_enum import AnIntEnum
1110
from .another_all_of_sub_model import AnotherAllOfSubModel

end_to_end_tests/golden-record/my_test_api_client/models/a_model.py

+46-25
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,8 @@
44
import attr
55
from dateutil.parser import isoparse
66

7-
from ..models.a_model_model import AModelModel
8-
from ..models.a_model_not_required_model import AModelNotRequiredModel
9-
from ..models.a_model_not_required_nullable_model import AModelNotRequiredNullableModel
10-
from ..models.a_model_nullable_model import AModelNullableModel
7+
from ..models.a_model_an_all_of_enum import AModelAnAllOfEnum
8+
from ..models.a_model_model_with_union_property import AModelModelWithUnionProperty
119
from ..models.an_enum import AnEnum
1210
from ..models.different_enum import DifferentEnum
1311
from ..models.free_form_model import FreeFormModel
@@ -26,24 +24,27 @@ class AModel:
2624
a_date: datetime.date
2725
required_not_nullable: str
2826
one_of_models: Union[FreeFormModel, ModelWithUnionProperty]
29-
model: AModelModel
27+
model: AModelModelWithUnionProperty
3028
a_nullable_date: Optional[datetime.date]
3129
required_nullable: Optional[str]
3230
nullable_one_of_models: Union[FreeFormModel, ModelWithUnionProperty, None]
33-
nullable_model: Optional[AModelNullableModel]
31+
nullable_model: Optional[AModelModelWithUnionProperty]
32+
an_allof_enum_value: AModelAnAllOfEnum = AModelAnAllOfEnum.OVERRIDDEN_DEFAULT
3433
nested_list_of_enums: Union[Unset, List[List[DifferentEnum]]] = UNSET
3534
a_not_required_date: Union[Unset, datetime.date] = UNSET
3635
attr_1_leading_digit: Union[Unset, str] = UNSET
3736
not_required_nullable: Union[Unset, None, str] = UNSET
3837
not_required_not_nullable: Union[Unset, str] = UNSET
3938
not_required_one_of_models: Union[FreeFormModel, ModelWithUnionProperty, Unset] = UNSET
4039
not_required_nullable_one_of_models: Union[FreeFormModel, ModelWithUnionProperty, None, Unset, str] = UNSET
41-
not_required_model: Union[Unset, AModelNotRequiredModel] = UNSET
42-
not_required_nullable_model: Union[Unset, None, AModelNotRequiredNullableModel] = UNSET
40+
not_required_model: Union[Unset, AModelModelWithUnionProperty] = UNSET
41+
not_required_nullable_model: Union[Unset, None, AModelModelWithUnionProperty] = UNSET
4342

4443
def to_dict(self) -> Dict[str, Any]:
4544
an_enum_value = self.an_enum_value.value
4645

46+
an_allof_enum_value = self.an_allof_enum_value.value
47+
4748
if isinstance(self.a_camel_date_time, datetime.datetime):
4849
a_camel_date_time = self.a_camel_date_time.isoformat()
4950

@@ -56,7 +57,7 @@ def to_dict(self) -> Dict[str, Any]:
5657
one_of_models = self.one_of_models.to_dict()
5758

5859
else:
59-
one_of_models = self.one_of_models.to_dict()
60+
one_of_models = self.one_of_models.to_dict() if self.one_of_models else None
6061

6162
model = self.model.to_dict()
6263

@@ -88,7 +89,7 @@ def to_dict(self) -> Dict[str, Any]:
8889
nullable_one_of_models = self.nullable_one_of_models.to_dict()
8990

9091
else:
91-
nullable_one_of_models = self.nullable_one_of_models.to_dict()
92+
nullable_one_of_models = self.nullable_one_of_models.to_dict() if self.nullable_one_of_models else None
9293

9394
not_required_one_of_models: Union[Dict[str, Any], Unset]
9495
if isinstance(self.not_required_one_of_models, Unset):
@@ -101,7 +102,9 @@ def to_dict(self) -> Dict[str, Any]:
101102
else:
102103
not_required_one_of_models = UNSET
103104
if not isinstance(self.not_required_one_of_models, Unset):
104-
not_required_one_of_models = self.not_required_one_of_models.to_dict()
105+
not_required_one_of_models = (
106+
self.not_required_one_of_models.to_dict() if self.not_required_one_of_models else None
107+
)
105108

106109
not_required_nullable_one_of_models: Union[Dict[str, Any], None, Unset, str]
107110
if isinstance(self.not_required_nullable_one_of_models, Unset):
@@ -116,7 +119,11 @@ def to_dict(self) -> Dict[str, Any]:
116119
elif isinstance(self.not_required_nullable_one_of_models, ModelWithUnionProperty):
117120
not_required_nullable_one_of_models = UNSET
118121
if not isinstance(self.not_required_nullable_one_of_models, Unset):
119-
not_required_nullable_one_of_models = self.not_required_nullable_one_of_models.to_dict()
122+
not_required_nullable_one_of_models = (
123+
self.not_required_nullable_one_of_models.to_dict()
124+
if self.not_required_nullable_one_of_models
125+
else None
126+
)
120127

121128
else:
122129
not_required_nullable_one_of_models = self.not_required_nullable_one_of_models
@@ -137,6 +144,7 @@ def to_dict(self) -> Dict[str, Any]:
137144
field_dict.update(
138145
{
139146
"an_enum_value": an_enum_value,
147+
"an_allof_enum_value": an_allof_enum_value,
140148
"aCamelDateTime": a_camel_date_time,
141149
"a_date": a_date,
142150
"required_not_nullable": required_not_nullable,
@@ -174,6 +182,8 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
174182
d = src_dict.copy()
175183
an_enum_value = AnEnum(d.pop("an_enum_value"))
176184

185+
an_allof_enum_value = AModelAnAllOfEnum(d.pop("an_allof_enum_value"))
186+
177187
def _parse_a_camel_date_time(data: object) -> Union[datetime.date, datetime.datetime]:
178188
try:
179189
a_camel_date_time_type0: datetime.datetime
@@ -209,14 +219,17 @@ def _parse_one_of_models(data: object) -> Union[FreeFormModel, ModelWithUnionPro
209219
pass
210220
if not isinstance(data, dict):
211221
raise TypeError()
212-
one_of_models_type1: ModelWithUnionProperty
213-
one_of_models_type1 = ModelWithUnionProperty.from_dict(data)
222+
one_of_models_type1: Optional[ModelWithUnionProperty]
223+
one_of_models_type1 = UNSET
224+
_one_of_models_type1 = data
225+
if _one_of_models_type1 is not None:
226+
one_of_models_type1 = ModelWithUnionProperty.from_dict(_one_of_models_type1)
214227

215228
return one_of_models_type1
216229

217230
one_of_models = _parse_one_of_models(d.pop("one_of_models"))
218231

219-
model = AModelModel.from_dict(d.pop("model"))
232+
model = AModelModelWithUnionProperty.from_dict(d.pop("model"))
220233

221234
nested_list_of_enums = []
222235
_nested_list_of_enums = d.pop("nested_list_of_enums", UNSET)
@@ -262,8 +275,11 @@ def _parse_nullable_one_of_models(data: object) -> Union[FreeFormModel, ModelWit
262275
pass
263276
if not isinstance(data, dict):
264277
raise TypeError()
265-
nullable_one_of_models_type1: ModelWithUnionProperty
266-
nullable_one_of_models_type1 = ModelWithUnionProperty.from_dict(data)
278+
nullable_one_of_models_type1: Optional[ModelWithUnionProperty]
279+
nullable_one_of_models_type1 = UNSET
280+
_nullable_one_of_models_type1 = data
281+
if _nullable_one_of_models_type1 is not None:
282+
nullable_one_of_models_type1 = ModelWithUnionProperty.from_dict(_nullable_one_of_models_type1)
267283

268284
return nullable_one_of_models_type1
269285

@@ -286,10 +302,12 @@ def _parse_not_required_one_of_models(data: object) -> Union[FreeFormModel, Mode
286302
pass
287303
if not isinstance(data, dict):
288304
raise TypeError()
289-
not_required_one_of_models_type1: Union[Unset, ModelWithUnionProperty]
305+
not_required_one_of_models_type1: Union[Unset, None, ModelWithUnionProperty]
290306
not_required_one_of_models_type1 = UNSET
291307
_not_required_one_of_models_type1 = data
292-
if not isinstance(_not_required_one_of_models_type1, Unset):
308+
if _not_required_one_of_models_type1 is not None and not isinstance(
309+
_not_required_one_of_models_type1, Unset
310+
):
293311
not_required_one_of_models_type1 = ModelWithUnionProperty.from_dict(_not_required_one_of_models_type1)
294312

295313
return not_required_one_of_models_type1
@@ -318,12 +336,14 @@ def _parse_not_required_nullable_one_of_models(
318336
except: # noqa: E722
319337
pass
320338
try:
321-
not_required_nullable_one_of_models_type1: Union[Unset, ModelWithUnionProperty]
339+
not_required_nullable_one_of_models_type1: Union[Unset, None, ModelWithUnionProperty]
322340
if not isinstance(data, dict):
323341
raise TypeError()
324342
not_required_nullable_one_of_models_type1 = UNSET
325343
_not_required_nullable_one_of_models_type1 = data
326-
if not isinstance(_not_required_nullable_one_of_models_type1, Unset):
344+
if _not_required_nullable_one_of_models_type1 is not None and not isinstance(
345+
_not_required_nullable_one_of_models_type1, Unset
346+
):
327347
not_required_nullable_one_of_models_type1 = ModelWithUnionProperty.from_dict(
328348
_not_required_nullable_one_of_models_type1
329349
)
@@ -340,20 +360,21 @@ def _parse_not_required_nullable_one_of_models(
340360
nullable_model = None
341361
_nullable_model = d.pop("nullable_model")
342362
if _nullable_model is not None:
343-
nullable_model = AModelNullableModel.from_dict(_nullable_model)
363+
nullable_model = AModelModelWithUnionProperty.from_dict(_nullable_model)
344364

345-
not_required_model: Union[Unset, AModelNotRequiredModel] = UNSET
365+
not_required_model: Union[Unset, AModelModelWithUnionProperty] = UNSET
346366
_not_required_model = d.pop("not_required_model", UNSET)
347367
if not isinstance(_not_required_model, Unset):
348-
not_required_model = AModelNotRequiredModel.from_dict(_not_required_model)
368+
not_required_model = AModelModelWithUnionProperty.from_dict(_not_required_model)
349369

350370
not_required_nullable_model = None
351371
_not_required_nullable_model = d.pop("not_required_nullable_model", UNSET)
352372
if _not_required_nullable_model is not None and not isinstance(_not_required_nullable_model, Unset):
353-
not_required_nullable_model = AModelNotRequiredNullableModel.from_dict(_not_required_nullable_model)
373+
not_required_nullable_model = AModelModelWithUnionProperty.from_dict(_not_required_nullable_model)
354374

355375
a_model = cls(
356376
an_enum_value=an_enum_value,
377+
an_allof_enum_value=an_allof_enum_value,
357378
a_camel_date_time=a_camel_date_time,
358379
a_date=a_date,
359380
required_not_nullable=required_not_nullable,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from enum import Enum
2+
3+
4+
class AModelAnAllOfEnum(str, Enum):
5+
FOO = "foo"
6+
BAR = "bar"
7+
A_DEFAULT = "a_default"
8+
OVERRIDDEN_DEFAULT = "overridden_default"
9+
10+
def __str__(self) -> str:
11+
return str(self.value)

end_to_end_tests/golden-record/my_test_api_client/models/a_model_model.py renamed to end_to_end_tests/golden-record/my_test_api_client/models/a_model_model_with_union_property.py

+5-24
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
1-
from typing import Any, Dict, List, Type, TypeVar, Union
1+
from typing import Any, Dict, Type, TypeVar, Union
22

33
import attr
44

55
from ..models.an_enum import AnEnum
66
from ..models.an_int_enum import AnIntEnum
77
from ..types import UNSET, Unset
88

9-
T = TypeVar("T", bound="AModelModel")
9+
T = TypeVar("T", bound="AModelModelWithUnionProperty")
1010

1111

1212
@attr.s(auto_attribs=True)
13-
class AModelModel:
13+
class AModelModelWithUnionProperty:
1414
""" """
1515

1616
a_property: Union[AnEnum, AnIntEnum, Unset] = UNSET
17-
additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict)
1817

1918
def to_dict(self) -> Dict[str, Any]:
2019
a_property: Union[Unset, int, str]
@@ -31,7 +30,6 @@ def to_dict(self) -> Dict[str, Any]:
3130
a_property = self.a_property.value
3231

3332
field_dict: Dict[str, Any] = {}
34-
field_dict.update(self.additional_properties)
3533
field_dict.update({})
3634
if a_property is not UNSET:
3735
field_dict["a_property"] = a_property
@@ -69,25 +67,8 @@ def _parse_a_property(data: object) -> Union[AnEnum, AnIntEnum, Unset]:
6967

7068
a_property = _parse_a_property(d.pop("a_property", UNSET))
7169

72-
a_model_model = cls(
70+
a_model_model_with_union_property = cls(
7371
a_property=a_property,
7472
)
7573

76-
a_model_model.additional_properties = d
77-
return a_model_model
78-
79-
@property
80-
def additional_keys(self) -> List[str]:
81-
return list(self.additional_properties.keys())
82-
83-
def __getitem__(self, key: str) -> Any:
84-
return self.additional_properties[key]
85-
86-
def __setitem__(self, key: str, value: Any) -> None:
87-
self.additional_properties[key] = value
88-
89-
def __delitem__(self, key: str) -> None:
90-
del self.additional_properties[key]
91-
92-
def __contains__(self, key: str) -> bool:
93-
return key in self.additional_properties
74+
return a_model_model_with_union_property

0 commit comments

Comments
 (0)