Skip to content

Commit feeccda

Browse files
committed
Fix negative integers in Enums (fixes #185). Also fix OpenAPI document in end to end tests.
1 parent da1a7e4 commit feeccda

File tree

7 files changed

+59
-16
lines changed

7 files changed

+59
-16
lines changed

end_to_end_tests/fastapi_app/__init__.py

+1
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ def unsupported_content():
137137

138138

139139
class AnIntEnum(IntEnum):
140+
NEGATIVE = -1
140141
FIRST = 1
141142
SECOND = 2
142143

end_to_end_tests/fastapi_app/openapi.json

+21-4
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,16 @@
5151
"required": true,
5252
"schema": {
5353
"title": "Some Date",
54-
"type": "string",
55-
"format": "date"
54+
"anyOf": [
55+
{
56+
"type": "string",
57+
"format": "date"
58+
},
59+
{
60+
"type": "string",
61+
"format": "date-time"
62+
}
63+
]
5664
},
5765
"name": "some_date",
5866
"in": "query"
@@ -573,8 +581,16 @@
573581
},
574582
"aCamelDateTime": {
575583
"title": "Acameldatetime",
576-
"type": "string",
577-
"format": "date"
584+
"anyOf": [
585+
{
586+
"type": "string",
587+
"format": "date-time"
588+
},
589+
{
590+
"type": "string",
591+
"format": "date"
592+
}
593+
]
578594
},
579595
"a_date": {
580596
"title": "A Date",
@@ -595,6 +611,7 @@
595611
"AnIntEnum": {
596612
"title": "AnIntEnum",
597613
"enum": [
614+
-1,
598615
1,
599616
2
600617
],

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

+10-6
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def _get_kwargs(
1616
*,
1717
client: Client,
1818
an_enum_value: List[AnEnum],
19-
some_date: datetime.date,
19+
some_date: Union[datetime.date, datetime.datetime],
2020
) -> Dict[str, Any]:
2121
url = "{}/tests/".format(client.base_url)
2222

@@ -28,7 +28,11 @@ def _get_kwargs(
2828

2929
json_an_enum_value.append(an_enum_value_item)
3030

31-
json_some_date = some_date.isoformat()
31+
if isinstance(some_date, datetime.date):
32+
json_some_date = some_date.isoformat()
33+
34+
else:
35+
json_some_date = some_date.isoformat()
3236

3337
params: Dict[str, Any] = {
3438
"an_enum_value": json_an_enum_value,
@@ -65,7 +69,7 @@ def sync_detailed(
6569
*,
6670
client: Client,
6771
an_enum_value: List[AnEnum],
68-
some_date: datetime.date,
72+
some_date: Union[datetime.date, datetime.datetime],
6973
) -> Response[Union[List[AModel], HTTPValidationError]]:
7074
kwargs = _get_kwargs(
7175
client=client,
@@ -84,7 +88,7 @@ def sync(
8488
*,
8589
client: Client,
8690
an_enum_value: List[AnEnum],
87-
some_date: datetime.date,
91+
some_date: Union[datetime.date, datetime.datetime],
8892
) -> Optional[Union[List[AModel], HTTPValidationError]]:
8993
""" Get a list of things """
9094

@@ -99,7 +103,7 @@ async def asyncio_detailed(
99103
*,
100104
client: Client,
101105
an_enum_value: List[AnEnum],
102-
some_date: datetime.date,
106+
some_date: Union[datetime.date, datetime.datetime],
103107
) -> Response[Union[List[AModel], HTTPValidationError]]:
104108
kwargs = _get_kwargs(
105109
client=client,
@@ -117,7 +121,7 @@ async def asyncio(
117121
*,
118122
client: Client,
119123
an_enum_value: List[AnEnum],
120-
some_date: datetime.date,
124+
some_date: Union[datetime.date, datetime.datetime],
121125
) -> Optional[Union[List[AModel], HTTPValidationError]]:
122126
""" Get a list of things """
123127

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

+20-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import datetime
2-
from typing import Any, Dict, List, Optional, cast
2+
from typing import Any, Dict, List, Optional, Union, cast
33

44
import attr
55
from dateutil.parser import isoparse
@@ -14,7 +14,7 @@ class AModel:
1414

1515
an_enum_value: AnEnum
1616
some_dict: Optional[Dict[Any, Any]]
17-
a_camel_date_time: datetime.date
17+
a_camel_date_time: Union[datetime.datetime, datetime.date]
1818
a_date: datetime.date
1919
nested_list_of_enums: Optional[List[List[DifferentEnum]]] = None
2020

@@ -23,7 +23,11 @@ def to_dict(self) -> Dict[str, Any]:
2323

2424
some_dict = self.some_dict
2525

26-
a_camel_date_time = self.a_camel_date_time.isoformat()
26+
if isinstance(self.a_camel_date_time, datetime.datetime):
27+
a_camel_date_time = self.a_camel_date_time.isoformat()
28+
29+
else:
30+
a_camel_date_time = self.a_camel_date_time.isoformat()
2731

2832
a_date = self.a_date.isoformat()
2933

@@ -54,7 +58,19 @@ def from_dict(d: Dict[str, Any]) -> "AModel":
5458

5559
some_dict = d["some_dict"]
5660

57-
a_camel_date_time = isoparse(d["aCamelDateTime"]).date()
61+
def _parse_a_camel_date_time(data: Dict[str, Any]) -> Union[datetime.datetime, datetime.date]:
62+
a_camel_date_time: Union[datetime.datetime, datetime.date]
63+
try:
64+
a_camel_date_time = isoparse(d["aCamelDateTime"])
65+
66+
return a_camel_date_time
67+
except:
68+
pass
69+
a_camel_date_time = isoparse(d["aCamelDateTime"]).date()
70+
71+
return a_camel_date_time
72+
73+
a_camel_date_time = _parse_a_camel_date_time(d["aCamelDateTime"])
5874

5975
a_date = isoparse(d["a_date"]).date()
6076

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

+1
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@
22

33

44
class AnIntEnum(IntEnum):
5+
VALUE_NEGATIVE_1 = -1
56
VALUE_1 = 1
67
VALUE_2 = 2

openapi_python_client/parser/properties.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,10 @@ def values_from_list(values: List[ValueType]) -> Dict[str, ValueType]:
352352

353353
for i, value in enumerate(values):
354354
if isinstance(value, int):
355-
output[f"VALUE_{value}"] = value
355+
if value < 0:
356+
output[f"VALUE_NEGATIVE_{-value}"] = value
357+
else:
358+
output[f"VALUE_{value}"] = value
356359
continue
357360
if value[0].isalpha():
358361
key = value.upper()

tests/test_openapi_parser/test_properties.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ def test_get_imports(self, mocker):
430430
def test_values_from_list(self):
431431
from openapi_python_client.parser.properties import EnumProperty
432432

433-
data = ["abc", "123", "a23", "1bc", 4]
433+
data = ["abc", "123", "a23", "1bc", 4, -3]
434434

435435
result = EnumProperty.values_from_list(data)
436436

@@ -440,6 +440,7 @@ def test_values_from_list(self):
440440
"A23": "a23",
441441
"VALUE_3": "1bc",
442442
"VALUE_4": 4,
443+
"VALUE_NEGATIVE_3": -3,
443444
}
444445

445446
def test_values_from_list_duplicate(self):

0 commit comments

Comments
 (0)