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 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

12
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()

20
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,

Loading…
Cancel
Save