Browse Source

support both Color classes in ENCODERS_BY_TYPE

pull/15101/head
svlandeg 4 months ago
parent
commit
6c76442f2b
  1. 1
      fastapi/_compat/__init__.py
  2. 12
      fastapi/_compat/v2.py
  3. 20
      fastapi/encoders.py

1
fastapi/_compat/__init__.py

@ -19,7 +19,6 @@ from .shared import (
from .shared import lenient_issubclass as lenient_issubclass from .shared import lenient_issubclass as lenient_issubclass
from .shared import sequence_types as sequence_types from .shared import sequence_types as sequence_types
from .shared import value_is_sequence as value_is_sequence 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 ModelField as ModelField
from .v2 import PydanticSchemaGenerationError as PydanticSchemaGenerationError from .v2 import PydanticSchemaGenerationError as PydanticSchemaGenerationError
from .v2 import RequiredParam as RequiredParam from .v2 import RequiredParam as RequiredParam

12
fastapi/_compat/v2.py

@ -23,7 +23,7 @@ from pydantic import PydanticSchemaGenerationError as PydanticSchemaGenerationEr
from pydantic import PydanticUndefinedAnnotation as PydanticUndefinedAnnotation from pydantic import PydanticUndefinedAnnotation as PydanticUndefinedAnnotation
from pydantic import ValidationError as ValidationError from pydantic import ValidationError as ValidationError
from pydantic._internal import _typing_extra as _pydantic_typing_extra 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, GetJsonSchemaHandler as GetJsonSchemaHandler,
) )
from pydantic.fields import FieldInfo as FieldInfo from pydantic.fields import FieldInfo as FieldInfo
@ -39,21 +39,13 @@ from pydantic_core.core_schema import (
RequiredParam = PydanticUndefined RequiredParam = PydanticUndefined
Undefined = 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]: def define_forwardref() -> Callable[..., Any]:
# eval_type_lenient has been deprecated since Pydantic v2.10.0b1 (PR #10530) # eval_type_lenient has been deprecated since Pydantic v2.10.0b1 (PR #10530)
try_eval_type = getattr(_pydantic_typing_extra, "try_eval_type", None) try_eval_type = getattr(_pydantic_typing_extra, "try_eval_type", None)
if try_eval_type is not None: if try_eval_type is not None:
return lambda *args: try_eval_type(*args)[0] 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() evaluate_forwardref = define_forwardref()

20
fastapi/encoders.py

@ -27,11 +27,26 @@ from pydantic.types import SecretBytes, SecretStr
from pydantic_core import PydanticUndefinedType from pydantic_core import PydanticUndefinedType
from ._compat import ( from ._compat import (
Color,
Url, Url,
is_pydantic_v1_model_instance, 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 # Taken from Pydantic v1 as is
def isoformat(o: datetime.date | datetime.time) -> str: 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]] = { ENCODERS_BY_TYPE: dict[type[Any], Callable[[Any], Any]] = {
bytes: lambda o: o.decode(), bytes: lambda o: o.decode(),
Color: str, # ty: ignore[deprecated] Color: str,
PyExtraColor: str,
datetime.date: isoformat, datetime.date: isoformat,
datetime.datetime: isoformat, datetime.datetime: isoformat,
datetime.time: isoformat, datetime.time: isoformat,

Loading…
Cancel
Save