1
0
Fork 0
openapi-pydantic/openapi_pydantic/compat.py
Daniel Baumann 97e6d74bac
Adding upstream version 0.5.1.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-05-04 22:22:32 +02:00

119 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