From 4ccbce9e27c1add40ec543ad760517bf45612e51 Mon Sep 17 00:00:00 2001 From: Forest Tong Date: Wed, 10 Feb 2021 11:49:57 -0500 Subject: [PATCH 1/8] Fail on duplicate names --- openapi_python_client/parser/properties/__init__.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/openapi_python_client/parser/properties/__init__.py b/openapi_python_client/parser/properties/__init__.py index 2ea75a569..b77383e8d 100644 --- a/openapi_python_client/parser/properties/__init__.py +++ b/openapi_python_client/parser/properties/__init__.py @@ -234,6 +234,10 @@ def _string_based_property( ) +class NameClashException(Exception): + pass + + def build_model_property( *, data: oai.Schema, name: str, schemas: Schemas, required: bool, parent_name: Optional[str] ) -> Tuple[Union[ModelProperty, PropertyError], Schemas]: @@ -302,6 +306,9 @@ def build_model_property( name=name, additional_properties=additional_properties, ) + if prop.reference.class_name in schemas.models: + raise NameClashException(f'Attempted to generate duplicate models with name "{prop.reference.class_name}"') + schemas = attr.evolve(schemas, models={**schemas.models, prop.reference.class_name: prop}) return prop, schemas @@ -374,6 +381,9 @@ def build_enum_property( values=values, value_type=value_type, ) + if prop.reference.class_name in schemas.enums: + raise NameClashException(f'Attempted to generate duplicate enums with name "{prop.reference.class_name}"') + schemas = attr.evolve(schemas, enums={**schemas.enums, prop.reference.class_name: prop}) return prop, schemas From 3f86bee3bb1eef9afa9e7c4a111ae93d9a9cc24e Mon Sep 17 00:00:00 2001 From: Forest Tong Date: Wed, 10 Feb 2021 13:48:35 -0500 Subject: [PATCH 2/8] Use PropertyError --- .../parser/properties/__init__.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/openapi_python_client/parser/properties/__init__.py b/openapi_python_client/parser/properties/__init__.py index b77383e8d..d6a3a45e6 100644 --- a/openapi_python_client/parser/properties/__init__.py +++ b/openapi_python_client/parser/properties/__init__.py @@ -234,10 +234,6 @@ def _string_based_property( ) -class NameClashException(Exception): - pass - - def build_model_property( *, data: oai.Schema, name: str, schemas: Schemas, required: bool, parent_name: Optional[str] ) -> Tuple[Union[ModelProperty, PropertyError], Schemas]: @@ -307,9 +303,12 @@ def build_model_property( additional_properties=additional_properties, ) if prop.reference.class_name in schemas.models: - raise NameClashException(f'Attempted to generate duplicate models with name "{prop.reference.class_name}"') + prop = PropertyError( + data=data, + detail=f'Attempted to generate duplicate models with name "{prop.reference.class_name}"') + else: + schemas = attr.evolve(schemas, models={**schemas.models, prop.reference.class_name: prop}) - schemas = attr.evolve(schemas, models={**schemas.models, prop.reference.class_name: prop}) return prop, schemas @@ -382,9 +381,12 @@ def build_enum_property( value_type=value_type, ) if prop.reference.class_name in schemas.enums: - raise NameClashException(f'Attempted to generate duplicate enums with name "{prop.reference.class_name}"') + prop = PropertyError( + data=data, + detail=f'Attempted to generate duplicate enums with name "{prop.reference.class_name}"') + else: + schemas = attr.evolve(schemas, enums={**schemas.enums, prop.reference.class_name: prop}) - schemas = attr.evolve(schemas, enums={**schemas.enums, prop.reference.class_name: prop}) return prop, schemas From 2655a8fc26c7cb145b918283ff2893b6e9894bf8 Mon Sep 17 00:00:00 2001 From: Forest Tong Date: Wed, 10 Feb 2021 13:50:53 -0500 Subject: [PATCH 3/8] Remove else --- end_to_end_tests/openapi.json | 23 +++++++++++++++++++ .../parser/properties/__init__.py | 20 ++++++++-------- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/end_to_end_tests/openapi.json b/end_to_end_tests/openapi.json index 196538f19..46c631533 100644 --- a/end_to_end_tests/openapi.json +++ b/end_to_end_tests/openapi.json @@ -806,6 +806,29 @@ }, "additionalProperties": false }, + "ModelWithUnionPropertyInlined": { + "title": "ModelWithUnionPropertyInlined", + "type": "object", + "properties": { + "fruit": { + "oneOf": [ + { + "type": "object", + "properties": { + "apples": {"type": "string"} + } + }, + { + "type": "object", + "properties": { + "bananas": {"type": "string"} + } + } + ] + } + }, + "additionalProperties": false + }, "FreeFormModel": { "title": "FreeFormModel", "type": "object" diff --git a/openapi_python_client/parser/properties/__init__.py b/openapi_python_client/parser/properties/__init__.py index d6a3a45e6..edd4c037c 100644 --- a/openapi_python_client/parser/properties/__init__.py +++ b/openapi_python_client/parser/properties/__init__.py @@ -303,12 +303,12 @@ def build_model_property( additional_properties=additional_properties, ) if prop.reference.class_name in schemas.models: - prop = PropertyError( - data=data, - detail=f'Attempted to generate duplicate models with name "{prop.reference.class_name}"') - else: - schemas = attr.evolve(schemas, models={**schemas.models, prop.reference.class_name: prop}) + error = PropertyError( + data=data, detail=f'Attempted to generate duplicate models with name "{prop.reference.class_name}"' + ) + return error, schemas + schemas = attr.evolve(schemas, models={**schemas.models, prop.reference.class_name: prop}) return prop, schemas @@ -381,12 +381,12 @@ def build_enum_property( value_type=value_type, ) if prop.reference.class_name in schemas.enums: - prop = PropertyError( - data=data, - detail=f'Attempted to generate duplicate enums with name "{prop.reference.class_name}"') - else: - schemas = attr.evolve(schemas, enums={**schemas.enums, prop.reference.class_name: prop}) + error = PropertyError( + data=data, detail=f'Attempted to generate duplicate enums with name "{prop.reference.class_name}"' + ) + return error, schemas + schemas = attr.evolve(schemas, enums={**schemas.enums, prop.reference.class_name: prop}) return prop, schemas From bb4d8d571bc312f78651e05f7d8a82f11afc312d Mon Sep 17 00:00:00 2001 From: Forest Tong Date: Wed, 10 Feb 2021 13:51:14 -0500 Subject: [PATCH 4/8] Revert openAPI --- end_to_end_tests/openapi.json | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/end_to_end_tests/openapi.json b/end_to_end_tests/openapi.json index 46c631533..196538f19 100644 --- a/end_to_end_tests/openapi.json +++ b/end_to_end_tests/openapi.json @@ -806,29 +806,6 @@ }, "additionalProperties": false }, - "ModelWithUnionPropertyInlined": { - "title": "ModelWithUnionPropertyInlined", - "type": "object", - "properties": { - "fruit": { - "oneOf": [ - { - "type": "object", - "properties": { - "apples": {"type": "string"} - } - }, - { - "type": "object", - "properties": { - "bananas": {"type": "string"} - } - } - ] - } - }, - "additionalProperties": false - }, "FreeFormModel": { "title": "FreeFormModel", "type": "object" From bb66d55febacf82072d8ff74ba508cc5d766896f Mon Sep 17 00:00:00 2001 From: Forest Tong Date: Wed, 10 Feb 2021 14:19:48 -0500 Subject: [PATCH 5/8] Add test and remove enum check --- .../parser/properties/__init__.py | 5 ---- .../test_parser/test_properties/test_init.py | 28 +++++++++++++++++-- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/openapi_python_client/parser/properties/__init__.py b/openapi_python_client/parser/properties/__init__.py index edd4c037c..ce375f1cb 100644 --- a/openapi_python_client/parser/properties/__init__.py +++ b/openapi_python_client/parser/properties/__init__.py @@ -380,11 +380,6 @@ def build_enum_property( values=values, value_type=value_type, ) - if prop.reference.class_name in schemas.enums: - error = PropertyError( - data=data, detail=f'Attempted to generate duplicate enums with name "{prop.reference.class_name}"' - ) - return error, schemas schemas = attr.evolve(schemas, enums={**schemas.enums, prop.reference.class_name: prop}) return prop, schemas diff --git a/tests/test_parser/test_properties/test_init.py b/tests/test_parser/test_properties/test_init.py index a7ea05881..adde2db5e 100644 --- a/tests/test_parser/test_properties/test_init.py +++ b/tests/test_parser/test_properties/test_init.py @@ -1105,7 +1105,32 @@ def test_build_model_property(additional_properties_schema, expected_additional_ ) -def test_build_model_property_bad_prop(): +def test_build_model_property_conflict(): + from openapi_python_client.parser.properties import Schemas, build_model_property + + data = oai.Schema.construct( + required=["req"], + properties={ + "req": oai.Schema.construct(type="string"), + "opt": oai.Schema(type="string", format="date-time"), + }, + nullable=False, + ) + schemas = Schemas(models={"OtherModel": None}) + + err, new_schemas = build_model_property( + data=data, + name="OtherModel", + schemas=schemas, + required=True, + parent_name=None, + ) + + assert new_schemas == schemas + assert err == PropertyError(detail='Attempted to generate duplicate models with name "OtherModel"', data=data) + + +def test_build_model_property_bad_prop(mocker): from openapi_python_client.parser.properties import Schemas, build_model_property data = oai.Schema( @@ -1122,7 +1147,6 @@ def test_build_model_property_bad_prop(): required=True, parent_name=None, ) - assert new_schemas == schemas assert err == PropertyError(detail="unknown type not_real", data=oai.Schema(type="not_real")) From e2a2b9b78553a68878e3834c49c409fce1a4cbdf Mon Sep 17 00:00:00 2001 From: Forest Tong Date: Wed, 10 Feb 2021 14:21:31 -0500 Subject: [PATCH 6/8] Remove whitespace --- openapi_python_client/parser/properties/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openapi_python_client/parser/properties/__init__.py b/openapi_python_client/parser/properties/__init__.py index ce375f1cb..992d726df 100644 --- a/openapi_python_client/parser/properties/__init__.py +++ b/openapi_python_client/parser/properties/__init__.py @@ -380,7 +380,6 @@ def build_enum_property( values=values, value_type=value_type, ) - schemas = attr.evolve(schemas, enums={**schemas.enums, prop.reference.class_name: prop}) return prop, schemas From 9b53646b5c588d9a9aa1a9ad4c2c90af3785c7e0 Mon Sep 17 00:00:00 2001 From: Forest Tong Date: Wed, 10 Feb 2021 14:22:09 -0500 Subject: [PATCH 7/8] Add back whitespace --- tests/test_parser/test_properties/test_init.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_parser/test_properties/test_init.py b/tests/test_parser/test_properties/test_init.py index adde2db5e..25df9cab5 100644 --- a/tests/test_parser/test_properties/test_init.py +++ b/tests/test_parser/test_properties/test_init.py @@ -1147,6 +1147,7 @@ def test_build_model_property_bad_prop(mocker): required=True, parent_name=None, ) + assert new_schemas == schemas assert err == PropertyError(detail="unknown type not_real", data=oai.Schema(type="not_real")) From 3ae0f18ac8babc39f0453be5532510874f11163b Mon Sep 17 00:00:00 2001 From: Forest Tong Date: Wed, 10 Feb 2021 14:22:30 -0500 Subject: [PATCH 8/8] Remove mocker --- tests/test_parser/test_properties/test_init.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_parser/test_properties/test_init.py b/tests/test_parser/test_properties/test_init.py index 25df9cab5..ee07d3973 100644 --- a/tests/test_parser/test_properties/test_init.py +++ b/tests/test_parser/test_properties/test_init.py @@ -1130,7 +1130,7 @@ def test_build_model_property_conflict(): assert err == PropertyError(detail='Attempted to generate duplicate models with name "OtherModel"', data=data) -def test_build_model_property_bad_prop(mocker): +def test_build_model_property_bad_prop(): from openapi_python_client.parser.properties import Schemas, build_model_property data = oai.Schema(