Skip to content

Commit 4e21b82

Browse files
committed
Fixes for date support
- Add imports in models - Fix python_name for Date/Time properties - Add date/datetime props to E2E test - Add unit tests for Date/TimeProperty transofrm - Add tests for datetime imports
1 parent e494aa0 commit 4e21b82

File tree

14 files changed

+122
-36
lines changed

14 files changed

+122
-36
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,4 @@ dmypy.json
2121

2222
/coverage.xml
2323
/.coverage
24+
htmlcov/

openapi_python_client/openapi_parser/openapi.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -117,15 +117,16 @@ def _add_parameters(self, data: Dict[str, Any]) -> None:
117117
prop = property_from_dict(
118118
name=param_dict["name"], required=param_dict["required"], data=param_dict["schema"]
119119
)
120-
if (
120+
if isinstance(prop, DateProperty):
121+
self.relative_imports.add("from datetime import date")
122+
elif isinstance(prop, DateTimeProperty):
123+
self.relative_imports.add("from datetime import datetime")
124+
elif (
121125
isinstance(prop, (ReferenceListProperty, EnumListProperty, RefProperty, EnumProperty))
122126
and prop.reference
123127
):
124128
self.relative_imports.add(import_string_from_reference(prop.reference, prefix="..models"))
125-
if isinstance(prop, DateProperty):
126-
self.relative_imports.add("from datetime import date")
127-
if isinstance(prop, DateTimeProperty):
128-
self.relative_imports.add("from datetime import datetime")
129+
129130
if param_dict["in"] == ParameterLocation.QUERY:
130131
self.query_parameters.append(prop)
131132
elif param_dict["in"] == ParameterLocation.PATH:
@@ -181,7 +182,11 @@ def from_dict(d: Dict[str, Any], /) -> Schema:
181182
required_properties.append(p)
182183
else:
183184
optional_properties.append(p)
184-
if isinstance(p, (ReferenceListProperty, EnumListProperty, RefProperty, EnumProperty)) and p.reference:
185+
if isinstance(p, DateTimeProperty):
186+
relative_imports.add("from datetime import datetime")
187+
elif isinstance(p, DateProperty):
188+
relative_imports.add("from datetime import date")
189+
elif isinstance(p, (ReferenceListProperty, EnumListProperty, RefProperty, EnumProperty)) and p.reference:
185190
relative_imports.add(import_string_from_reference(p.reference))
186191
schema = Schema(
187192
reference=Reference.from_ref(d["title"]),

openapi_python_client/openapi_parser/properties.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ class DateTimeProperty(Property):
7777
constructor_template: ClassVar[str] = "datetime_property.pyi"
7878

7979
def transform(self) -> str:
80-
return f"{self.python_name()}.isoformat()"
80+
return f"{self.python_name}.isoformat()"
8181

8282

8383
@dataclass
@@ -88,7 +88,7 @@ class DateProperty(Property):
8888
constructor_template: ClassVar[str] = "date_property.pyi"
8989

9090
def transform(self) -> str:
91-
return f"{self.python_name()}.isoformat()"
91+
return f"{self.python_name}.isoformat()"
9292

9393

9494
@dataclass

tests/test_end_to_end/fastapi/__init__.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
""" A FastAPI app used to create an OpenAPI document for end-to-end testing """
22
import json
3-
from datetime import datetime
3+
from datetime import date, datetime
44
from enum import Enum
55
from pathlib import Path
66
from typing import List
@@ -45,10 +45,11 @@ class AModel(BaseModel):
4545
a_list_of_strings: List[str]
4646
a_list_of_objects: List[OtherModel]
4747
aCamelDateTime: datetime
48+
a_date: date
4849

4950

5051
@test_router.get("/", response_model=List[AModel], operation_id="getUserList")
51-
def get_list(statuses: List[AnEnum] = Query(...),):
52+
def get_list(statuses: List[AnEnum] = Query(...), some_date: date = Query(...), some_datetime: datetime = Query(...)):
5253
""" Get users, filtered by statuses """
5354
return
5455

tests/test_end_to_end/fastapi/openapi.json

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,26 @@
4848
},
4949
"name": "statuses",
5050
"in": "query"
51+
},
52+
{
53+
"required": true,
54+
"schema": {
55+
"title": "Some Date",
56+
"type": "string",
57+
"format": "date"
58+
},
59+
"name": "some_date",
60+
"in": "query"
61+
},
62+
{
63+
"required": true,
64+
"schema": {
65+
"title": "Some Datetime",
66+
"type": "string",
67+
"format": "date-time"
68+
},
69+
"name": "some_datetime",
70+
"in": "query"
5171
}
5272
],
5373
"responses": {
@@ -88,7 +108,8 @@
88108
"a_list_of_enums",
89109
"a_list_of_strings",
90110
"a_list_of_objects",
91-
"aCamelDateTime"
111+
"aCamelDateTime",
112+
"a_date"
92113
],
93114
"type": "object",
94115
"properties": {
@@ -127,6 +148,11 @@
127148
"title": "Acameldatetime",
128149
"type": "string",
129150
"format": "date-time"
151+
},
152+
"a_date": {
153+
"title": "A Date",
154+
"type": "string",
155+
"format": "date"
130156
}
131157
},
132158
"description": "A Model for testing all the ways custom objects can be used "

