From 4dbee476d1a3754034204167d77361707eba00a2 Mon Sep 17 00:00:00 2001 From: Dylan Anthony Date: Wed, 28 Apr 2021 08:34:45 -0600 Subject: [PATCH 1/2] test: Forced a test case where the bug presents itself in end to end tests --- .../my_test_api_client/models/__init__.py | 6 +++--- ...al_properties_inlined_additional_property.py} | 10 +++++----- .../model_with_additional_properties_inlined.py | 16 ++++++++++------ end_to_end_tests/openapi.json | 1 - 4 files changed, 18 insertions(+), 15 deletions(-) rename end_to_end_tests/golden-record/my_test_api_client/models/{model_with_additional_properties_inlined_additional_property.py => componentsschemas_model_with_additional_properties_inlined_additional_property.py} (73%) diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/__init__.py b/end_to_end_tests/golden-record/my_test_api_client/models/__init__.py index 93c6bab3a..665097a74 100644 --- a/end_to_end_tests/golden-record/my_test_api_client/models/__init__.py +++ b/end_to_end_tests/golden-record/my_test_api_client/models/__init__.py @@ -7,15 +7,15 @@ from .an_int_enum import AnIntEnum from .another_all_of_sub_model import AnotherAllOfSubModel from .body_upload_file_tests_upload_post import BodyUploadFileTestsUploadPost +from .componentsschemas_model_with_additional_properties_inlined_additional_property import ( + ComponentsschemasModelWithAdditionalPropertiesInlinedAdditionalProperty, +) from .different_enum import DifferentEnum from .free_form_model import FreeFormModel from .http_validation_error import HTTPValidationError from .model_from_all_of import ModelFromAllOf from .model_name import ModelName from .model_with_additional_properties_inlined import ModelWithAdditionalPropertiesInlined -from .model_with_additional_properties_inlined_additional_property import ( - 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_type0 import ModelWithAnyJsonPropertiesAdditionalPropertyType0 diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_inlined_additional_property.py b/end_to_end_tests/golden-record/my_test_api_client/models/componentsschemas_model_with_additional_properties_inlined_additional_property.py similarity index 73% rename from end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_inlined_additional_property.py rename to end_to_end_tests/golden-record/my_test_api_client/models/componentsschemas_model_with_additional_properties_inlined_additional_property.py index baedb6193..cd5f28665 100644 --- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_inlined_additional_property.py +++ b/end_to_end_tests/golden-record/my_test_api_client/models/componentsschemas_model_with_additional_properties_inlined_additional_property.py @@ -4,11 +4,11 @@ from ..types import UNSET, Unset -T = TypeVar("T", bound="ModelWithAdditionalPropertiesInlinedAdditionalProperty") +T = TypeVar("T", bound="ComponentsschemasModelWithAdditionalPropertiesInlinedAdditionalProperty") @attr.s(auto_attribs=True) -class ModelWithAdditionalPropertiesInlinedAdditionalProperty: +class ComponentsschemasModelWithAdditionalPropertiesInlinedAdditionalProperty: """ """ extra_props_prop: Union[Unset, str] = UNSET @@ -30,12 +30,12 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: d = src_dict.copy() extra_props_prop = d.pop("extra_props_prop", UNSET) - model_with_additional_properties_inlined_additional_property = cls( + componentsschemas_model_with_additional_properties_inlined_additional_property = cls( extra_props_prop=extra_props_prop, ) - model_with_additional_properties_inlined_additional_property.additional_properties = d - return model_with_additional_properties_inlined_additional_property + componentsschemas_model_with_additional_properties_inlined_additional_property.additional_properties = d + return componentsschemas_model_with_additional_properties_inlined_additional_property @property def additional_keys(self) -> List[str]: diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_inlined.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_inlined.py index a81e57a8e..c1379fba4 100644 --- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_inlined.py +++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_inlined.py @@ -2,8 +2,8 @@ import attr -from ..models.model_with_additional_properties_inlined_additional_property import ( - ModelWithAdditionalPropertiesInlinedAdditionalProperty, +from ..models.componentsschemas_model_with_additional_properties_inlined_additional_property import ( + ComponentsschemasModelWithAdditionalPropertiesInlinedAdditionalProperty, ) from ..types import UNSET, Unset @@ -15,7 +15,7 @@ class ModelWithAdditionalPropertiesInlined: """ """ a_number: Union[Unset, float] = UNSET - additional_properties: Dict[str, ModelWithAdditionalPropertiesInlinedAdditionalProperty] = attr.ib( + additional_properties: Dict[str, ComponentsschemasModelWithAdditionalPropertiesInlinedAdditionalProperty] = attr.ib( init=False, factory=dict ) @@ -43,7 +43,9 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: additional_properties = {} for prop_name, prop_dict in d.items(): - additional_property = ModelWithAdditionalPropertiesInlinedAdditionalProperty.from_dict(prop_dict) + additional_property = ComponentsschemasModelWithAdditionalPropertiesInlinedAdditionalProperty.from_dict( + prop_dict + ) additional_properties[prop_name] = additional_property @@ -54,10 +56,12 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: def additional_keys(self) -> List[str]: return list(self.additional_properties.keys()) - def __getitem__(self, key: str) -> ModelWithAdditionalPropertiesInlinedAdditionalProperty: + def __getitem__(self, key: str) -> ComponentsschemasModelWithAdditionalPropertiesInlinedAdditionalProperty: return self.additional_properties[key] - def __setitem__(self, key: str, value: ModelWithAdditionalPropertiesInlinedAdditionalProperty) -> None: + def __setitem__( + self, key: str, value: ComponentsschemasModelWithAdditionalPropertiesInlinedAdditionalProperty + ) -> None: self.additional_properties[key] = value def __delitem__(self, key: str) -> None: diff --git a/end_to_end_tests/openapi.json b/end_to_end_tests/openapi.json index f384dbbdd..4af206d39 100644 --- a/end_to_end_tests/openapi.json +++ b/end_to_end_tests/openapi.json @@ -1063,7 +1063,6 @@ "type": "object" }, "ModelWithAdditionalPropertiesInlined": { - "title": "ModelWithAdditionalPropertiesInlined", "type": "object", "properties": { "a_number": { From 47e316e39edd3ee16e495f5f3e8893f76e9211d5 Mon Sep 17 00:00:00 2001 From: Dylan Anthony Date: Sun, 2 May 2021 09:55:22 -0600 Subject: [PATCH 2/2] =?UTF-8?q?fix(generator):=20Bad=20class=C2=B7name=20f?= =?UTF-8?q?or=20components/schemas=20without=20titles=20(fixes=20#397)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../my_test_api_client/models/__init__.py | 6 +++--- .../model_with_additional_properties_inlined.py | 16 ++++++---------- ...al_properties_inlined_additional_property.py} | 10 +++++----- .../parser/properties/model_property.py | 10 +++++----- .../test_properties/test_model_property.py | 4 ++-- 5 files changed, 21 insertions(+), 25 deletions(-) rename end_to_end_tests/golden-record/my_test_api_client/models/{componentsschemas_model_with_additional_properties_inlined_additional_property.py => model_with_additional_properties_inlined_additional_property.py} (73%) diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/__init__.py b/end_to_end_tests/golden-record/my_test_api_client/models/__init__.py index 72f28e12b..5bbd77d7d 100644 --- a/end_to_end_tests/golden-record/my_test_api_client/models/__init__.py +++ b/end_to_end_tests/golden-record/my_test_api_client/models/__init__.py @@ -7,15 +7,15 @@ from .an_int_enum import AnIntEnum from .another_all_of_sub_model import AnotherAllOfSubModel from .body_upload_file_tests_upload_post import BodyUploadFileTestsUploadPost -from .componentsschemas_model_with_additional_properties_inlined_additional_property import ( - ComponentsschemasModelWithAdditionalPropertiesInlinedAdditionalProperty, -) from .different_enum import DifferentEnum from .free_form_model import FreeFormModel from .http_validation_error import HTTPValidationError from .model_from_all_of import ModelFromAllOf from .model_name import ModelName from .model_with_additional_properties_inlined import ModelWithAdditionalPropertiesInlined +from .model_with_additional_properties_inlined_additional_property import ( + 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_type_0 import ModelWithAnyJsonPropertiesAdditionalPropertyType0 diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_inlined.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_inlined.py index 81c5ce403..a2e168758 100644 --- a/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_inlined.py +++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_inlined.py @@ -2,8 +2,8 @@ import attr -from ..models.componentsschemas_model_with_additional_properties_inlined_additional_property import ( - ComponentsschemasModelWithAdditionalPropertiesInlinedAdditionalProperty, +from ..models.model_with_additional_properties_inlined_additional_property import ( + ModelWithAdditionalPropertiesInlinedAdditionalProperty, ) from ..types import UNSET, Unset @@ -15,7 +15,7 @@ class ModelWithAdditionalPropertiesInlined: """ """ a_number: Union[Unset, float] = UNSET - additional_properties: Dict[str, ComponentsschemasModelWithAdditionalPropertiesInlinedAdditionalProperty] = attr.ib( + additional_properties: Dict[str, ModelWithAdditionalPropertiesInlinedAdditionalProperty] = attr.ib( init=False, factory=dict ) @@ -43,9 +43,7 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: additional_properties = {} for prop_name, prop_dict in d.items(): - additional_property = ComponentsschemasModelWithAdditionalPropertiesInlinedAdditionalProperty.from_dict( - prop_dict - ) + additional_property = ModelWithAdditionalPropertiesInlinedAdditionalProperty.from_dict(prop_dict) additional_properties[prop_name] = additional_property @@ -56,12 +54,10 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: def additional_keys(self) -> List[str]: return list(self.additional_properties.keys()) - def __getitem__(self, key: str) -> ComponentsschemasModelWithAdditionalPropertiesInlinedAdditionalProperty: + def __getitem__(self, key: str) -> ModelWithAdditionalPropertiesInlinedAdditionalProperty: return self.additional_properties[key] - def __setitem__( - self, key: str, value: ComponentsschemasModelWithAdditionalPropertiesInlinedAdditionalProperty - ) -> None: + def __setitem__(self, key: str, value: ModelWithAdditionalPropertiesInlinedAdditionalProperty) -> None: self.additional_properties[key] = value def __delitem__(self, key: str) -> None: diff --git a/end_to_end_tests/golden-record/my_test_api_client/models/componentsschemas_model_with_additional_properties_inlined_additional_property.py b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_inlined_additional_property.py similarity index 73% rename from end_to_end_tests/golden-record/my_test_api_client/models/componentsschemas_model_with_additional_properties_inlined_additional_property.py rename to end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_inlined_additional_property.py index 5e3c700f8..490f6e34c 100644 --- a/end_to_end_tests/golden-record/my_test_api_client/models/componentsschemas_model_with_additional_properties_inlined_additional_property.py +++ b/end_to_end_tests/golden-record/my_test_api_client/models/model_with_additional_properties_inlined_additional_property.py @@ -4,11 +4,11 @@ from ..types import UNSET, Unset -T = TypeVar("T", bound="ComponentsschemasModelWithAdditionalPropertiesInlinedAdditionalProperty") +T = TypeVar("T", bound="ModelWithAdditionalPropertiesInlinedAdditionalProperty") @attr.s(auto_attribs=True) -class ComponentsschemasModelWithAdditionalPropertiesInlinedAdditionalProperty: +class ModelWithAdditionalPropertiesInlinedAdditionalProperty: """ """ extra_props_prop: Union[Unset, str] = UNSET @@ -30,12 +30,12 @@ def from_dict(cls: Type[T], src_dict: Dict[str, Any]) -> T: d = src_dict.copy() extra_props_prop = d.pop("extra_props_prop", UNSET) - componentsschemas_model_with_additional_properties_inlined_additional_property = cls( + model_with_additional_properties_inlined_additional_property = cls( extra_props_prop=extra_props_prop, ) - componentsschemas_model_with_additional_properties_inlined_additional_property.additional_properties = d - return componentsschemas_model_with_additional_properties_inlined_additional_property + model_with_additional_properties_inlined_additional_property.additional_properties = d + return model_with_additional_properties_inlined_additional_property @property def additional_keys(self) -> List[str]: diff --git a/openapi_python_client/parser/properties/model_property.py b/openapi_python_client/parser/properties/model_property.py index 0af0b1cea..a40460886 100644 --- a/openapi_python_client/parser/properties/model_property.py +++ b/openapi_python_client/parser/properties/model_property.py @@ -180,18 +180,18 @@ def build_model_property( parent_name: The name of the property that this property is inside of (affects class naming) config: Config data for this run of the generator, used to modifying names """ - class_name = data.title or name + class_string = data.title or name if parent_name: - class_name = f"{utils.pascal_case(parent_name)}{utils.pascal_case(class_name)}" - class_info = Class.from_string(string=class_name, config=config) + class_string = f"{utils.pascal_case(parent_name)}{utils.pascal_case(class_string)}" + class_info = Class.from_string(string=class_string, config=config) - property_data = _process_properties(data=data, schemas=schemas, class_name=class_name, config=config) + property_data = _process_properties(data=data, schemas=schemas, class_name=class_info.name, config=config) if isinstance(property_data, PropertyError): return property_data, schemas schemas = property_data.schemas additional_properties, schemas = _get_additional_properties( - schema_additional=data.additionalProperties, schemas=schemas, class_name=class_name, config=config + schema_additional=data.additionalProperties, schemas=schemas, class_name=class_info.name, config=config ) if isinstance(additional_properties, Property): property_data.relative_imports.update(additional_properties.get_imports(prefix="..")) diff --git a/tests/test_parser/test_properties/test_model_property.py b/tests/test_parser/test_properties/test_model_property.py index b366c2333..abe0e5323 100644 --- a/tests/test_parser/test_properties/test_model_property.py +++ b/tests/test_parser/test_properties/test_model_property.py @@ -178,7 +178,7 @@ def test_bad_props_return_error(self): assert err == PropertyError(detail="unknown type not_real", data=oai.Schema(type="not_real")) def test_bad_additional_props_return_error(self): - from openapi_python_client.parser.properties import Schemas, build_model_property + from openapi_python_client.parser.properties import Config, Schemas, build_model_property additional_properties = oai.Schema( type="object", @@ -190,7 +190,7 @@ def test_bad_additional_props_return_error(self): schemas = Schemas() err, new_schemas = build_model_property( - data=data, name="prop", schemas=schemas, required=True, parent_name=None, config=MagicMock() + data=data, name="prop", schemas=schemas, required=True, parent_name=None, config=Config() ) assert new_schemas == schemas