diff --git a/fastapi/_compat/__init__.py b/fastapi/_compat/__init__.py index a0bede3471..4581c38c88 100644 --- a/fastapi/_compat/__init__.py +++ b/fastapi/_compat/__init__.py @@ -19,7 +19,6 @@ from .shared import ( from .shared import lenient_issubclass as lenient_issubclass from .shared import sequence_types as sequence_types from .shared import value_is_sequence as value_is_sequence -from .v2 import Color as Color # type: ignore[attr-defined] from .v2 import ModelField as ModelField from .v2 import PydanticSchemaGenerationError as PydanticSchemaGenerationError from .v2 import RequiredParam as RequiredParam diff --git a/fastapi/_compat/v2.py b/fastapi/_compat/v2.py index 8587393ea4..9dad514b95 100644 --- a/fastapi/_compat/v2.py +++ b/fastapi/_compat/v2.py @@ -23,7 +23,7 @@ from pydantic import PydanticSchemaGenerationError as PydanticSchemaGenerationEr from pydantic import PydanticUndefinedAnnotation as PydanticUndefinedAnnotation from pydantic import ValidationError as ValidationError from pydantic._internal import _typing_extra as _pydantic_typing_extra -from pydantic._internal._schema_generation_shared import ( # type: ignore[attr-defined] +from pydantic._internal._schema_generation_shared import ( # type: ignore[attr-defined] # ty: ignore[unused-ignore-comment] GetJsonSchemaHandler as GetJsonSchemaHandler, ) from pydantic.fields import FieldInfo as FieldInfo @@ -39,21 +39,13 @@ from pydantic_core.core_schema import ( RequiredParam = PydanticUndefined Undefined = PydanticUndefined -# pydantic.color.Color is deprecated since v2.0b3 -try: - from pydantic_extra_types.color import Color -except ImportError: # pragma: no cover - from pydantic.color import ( # type: ignore[assignment] - Color, # noqa: F401 - ) - def define_forwardref() -> Callable[..., Any]: # eval_type_lenient has been deprecated since Pydantic v2.10.0b1 (PR #10530) try_eval_type = getattr(_pydantic_typing_extra, "try_eval_type", None) if try_eval_type is not None: return lambda *args: try_eval_type(*args)[0] - return _pydantic_typing_extra.eval_type_lenient # pragma: no cover + return _pydantic_typing_extra.eval_type_lenient # pragma: no cover # ty: ignore[deprecated] evaluate_forwardref = define_forwardref() diff --git a/fastapi/encoders.py b/fastapi/encoders.py index 7c46072041..d34cd00976 100644 --- a/fastapi/encoders.py +++ b/fastapi/encoders.py @@ -27,11 +27,26 @@ from pydantic.types import SecretBytes, SecretStr from pydantic_core import PydanticUndefinedType from ._compat import ( - Color, Url, is_pydantic_v1_model_instance, ) +try: + from pydantic.color import Color # ty: ignore[deprecated] +except ImportError: # pragma: no cover + + class Color: # type: ignore[no-redef] # ty: ignore[unused-ignore-comment] + pass + + +# pydantic.color.Color is deprecated since v2.0b3 -> supporting the new one as well +try: + from pydantic_extra_types.color import Color as PyExtraColor +except ImportError: # pragma: no cover + + class PyExtraColor: # type: ignore[no-redef] # ty: ignore[unused-ignore-comment] + pass + # Taken from Pydantic v1 as is def isoformat(o: datetime.date | datetime.time) -> str: @@ -67,7 +82,8 @@ def decimal_encoder(dec_value: Decimal) -> int | float: ENCODERS_BY_TYPE: dict[type[Any], Callable[[Any], Any]] = { bytes: lambda o: o.decode(), - Color: str, # ty: ignore[deprecated] + Color: str, + PyExtraColor: str, datetime.date: isoformat, datetime.datetime: isoformat, datetime.time: isoformat,