tests/test_end_to_end/golden-master/my_test_api_client/api/users.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from dataclasses import asdict
2+
from datetime import date, datetime
23
from typing import Any, Dict, List, Optional, Union, cast
34

45
import httpx
@@ -11,7 +12,7 @@
1112

1213

1314
def get_user_list(
14-
*, client: Client, statuses: List[Statuses],
15+
*, client: Client, statuses: List[Statuses], some_date: date, some_datetime: datetime,
1516
) -> Union[
1617
List[AModel], HTTPValidationError,
1718
]:
@@ -20,6 +21,8 @@ def get_user_list(
2021

2122
params = {
2223
"statuses": statuses,
24+
"some_date": some_date.isoformat(),
25+
"some_datetime": some_datetime.isoformat(),
2326
}
2427

2528
response = httpx.get(url=url, headers=client.get_headers(), params=params,)

tests/test_end_to_end/golden-master/my_test_api_client/async_api/users.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from dataclasses import asdict
2+
from datetime import date, datetime
23
from typing import Any, Dict, List, Optional, Union, cast
34

45
import httpx
@@ -11,7 +12,7 @@
1112

1213

1314
async def get_user_list(
14-
*, client: Client, statuses: List[Statuses],
15+
*, client: Client, statuses: List[Statuses], some_date: date, some_datetime: datetime,
1516
) -> Union[
1617
List[AModel], HTTPValidationError,
1718
]:
@@ -20,6 +21,8 @@ async def get_user_list(
2021

2122
params = {
2223
"statuses": statuses,
24+
"some_date": some_date.isoformat(),
25+
"some_datetime": some_datetime.isoformat(),
2326
}
2427

2528
async with httpx.AsyncClient() as _client:

tests/test_end_to_end/golden-master/my_test_api_client/models/a_model.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from __future__ import annotations
22

33
from dataclasses import dataclass
4-
from datetime import datetime
4+
from datetime import date, datetime
55
from typing import Any, Dict, List, Optional, cast
66

77
from .a_list_of_enums import AListOfEnums
@@ -18,14 +18,16 @@ class AModel:
1818
a_list_of_strings: List[str]
1919
a_list_of_objects: List[OtherModel]
2020
a_camel_date_time: datetime
21+
a_date: date
2122

2223
def to_dict(self) -> Dict[str, Any]:
2324
return {
2425
"an_enum_value": self.an_enum_value.value,
2526
"a_list_of_enums": self.a_list_of_enums,
2627
"a_list_of_strings": self.a_list_of_strings,
2728
"a_list_of_objects": self.a_list_of_objects,
28-
"aCamelDateTime": self.a_camel_date_time,
29+
"aCamelDateTime": self.a_camel_date_time.isoformat(),
30+
"a_date": self.a_date.isoformat(),
2931
}
3032

3133
@staticmethod
@@ -45,10 +47,13 @@ def from_dict(d: Dict[str, Any]) -> AModel:
4547

4648
a_camel_date_time = datetime.fromisoformat(d["aCamelDateTime"])
4749

50+
a_date = date.fromisoformat(d["a_date"])
51+
4852
return AModel(
4953
an_enum_value=an_enum_value,
5054
a_list_of_enums=a_list_of_enums,
5155
a_list_of_strings=a_list_of_strings,
5256
a_list_of_objects=a_list_of_objects,
5357
a_camel_date_time=a_camel_date_time,
58+
a_date=a_date,
5459
)

tests/test_end_to_end/golden-master/my_test_api_client/models/abc_response.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from __future__ import annotations
22

33
from dataclasses import dataclass
4-
from datetime import datetime
54
from typing import Any, Dict, List, Optional, cast
65

76

tests/test_end_to_end/golden-master/my_test_api_client/models/http_validation_error.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from __future__ import annotations
22

33
from dataclasses import dataclass
4-
from datetime import datetime
54
from typing import Any, Dict, List, Optional, cast
65

76
from .validation_error import ValidationError

0 commit comments

Comments
 (0)