Skip to content

Commit 63c01f0

Browse files
authored
fix: Generate valid code when a property of a model is named "datetime" [#557 & #558]. Thanks @kmray!
Co-authored-by: Dylan Anthony <[email protected]> BREAKING CHANGE: `datetime` is now considered a reserved word anywhere, so any properties which were named `datetime` will now be named `datetime_`.
1 parent 48cabf9 commit 63c01f0

File tree

4 files changed

+77
-1
lines changed

4 files changed

+77
-1
lines changed

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

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
from .model_with_additional_properties_refed import ModelWithAdditionalPropertiesRefed
3131
from .model_with_any_json_properties import ModelWithAnyJsonProperties
3232
from .model_with_any_json_properties_additional_property_type_0 import ModelWithAnyJsonPropertiesAdditionalPropertyType0
33+
from .model_with_date_time_property import ModelWithDateTimeProperty
3334
from .model_with_primitive_additional_properties import ModelWithPrimitiveAdditionalProperties
3435
from .model_with_primitive_additional_properties_a_date_holder import ModelWithPrimitiveAdditionalPropertiesADateHolder
3536
from .model_with_property_ref import ModelWithPropertyRef
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import datetime
2+
from typing import Any, Dict, List, Type, TypeVar, Union
3+
4+
import attr
5+
from dateutil.parser import isoparse
6+
7+
from ..types import UNSET, Unset
8+
9+
T = TypeVar("T", bound="ModelWithDateTimeProperty")
10+
11+
12+
@attr.s(auto_attribs=True)
13+
class ModelWithDateTimeProperty:
14+
"""
15+
Attributes:
16+
datetime_ (Union[Unset, datetime.datetime]):
17+
"""
18+
19+
datetime_: Union[Unset, datetime.datetime] = UNSET
20+
additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict)
21+
22+
def to_dict(self) -> Dict[str, Any]:
23+
datetime_: Union[Unset, str] = UNSET
24+
if not isinstance(self.datetime_, Unset):
25+
datetime_ = self.datetime_.isoformat()
26+
27+
field_dict: Dict[str, Any] = {}
28+
field_dict.update(self.additional_properties)
29+
field_dict.update({})
30+
if datetime_ is not UNSET:
31+
field_dict["datetime"] = datetime_
32+
33+
return field_dict
34+
35+
@classmethod
36+
def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
37+
d = src_dict.copy()
38+
_datetime_ = d.pop("datetime", UNSET)
39+
datetime_: Union[Unset, datetime.datetime]
40+
if isinstance(_datetime_, Unset):
41+
datetime_ = UNSET
42+
else:
43+
datetime_ = isoparse(_datetime_)
44+
45+
model_with_date_time_property = cls(
46+
datetime_=datetime_,
47+
)
48+
49+
model_with_date_time_property.additional_properties = d
50+
return model_with_date_time_property
51+
52+
@property
53+
def additional_keys(self) -> List[str]:
54+
return list(self.additional_properties.keys())
55+
56+
def __getitem__(self, key: str) -> Any:
57+
return self.additional_properties[key]
58+
59+
def __setitem__(self, key: str, value: Any) -> None:
60+
self.additional_properties[key] = value
61+
62+
def __delitem__(self, key: str) -> None:
63+
del self.additional_properties[key]
64+
65+
def __contains__(self, key: str) -> bool:
66+
return key in self.additional_properties

Diff for: end_to_end_tests/openapi.json

+9
Original file line numberDiff line numberDiff line change
@@ -1696,6 +1696,15 @@
16961696
}
16971697
}
16981698
},
1699+
"ModelWithDateTimeProperty" : {
1700+
"type": "object",
1701+
"properties": {
1702+
"datetime": {
1703+
"type": "string",
1704+
"format": "date-time"
1705+
}
1706+
}
1707+
},
16991708
"AnArrayOfEnum": {
17001709
"type": "array",
17011710
"items": {

Diff for: openapi_python_client/utils.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def split_words(value: str) -> List[str]:
4848
return re.findall(rf"[^{DELIMITERS}]+", value)
4949

5050

51-
RESERVED_WORDS = (set(dir(builtins)) | {"self", "true", "false"}) - {"type", "id"}
51+
RESERVED_WORDS = (set(dir(builtins)) | {"self", "true", "false", "datetime"}) - {"type", "id"}
5252

5353

5454
def fix_reserved_words(value: str) -> str:

0 commit comments

Comments
 (0)