From a0a6cd69b2753acbfd0821912c2fd0811f80d934 Mon Sep 17 00:00:00 2001 From: Roman Imankulov Date: Thu, 20 Jul 2023 16:42:42 +0100 Subject: [PATCH] Fix "parent" AttributeError when calling --collapse-root-models (#1432) Fixes #1419 --- datamodel_code_generator/parser/base.py | 4 ++- .../output.py | 13 ++++++++++ tests/data/openapi/flat_type.jsonschema | 16 ++++++++++++ tests/test_main.py | 25 +++++++++++++++++++ 4 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 tests/data/expected/main/main_collapse_root_models_with_references_to_flat_types/output.py create mode 100644 tests/data/openapi/flat_type.jsonschema diff --git a/datamodel_code_generator/parser/base.py b/datamodel_code_generator/parser/base.py index e5a03bbe3..b8903bd65 100644 --- a/datamodel_code_generator/parser/base.py +++ b/datamodel_code_generator/parser/base.py @@ -868,7 +868,9 @@ def __collapse_root_models( data_type.remove_reference() root_type_model.reference.children = [ - c for c in root_type_model.reference.children if c.parent + c + for c in root_type_model.reference.children + if getattr(c, 'parent', None) ] if not root_type_model.reference.children: diff --git a/tests/data/expected/main/main_collapse_root_models_with_references_to_flat_types/output.py b/tests/data/expected/main/main_collapse_root_models_with_references_to_flat_types/output.py new file mode 100644 index 000000000..0e6eff78e --- /dev/null +++ b/tests/data/expected/main/main_collapse_root_models_with_references_to_flat_types/output.py @@ -0,0 +1,13 @@ +# generated by datamodel-codegen: +# filename: flat_type.jsonschema +# timestamp: 2019-07-26T00:00:00+00:00 + +from __future__ import annotations + +from typing import Optional + +from pydantic import BaseModel + + +class FooModel(BaseModel): + foo: Optional[str] = None diff --git a/tests/data/openapi/flat_type.jsonschema b/tests/data/openapi/flat_type.jsonschema new file mode 100644 index 000000000..9be8e2bf2 --- /dev/null +++ b/tests/data/openapi/flat_type.jsonschema @@ -0,0 +1,16 @@ +{ + "title": "Foo", + "$schema": "http://json-schema.org/schema#", + "description": "", + "type": "object", + "properties": { + "foo": { + "$ref": "#/definitions/foo" + } + }, + "definitions": { + "foo": { + "type": "string" + } + } +} diff --git a/tests/test_main.py b/tests/test_main.py index 218ad45c4..7c3a5a3c5 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -4339,6 +4339,31 @@ def test_main_collapse_root_models_field_constraints(): ) +@freeze_time('2019-07-26') +def test_main_collapse_root_models_with_references_to_flat_types(): + with TemporaryDirectory() as output_dir: + output_file: Path = Path(output_dir) / 'output.py' + return_code: Exit = main( + [ + '--input', + str(OPEN_API_DATA_PATH / 'flat_type.jsonschema'), + '--output', + str(output_file), + '--collapse-root-models', + ] + ) + + assert return_code == Exit.OK + assert ( + output_file.read_text() + == ( + EXPECTED_MAIN_PATH + / 'main_collapse_root_models_with_references_to_flat_types' + / 'output.py' + ).read_text() + ) + + @freeze_time('2019-07-26') def test_main_openapi_max_items_enum(): with TemporaryDirectory() as output_dir: