Загрузить файлы в «venv/Lib/site-packages/pydantic/deprecated»
This commit is contained in:
141
venv/Lib/site-packages/pydantic/deprecated/json.py
Normal file
141
venv/Lib/site-packages/pydantic/deprecated/json.py
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
import datetime
|
||||||
|
import warnings
|
||||||
|
from collections import deque
|
||||||
|
from decimal import Decimal
|
||||||
|
from enum import Enum
|
||||||
|
from ipaddress import IPv4Address, IPv4Interface, IPv4Network, IPv6Address, IPv6Interface, IPv6Network
|
||||||
|
from pathlib import Path
|
||||||
|
from re import Pattern
|
||||||
|
from types import GeneratorType
|
||||||
|
from typing import TYPE_CHECKING, Any, Callable, Union
|
||||||
|
from uuid import UUID
|
||||||
|
|
||||||
|
from typing_extensions import deprecated
|
||||||
|
|
||||||
|
from .._internal._import_utils import import_cached_base_model
|
||||||
|
from ..color import Color
|
||||||
|
from ..networks import NameEmail
|
||||||
|
from ..types import SecretBytes, SecretStr
|
||||||
|
from ..warnings import PydanticDeprecatedSince20
|
||||||
|
|
||||||
|
if not TYPE_CHECKING:
|
||||||
|
# See PyCharm issues https://youtrack.jetbrains.com/issue/PY-21915
|
||||||
|
# and https://youtrack.jetbrains.com/issue/PY-51428
|
||||||
|
DeprecationWarning = PydanticDeprecatedSince20
|
||||||
|
|
||||||
|
__all__ = 'pydantic_encoder', 'custom_pydantic_encoder', 'timedelta_isoformat'
|
||||||
|
|
||||||
|
|
||||||
|
def isoformat(o: Union[datetime.date, datetime.time]) -> str:
|
||||||
|
return o.isoformat()
|
||||||
|
|
||||||
|
|
||||||
|
def decimal_encoder(dec_value: Decimal) -> Union[int, float]:
|
||||||
|
"""Encodes a Decimal as int of there's no exponent, otherwise float.
|
||||||
|
|
||||||
|
This is useful when we use ConstrainedDecimal to represent Numeric(x,0)
|
||||||
|
where a integer (but not int typed) is used. Encoding this as a float
|
||||||
|
results in failed round-tripping between encode and parse.
|
||||||
|
Our Id type is a prime example of this.
|
||||||
|
|
||||||
|
>>> decimal_encoder(Decimal("1.0"))
|
||||||
|
1.0
|
||||||
|
|
||||||
|
>>> decimal_encoder(Decimal("1"))
|
||||||
|
1
|
||||||
|
"""
|
||||||
|
exponent = dec_value.as_tuple().exponent
|
||||||
|
if isinstance(exponent, int) and exponent >= 0:
|
||||||
|
return int(dec_value)
|
||||||
|
else:
|
||||||
|
return float(dec_value)
|
||||||
|
|
||||||
|
|
||||||
|
ENCODERS_BY_TYPE: dict[type[Any], Callable[[Any], Any]] = {
|
||||||
|
bytes: lambda o: o.decode(),
|
||||||
|
Color: str,
|
||||||
|
datetime.date: isoformat,
|
||||||
|
datetime.datetime: isoformat,
|
||||||
|
datetime.time: isoformat,
|
||||||
|
datetime.timedelta: lambda td: td.total_seconds(),
|
||||||
|
Decimal: decimal_encoder,
|
||||||
|
Enum: lambda o: o.value,
|
||||||
|
frozenset: list,
|
||||||
|
deque: list,
|
||||||
|
GeneratorType: list,
|
||||||
|
IPv4Address: str,
|
||||||
|
IPv4Interface: str,
|
||||||
|
IPv4Network: str,
|
||||||
|
IPv6Address: str,
|
||||||
|
IPv6Interface: str,
|
||||||
|
IPv6Network: str,
|
||||||
|
NameEmail: str,
|
||||||
|
Path: str,
|
||||||
|
Pattern: lambda o: o.pattern,
|
||||||
|
SecretBytes: str,
|
||||||
|
SecretStr: str,
|
||||||
|
set: list,
|
||||||
|
UUID: str,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@deprecated(
|
||||||
|
'`pydantic_encoder` is deprecated, use `pydantic_core.to_jsonable_python` instead.',
|
||||||
|
category=None,
|
||||||
|
)
|
||||||
|
def pydantic_encoder(obj: Any) -> Any:
|
||||||
|
warnings.warn(
|
||||||
|
'`pydantic_encoder` is deprecated, use `pydantic_core.to_jsonable_python` instead.',
|
||||||
|
category=PydanticDeprecatedSince20,
|
||||||
|
stacklevel=2,
|
||||||
|
)
|
||||||
|
from dataclasses import asdict, is_dataclass
|
||||||
|
|
||||||
|
BaseModel = import_cached_base_model()
|
||||||
|
|
||||||
|
if isinstance(obj, BaseModel):
|
||||||
|
return obj.model_dump()
|
||||||
|
elif is_dataclass(obj):
|
||||||
|
return asdict(obj) # type: ignore
|
||||||
|
|
||||||
|
# Check the class type and its superclasses for a matching encoder
|
||||||
|
for base in obj.__class__.__mro__[:-1]:
|
||||||
|
try:
|
||||||
|
encoder = ENCODERS_BY_TYPE[base]
|
||||||
|
except KeyError:
|
||||||
|
continue
|
||||||
|
return encoder(obj)
|
||||||
|
else: # We have exited the for loop without finding a suitable encoder
|
||||||
|
raise TypeError(f"Object of type '{obj.__class__.__name__}' is not JSON serializable")
|
||||||
|
|
||||||
|
|
||||||
|
# TODO: Add a suggested migration path once there is a way to use custom encoders
|
||||||
|
@deprecated(
|
||||||
|
'`custom_pydantic_encoder` is deprecated, use `BaseModel.model_dump` instead.',
|
||||||
|
category=None,
|
||||||
|
)
|
||||||
|
def custom_pydantic_encoder(type_encoders: dict[Any, Callable[[type[Any]], Any]], obj: Any) -> Any:
|
||||||
|
warnings.warn(
|
||||||
|
'`custom_pydantic_encoder` is deprecated, use `BaseModel.model_dump` instead.',
|
||||||
|
category=PydanticDeprecatedSince20,
|
||||||
|
stacklevel=2,
|
||||||
|
)
|
||||||
|
# Check the class type and its superclasses for a matching encoder
|
||||||
|
for base in obj.__class__.__mro__[:-1]:
|
||||||
|
try:
|
||||||
|
encoder = type_encoders[base]
|
||||||
|
except KeyError:
|
||||||
|
continue
|
||||||
|
|
||||||
|
return encoder(obj)
|
||||||
|
else: # We have exited the for loop without finding a suitable encoder
|
||||||
|
return pydantic_encoder(obj)
|
||||||
|
|
||||||
|
|
||||||
|
@deprecated('`timedelta_isoformat` is deprecated.', category=None)
|
||||||
|
def timedelta_isoformat(td: datetime.timedelta) -> str:
|
||||||
|
"""ISO 8601 encoding for Python timedelta object."""
|
||||||
|
warnings.warn('`timedelta_isoformat` is deprecated.', category=PydanticDeprecatedSince20, stacklevel=2)
|
||||||
|
minutes, seconds = divmod(td.seconds, 60)
|
||||||
|
hours, minutes = divmod(minutes, 60)
|
||||||
|
return f'{"-" if td.days < 0 else ""}P{abs(td.days)}DT{hours:d}H{minutes:d}M{seconds:d}.{td.microseconds:06d}S'
|
||||||
80
venv/Lib/site-packages/pydantic/deprecated/parse.py
Normal file
80
venv/Lib/site-packages/pydantic/deprecated/parse.py
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import json
|
||||||
|
import pickle
|
||||||
|
import warnings
|
||||||
|
from enum import Enum
|
||||||
|
from pathlib import Path
|
||||||
|
from typing import TYPE_CHECKING, Any, Callable
|
||||||
|
|
||||||
|
from typing_extensions import deprecated
|
||||||
|
|
||||||
|
from ..warnings import PydanticDeprecatedSince20
|
||||||
|
|
||||||
|
if not TYPE_CHECKING:
|
||||||
|
# See PyCharm issues https://youtrack.jetbrains.com/issue/PY-21915
|
||||||
|
# and https://youtrack.jetbrains.com/issue/PY-51428
|
||||||
|
DeprecationWarning = PydanticDeprecatedSince20
|
||||||
|
|
||||||
|
|
||||||
|
class Protocol(str, Enum):
|
||||||
|
json = 'json'
|
||||||
|
pickle = 'pickle'
|
||||||
|
|
||||||
|
|
||||||
|
@deprecated('`load_str_bytes` is deprecated.', category=None)
|
||||||
|
def load_str_bytes(
|
||||||
|
b: str | bytes,
|
||||||
|
*,
|
||||||
|
content_type: str | None = None,
|
||||||
|
encoding: str = 'utf8',
|
||||||
|
proto: Protocol | None = None,
|
||||||
|
allow_pickle: bool = False,
|
||||||
|
json_loads: Callable[[str], Any] = json.loads,
|
||||||
|
) -> Any:
|
||||||
|
warnings.warn('`load_str_bytes` is deprecated.', category=PydanticDeprecatedSince20, stacklevel=2)
|
||||||
|
if proto is None and content_type:
|
||||||
|
if content_type.endswith(('json', 'javascript')):
|
||||||
|
pass
|
||||||
|
elif allow_pickle and content_type.endswith('pickle'):
|
||||||
|
proto = Protocol.pickle
|
||||||
|
else:
|
||||||
|
raise TypeError(f'Unknown content-type: {content_type}')
|
||||||
|
|
||||||
|
proto = proto or Protocol.json
|
||||||
|
|
||||||
|
if proto == Protocol.json:
|
||||||
|
if isinstance(b, bytes):
|
||||||
|
b = b.decode(encoding)
|
||||||
|
return json_loads(b) # type: ignore
|
||||||
|
elif proto == Protocol.pickle:
|
||||||
|
if not allow_pickle:
|
||||||
|
raise RuntimeError('Trying to decode with pickle with allow_pickle=False')
|
||||||
|
bb = b if isinstance(b, bytes) else b.encode() # type: ignore
|
||||||
|
return pickle.loads(bb)
|
||||||
|
else:
|
||||||
|
raise TypeError(f'Unknown protocol: {proto}')
|
||||||
|
|
||||||
|
|
||||||
|
@deprecated('`load_file` is deprecated.', category=None)
|
||||||
|
def load_file(
|
||||||
|
path: str | Path,
|
||||||
|
*,
|
||||||
|
content_type: str | None = None,
|
||||||
|
encoding: str = 'utf8',
|
||||||
|
proto: Protocol | None = None,
|
||||||
|
allow_pickle: bool = False,
|
||||||
|
json_loads: Callable[[str], Any] = json.loads,
|
||||||
|
) -> Any:
|
||||||
|
warnings.warn('`load_file` is deprecated.', category=PydanticDeprecatedSince20, stacklevel=2)
|
||||||
|
path = Path(path)
|
||||||
|
b = path.read_bytes()
|
||||||
|
if content_type is None:
|
||||||
|
if path.suffix in ('.js', '.json'):
|
||||||
|
proto = Protocol.json
|
||||||
|
elif path.suffix == '.pkl':
|
||||||
|
proto = Protocol.pickle
|
||||||
|
|
||||||
|
return load_str_bytes(
|
||||||
|
b, proto=proto, content_type=content_type, encoding=encoding, allow_pickle=allow_pickle, json_loads=json_loads
|
||||||
|
)
|
||||||
103
venv/Lib/site-packages/pydantic/deprecated/tools.py
Normal file
103
venv/Lib/site-packages/pydantic/deprecated/tools.py
Normal file
@@ -0,0 +1,103 @@
|
|||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import json
|
||||||
|
import warnings
|
||||||
|
from typing import TYPE_CHECKING, Any, Callable, TypeVar, Union
|
||||||
|
|
||||||
|
from typing_extensions import deprecated
|
||||||
|
|
||||||
|
from ..json_schema import DEFAULT_REF_TEMPLATE, GenerateJsonSchema
|
||||||
|
from ..type_adapter import TypeAdapter
|
||||||
|
from ..warnings import PydanticDeprecatedSince20
|
||||||
|
|
||||||
|
if not TYPE_CHECKING:
|
||||||
|
# See PyCharm issues https://youtrack.jetbrains.com/issue/PY-21915
|
||||||
|
# and https://youtrack.jetbrains.com/issue/PY-51428
|
||||||
|
DeprecationWarning = PydanticDeprecatedSince20
|
||||||
|
|
||||||
|
__all__ = 'parse_obj_as', 'schema_of', 'schema_json_of'
|
||||||
|
|
||||||
|
NameFactory = Union[str, Callable[[type[Any]], str]]
|
||||||
|
|
||||||
|
|
||||||
|
T = TypeVar('T')
|
||||||
|
|
||||||
|
|
||||||
|
@deprecated(
|
||||||
|
'`parse_obj_as` is deprecated. Use `pydantic.TypeAdapter.validate_python` instead.',
|
||||||
|
category=None,
|
||||||
|
)
|
||||||
|
def parse_obj_as(type_: type[T], obj: Any, type_name: NameFactory | None = None) -> T:
|
||||||
|
warnings.warn(
|
||||||
|
'`parse_obj_as` is deprecated. Use `pydantic.TypeAdapter.validate_python` instead.',
|
||||||
|
category=PydanticDeprecatedSince20,
|
||||||
|
stacklevel=2,
|
||||||
|
)
|
||||||
|
if type_name is not None: # pragma: no cover
|
||||||
|
warnings.warn(
|
||||||
|
'The type_name parameter is deprecated. parse_obj_as no longer creates temporary models',
|
||||||
|
DeprecationWarning,
|
||||||
|
stacklevel=2,
|
||||||
|
)
|
||||||
|
return TypeAdapter(type_).validate_python(obj)
|
||||||
|
|
||||||
|
|
||||||
|
@deprecated(
|
||||||
|
'`schema_of` is deprecated. Use `pydantic.TypeAdapter.json_schema` instead.',
|
||||||
|
category=None,
|
||||||
|
)
|
||||||
|
def schema_of(
|
||||||
|
type_: Any,
|
||||||
|
*,
|
||||||
|
title: NameFactory | None = None,
|
||||||
|
by_alias: bool = True,
|
||||||
|
ref_template: str = DEFAULT_REF_TEMPLATE,
|
||||||
|
schema_generator: type[GenerateJsonSchema] = GenerateJsonSchema,
|
||||||
|
) -> dict[str, Any]:
|
||||||
|
"""Generate a JSON schema (as dict) for the passed model or dynamically generated one."""
|
||||||
|
warnings.warn(
|
||||||
|
'`schema_of` is deprecated. Use `pydantic.TypeAdapter.json_schema` instead.',
|
||||||
|
category=PydanticDeprecatedSince20,
|
||||||
|
stacklevel=2,
|
||||||
|
)
|
||||||
|
res = TypeAdapter(type_).json_schema(
|
||||||
|
by_alias=by_alias,
|
||||||
|
schema_generator=schema_generator,
|
||||||
|
ref_template=ref_template,
|
||||||
|
)
|
||||||
|
if title is not None:
|
||||||
|
if isinstance(title, str):
|
||||||
|
res['title'] = title
|
||||||
|
else:
|
||||||
|
warnings.warn(
|
||||||
|
'Passing a callable for the `title` parameter is deprecated and no longer supported',
|
||||||
|
DeprecationWarning,
|
||||||
|
stacklevel=2,
|
||||||
|
)
|
||||||
|
res['title'] = title(type_)
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
@deprecated(
|
||||||
|
'`schema_json_of` is deprecated. Use `pydantic.TypeAdapter.json_schema` instead.',
|
||||||
|
category=None,
|
||||||
|
)
|
||||||
|
def schema_json_of(
|
||||||
|
type_: Any,
|
||||||
|
*,
|
||||||
|
title: NameFactory | None = None,
|
||||||
|
by_alias: bool = True,
|
||||||
|
ref_template: str = DEFAULT_REF_TEMPLATE,
|
||||||
|
schema_generator: type[GenerateJsonSchema] = GenerateJsonSchema,
|
||||||
|
**dumps_kwargs: Any,
|
||||||
|
) -> str:
|
||||||
|
"""Generate a JSON schema (as JSON) for the passed model or dynamically generated one."""
|
||||||
|
warnings.warn(
|
||||||
|
'`schema_json_of` is deprecated. Use `pydantic.TypeAdapter.json_schema` instead.',
|
||||||
|
category=PydanticDeprecatedSince20,
|
||||||
|
stacklevel=2,
|
||||||
|
)
|
||||||
|
return json.dumps(
|
||||||
|
schema_of(type_, title=title, by_alias=by_alias, ref_template=ref_template, schema_generator=schema_generator),
|
||||||
|
**dumps_kwargs,
|
||||||
|
)
|
||||||
Reference in New Issue
Block a user