Skip to content

Commit d9cb65d

Browse files
committed
Fix array schema object item issues
Previous changes prevented models defined in array schemas from being built properly. This commit fixes that issue and adds support for recursive and circular references in array schema item objects, a behavior that was previously expected but not functioning correctly. This does not add support for recursive and circular references directly in an array schema's 'items' section. However, this feature would be functionally useless, so a warning is logged on detection.
1 parent 174f090 commit d9cb65d

14 files changed

+642
-30
lines changed

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,18 @@
66
from .all_of_sub_model import AllOfSubModel
77
from .all_of_sub_model_type_enum import AllOfSubModelTypeEnum
88
from .an_all_of_enum import AnAllOfEnum
9+
from .an_array_with_a_circular_ref_in_items_object_a_item import AnArrayWithACircularRefInItemsObjectAItem
10+
from .an_array_with_a_circular_ref_in_items_object_additional_properties_a_item import (
11+
AnArrayWithACircularRefInItemsObjectAdditionalPropertiesAItem,
12+
)
13+
from .an_array_with_a_circular_ref_in_items_object_additional_properties_b_item import (
14+
AnArrayWithACircularRefInItemsObjectAdditionalPropertiesBItem,
15+
)
16+
from .an_array_with_a_circular_ref_in_items_object_b_item import AnArrayWithACircularRefInItemsObjectBItem
17+
from .an_array_with_a_recursive_ref_in_items_object_additional_properties_item import (
18+
AnArrayWithARecursiveRefInItemsObjectAdditionalPropertiesItem,
19+
)
20+
from .an_array_with_a_recursive_ref_in_items_object_item import AnArrayWithARecursiveRefInItemsObjectItem
921
from .an_enum import AnEnum
1022
from .an_enum_with_null import AnEnumWithNull
1123
from .an_int_enum import AnIntEnum
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
from typing import Any, Dict, List, Type, TypeVar, Union
2+
3+
import attr
4+
5+
from ..models.an_array_with_a_circular_ref_in_items_object_b_item import AnArrayWithACircularRefInItemsObjectBItem
6+
from ..types import UNSET, Unset
7+
8+
T = TypeVar("T", bound="AnArrayWithACircularRefInItemsObjectAItem")
9+
10+
11+
@attr.s(auto_attribs=True)
12+
class AnArrayWithACircularRefInItemsObjectAItem:
13+
"""
14+
Attributes:
15+
circular (Union[Unset, List[AnArrayWithACircularRefInItemsObjectBItem]]):
16+
"""
17+
18+
circular: Union[Unset, List[AnArrayWithACircularRefInItemsObjectBItem]] = UNSET
19+
additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict)
20+
21+
def to_dict(self) -> Dict[str, Any]:
22+
circular: Union[Unset, List[Dict[str, Any]]] = UNSET
23+
if not isinstance(self.circular, Unset):
24+
circular = []
25+
for componentsschemas_an_array_with_a_circular_ref_in_items_object_b_item_data in self.circular:
26+
componentsschemas_an_array_with_a_circular_ref_in_items_object_b_item = (
27+
componentsschemas_an_array_with_a_circular_ref_in_items_object_b_item_data.to_dict()
28+
)
29+
30+
circular.append(componentsschemas_an_array_with_a_circular_ref_in_items_object_b_item)
31+
32+
field_dict: Dict[str, Any] = {}
33+
field_dict.update(self.additional_properties)
34+
field_dict.update({})
35+
if circular is not UNSET:
36+
field_dict["circular"] = circular
37+
38+
return field_dict
39+
40+
@classmethod
41+
def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
42+
d = src_dict.copy()
43+
circular = []
44+
_circular = d.pop("circular", UNSET)
45+
for componentsschemas_an_array_with_a_circular_ref_in_items_object_b_item_data in _circular or []:
46+
componentsschemas_an_array_with_a_circular_ref_in_items_object_b_item = (
47+
AnArrayWithACircularRefInItemsObjectBItem.from_dict(
48+
componentsschemas_an_array_with_a_circular_ref_in_items_object_b_item_data
49+
)
50+
)
51+
52+
circular.append(componentsschemas_an_array_with_a_circular_ref_in_items_object_b_item)
53+
54+
an_array_with_a_circular_ref_in_items_object_a_item = cls(
55+
circular=circular,
56+
)
57+
58+
an_array_with_a_circular_ref_in_items_object_a_item.additional_properties = d
59+
return an_array_with_a_circular_ref_in_items_object_a_item
60+
61+
@property
62+
def additional_keys(self) -> List[str]:
63+
return list(self.additional_properties.keys())
64+
65+
def __getitem__(self, key: str) -> Any:
66+
return self.additional_properties[key]
67+
68+
def __setitem__(self, key: str, value: Any) -> None:
69+
self.additional_properties[key] = value
70+
71+
def __delitem__(self, key: str) -> None:
72+
del self.additional_properties[key]
73+
74+
def __contains__(self, key: str) -> bool:
75+
return key in self.additional_properties
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
from typing import Any, Dict, List, Type, TypeVar
2+
3+
import attr
4+
5+
from ..models.an_array_with_a_circular_ref_in_items_object_additional_properties_b_item import (
6+
AnArrayWithACircularRefInItemsObjectAdditionalPropertiesBItem,
7+
)
8+
9+
T = TypeVar("T", bound="AnArrayWithACircularRefInItemsObjectAdditionalPropertiesAItem")
10+
11+
12+
@attr.s(auto_attribs=True)
13+
class AnArrayWithACircularRefInItemsObjectAdditionalPropertiesAItem:
14+
""" """
15+
16+
additional_properties: Dict[str, List[AnArrayWithACircularRefInItemsObjectAdditionalPropertiesBItem]] = attr.ib(
17+
init=False, factory=dict
18+
)
19+
20+
def to_dict(self) -> Dict[str, Any]:
21+
22+
field_dict: Dict[str, Any] = {}
23+
for prop_name, prop in self.additional_properties.items():
24+
field_dict[prop_name] = []
25+
for (
26+
componentsschemas_an_array_with_a_circular_ref_in_items_object_additional_properties_b_item_data
27+
) in prop:
28+
componentsschemas_an_array_with_a_circular_ref_in_items_object_additional_properties_b_item = (
29+
componentsschemas_an_array_with_a_circular_ref_in_items_object_additional_properties_b_item_data.to_dict()
30+
)
31+
32+
field_dict[prop_name].append(
33+
componentsschemas_an_array_with_a_circular_ref_in_items_object_additional_properties_b_item
34+
)
35+
36+
field_dict.update({})
37+
38+
return field_dict
39+
40+
@classmethod
41+
def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
42+
d = src_dict.copy()
43+
an_array_with_a_circular_ref_in_items_object_additional_properties_a_item = cls()
44+
45+
additional_properties = {}
46+
for prop_name, prop_dict in d.items():
47+
additional_property = []
48+
_additional_property = prop_dict
49+
for (
50+
componentsschemas_an_array_with_a_circular_ref_in_items_object_additional_properties_b_item_data
51+
) in _additional_property:
52+
componentsschemas_an_array_with_a_circular_ref_in_items_object_additional_properties_b_item = (
53+
AnArrayWithACircularRefInItemsObjectAdditionalPropertiesBItem.from_dict(
54+
componentsschemas_an_array_with_a_circular_ref_in_items_object_additional_properties_b_item_data
55+
)
56+
)
57+
58+
additional_property.append(
59+
componentsschemas_an_array_with_a_circular_ref_in_items_object_additional_properties_b_item
60+
)
61+
62+
additional_properties[prop_name] = additional_property
63+
64+
an_array_with_a_circular_ref_in_items_object_additional_properties_a_item.additional_properties = (
65+
additional_properties
66+
)
67+
return an_array_with_a_circular_ref_in_items_object_additional_properties_a_item
68+
69+
@property
70+
def additional_keys(self) -> List[str]:
71+
return list(self.additional_properties.keys())
72+
73+
def __getitem__(self, key: str) -> List[AnArrayWithACircularRefInItemsObjectAdditionalPropertiesBItem]:
74+
return self.additional_properties[key]
75+
76+
def __setitem__(self, key: str, value: List[AnArrayWithACircularRefInItemsObjectAdditionalPropertiesBItem]) -> None:
77+
self.additional_properties[key] = value
78+
79+
def __delitem__(self, key: str) -> None:
80+
del self.additional_properties[key]
81+
82+
def __contains__(self, key: str) -> bool:
83+
return key in self.additional_properties
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
from typing import Any, Dict, List, Type, TypeVar
2+
3+
import attr
4+
5+
from ..models.an_array_with_a_circular_ref_in_items_object_additional_properties_a_item import (
6+
AnArrayWithACircularRefInItemsObjectAdditionalPropertiesAItem,
7+
)
8+
9+
T = TypeVar("T", bound="AnArrayWithACircularRefInItemsObjectAdditionalPropertiesBItem")
10+
11+
12+
@attr.s(auto_attribs=True)
13+
class AnArrayWithACircularRefInItemsObjectAdditionalPropertiesBItem:
14+
""" """
15+
16+
additional_properties: Dict[str, List[AnArrayWithACircularRefInItemsObjectAdditionalPropertiesAItem]] = attr.ib(
17+
init=False, factory=dict
18+
)
19+
20+
def to_dict(self) -> Dict[str, Any]:
21+
22+
field_dict: Dict[str, Any] = {}
23+
for prop_name, prop in self.additional_properties.items():
24+
field_dict[prop_name] = []
25+
for (
26+
componentsschemas_an_array_with_a_circular_ref_in_items_object_additional_properties_a_item_data
27+
) in prop:
28+
componentsschemas_an_array_with_a_circular_ref_in_items_object_additional_properties_a_item = (
29+
componentsschemas_an_array_with_a_circular_ref_in_items_object_additional_properties_a_item_data.to_dict()
30+
)
31+
32+
field_dict[prop_name].append(
33+
componentsschemas_an_array_with_a_circular_ref_in_items_object_additional_properties_a_item
34+
)
35+
36+
field_dict.update({})
37+
38+
return field_dict
39+
40+
@classmethod
41+
def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
42+
d = src_dict.copy()
43+
an_array_with_a_circular_ref_in_items_object_additional_properties_b_item = cls()
44+
45+
additional_properties = {}
46+
for prop_name, prop_dict in d.items():
47+
additional_property = []
48+
_additional_property = prop_dict
49+
for (
50+
componentsschemas_an_array_with_a_circular_ref_in_items_object_additional_properties_a_item_data
51+
) in _additional_property:
52+
componentsschemas_an_array_with_a_circular_ref_in_items_object_additional_properties_a_item = (
53+
AnArrayWithACircularRefInItemsObjectAdditionalPropertiesAItem.from_dict(
54+
componentsschemas_an_array_with_a_circular_ref_in_items_object_additional_properties_a_item_data
55+
)
56+
)
57+
58+
additional_property.append(
59+
componentsschemas_an_array_with_a_circular_ref_in_items_object_additional_properties_a_item
60+
)
61+
62+
additional_properties[prop_name] = additional_property
63+
64+
an_array_with_a_circular_ref_in_items_object_additional_properties_b_item.additional_properties = (
65+
additional_properties
66+
)
67+
return an_array_with_a_circular_ref_in_items_object_additional_properties_b_item
68+
69+
@property
70+
def additional_keys(self) -> List[str]:
71+
return list(self.additional_properties.keys())
72+
73+
def __getitem__(self, key: str) -> List[AnArrayWithACircularRefInItemsObjectAdditionalPropertiesAItem]:
74+
return self.additional_properties[key]
75+
76+
def __setitem__(self, key: str, value: List[AnArrayWithACircularRefInItemsObjectAdditionalPropertiesAItem]) -> None:
77+
self.additional_properties[key] = value
78+
79+
def __delitem__(self, key: str) -> None:
80+
del self.additional_properties[key]
81+
82+
def __contains__(self, key: str) -> bool:
83+
return key in self.additional_properties
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
from typing import Any, Dict, List, Type, TypeVar, Union
2+
3+
import attr
4+
5+
from ..models.an_array_with_a_circular_ref_in_items_object_a_item import AnArrayWithACircularRefInItemsObjectAItem
6+
from ..types import UNSET, Unset
7+
8+
T = TypeVar("T", bound="AnArrayWithACircularRefInItemsObjectBItem")
9+
10+
11+
@attr.s(auto_attribs=True)
12+
class AnArrayWithACircularRefInItemsObjectBItem:
13+
"""
14+
Attributes:
15+
circular (Union[Unset, List[AnArrayWithACircularRefInItemsObjectAItem]]):
16+
"""
17+
18+
circular: Union[Unset, List[AnArrayWithACircularRefInItemsObjectAItem]] = UNSET
19+
additional_properties: Dict[str, Any] = attr.ib(init=False, factory=dict)
20+
21+
def to_dict(self) -> Dict[str, Any]:
22+
circular: Union[Unset, List[Dict[str, Any]]] = UNSET
23+
if not isinstance(self.circular, Unset):
24+
circular = []
25+
for componentsschemas_an_array_with_a_circular_ref_in_items_object_a_item_data in self.circular:
26+
componentsschemas_an_array_with_a_circular_ref_in_items_object_a_item = (
27+
componentsschemas_an_array_with_a_circular_ref_in_items_object_a_item_data.to_dict()
28+
)
29+
30+
circular.append(componentsschemas_an_array_with_a_circular_ref_in_items_object_a_item)
31+
32+
field_dict: Dict[str, Any] = {}
33+
field_dict.update(self.additional_properties)
34+
field_dict.update({})
35+
if circular is not UNSET:
36+
field_dict["circular"] = circular
37+
38+
return field_dict
39+
40+
@classmethod
41+
def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T:
42+
d = src_dict.copy()
43+
circular = []
44+
_circular = d.pop("circular", UNSET)
45+
for componentsschemas_an_array_with_a_circular_ref_in_items_object_a_item_data in _circular or []:
46+
componentsschemas_an_array_with_a_circular_ref_in_items_object_a_item = (
47+
AnArrayWithACircularRefInItemsObjectAItem.from_dict(
48+
componentsschemas_an_array_with_a_circular_ref_in_items_object_a_item_data
49+
)
50+
)
51+
52+
circular.append(componentsschemas_an_array_with_a_circular_ref_in_items_object_a_item)
53+
54+
an_array_with_a_circular_ref_in_items_object_b_item = cls(
55+
circular=circular,
56+
)
57+
58+
an_array_with_a_circular_ref_in_items_object_b_item.additional_properties = d
59+
return an_array_with_a_circular_ref_in_items_object_b_item
60+
61+
@property
62+
def additional_keys(self) -> List[str]:
63+
return list(self.additional_properties.keys())
64+
65+
def __getitem__(self, key: str) -> Any:
66+
return self.additional_properties[key]
67+
68+
def __setitem__(self, key: str, value: Any) -> None:
69+
self.additional_properties[key] = value
70+
71+
def __delitem__(self, key: str) -> None:
72+
del self.additional_properties[key]
73+
74+
def __contains__(self, key: str) -> bool:
75+
return key in self.additional_properties

0 commit comments

Comments
 (0)