You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

167 lines
6.8 KiB

# mypy: disable-error-code=attr-defined
# path: fastapi/_compat/__init__.py
"""
FastAPI Pydantic compatibility layer.
This module provides a v2-first compatibility layer that automatically
detects the Pydantic version and provides the appropriate symbols.
"""
from __future__ import annotations
from typing import Any
# Import the v1 proxy module - this provides lazy loading and controlled warnings
# Don't import at module level to avoid warnings
# Import legacy compatibility symbols for backward compatibility
# These are now imported dynamically from the appropriate v1/v2 modules
from .shared import PYDANTIC_V2
if PYDANTIC_V2:
from .v2 import BaseConfig as BaseConfig
from .v2 import PydanticSchemaGenerationError as PydanticSchemaGenerationError
from .v2 import RequiredParam as RequiredParam
from .v2 import Undefined as Undefined
from .v2 import UndefinedType as UndefinedType
from .v2 import Url as Url
from .v2 import Validator as Validator
from .v2 import _get_model_config as _get_model_config
from .v2 import _model_dump as _model_dump
from .v2 import _model_rebuild as _model_rebuild
from .v2 import copy_field_info as copy_field_info
from .v2 import create_body_model as create_body_model
from .v2 import evaluate_forwardref as evaluate_forwardref
from .v2 import get_annotation_from_field_info as get_annotation_from_field_info
from .v2 import get_definitions as get_definitions
from .v2 import get_missing_field_error as get_missing_field_error
from .v2 import get_schema_from_model_field as get_schema_from_model_field
from .v2 import is_bytes_field as is_bytes_field
from .v2 import is_bytes_sequence_field as is_bytes_sequence_field
from .v2 import is_scalar_field as is_scalar_field
from .v2 import is_scalar_sequence_field as is_scalar_sequence_field
from .v2 import is_sequence_field as is_sequence_field
from .v2 import serialize_sequence_value as serialize_sequence_value
from .v2 import (
with_info_plain_validator_function as with_info_plain_validator_function,
)
else:
from .v1 import BaseConfig as BaseConfig # type: ignore[assignment]
from .v1 import PydanticSchemaGenerationError as PydanticSchemaGenerationError # type: ignore[assignment] # noqa: I001
from .v1 import RequiredParam as RequiredParam # type: ignore[assignment]
from .v1 import Undefined as Undefined # type: ignore[assignment]
from .v1 import UndefinedType as UndefinedType # type: ignore[assignment]
from .v1 import Url as Url # type: ignore[assignment]
from .v1 import Validator as Validator # type: ignore[assignment]
from .v1 import _get_model_config as _get_model_config
from .v1 import _model_dump as _model_dump
from .v1 import _model_rebuild as _model_rebuild
from .v1 import copy_field_info as copy_field_info
from .v1 import create_body_model as create_body_model
from .v1 import evaluate_forwardref as evaluate_forwardref
from .v1 import get_annotation_from_field_info as get_annotation_from_field_info
from .v1 import get_definitions as get_definitions
from .v1 import get_missing_field_error as get_missing_field_error
from .v1 import get_schema_from_model_field as get_schema_from_model_field
from .v1 import is_bytes_field as is_bytes_field
from .v1 import is_bytes_sequence_field as is_bytes_sequence_field
from .v1 import is_scalar_field as is_scalar_field
from .v1 import is_scalar_sequence_field as is_scalar_sequence_field
from .v1 import is_sequence_field as is_sequence_field
from .v1 import serialize_sequence_value as serialize_sequence_value
from .v1 import (
with_info_plain_validator_function as with_info_plain_validator_function,
)
# Import functions that exist in main.py
from .main import _is_error_wrapper as _is_error_wrapper
from .main import _is_model_class as _is_model_class
from .main import _is_model_field as _is_model_field
from .main import _is_undefined as _is_undefined
from .main import get_cached_model_fields as get_cached_model_fields
from .main import get_compat_model_name_map as get_compat_model_name_map
from .model_field import ModelField as ModelField
from .shared import PYDANTIC_V2 as PYDANTIC_V2
from .shared import PYDANTIC_VERSION_MINOR_TUPLE as PYDANTIC_VERSION_MINOR_TUPLE
from .shared import annotation_is_pydantic_v1 as annotation_is_pydantic_v1
from .shared import field_annotation_is_scalar as field_annotation_is_scalar
from .shared import (
is_uploadfile_or_nonable_uploadfile_annotation as is_uploadfile_or_nonable_uploadfile_annotation,
)
from .shared import (
is_uploadfile_sequence_annotation as is_uploadfile_sequence_annotation,
)
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
# V1 symbols are available via the v1 proxy module
# Access them directly: from fastapi._compat import v1; v1.CoreSchema
# This avoids import-time access and warnings
# Export V1 symbols as Any to avoid import-time access
CoreSchema = Any
GetJsonSchemaHandler = Any
JsonSchemaValue = dict[str, Any]
def _normalize_errors(errors: Any) -> Any:
from importlib import import_module
v1 = import_module("fastapi._compat.v1") # proxy lazy
return v1._normalize_errors(errors)
# Make v1 available as an attribute
def __getattr__(name: str) -> Any:
if name == "v1":
# Import directly to avoid recursion
import importlib
return importlib.import_module("fastapi._compat.v1")
raise AttributeError(f"module 'fastapi._compat' has no attribute '{name}'")
# Explicitly export all compatibility symbols
__all__ = [
"PYDANTIC_V2",
"BaseConfig",
"PydanticSchemaGenerationError",
"RequiredParam",
"Undefined",
"UndefinedType",
"Url",
"Validator",
"_get_model_config",
"_model_dump",
"_model_rebuild",
"copy_field_info",
"create_body_model",
"evaluate_forwardref",
"get_annotation_from_field_info",
"get_definitions",
"get_missing_field_error",
"get_schema_from_model_field",
"is_bytes_field",
"is_bytes_sequence_field",
"is_scalar_field",
"is_scalar_sequence_field",
"is_sequence_field",
"serialize_sequence_value",
"with_info_plain_validator_function",
"_is_error_wrapper",
"_is_model_class",
"_is_model_field",
"_is_undefined",
"get_cached_model_fields",
"get_compat_model_name_map",
"ModelField",
"PYDANTIC_VERSION_MINOR_TUPLE",
"annotation_is_pydantic_v1",
"field_annotation_is_scalar",
"is_uploadfile_or_nonable_uploadfile_annotation",
"is_uploadfile_sequence_annotation",
"lenient_issubclass",
"sequence_types",
"value_is_sequence",
"CoreSchema",
"GetJsonSchemaHandler",
"JsonSchemaValue",
"_normalize_errors",
"v1",
]