From 895baa49cf748f4420104d6fcf60ed0567a9404c Mon Sep 17 00:00:00 2001 From: Koudai Aono Date: Sat, 3 Jan 2026 17:28:45 +0000 Subject: [PATCH] Add deprecated field support for Pydantic v2 --- .../model/pydantic_v2/base_model.py | 1 + .../parser/jsonschema.py | 1 + .../expected/main/openapi/deprecated_field.py | 15 +++++++++++++ tests/data/openapi/deprecated_field.yaml | 22 +++++++++++++++++++ tests/main/openapi/test_main_openapi.py | 13 +++++++++++ 5 files changed, 52 insertions(+) create mode 100644 tests/data/expected/main/openapi/deprecated_field.py create mode 100644 tests/data/openapi/deprecated_field.yaml diff --git a/src/datamodel_code_generator/model/pydantic_v2/base_model.py b/src/datamodel_code_generator/model/pydantic_v2/base_model.py index 94a816d72..44e577641 100644 --- a/src/datamodel_code_generator/model/pydantic_v2/base_model.py +++ b/src/datamodel_code_generator/model/pydantic_v2/base_model.py @@ -120,6 +120,7 @@ class DataModelField(DataModelFieldV1): "min_length", "max_length", "union_mode", + "deprecated", } constraints: Optional[Constraints] = None # pyright: ignore[reportIncompatibleVariableOverride] # noqa: UP045 _PARSE_METHOD: ClassVar[str] = "model_validate" diff --git a/src/datamodel_code_generator/parser/jsonschema.py b/src/datamodel_code_generator/parser/jsonschema.py index a40486424..c427902dc 100644 --- a/src/datamodel_code_generator/parser/jsonschema.py +++ b/src/datamodel_code_generator/parser/jsonschema.py @@ -530,6 +530,7 @@ def _get_type(type_: str, format__: str | None = None) -> Types: "title", "const", "default_factory", + "deprecated", } EXCLUDE_FIELD_KEYS_IN_JSON_SCHEMA: set[str] = { diff --git a/tests/data/expected/main/openapi/deprecated_field.py b/tests/data/expected/main/openapi/deprecated_field.py new file mode 100644 index 000000000..5509a9cfa --- /dev/null +++ b/tests/data/expected/main/openapi/deprecated_field.py @@ -0,0 +1,15 @@ +# generated by datamodel-codegen: +# filename: deprecated_field.yaml +# timestamp: 2019-07-26T00:00:00+00:00 + +from __future__ import annotations + +from pydantic import BaseModel, Field + + +class Service(BaseModel): + name: str = Field(..., description='Name of the service') + location: str | None = Field( + None, deprecated=True, description='Location of the service (deprecated)' + ) + old_id: int | None = Field(None, deprecated=True) diff --git a/tests/data/openapi/deprecated_field.yaml b/tests/data/openapi/deprecated_field.yaml new file mode 100644 index 000000000..c17d7c846 --- /dev/null +++ b/tests/data/openapi/deprecated_field.yaml @@ -0,0 +1,22 @@ +openapi: "3.0.0" +info: + version: 1.0.0 + title: Deprecated Field Test +paths: {} +components: + schemas: + Service: + type: object + properties: + name: + type: string + description: Name of the service + location: + type: string + description: Location of the service (deprecated) + deprecated: true + old_id: + type: integer + deprecated: true + required: + - name diff --git a/tests/main/openapi/test_main_openapi.py b/tests/main/openapi/test_main_openapi.py index fa3e6009f..0847d1cc2 100644 --- a/tests/main/openapi/test_main_openapi.py +++ b/tests/main/openapi/test_main_openapi.py @@ -4856,3 +4856,16 @@ def test_main_openapi_include_paths_warning_without_paths_scope() -> None: assert any( "--openapi-include-paths has no effect without --openapi-scopes paths" in msg for msg in warning_messages ) + + +@SKIP_PYDANTIC_V1 +def test_main_openapi_deprecated_field(output_file: Path) -> None: + """Test OpenAPI generation with deprecated field property.""" + run_main_and_assert( + input_path=OPEN_API_DATA_PATH / "deprecated_field.yaml", + output_path=output_file, + input_file_type="openapi", + assert_func=assert_file_content, + expected_file="deprecated_field.py", + extra_args=["--output-model-type", "pydantic_v2.BaseModel"], + )