Skip to content

Commit fed62b0

Browse files
committed
fix: nullable passthrough in single union refs
1 parent 7f9051b commit fed62b0

File tree

3 files changed

+34
-28
lines changed

3 files changed

+34
-28
lines changed

Diff for: end_to_end_tests/golden-record/my_test_api_client/api/tests/defaults_tests_defaults_post.py

+16-15
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ def _get_kwargs(
2929
enum_prop: Union[Unset, AnEnum] = UNSET,
3030
model_prop: Union[Unset, ModelWithUnionProperty] = UNSET,
3131
required_model_prop: ModelWithUnionProperty,
32-
nullable_model_prop: Union[Unset, ModelWithUnionProperty] = UNSET,
33-
nullable_required_model_prop: ModelWithUnionProperty,
32+
nullable_model_prop: Union[Unset, None, ModelWithUnionProperty] = UNSET,
33+
nullable_required_model_prop: Optional[ModelWithUnionProperty],
3434
) -> Dict[str, Any]:
3535
url = "{}/tests/defaults".format(client.base_url)
3636

@@ -92,11 +92,11 @@ def _get_kwargs(
9292

9393
json_required_model_prop = required_model_prop.to_dict()
9494

95-
json_nullable_model_prop: Union[Unset, Dict[str, Any]] = UNSET
95+
json_nullable_model_prop: Union[Unset, None, Dict[str, Any]] = UNSET
9696
if not isinstance(nullable_model_prop, Unset):
97-
json_nullable_model_prop = nullable_model_prop.to_dict()
97+
json_nullable_model_prop = nullable_model_prop.to_dict() if nullable_model_prop else None
9898

99-
json_nullable_required_model_prop = nullable_required_model_prop.to_dict()
99+
json_nullable_required_model_prop = nullable_required_model_prop.to_dict() if nullable_required_model_prop else None
100100

101101
params: Dict[str, Any] = {
102102
"string_prop": string_prop,
@@ -116,9 +116,10 @@ def _get_kwargs(
116116
if not isinstance(json_model_prop, Unset):
117117
params.update(json_model_prop)
118118
params.update(json_required_model_prop)
119-
if not isinstance(json_nullable_model_prop, Unset):
119+
if not isinstance(json_nullable_model_prop, Unset) and json_nullable_model_prop is not None:
120120
params.update(json_nullable_model_prop)
121-
params.update(json_nullable_required_model_prop)
121+
if json_nullable_required_model_prop is not None:
122+
params.update(json_nullable_required_model_prop)
122123
params = {k: v for k, v in params.items() if v is not UNSET and v is not None}
123124

124125
return {
@@ -169,8 +170,8 @@ def sync_detailed(
169170
enum_prop: Union[Unset, AnEnum] = UNSET,
170171
model_prop: Union[Unset, ModelWithUnionProperty] = UNSET,
171172
required_model_prop: ModelWithUnionProperty,
172-
nullable_model_prop: Union[Unset, ModelWithUnionProperty] = UNSET,
173-
nullable_required_model_prop: ModelWithUnionProperty,
173+
nullable_model_prop: Union[Unset, None, ModelWithUnionProperty] = UNSET,
174+
nullable_required_model_prop: Optional[ModelWithUnionProperty],
174175
) -> Response[Union[None, HTTPValidationError]]:
175176
kwargs = _get_kwargs(
176177
client=client,
@@ -218,8 +219,8 @@ def sync(
218219
enum_prop: Union[Unset, AnEnum] = UNSET,
219220
model_prop: Union[Unset, ModelWithUnionProperty] = UNSET,
220221
required_model_prop: ModelWithUnionProperty,
221-
nullable_model_prop: Union[Unset, ModelWithUnionProperty] = UNSET,
222-
nullable_required_model_prop: ModelWithUnionProperty,
222+
nullable_model_prop: Union[Unset, None, ModelWithUnionProperty] = UNSET,
223+
nullable_required_model_prop: Optional[ModelWithUnionProperty],
223224
) -> Optional[Union[None, HTTPValidationError]]:
224225
""" """
225226

@@ -263,8 +264,8 @@ async def asyncio_detailed(
263264
enum_prop: Union[Unset, AnEnum] = UNSET,
264265
model_prop: Union[Unset, ModelWithUnionProperty] = UNSET,
265266
required_model_prop: ModelWithUnionProperty,
266-
nullable_model_prop: Union[Unset, ModelWithUnionProperty] = UNSET,
267-
nullable_required_model_prop: ModelWithUnionProperty,
267+
nullable_model_prop: Union[Unset, None, ModelWithUnionProperty] = UNSET,
268+
nullable_required_model_prop: Optional[ModelWithUnionProperty],
268269
) -> Response[Union[None, HTTPValidationError]]:
269270
kwargs = _get_kwargs(
270271
client=client,
@@ -311,8 +312,8 @@ async def asyncio(
311312
enum_prop: Union[Unset, AnEnum] = UNSET,
312313
model_prop: Union[Unset, ModelWithUnionProperty] = UNSET,
313314
required_model_prop: ModelWithUnionProperty,
314-
nullable_model_prop: Union[Unset, ModelWithUnionProperty] = UNSET,
315-
nullable_required_model_prop: ModelWithUnionProperty,
315+
nullable_model_prop: Union[Unset, None, ModelWithUnionProperty] = UNSET,
316+
nullable_required_model_prop: Optional[ModelWithUnionProperty],
316317
) -> Optional[Union[None, HTTPValidationError]]:
317318
""" """
318319

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

+17-12
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,10 @@ class AModel:
2323
required_not_nullable: str
2424
one_of_models: Union[FreeFormModel, ModelWithUnionProperty]
2525
model: ModelWithUnionProperty
26-
nullable_model: ModelWithUnionProperty
2726
a_nullable_date: Optional[datetime.date]
2827
required_nullable: Optional[str]
2928
nullable_one_of_models: Union[FreeFormModel, ModelWithUnionProperty, None]
29+
nullable_model: Optional[ModelWithUnionProperty]
3030
nested_list_of_enums: Union[Unset, List[List[DifferentEnum]]] = UNSET
3131
a_not_required_date: Union[Unset, datetime.date] = UNSET
3232
attr_1_leading_digit: Union[Unset, str] = UNSET
@@ -35,7 +35,7 @@ class AModel:
3535
not_required_one_of_models: Union[FreeFormModel, ModelWithUnionProperty, Unset] = UNSET
3636
not_required_nullable_one_of_models: Union[FreeFormModel, ModelWithUnionProperty, None, Unset, str] = UNSET
3737
not_required_model: Union[Unset, ModelWithUnionProperty] = UNSET
38-
not_required_nullable_model: Union[Unset, ModelWithUnionProperty] = UNSET
38+
not_required_nullable_model: Union[Unset, None, ModelWithUnionProperty] = UNSET
3939

4040
def to_dict(self) -> Dict[str, Any]:
4141
an_enum_value = self.an_enum_value.value
@@ -56,8 +56,6 @@ def to_dict(self) -> Dict[str, Any]:
5656

5757
model = self.model.to_dict()
5858

59-
nullable_model = self.nullable_model.to_dict()
60-
6159
nested_list_of_enums: Union[Unset, List[List[str]]] = UNSET
6260
if not isinstance(self.nested_list_of_enums, Unset):
6361
nested_list_of_enums = []
@@ -119,13 +117,17 @@ def to_dict(self) -> Dict[str, Any]:
119117
else:
120118
not_required_nullable_one_of_models = self.not_required_nullable_one_of_models
121119

120+
nullable_model = self.nullable_model.to_dict() if self.nullable_model else None
121+
122122
not_required_model: Union[Unset, Dict[str, Any]] = UNSET
123123
if not isinstance(self.not_required_model, Unset):
124124
not_required_model = self.not_required_model.to_dict()
125125

126-
not_required_nullable_model: Union[Unset, Dict[str, Any]] = UNSET
126+
not_required_nullable_model: Union[Unset, None, Dict[str, Any]] = UNSET
127127
if not isinstance(self.not_required_nullable_model, Unset):
128-
not_required_nullable_model = self.not_required_nullable_model.to_dict()
128+
not_required_nullable_model = (
129+
self.not_required_nullable_model.to_dict() if self.not_required_nullable_model else None
130+
)
129131

130132
field_dict: Dict[str, Any] = {}
131133
field_dict.update(
@@ -136,10 +138,10 @@ def to_dict(self) -> Dict[str, Any]:
136138
"required_not_nullable": required_not_nullable,
137139
"one_of_models": one_of_models,
138140
"model": model,
139-
"nullable_model": nullable_model,
140141
"a_nullable_date": a_nullable_date,
141142
"required_nullable": required_nullable,
142143
"nullable_one_of_models": nullable_one_of_models,
144+
"nullable_model": nullable_model,
143145
}
144146
)
145147
if nested_list_of_enums is not UNSET:
@@ -212,8 +214,6 @@ def _parse_one_of_models(data: object) -> Union[FreeFormModel, ModelWithUnionPro
212214

213215
model = ModelWithUnionProperty.from_dict(d.pop("model"))
214216

215-
nullable_model = ModelWithUnionProperty.from_dict(d.pop("nullable_model"))
216-
217217
nested_list_of_enums = []
218218
_nested_list_of_enums = d.pop("nested_list_of_enums", UNSET)
219219
for nested_list_of_enums_item_data in _nested_list_of_enums or []:
@@ -333,14 +333,19 @@ def _parse_not_required_nullable_one_of_models(
333333
d.pop("not_required_nullable_one_of_models", UNSET)
334334
)
335335

336+
nullable_model = None
337+
_nullable_model = d.pop("nullable_model")
338+
if _nullable_model is not None:
339+
nullable_model = ModelWithUnionProperty.from_dict(_nullable_model)
340+
336341
not_required_model: Union[Unset, ModelWithUnionProperty] = UNSET
337342
_not_required_model = d.pop("not_required_model", UNSET)
338343
if not isinstance(_not_required_model, Unset):
339344
not_required_model = ModelWithUnionProperty.from_dict(_not_required_model)
340345

341-
not_required_nullable_model: Union[Unset, ModelWithUnionProperty] = UNSET
346+
not_required_nullable_model = None
342347
_not_required_nullable_model = d.pop("not_required_nullable_model", UNSET)
343-
if not isinstance(_not_required_nullable_model, Unset):
348+
if _not_required_nullable_model is not None and not isinstance(_not_required_nullable_model, Unset):
344349
not_required_nullable_model = ModelWithUnionProperty.from_dict(_not_required_nullable_model)
345350

346351
a_model = cls(
@@ -350,7 +355,6 @@ def _parse_not_required_nullable_one_of_models(
350355
required_not_nullable=required_not_nullable,
351356
one_of_models=one_of_models,
352357
model=model,
353-
nullable_model=nullable_model,
354358
nested_list_of_enums=nested_list_of_enums,
355359
a_nullable_date=a_nullable_date,
356360
a_not_required_date=a_not_required_date,
@@ -361,6 +365,7 @@ def _parse_not_required_nullable_one_of_models(
361365
nullable_one_of_models=nullable_one_of_models,
362366
not_required_one_of_models=not_required_one_of_models,
363367
not_required_nullable_one_of_models=not_required_nullable_one_of_models,
368+
nullable_model=nullable_model,
364369
not_required_model=not_required_model,
365370
not_required_nullable_model=not_required_nullable_model,
366371
)

Diff for: openapi_python_client/parser/properties/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,7 @@ def _property_from_ref(
407407
existing = schemas.classes_by_reference.get(ref_path)
408408
if existing:
409409
return (
410-
attr.evolve(existing, required=required, name=name),
410+
attr.evolve(existing, required=required, name=name, nullable=nullable),
411411
schemas,
412412
)
413413
return PropertyError(data=data, detail="Could not find reference in parsed models or enums"), schemas

0 commit comments

Comments
 (0)