From 20dd419a647c803c79e24609206195054ce55c15 Mon Sep 17 00:00:00 2001 From: Jianqi Pan Date: Sat, 19 Apr 2025 20:36:37 +0900 Subject: [PATCH 1/4] fix(litestar): improve schema key equality check && add schema name to dto base --- litestar/_openapi/datastructures.py | 3 +-- litestar/dto/_backend.py | 4 ++-- litestar/dto/base_dto.py | 1 + 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/litestar/_openapi/datastructures.py b/litestar/_openapi/datastructures.py index 91761e7eff..2c85476d3c 100644 --- a/litestar/_openapi/datastructures.py +++ b/litestar/_openapi/datastructures.py @@ -136,8 +136,7 @@ def get_reference_for_field_definition(self, field: FieldDefinition) -> Referenc key = _get_normalized_schema_key(field) if key not in self._schema_key_map: return None - - if (existing_type := self._component_type_map[key]) != field: + if (existing_type := self._component_type_map[key]) != field and f"{field.raw!r}" != f"{existing_type.raw!r}": # TODO: This should check for strict equality, e.g. changes in type metadata # However, this is currently not possible to do without breaking things, as # we allow to define metadata on a type annotation in one place to be used diff --git a/litestar/dto/_backend.py b/litestar/dto/_backend.py index ba121e0f5c..8bf5e857c1 100644 --- a/litestar/dto/_backend.py +++ b/litestar/dto/_backend.py @@ -113,7 +113,7 @@ def __init__( rename_fields=self.dto_factory.config.rename_fields, ) self.transfer_model_type = self.create_transfer_model_type( - model_name=model_type.__name__, field_definitions=self.parsed_field_definitions + model_name=model_type.__name__, field_definitions=self.parsed_field_definitions, ) self.dto_data_type: type[DTOData] | None = None @@ -207,7 +207,7 @@ def create_transfer_model_type( Returns: A ``BackendT`` class. """ - struct_name = self._create_transfer_model_name(model_name) + struct_name = self.dto_factory.__schema_name__ or self._create_transfer_model_name(model_name) struct = _create_struct_for_field_definitions( model_name=struct_name, diff --git a/litestar/dto/base_dto.py b/litestar/dto/base_dto.py index 93498f3c99..a5c9ba6b1e 100644 --- a/litestar/dto/base_dto.py +++ b/litestar/dto/base_dto.py @@ -52,6 +52,7 @@ class AbstractDTO(Generic[T]): """If ``annotation`` is an iterable, this is the inner type, otherwise will be the same as ``annotation``.""" _dto_backends: ClassVar[dict[str, _BackendDict]] = {} + __schema_name__ = None def __init__(self, asgi_connection: ASGIConnection) -> None: """Create an AbstractDTOFactory type. From a72f45cdf5e428eacfee78775d127f42d52751aa Mon Sep 17 00:00:00 2001 From: Jianqi Pan Date: Sat, 19 Apr 2025 20:55:12 +0900 Subject: [PATCH 2/4] style(backend): fix line wrapping && trailing commas in function call --- litestar/dto/_backend.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/litestar/dto/_backend.py b/litestar/dto/_backend.py index 8bf5e857c1..f5c14fd408 100644 --- a/litestar/dto/_backend.py +++ b/litestar/dto/_backend.py @@ -113,7 +113,8 @@ def __init__( rename_fields=self.dto_factory.config.rename_fields, ) self.transfer_model_type = self.create_transfer_model_type( - model_name=model_type.__name__, field_definitions=self.parsed_field_definitions, + model_name=model_type.__name__, + field_definitions=self.parsed_field_definitions, ) self.dto_data_type: type[DTOData] | None = None From 1d88b18dd0501b6ffb6a2f4931974f6eaab9f4c7 Mon Sep 17 00:00:00 2001 From: Jianqi Pan Date: Sat, 19 Apr 2025 20:58:02 +0900 Subject: [PATCH 3/4] style(base-dto): add typing to __schema_name__ attribute --- litestar/dto/base_dto.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/litestar/dto/base_dto.py b/litestar/dto/base_dto.py index a5c9ba6b1e..aae6c99d1b 100644 --- a/litestar/dto/base_dto.py +++ b/litestar/dto/base_dto.py @@ -52,7 +52,7 @@ class AbstractDTO(Generic[T]): """If ``annotation`` is an iterable, this is the inner type, otherwise will be the same as ``annotation``.""" _dto_backends: ClassVar[dict[str, _BackendDict]] = {} - __schema_name__ = None + __schema_name__: ClassVar[None | str] = None def __init__(self, asgi_connection: ASGIConnection) -> None: """Create an AbstractDTOFactory type. From 2f249d19d613b2c8f944c264681f3db008d7fcc4 Mon Sep 17 00:00:00 2001 From: Jianqi Pan Date: Sat, 19 Apr 2025 21:07:09 +0900 Subject: [PATCH 4/4] style(dto-backend): reformat code for improved readability --- litestar/dto/_backend.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/litestar/dto/_backend.py b/litestar/dto/_backend.py index f5c14fd408..01a05a5065 100644 --- a/litestar/dto/_backend.py +++ b/litestar/dto/_backend.py @@ -113,8 +113,7 @@ def __init__( rename_fields=self.dto_factory.config.rename_fields, ) self.transfer_model_type = self.create_transfer_model_type( - model_name=model_type.__name__, - field_definitions=self.parsed_field_definitions, + model_name=model_type.__name__, field_definitions=self.parsed_field_definitions ) self.dto_data_type: type[DTOData] | None = None