diff --git a/fastapi/_compat/__init__.py b/fastapi/_compat/__init__.py index 40810eab7a..42a4aca628 100644 --- a/fastapi/_compat/__init__.py +++ b/fastapi/_compat/__init__.py @@ -19,6 +19,7 @@ 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 535af07849..8587393ea4 100644 --- a/fastapi/_compat/v2.py +++ b/fastapi/_compat/v2.py @@ -1,6 +1,6 @@ import re import warnings -from collections.abc import Sequence +from collections.abc import Callable, Sequence from copy import copy from dataclasses import dataclass, is_dataclass from enum import Enum @@ -22,10 +22,10 @@ from pydantic import BaseModel, ConfigDict, Field, TypeAdapter, create_model from pydantic import PydanticSchemaGenerationError as PydanticSchemaGenerationError from pydantic import PydanticUndefinedAnnotation as PydanticUndefinedAnnotation from pydantic import ValidationError as ValidationError -from pydantic._internal._schema_generation_shared import ( # type: ignore[attr-defined] # ty: ignore[unused-ignore-comment] +from pydantic._internal import _typing_extra as _pydantic_typing_extra +from pydantic._internal._schema_generation_shared import ( # type: ignore[attr-defined] GetJsonSchemaHandler as GetJsonSchemaHandler, ) -from pydantic._internal._typing_extra import eval_type_lenient # ty: ignore[deprecated] from pydantic.fields import FieldInfo as FieldInfo from pydantic.json_schema import GenerateJsonSchema as _GenerateJsonSchema from pydantic.json_schema import JsonSchemaValue as JsonSchemaValue @@ -38,7 +38,25 @@ from pydantic_core.core_schema import ( RequiredParam = PydanticUndefined Undefined = PydanticUndefined -evaluate_forwardref = eval_type_lenient # ty: ignore[deprecated] + +# 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 + + +evaluate_forwardref = define_forwardref() class GenerateJsonSchema(_GenerateJsonSchema): diff --git a/fastapi/encoders.py b/fastapi/encoders.py index 84893dc808..7c46072041 100644 --- a/fastapi/encoders.py +++ b/fastapi/encoders.py @@ -22,12 +22,12 @@ from annotated_doc import Doc from fastapi.exceptions import PydanticV1NotSupportedError from fastapi.types import IncEx from pydantic import BaseModel -from pydantic.color import Color # ty: ignore[deprecated] from pydantic.networks import AnyUrl, NameEmail from pydantic.types import SecretBytes, SecretStr from pydantic_core import PydanticUndefinedType from ._compat import ( + Color, Url, is_pydantic_v1_model_instance, )