Skip to content

Fix additionalProperty Union spacing and construction (#266) #273

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 13 commits into from
Dec 21, 2020
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## 0.7.3 - Unreleased
### Fixes
- Spacing and extra returns for Union types of `additionalProperties` (#266 & #268). Thanks @joshzana & @packyg!

## 0.7.2 - 2020-12-08
### Fixes
- A bug in handling optional properties that are themselves models (introduced in 0.7.1) (#262). Thanks @packyg!
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,21 +71,20 @@ def httpx_request(
json_union_prop: Union[Unset, float, str]
if isinstance(union_prop, Unset):
json_union_prop = UNSET
elif isinstance(union_prop, float):
json_union_prop = union_prop
else:
json_union_prop = union_prop

json_union_prop_with_ref: Union[Unset, float, AnEnum]
if isinstance(union_prop_with_ref, Unset):
json_union_prop_with_ref = UNSET
elif isinstance(union_prop_with_ref, float):
json_union_prop_with_ref = union_prop_with_ref
else:
elif isinstance(union_prop_with_ref, AnEnum):
json_union_prop_with_ref = UNSET
if not isinstance(union_prop_with_ref, Unset):
json_union_prop_with_ref = union_prop_with_ref

else:
json_union_prop_with_ref = union_prop_with_ref

json_enum_prop: Union[Unset, AnEnum] = UNSET
if not isinstance(enum_prop, Unset):
json_enum_prop = enum_prop
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
ModelWithAdditionalPropertiesInlinedAdditionalProperty,
)
from .model_with_additional_properties_refed import ModelWithAdditionalPropertiesRefed
from .model_with_any_json_properties import ModelWithAnyJsonProperties
from .model_with_any_json_properties_additional_property import ModelWithAnyJsonPropertiesAdditionalProperty
from .model_with_primitive_additional_properties import ModelWithPrimitiveAdditionalProperties
from .model_with_primitive_additional_properties_a_date_holder import ModelWithPrimitiveAdditionalPropertiesADateHolder
from .model_with_union_property import ModelWithUnionProperty
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
from typing import Any, Dict, List, Union, cast

import attr

from ..models.model_with_any_json_properties_additional_property import ModelWithAnyJsonPropertiesAdditionalProperty
from ..types import Unset


@attr.s(auto_attribs=True)
class ModelWithAnyJsonProperties:
""" """

additional_properties: Dict[
str, Union[ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool]
] = attr.ib(init=False, factory=dict)

def to_dict(self) -> Dict[str, Any]:

field_dict: Dict[str, Any] = {}
for prop_name, prop in self.additional_properties.items():
if isinstance(prop, ModelWithAnyJsonPropertiesAdditionalProperty):
field_dict[prop_name] = prop.to_dict()

elif isinstance(prop, list):
field_dict[prop_name] = prop

else:
field_dict[prop_name] = prop

field_dict.update({})

return field_dict

@staticmethod
def from_dict(src_dict: Dict[str, Any]) -> "ModelWithAnyJsonProperties":
d = src_dict.copy()
model_with_any_json_properties = ModelWithAnyJsonProperties()

additional_properties = {}
for prop_name, prop_dict in d.items():

def _parse_additional_property(
data: Any,
) -> Union[ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool]:
data = None if isinstance(data, Unset) else data
additional_property: Union[
ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool
]
try:
additional_property = ModelWithAnyJsonPropertiesAdditionalProperty.from_dict(data)

return additional_property
except: # noqa: E722
pass
try:
additional_property = cast(List[str], data)

return additional_property
except: # noqa: E722
pass
return cast(Union[ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool], data)

additional_property = _parse_additional_property(prop_dict)

additional_properties[prop_name] = additional_property

model_with_any_json_properties.additional_properties = additional_properties
return model_with_any_json_properties

@property
def additional_keys(self) -> List[str]:
return list(self.additional_properties.keys())

def __getitem__(
self, key: str
) -> Union[ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool]:
return self.additional_properties[key]

def __setitem__(
self, key: str, value: Union[ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool]
) -> None:
self.additional_properties[key] = value

def __delitem__(self, key: str) -> None:
del self.additional_properties[key]

def __contains__(self, key: str) -> bool:
return key in self.additional_properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
from typing import Any, Dict, List

import attr


@attr.s(auto_attribs=True)
class ModelWithAnyJsonPropertiesAdditionalProperty:
""" """

additional_properties: Dict[str, str] = attr.ib(init=False, factory=dict)

def to_dict(self) -> Dict[str, Any]:

field_dict: Dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})

return field_dict

@staticmethod
def from_dict(src_dict: Dict[str, Any]) -> "ModelWithAnyJsonPropertiesAdditionalProperty":
d = src_dict.copy()
model_with_any_json_properties_additional_property = ModelWithAnyJsonPropertiesAdditionalProperty()

model_with_any_json_properties_additional_property.additional_properties = d
return model_with_any_json_properties_additional_property

@property
def additional_keys(self) -> List[str]:
return list(self.additional_properties.keys())

def __getitem__(self, key: str) -> str:
return self.additional_properties[key]

def __setitem__(self, key: str, value: str) -> None:
self.additional_properties[key] = value

def __delitem__(self, key: str) -> None:
del self.additional_properties[key]

def __contains__(self, key: str) -> bool:
return key in self.additional_properties
Original file line number Diff line number Diff line change
Expand Up @@ -47,21 +47,20 @@ def _get_kwargs(
json_union_prop: Union[Unset, float, str]
if isinstance(union_prop, Unset):
json_union_prop = UNSET
elif isinstance(union_prop, float):
json_union_prop = union_prop
else:
json_union_prop = union_prop

json_union_prop_with_ref: Union[Unset, float, AnEnum]
if isinstance(union_prop_with_ref, Unset):
json_union_prop_with_ref = UNSET
elif isinstance(union_prop_with_ref, float):
json_union_prop_with_ref = union_prop_with_ref
else:
elif isinstance(union_prop_with_ref, AnEnum):
json_union_prop_with_ref = UNSET
if not isinstance(union_prop_with_ref, Unset):
json_union_prop_with_ref = union_prop_with_ref

else:
json_union_prop_with_ref = union_prop_with_ref

json_enum_prop: Union[Unset, AnEnum] = UNSET
if not isinstance(enum_prop, Unset):
json_enum_prop = enum_prop
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
ModelWithAdditionalPropertiesInlinedAdditionalProperty,
)
from .model_with_additional_properties_refed import ModelWithAdditionalPropertiesRefed
from .model_with_any_json_properties import ModelWithAnyJsonProperties
from .model_with_any_json_properties_additional_property import ModelWithAnyJsonPropertiesAdditionalProperty
from .model_with_primitive_additional_properties import ModelWithPrimitiveAdditionalProperties
from .model_with_primitive_additional_properties_a_date_holder import ModelWithPrimitiveAdditionalPropertiesADateHolder
from .model_with_union_property import ModelWithUnionProperty
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
from typing import Any, Dict, List, Union, cast

import attr

from ..models.model_with_any_json_properties_additional_property import ModelWithAnyJsonPropertiesAdditionalProperty
from ..types import Unset


@attr.s(auto_attribs=True)
class ModelWithAnyJsonProperties:
""" """

additional_properties: Dict[
str, Union[ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool]
] = attr.ib(init=False, factory=dict)

def to_dict(self) -> Dict[str, Any]:

field_dict: Dict[str, Any] = {}
for prop_name, prop in self.additional_properties.items():
if isinstance(prop, ModelWithAnyJsonPropertiesAdditionalProperty):
field_dict[prop_name] = prop.to_dict()

elif isinstance(prop, list):
field_dict[prop_name] = prop

else:
field_dict[prop_name] = prop

field_dict.update({})

return field_dict

@staticmethod
def from_dict(src_dict: Dict[str, Any]) -> "ModelWithAnyJsonProperties":
d = src_dict.copy()
model_with_any_json_properties = ModelWithAnyJsonProperties()

additional_properties = {}
for prop_name, prop_dict in d.items():

def _parse_additional_property(
data: Any,
) -> Union[ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool]:
data = None if isinstance(data, Unset) else data
additional_property: Union[
ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool
]
try:
additional_property = ModelWithAnyJsonPropertiesAdditionalProperty.from_dict(data)

return additional_property
except: # noqa: E722
pass
try:
additional_property = cast(List[str], data)

return additional_property
except: # noqa: E722
pass
return cast(Union[ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool], data)

additional_property = _parse_additional_property(prop_dict)

additional_properties[prop_name] = additional_property

model_with_any_json_properties.additional_properties = additional_properties
return model_with_any_json_properties

@property
def additional_keys(self) -> List[str]:
return list(self.additional_properties.keys())

def __getitem__(
self, key: str
) -> Union[ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool]:
return self.additional_properties[key]

def __setitem__(
self, key: str, value: Union[ModelWithAnyJsonPropertiesAdditionalProperty, List[str], str, float, int, bool]
) -> None:
self.additional_properties[key] = value

def __delitem__(self, key: str) -> None:
del self.additional_properties[key]

def __contains__(self, key: str) -> bool:
return key in self.additional_properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
from typing import Any, Dict, List

import attr


@attr.s(auto_attribs=True)
class ModelWithAnyJsonPropertiesAdditionalProperty:
""" """

additional_properties: Dict[str, str] = attr.ib(init=False, factory=dict)

def to_dict(self) -> Dict[str, Any]:

field_dict: Dict[str, Any] = {}
field_dict.update(self.additional_properties)
field_dict.update({})

return field_dict

@staticmethod
def from_dict(src_dict: Dict[str, Any]) -> "ModelWithAnyJsonPropertiesAdditionalProperty":
d = src_dict.copy()
model_with_any_json_properties_additional_property = ModelWithAnyJsonPropertiesAdditionalProperty()

model_with_any_json_properties_additional_property.additional_properties = d
return model_with_any_json_properties_additional_property

@property
def additional_keys(self) -> List[str]:
return list(self.additional_properties.keys())

def __getitem__(self, key: str) -> str:
return self.additional_properties[key]

def __setitem__(self, key: str, value: str) -> None:
self.additional_properties[key] = value

def __delitem__(self, key: str) -> None:
del self.additional_properties[key]

def __contains__(self, key: str) -> bool:
return key in self.additional_properties
32 changes: 32 additions & 0 deletions end_to_end_tests/openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -806,6 +806,38 @@
"additionalProperties": {
"$ref": "#/components/schemas/AnEnum"
}
},
"ModelWithAnyJsonProperties": {
"title": "ModelWithAnyJsonProperties",
"type": "object",
"additionalProperties": {
"anyOf": [
{
"type": "object",
"additionalProperties": {
"type": "string"
}
},
{
"type": "array",
"items": {
"type": "string"
}
},
{
"type": "string"
},
{
"type": "number"
},
{
"type": "integer"
},
{
"type": "boolean"
}
]
}
}
}
}
Expand Down
Loading