Skip to content

Commit 9e9ebbe

Browse files
committed
Cleaned up union type strings when property is not required + required but nullable properties no longer have a default value
1 parent 0ab3ddf commit 9e9ebbe

File tree

5 files changed

+45
-22
lines changed

5 files changed

+45
-22
lines changed

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

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ def _get_kwargs(
1919
date_prop: Union[Unset, datetime.date] = isoparse("1010-10-10").date(),
2020
float_prop: Union[Unset, float] = 3.14,
2121
int_prop: Union[Unset, int] = 7,
22-
boolean_prop: Union[Unset, bool] = UNSET,
22+
boolean_prop: Union[Unset, bool] = False,
2323
list_prop: Union[Unset, List[AnEnum]] = UNSET,
24-
union_prop: Union[Unset, Union[float, str]] = "not a float",
24+
union_prop: Union[Unset, float, str] = "not a float",
2525
enum_prop: Union[Unset, AnEnum] = UNSET,
2626
) -> Dict[str, Any]:
2727
url = "{}/tests/defaults".format(client.base_url)
@@ -44,7 +44,7 @@ def _get_kwargs(
4444

4545
json_list_prop.append(list_prop_item)
4646

47-
json_union_prop: Union[Unset, Union[float, str]]
47+
json_union_prop: Union[Unset, float, str]
4848
if isinstance(union_prop, Unset):
4949
json_union_prop = UNSET
5050
elif isinstance(union_prop, float):
@@ -114,9 +114,9 @@ def sync_detailed(
114114
date_prop: Union[Unset, datetime.date] = isoparse("1010-10-10").date(),
115115
float_prop: Union[Unset, float] = 3.14,
116116
int_prop: Union[Unset, int] = 7,
117-
boolean_prop: Union[Unset, bool] = UNSET,
117+
boolean_prop: Union[Unset, bool] = False,
118118
list_prop: Union[Unset, List[AnEnum]] = UNSET,
119-
union_prop: Union[Unset, Union[float, str]] = "not a float",
119+
union_prop: Union[Unset, float, str] = "not a float",
120120
enum_prop: Union[Unset, AnEnum] = UNSET,
121121
) -> Response[Union[None, HTTPValidationError]]:
122122
kwargs = _get_kwargs(
@@ -149,9 +149,9 @@ def sync(
149149
date_prop: Union[Unset, datetime.date] = isoparse("1010-10-10").date(),
150150
float_prop: Union[Unset, float] = 3.14,
151151
int_prop: Union[Unset, int] = 7,
152-
boolean_prop: Union[Unset, bool] = UNSET,
152+
boolean_prop: Union[Unset, bool] = False,
153153
list_prop: Union[Unset, List[AnEnum]] = UNSET,
154-
union_prop: Union[Unset, Union[float, str]] = "not a float",
154+
union_prop: Union[Unset, float, str] = "not a float",
155155
enum_prop: Union[Unset, AnEnum] = UNSET,
156156
) -> Optional[Union[None, HTTPValidationError]]:
157157
""" """
@@ -180,9 +180,9 @@ async def asyncio_detailed(
180180
date_prop: Union[Unset, datetime.date] = isoparse("1010-10-10").date(),
181181
float_prop: Union[Unset, float] = 3.14,
182182
int_prop: Union[Unset, int] = 7,
183-
boolean_prop: Union[Unset, bool] = UNSET,
183+
boolean_prop: Union[Unset, bool] = False,
184184
list_prop: Union[Unset, List[AnEnum]] = UNSET,
185-
union_prop: Union[Unset, Union[float, str]] = "not a float",
185+
union_prop: Union[Unset, float, str] = "not a float",
186186
enum_prop: Union[Unset, AnEnum] = UNSET,
187187
) -> Response[Union[None, HTTPValidationError]]:
188188
kwargs = _get_kwargs(
@@ -214,9 +214,9 @@ async def asyncio(
214214
date_prop: Union[Unset, datetime.date] = isoparse("1010-10-10").date(),
215215
float_prop: Union[Unset, float] = 3.14,
216216
int_prop: Union[Unset, int] = 7,
217-
boolean_prop: Union[Unset, bool] = UNSET,
217+
boolean_prop: Union[Unset, bool] = False,
218218
list_prop: Union[Unset, List[AnEnum]] = UNSET,
219-
union_prop: Union[Unset, Union[float, str]] = "not a float",
219+
union_prop: Union[Unset, float, str] = "not a float",
220220
enum_prop: Union[Unset, AnEnum] = UNSET,
221221
) -> Optional[Union[None, HTTPValidationError]]:
222222
""" """

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ class AModel:
1717
a_camel_date_time: Union[datetime.datetime, datetime.date]
1818
a_date: datetime.date
1919
required_not_nullable: str
20+
some_dict: Optional[Dict[Any, Any]]
21+
required_nullable: Optional[str]
2022
nested_list_of_enums: Union[Unset, List[List[DifferentEnum]]] = UNSET
21-
some_dict: Optional[Dict[Any, Any]] = None
2223
attr_1_leading_digit: Union[Unset, str] = UNSET
23-
required_nullable: Optional[str] = None
2424
not_required_nullable: Union[Unset, Optional[str]] = UNSET
2525
not_required_not_nullable: Union[Unset, str] = UNSET
2626

openapi_python_client/parser/properties.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,10 @@ def get_imports(self, *, prefix: str) -> Set[str]:
7474

7575
def to_string(self) -> str:
7676
""" How this should be declared in a dataclass """
77-
if self.default:
77+
if self.default is not None:
7878
default = self.default
7979
elif not self.required:
8080
default = "UNSET"
81-
elif self.nullable:
82-
default = "None"
8381
else:
8482
default = None
8583

@@ -267,10 +265,12 @@ def get_type_string(self, no_optional: bool = False) -> str:
267265
inner_types = [p.get_type_string(no_optional=True) for p in self.inner_properties]
268266
inner_prop_string = ", ".join(inner_types)
269267
type_string = f"Union[{inner_prop_string}]"
270-
if not no_optional and self.nullable:
268+
if no_optional:
269+
return type_string
270+
if not self.required:
271+
type_string = f"Union[Unset, {inner_prop_string}]"
272+
if self.nullable:
271273
type_string = f"Optional[{type_string}]"
272-
if not no_unset and not self.required:
273-
type_string = f"Union[Unset, {type_string}]"
274274
return type_string
275275

276276
def get_imports(self, *, prefix: str) -> Set[str]:

openapi_python_client/templates/model.pyi

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,14 @@ from ..types import UNSET, Unset
1313
class {{ model.reference.class_name }}:
1414
""" {{ model.description }} """
1515
{% for property in model.required_properties + model.optional_properties %}
16+
{% if property.default is none and property.required %}
1617
{{ property.to_string() }}
18+
{% endif %}
19+
{% endfor %}
20+
{% for property in model.required_properties + model.optional_properties %}
21+
{% if property.default is not none or not property.required %}
22+
{{ property.to_string() }}
23+
{% endif %}
1724
{% endfor %}
1825

1926
def to_dict(self) -> Dict[str, Any]:

tests/test_openapi_parser/test_properties.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,15 @@ def test_get_type_string(self):
3030

3131
p.nullable = True
3232
assert p.get_type_string() == f"Optional[{base_type_string}]"
33+
assert p.get_type_string(no_optional=True) == base_type_string
3334

3435
p.required = False
3536
assert p.get_type_string() == f"Union[Unset, Optional[{base_type_string}]]"
37+
assert p.get_type_string(no_optional=True) == base_type_string
3638

3739
p.nullable = False
3840
assert p.get_type_string() == f"Union[Unset, {base_type_string}]"
41+
assert p.get_type_string(no_optional=True) == base_type_string
3942

4043
def test_to_string(self, mocker):
4144
from openapi_python_client.parser.properties import Property
@@ -51,7 +54,7 @@ def test_to_string(self, mocker):
5154

5255
p.required = True
5356
p.nullable = True
54-
assert p.to_string() == f"{name}: {get_type_string()} = None"
57+
assert p.to_string() == f"{name}: {get_type_string()}"
5558

5659
p.default = "TEST"
5760
assert p.to_string() == f"{name}: {get_type_string()} = TEST"
@@ -270,12 +273,15 @@ def test_get_type_string(self, mocker):
270273

271274
p.nullable = True
272275
assert p.get_type_string() == f"Optional[{base_type_string}]"
276+
assert p.get_type_string(no_optional=True) == base_type_string
273277

274278
p.required = False
275279
assert p.get_type_string() == f"Union[Unset, Optional[{base_type_string}]]"
280+
assert p.get_type_string(no_optional=True) == base_type_string
276281

277282
p.nullable = False
278283
assert p.get_type_string() == f"Union[Unset, {base_type_string}]"
284+
assert p.get_type_string(no_optional=True) == base_type_string
279285

280286
def test_get_type_imports(self, mocker):
281287
from openapi_python_client.parser.properties import ListProperty
@@ -338,12 +344,16 @@ def test_get_type_string(self, mocker):
338344

339345
p.nullable = True
340346
assert p.get_type_string() == f"Optional[{base_type_string}]"
347+
assert p.get_type_string(no_optional=True) == base_type_string
341348

349+
base_type_string_with_unset = f"Union[Unset, inner_type_string_1, inner_type_string_2]"
342350
p.required = False
343-
assert p.get_type_string() == f"Union[Unset, Optional[{base_type_string}]]"
351+
assert p.get_type_string() == f"Optional[{base_type_string_with_unset}]"
352+
assert p.get_type_string(no_optional=True) == base_type_string
344353

345354
p.nullable = False
346-
assert p.get_type_string() == f"Union[Unset, {base_type_string}]"
355+
assert p.get_type_string() == base_type_string_with_unset
356+
assert p.get_type_string(no_optional=True) == base_type_string
347357

348358
def test_get_type_imports(self, mocker):
349359
from openapi_python_client.parser.properties import UnionProperty
@@ -483,12 +493,15 @@ def test_get_type_string(self, mocker):
483493

484494
p.nullable = True
485495
assert p.get_type_string() == f"Optional[{base_type_string}]"
496+
assert p.get_type_string(no_optional=True) == base_type_string
486497

487498
p.required = False
488499
assert p.get_type_string() == f"Union[Unset, Optional[{base_type_string}]]"
500+
assert p.get_type_string(no_optional=True) == base_type_string
489501

490502
p.nullable = False
491503
assert p.get_type_string() == f"Union[Unset, {base_type_string}]"
504+
assert p.get_type_string(no_optional=True) == base_type_string
492505

493506
properties._existing_enums = {}
494507

@@ -616,12 +629,15 @@ def test_get_type_string(self, mocker):
616629

617630
p.nullable = True
618631
assert p.get_type_string() == f"Optional[{base_type_string}]"
632+
assert p.get_type_string(no_optional=True) == base_type_string
619633

620634
p.required = False
621635
assert p.get_type_string() == f"Union[Unset, Optional[{base_type_string}]]"
636+
assert p.get_type_string(no_optional=True) == base_type_string
622637

623638
p.nullable = False
624639
assert p.get_type_string() == f"Union[Unset, {base_type_string}]"
640+
assert p.get_type_string(no_optional=True) == base_type_string
625641

626642
def test_get_imports(self, mocker):
627643
fake_reference = mocker.MagicMock(class_name="MyRefClass", module_name="my_test_enum")

0 commit comments

Comments
 (0)