120 lines
3.2 KiB
Python
120 lines
3.2 KiB
Python
|
"""Compatibility layer to make this package usable with Pydantic 1 or 2"""
|
||
|
|
||
|
from typing import TYPE_CHECKING, Dict, List, Optional, Tuple
|
||
|
|
||
|
from pydantic.version import VERSION as PYDANTIC_VERSION
|
||
|
|
||
|
__all__ = [
|
||
|
"PYDANTIC_V2",
|
||
|
"ConfigDict",
|
||
|
"JsonSchemaMode",
|
||
|
"models_json_schema",
|
||
|
"RootModel",
|
||
|
"Extra",
|
||
|
"v1_schema",
|
||
|
"DEFS_KEY",
|
||
|
"min_length_arg",
|
||
|
]
|
||
|
|
||
|
PYDANTIC_MAJOR_VERSION = int(PYDANTIC_VERSION.split(".", 1)[0])
|
||
|
PYDANTIC_MINOR_VERSION = int(PYDANTIC_VERSION.split(".")[1])
|
||
|
PYDANTIC_V2 = PYDANTIC_MAJOR_VERSION >= 2
|
||
|
|
||
|
if TYPE_CHECKING:
|
||
|
# Provide stubs for either version of Pydantic
|
||
|
|
||
|
from enum import Enum
|
||
|
from typing import Any, Literal, Type, TypedDict
|
||
|
|
||
|
from pydantic import BaseModel
|
||
|
from pydantic import ConfigDict as PydanticConfigDict
|
||
|
|
||
|
def ConfigDict(
|
||
|
extra: Literal["allow", "ignore", "forbid"] = "allow",
|
||
|
json_schema_extra: Optional[Dict[str, Any]] = None,
|
||
|
populate_by_name: bool = True,
|
||
|
) -> PydanticConfigDict:
|
||
|
"""Stub for pydantic.ConfigDict in Pydantic 2"""
|
||
|
...
|
||
|
|
||
|
class Extra(Enum):
|
||
|
"""Stub for pydantic.Extra in Pydantic 1"""
|
||
|
|
||
|
allow = "allow"
|
||
|
ignore = "ignore"
|
||
|
forbid = "forbid"
|
||
|
|
||
|
class RootModel(BaseModel):
|
||
|
"""Stub for pydantic.RootModel in Pydantic 2"""
|
||
|
|
||
|
JsonSchemaMode = Literal["validation", "serialization"]
|
||
|
|
||
|
def models_json_schema(
|
||
|
models: List[Tuple[Type[BaseModel], JsonSchemaMode]],
|
||
|
*,
|
||
|
by_alias: bool = True,
|
||
|
ref_template: str = "#/$defs/{model}",
|
||
|
schema_generator: Optional[type] = None,
|
||
|
) -> Tuple[Dict, Dict[str, Any]]:
|
||
|
"""Stub for pydantic.json_schema.models_json_schema in Pydantic 2"""
|
||
|
...
|
||
|
|
||
|
def v1_schema(
|
||
|
models: List[Type[BaseModel]],
|
||
|
*,
|
||
|
by_alias: bool = True,
|
||
|
ref_prefix: str = "#/$defs",
|
||
|
) -> Dict[str, Any]:
|
||
|
"""Stub for pydantic.schema.schema in Pydantic 1"""
|
||
|
...
|
||
|
|
||
|
DEFS_KEY = "$defs"
|
||
|
|
||
|
class MinLengthArg(TypedDict):
|
||
|
pass
|
||
|
|
||
|
def min_length_arg(min_length: int) -> MinLengthArg:
|
||
|
"""Generate a min_length or min_items parameter for Field(...)"""
|
||
|
...
|
||
|
|
||
|
elif PYDANTIC_V2:
|
||
|
from typing import TypedDict
|
||
|
|
||
|
from pydantic import ConfigDict, RootModel
|
||
|
from pydantic.json_schema import JsonSchemaMode, models_json_schema
|
||
|
|
||
|
# Pydantic 2 renders JSON schemas using the keyword "$defs"
|
||
|
DEFS_KEY = "$defs"
|
||
|
|
||
|
class MinLengthArg(TypedDict):
|
||
|
min_length: int
|
||
|
|
||
|
def min_length_arg(min_length: int) -> MinLengthArg:
|
||
|
return {"min_length": min_length}
|
||
|
|
||
|
# Create V1 stubs. These should not be used when PYDANTIC_V2 is true.
|
||
|
Extra = None
|
||
|
v1_schema = None
|
||
|
|
||
|
|
||
|
else:
|
||
|
from typing import TypedDict
|
||
|
|
||
|
from pydantic import Extra
|
||
|
from pydantic.schema import schema as v1_schema
|
||
|
|
||
|
# Pydantic 1 renders JSON schemas using the keyword "definitions"
|
||
|
DEFS_KEY = "definitions"
|
||
|
|
||
|
class MinLengthArg(TypedDict):
|
||
|
min_items: int
|
||
|
|
||
|
def min_length_arg(min_length: int) -> MinLengthArg:
|
||
|
return {"min_items": min_length}
|
||
|
|
||
|
# Create V2 stubs. These should not be used when PYDANTIC_V2 is false.
|
||
|
ConfigDict = None
|
||
|
models_json_schema = None
|
||
|
JsonSchemaMode = None
|
||
|
RootModel = None
|