Skip to content

Commit 31f20e8

Browse files
author
Adam Gray
committed
Add date property type and improve handling of date-time properties
1 parent 5583d86 commit 31f20e8

File tree

3 files changed

+43
-7
lines changed

3 files changed

+43
-7
lines changed

openapi_python_client/openapi_parser/openapi.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,16 @@
44
from enum import Enum
55
from typing import Any, Dict, Generator, Iterable, List, Optional, Set, Union
66

7-
from .properties import EnumListProperty, EnumProperty, Property, ReferenceListProperty, RefProperty, property_from_dict
7+
from .properties import (
8+
EnumListProperty,
9+
EnumProperty,
10+
Property,
11+
ReferenceListProperty,
12+
RefProperty,
13+
property_from_dict,
14+
DateTimeProperty,
15+
DateProperty,
16+
)
817
from .reference import Reference
918
from .responses import ListRefResponse, RefResponse, Response, response_from_dict
1019

@@ -113,6 +122,10 @@ def _add_parameters(self, data: Dict[str, Any]) -> None:
113122
and prop.reference
114123
):
115124
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")
116129
if param_dict["in"] == ParameterLocation.QUERY:
117130
self.query_parameters.append(prop)
118131
elif param_dict["in"] == ParameterLocation.PATH:

openapi_python_client/openapi_parser/properties.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,20 @@ class DateTimeProperty(Property):
6868
_type_string: ClassVar[str] = "datetime"
6969
constructor_template: ClassVar[str] = "datetime_property.pyi"
7070

71+
def transform(self) -> str:
72+
return f"{self.python_name()}.isoformat()"
73+
74+
75+
@dataclass
76+
class DateProperty(Property):
77+
""" A property of type datetime.date """
78+
79+
_type_string: ClassVar[str] = "date"
80+
constructor_template: ClassVar[str] = "date_property.pyi"
81+
82+
def transform(self) -> str:
83+
return f"{self.python_name()}.isoformat()"
84+
7185

7286
@dataclass
7387
class FloatProperty(Property):
@@ -232,12 +246,14 @@ def property_from_dict(name: str, required: bool, data: Dict[str, Any]) -> Prope
232246
if "$ref" in data:
233247
return RefProperty(name=name, required=required, reference=Reference.from_ref(data["$ref"]), default=None)
234248
if data["type"] == "string":
235-
if "format" not in data:
236-
return StringProperty(
237-
name=name, default=data.get("default"), required=required, pattern=data.get("pattern"),
238-
)
239-
elif data["format"] == "date-time":
240-
return DateTimeProperty(name=name, required=required, default=data.get("default"))
249+
if "format" in data:
250+
if data.get("format") == "date-time":
251+
return DateTimeProperty(name=name, required=required, default=data.get("default"))
252+
elif data.get("format") == "date":
253+
return DateProperty(name=name, required=required, default=data.get("default"))
254+
else:
255+
raise ValueError(f'Unsupported string format:{data["format"]}')
256+
return StringProperty(name=name, default=data.get("default"), required=required, pattern=data.get("pattern"),)
241257
elif data["type"] == "number":
242258
return FloatProperty(name=name, default=data.get("default"), required=required)
243259
elif data["type"] == "integer":
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{% if property.required %}
2+
{{ property.name }} = date.fromisoformat(d["{{ property.name }}"])
3+
{% else %}
4+
{{ property.name }} = None
5+
if ({{ property.name }}_string := d.get("{{ property.name }}")) is not None:
6+
{{ property.name }} = date.fromisoformat(cast(str, {{ property.name }}_string))
7+
{% endif %}

0 commit comments

Comments
 (0)