Skip to content

Commit 8cba8e9

Browse files
fix: Fix deserialization of unions BNCH-20706 (#41)
1 parent 55e16f3 commit 8cba8e9

27 files changed

+559
-71
lines changed

Diff for: end_to_end_tests/golden-record-custom/custom_e2e/models/a_model.py

+178-7
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
from ..models.a_model_nullable_model import AModelNullableModel
1111
from ..models.an_enum import AnEnum
1212
from ..models.different_enum import DifferentEnum
13+
from ..models.free_form_model import FreeFormModel
14+
from ..models.model_with_union_property import ModelWithUnionProperty
1315
from ..types import UNSET, Unset
1416

1517

@@ -22,15 +24,19 @@ class AModel:
2224
a_date: datetime.date
2325
required_not_nullable: str
2426
model: AModelModel
27+
one_of_models: Union[FreeFormModel, ModelWithUnionProperty]
2528
a_nullable_date: Optional[datetime.date]
2629
required_nullable: Optional[str]
2730
nullable_model: Optional[AModelNullableModel]
31+
nullable_one_of_models: Union[None, FreeFormModel, ModelWithUnionProperty]
2832
nested_list_of_enums: Union[Unset, List[List[DifferentEnum]]] = UNSET
2933
attr_1_leading_digit: Union[Unset, str] = UNSET
3034
not_required_nullable: Union[Unset, None, str] = UNSET
3135
not_required_not_nullable: Union[Unset, str] = UNSET
3236
not_required_model: Union[Unset, AModelNotRequiredModel] = UNSET
3337
not_required_nullable_model: Union[Unset, None, AModelNotRequiredNullableModel] = UNSET
38+
not_required_one_of_models: Union[Unset, FreeFormModel, ModelWithUnionProperty] = UNSET
39+
not_required_nullable_one_of_models: Union[Unset, None, FreeFormModel, ModelWithUnionProperty, str] = UNSET
3440

3541
def to_dict(self) -> Dict[str, Any]:
3642
an_enum_value = self.an_enum_value.value
@@ -45,6 +51,12 @@ def to_dict(self) -> Dict[str, Any]:
4551
required_not_nullable = self.required_not_nullable
4652
model = self.model.to_dict()
4753

54+
if isinstance(self.one_of_models, FreeFormModel):
55+
one_of_models = self.one_of_models.to_dict()
56+
57+
else:
58+
one_of_models = self.one_of_models.to_dict()
59+
4860
nested_list_of_enums: Union[Unset, List[Any]] = UNSET
4961
if not isinstance(self.nested_list_of_enums, Unset):
5062
nested_list_of_enums = []
@@ -74,6 +86,48 @@ def to_dict(self) -> Dict[str, Any]:
7486
self.not_required_nullable_model.to_dict() if self.not_required_nullable_model else None
7587
)
7688

