From 295b75825377c93300c767d64955a84d75a62ef9 Mon Sep 17 00:00:00 2001 From: prmshepherd Date: Thu, 26 Sep 2024 13:40:39 +0100 Subject: [PATCH] Change ordering of actions (#1961) * Change ordering of actions Update the ordering of the actions as the one literal on default option is not working for descriminator properties * Add test case * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * Add test data * Remove breakpoint * Remove unused arguments --------- Co-authored-by: Koudai Aono Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- datamodel_code_generator/parser/base.py | 2 +- .../enum_one_literal_as_default.py | 32 +++++++++++++++++++ tests/main/openapi/test_main_openapi.py | 28 ++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 tests/data/expected/main/openapi/discriminator/enum_one_literal_as_default.py diff --git a/datamodel_code_generator/parser/base.py b/datamodel_code_generator/parser/base.py index aac39043..b4d1ec81 100644 --- a/datamodel_code_generator/parser/base.py +++ b/datamodel_code_generator/parser/base.py @@ -1370,8 +1370,8 @@ class Processed(NamedTuple): ) self.__set_default_enum_member(models) self.__sort_models(models, imports) - self.__set_one_literal_on_default(models) self.__apply_discriminator_type(models, imports) + self.__set_one_literal_on_default(models) processed_models.append( Processed(module, models, init, imports, scoped_model_resolver) diff --git a/tests/data/expected/main/openapi/discriminator/enum_one_literal_as_default.py b/tests/data/expected/main/openapi/discriminator/enum_one_literal_as_default.py new file mode 100644 index 00000000..26f9f87c --- /dev/null +++ b/tests/data/expected/main/openapi/discriminator/enum_one_literal_as_default.py @@ -0,0 +1,32 @@ +# generated by datamodel-codegen: +# filename: discriminator_enum.yaml +# timestamp: 2019-07-26T00:00:00+00:00 + +from __future__ import annotations + +from enum import Enum +from typing import Literal, Union + +from pydantic import BaseModel, Field, RootModel + + +class RequestVersionEnum(Enum): + v1 = 'v1' + v2 = 'v2' + + +class RequestBase(BaseModel): + version: RequestVersionEnum + + +class RequestV1(RequestBase): + request_id: str = Field(..., description='there is description', title='test title') + version: Literal['v1'] = 'v1' + + +class RequestV2(RequestBase): + version: Literal['v2'] = 'v2' + + +class Request(RootModel[Union[RequestV1, RequestV2]]): + root: Union[RequestV1, RequestV2] = Field(..., discriminator='version') diff --git a/tests/main/openapi/test_main_openapi.py b/tests/main/openapi/test_main_openapi.py index 392076c9..2ab086c8 100644 --- a/tests/main/openapi/test_main_openapi.py +++ b/tests/main/openapi/test_main_openapi.py @@ -2798,3 +2798,31 @@ def test_main_openapi_msgspec_use_annotated_with_field_constraints(): / 'msgspec_use_annotated_with_field_constraints.py' ).read_text() ) + + +@freeze_time('2019-07-26') +def test_main_openapi_discriminator_one_literal_as_default(): + with TemporaryDirectory() as output_dir: + output_file: Path = Path(output_dir) / 'output.py' + return_code: Exit = main( + [ + '--input', + str(OPEN_API_DATA_PATH / 'discriminator_enum.yaml'), + '--output', + str(output_file), + '--input-file-type', + 'openapi', + '--output-model-type', + 'pydantic_v2.BaseModel', + '--use-one-literal-as-default', + ] + ) + assert return_code == Exit.OK + assert ( + output_file.read_text() + == ( + EXPECTED_OPENAPI_PATH + / 'discriminator' + / 'enum_one_literal_as_default.py' + ).read_text() + )