89+
nullable_one_of_models: Union[None, Dict[str, Any]]
90+
if isinstance(self.nullable_one_of_models, Unset):
91+
nullable_one_of_models = UNSET
92+
if self.nullable_one_of_models is None:
93+
nullable_one_of_models = None
94+
elif isinstance(self.nullable_one_of_models, FreeFormModel):
95+
nullable_one_of_models = self.nullable_one_of_models.to_dict()
96+
97+
else:
98+
nullable_one_of_models = self.nullable_one_of_models.to_dict()
99+
100+
not_required_one_of_models: Union[Unset, Dict[str, Any]]
101+
if isinstance(self.not_required_one_of_models, Unset):
102+
not_required_one_of_models = UNSET
103+
elif isinstance(self.not_required_one_of_models, FreeFormModel):
104+
not_required_one_of_models = UNSET
105+
if not isinstance(self.not_required_one_of_models, Unset):
106+
not_required_one_of_models = self.not_required_one_of_models.to_dict()
107+
108+
else:
109+
not_required_one_of_models = UNSET
110+
if not isinstance(self.not_required_one_of_models, Unset):
111+
not_required_one_of_models = self.not_required_one_of_models.to_dict()
112+
113+
not_required_nullable_one_of_models: Union[Unset, None, Dict[str, Any], str]
114+
if isinstance(self.not_required_nullable_one_of_models, Unset):
115+
not_required_nullable_one_of_models = UNSET
116+
elif self.not_required_nullable_one_of_models is None:
117+
not_required_nullable_one_of_models = None
118+
elif isinstance(self.not_required_nullable_one_of_models, FreeFormModel):
119+
not_required_nullable_one_of_models = UNSET
120+
if not isinstance(self.not_required_nullable_one_of_models, Unset):
121+
not_required_nullable_one_of_models = self.not_required_nullable_one_of_models.to_dict()
122+
123+
elif isinstance(self.not_required_nullable_one_of_models, ModelWithUnionProperty):
124+
not_required_nullable_one_of_models = UNSET
125+
if not isinstance(self.not_required_nullable_one_of_models, Unset):
126+
not_required_nullable_one_of_models = self.not_required_nullable_one_of_models.to_dict()
127+
128+
else:
129+
not_required_nullable_one_of_models = self.not_required_nullable_one_of_models
130+
77131
field_dict: Dict[str, Any] = {}
78132
field_dict.update(
79133
{
@@ -82,9 +136,11 @@ def to_dict(self) -> Dict[str, Any]:
82136
"a_date": a_date,
83137
"required_not_nullable": required_not_nullable,
84138
"model": model,
139+
"one_of_models": one_of_models,
85140
"a_nullable_date": a_nullable_date,
86141
"required_nullable": required_nullable,
87142
"nullable_model": nullable_model,
143+
"nullable_one_of_models": nullable_one_of_models,
88144
}
89145
)
90146
if nested_list_of_enums is not UNSET:
@@ -99,6 +155,10 @@ def to_dict(self) -> Dict[str, Any]:
99155
field_dict["not_required_model"] = not_required_model
100156
if not_required_nullable_model is not UNSET:
101157
field_dict["not_required_nullable_model"] = not_required_nullable_model
158+
if not_required_one_of_models is not UNSET:
159+
field_dict["not_required_one_of_models"] = not_required_one_of_models
160+
if not_required_nullable_one_of_models is not UNSET:
161+
field_dict["not_required_nullable_one_of_models"] = not_required_nullable_one_of_models
102162

103163
return field_dict
104164

@@ -107,15 +167,18 @@ def from_dict(src_dict: Dict[str, Any]) -> "AModel":
107167
d = src_dict.copy()
108168
an_enum_value = AnEnum(d.pop("an_enum_value"))
109169

110-
def _parse_a_camel_date_time(data: Any) -> Union[datetime.datetime, datetime.date]:
111-
data = None if isinstance(data, Unset) else data
170+
def _parse_a_camel_date_time(data: Union[str]) -> Union[datetime.datetime, datetime.date]:
112171
a_camel_date_time: Union[datetime.datetime, datetime.date]
113172
try:
173+
if not isinstance(data, str):
174+
raise TypeError()
114175
a_camel_date_time = isoparse(data)
115176

116177
return a_camel_date_time
117178
except: # noqa: E722
118179
pass
180+
if not isinstance(data, str):
181+
raise TypeError()
119182
a_camel_date_time = isoparse(data).date()
120183

121184
return a_camel_date_time
@@ -128,6 +191,24 @@ def _parse_a_camel_date_time(data: Any) -> Union[datetime.datetime, datetime.dat
128191

129192
model = AModelModel.from_dict(d.pop("model"))
130193

194+
def _parse_one_of_models(data: Union[Dict[str, Any]]) -> Union[FreeFormModel, ModelWithUnionProperty]:
195+
one_of_models: Union[FreeFormModel, ModelWithUnionProperty]
196+
try:
197+
if not isinstance(data, dict):
198+
raise TypeError()
199+
one_of_models = FreeFormModel.from_dict(data)
200+
201+
return one_of_models
202+
except: # noqa: E722
203+
pass
204+
if not isinstance(data, dict):
205+
raise TypeError()
206+
one_of_models = ModelWithUnionProperty.from_dict(data)
207+
208+
return one_of_models
209+
210+
one_of_models = _parse_one_of_models(d.pop("one_of_models"))
211+
131212
nested_list_of_enums = []
132213
_nested_list_of_enums = d.pop("nested_list_of_enums", UNSET)
133214
for nested_list_of_enums_item_data in _nested_list_of_enums or []:
@@ -156,26 +237,113 @@ def _parse_a_camel_date_time(data: Any) -> Union[datetime.datetime, datetime.dat
156237
nullable_model = None
157238
_nullable_model = d.pop("nullable_model")
158239
if _nullable_model is not None:
159-
nullable_model = AModelNullableModel.from_dict(cast(Dict[str, Any], _nullable_model))
240+
nullable_model = AModelNullableModel.from_dict(_nullable_model)
160241

161242
not_required_model: Union[Unset, AModelNotRequiredModel] = UNSET
162243
_not_required_model = d.pop("not_required_model", UNSET)
163244
if not isinstance(_not_required_model, Unset):
164-
not_required_model = AModelNotRequiredModel.from_dict(cast(Dict[str, Any], _not_required_model))
245+
not_required_model = AModelNotRequiredModel.from_dict(_not_required_model)
165246

166247
not_required_nullable_model = None
167248
_not_required_nullable_model = d.pop("not_required_nullable_model", UNSET)
168249
if _not_required_nullable_model is not None and not isinstance(_not_required_nullable_model, Unset):
169-
not_required_nullable_model = AModelNotRequiredNullableModel.from_dict(
170-
cast(Dict[str, Any], _not_required_nullable_model)
171-
)
250+
not_required_nullable_model = AModelNotRequiredNullableModel.from_dict(_not_required_nullable_model)
251+
252+
def _parse_nullable_one_of_models(
253+
data: Union[None, Dict[str, Any]]
254+
) -> Union[None, FreeFormModel, ModelWithUnionProperty]:
255+
nullable_one_of_models: Union[None, FreeFormModel, ModelWithUnionProperty]
256+
if data is None:
257+
return data
258+
try:
259+
if not isinstance(data, dict):
260+
raise TypeError()
261+
nullable_one_of_models = FreeFormModel.from_dict(data)
262+
263+
return nullable_one_of_models
264+
except: # noqa: E722
265+
pass
266+
if not isinstance(data, dict):
267+
raise TypeError()
268+
nullable_one_of_models = ModelWithUnionProperty.from_dict(data)
269+
270+
return nullable_one_of_models
271+
272+
nullable_one_of_models = _parse_nullable_one_of_models(d.pop("nullable_one_of_models"))
273+
274+
def _parse_not_required_one_of_models(
275+
data: Union[Unset, Dict[str, Any]]
276+
) -> Union[Unset, FreeFormModel, ModelWithUnionProperty]:
277+
not_required_one_of_models: Union[Unset, FreeFormModel, ModelWithUnionProperty]
278+
if isinstance(data, Unset):
279+
return data
280+
try:
281+
if not isinstance(data, dict):
282+
raise TypeError()
283+
not_required_one_of_models = UNSET
284+
_not_required_one_of_models = data
285+
if not isinstance(_not_required_one_of_models, Unset):
286+
not_required_one_of_models = FreeFormModel.from_dict(_not_required_one_of_models)
287+
288+
return not_required_one_of_models
289+
except: # noqa: E722
290+
pass
291+
if not isinstance(data, dict):
292+
raise TypeError()
293+
not_required_one_of_models = UNSET
294+
_not_required_one_of_models = data
295+
if not isinstance(_not_required_one_of_models, Unset):
296+
not_required_one_of_models = ModelWithUnionProperty.from_dict(_not_required_one_of_models)
297+
298+
return not_required_one_of_models
299+
300+
not_required_one_of_models = _parse_not_required_one_of_models(d.pop("not_required_one_of_models", UNSET))
301+
302+
def _parse_not_required_nullable_one_of_models(
303+
data: Union[Unset, None, Dict[str, Any], str]
304+
) -> Union[Unset, None, FreeFormModel, ModelWithUnionProperty, str]:
305+
not_required_nullable_one_of_models: Union[Unset, None, FreeFormModel, ModelWithUnionProperty, str]
306+
if data is None:
307+
return data
308+
if isinstance(data, Unset):
309+
return data
310+
try:
311+
if not isinstance(data, dict):
312+
raise TypeError()
313+
not_required_nullable_one_of_models = UNSET
314+
_not_required_nullable_one_of_models = data
315+
if not isinstance(_not_required_nullable_one_of_models, Unset):
316+
not_required_nullable_one_of_models = FreeFormModel.from_dict(_not_required_nullable_one_of_models)
317+
318+
return not_required_nullable_one_of_models
319+
except: # noqa: E722
320+
pass
321+
try:
322+
if not isinstance(data, dict):
323+
raise TypeError()
324+
not_required_nullable_one_of_models = UNSET
325+
_not_required_nullable_one_of_models = data
326+
if not isinstance(_not_required_nullable_one_of_models, Unset):
327+
not_required_nullable_one_of_models = ModelWithUnionProperty.from_dict(
328+
_not_required_nullable_one_of_models
329+
)
330+
331+
return not_required_nullable_one_of_models
332+
except: # noqa: E722
333+
pass
334+
return cast(Union[Unset, None, FreeFormModel, ModelWithUnionProperty, str], data)
335+
336+
not_required_nullable_one_of_models = _parse_not_required_nullable_one_of_models(
337+
d.pop("not_required_nullable_one_of_models", UNSET)
338+
)
172339

173340
a_model = AModel(
174341
an_enum_value=an_enum_value,
175342
a_camel_date_time=a_camel_date_time,
176343
a_date=a_date,
177344
required_not_nullable=required_not_nullable,
178345
model=model,
346+
one_of_models=one_of_models,
179347
nested_list_of_enums=nested_list_of_enums,
180348
a_nullable_date=a_nullable_date,
181349
attr_1_leading_digit=attr_1_leading_digit,
@@ -185,6 +353,9 @@ def _parse_a_camel_date_time(data: Any) -> Union[datetime.datetime, datetime.dat
185353
nullable_model=nullable_model,
186354
not_required_model=not_required_model,
187355
not_required_nullable_model=not_required_nullable_model,
356+
nullable_one_of_models=nullable_one_of_models,
357+
not_required_one_of_models=not_required_one_of_models,
358+
not_required_nullable_one_of_models=not_required_nullable_one_of_models,
188359
)
189360

190361
return a_model

Diff for: end_to_end_tests/golden-record-custom/custom_e2e/models/a_model_model.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,13 @@ def to_dict(self) -> Dict[str, Any]:
4040
def from_dict(src_dict: Dict[str, Any]) -> "AModelModel":
4141
d = src_dict.copy()
4242

43-
def _parse_a_property(data: Any) -> Union[Unset, AnEnum, AnIntEnum]:
44-
data = None if isinstance(data, Unset) else data
43+
def _parse_a_property(data: Union[Unset, int]) -> Union[Unset, AnEnum, AnIntEnum]:
4544
a_property: Union[Unset, AnEnum, AnIntEnum]
45+
if isinstance(data, Unset):
46+
return data
4647
try:
48+
if not (isinstance(data, int) or isinstance(data, str)):
49+
raise TypeError()
4750
a_property = UNSET
4851
_a_property = data
4952
if _a_property is not None:
@@ -52,6 +55,8 @@ def _parse_a_property(data: Any) -> Union[Unset, AnEnum, AnIntEnum]:
5255
return a_property
5356
except: # noqa: E722
5457
pass
58+
if not (isinstance(data, int) or isinstance(data, str)):
59+
raise TypeError()
5560
a_property = UNSET
5661
_a_property = data
5762
if _a_property is not None:

Diff for: end_to_end_tests/golden-record-custom/custom_e2e/models/a_model_not_required_model.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,13 @@ def to_dict(self) -> Dict[str, Any]:
4040
def from_dict(src_dict: Dict[str, Any]) -> "AModelNotRequiredModel":
4141
d = src_dict.copy()
4242

43-
def _parse_a_property(data: Any) -> Union[Unset, AnEnum, AnIntEnum]:
44-
data = None if isinstance(data, Unset) else data
43+
def _parse_a_property(data: Union[Unset, int]) -> Union[Unset, AnEnum, AnIntEnum]:
4544
a_property: Union[Unset, AnEnum, AnIntEnum]
45+
if isinstance(data, Unset):
46+
return data
4647
try:
48+
if not (isinstance(data, int) or isinstance(data, str)):
49+
raise TypeError()
4750
a_property = UNSET
4851
_a_property = data
4952
if _a_property is not None:
@@ -52,6 +55,8 @@ def _parse_a_property(data: Any) -> Union[Unset, AnEnum, AnIntEnum]:
5255
return a_property
5356
except: # noqa: E722
5457
pass
58+
if not (isinstance(data, int) or isinstance(data, str)):
59+
raise TypeError()
5560
a_property = UNSET
5661
_a_property = data
5762
if _a_property is not None:

Diff for: end_to_end_tests/golden-record-custom/custom_e2e/models/a_model_not_required_nullable_model.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,13 @@ def to_dict(self) -> Dict[str, Any]:
4040
def from_dict(src_dict: Dict[str, Any]) -> "AModelNotRequiredNullableModel":
4141
d = src_dict.copy()
4242

43-
def _parse_a_property(data: Any) -> Union[Unset, AnEnum, AnIntEnum]:
44-
data = None if isinstance(data, Unset) else data
43+
def _parse_a_property(data: Union[Unset, int]) -> Union[Unset, AnEnum, AnIntEnum]:
4544
a_property: Union[Unset, AnEnum, AnIntEnum]
45+
if isinstance(data, Unset):
46+
return data
4647
try:
48+
if not (isinstance(data, int) or isinstance(data, str)):
49+
raise TypeError()
4750
a_property = UNSET
4851
_a_property = data
4952
if _a_property is not None:
@@ -52,6 +55,8 @@ def _parse_a_property(data: Any) -> Union[Unset, AnEnum, AnIntEnum]:
5255
return a_property
5356
except: # noqa: E722
5457
pass
58+
if not (isinstance(data, int) or isinstance(data, str)):
59+
raise TypeError()
5560
a_property = UNSET
5661
_a_property = data
5762
if _a_property is not None:

Diff for: end_to_end_tests/golden-record-custom/custom_e2e/models/a_model_nullable_model.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -40,10 +40,13 @@ def to_dict(self) -> Dict[str, Any]:
4040
def from_dict(src_dict: Dict[str, Any]) -> "AModelNullableModel":
4141
d = src_dict.copy()
4242

43-
def _parse_a_property(data: Any) -> Union[Unset, AnEnum, AnIntEnum]:
44-
data = None if isinstance(data, Unset) else data
43+
def _parse_a_property(data: Union[Unset, int]) -> Union[Unset, AnEnum, AnIntEnum]:
4544
a_property: Union[Unset, AnEnum, AnIntEnum]
45+
if isinstance(data, Unset):
46+
return data
4647
try:
48+
if not (isinstance(data, int) or isinstance(data, str)):
49+
raise TypeError()
4750
a_property = UNSET
4851
_a_property = data
4952
if _a_property is not None:
@@ -52,6 +55,8 @@ def _parse_a_property(data: Any) -> Union[Unset, AnEnum, AnIntEnum]:
5255
return a_property
5356
except: # noqa: E722
5457
pass
58+
if not (isinstance(data, int) or isinstance(data, str)):
59+
raise TypeError()
5560
a_property = UNSET
5661
_a_property = data
5762
if _a_property is not None:

0 commit comments

Comments
 (0)