forked from pool/python-pydantic
Compare commits
27 Commits
| Author | SHA256 | Date | |
|---|---|---|---|
| 7fc62866e3 | |||
| 34e6e0e634 | |||
| 64fbc5e7ed | |||
| b1ff532f4b | |||
| 5bf97a6b2c | |||
| 2c4c1b50c1 | |||
| 1ea69de383 | |||
| 208724cd37 | |||
| bea0b9037f | |||
| 3228196e9e | |||
| 5af452c66c | |||
| 7adac6edca | |||
| 436ce7ee8c | |||
| 32e7f1b8ff | |||
| 3f75a1e5fd | |||
| dd01ec6e92 | |||
| eb3735017a | |||
| f4aac336ef | |||
| d90714d9d3 | |||
| de0fe174bb | |||
| 10800831eb | |||
| d5dea0fe9d | |||
| 419eb8bf13 | |||
| b20ae8e003 | |||
| 20e9354ff7 | |||
| 273690b8e0 | |||
| fd0f827663 |
@@ -1,424 +0,0 @@
|
|||||||
From 4494c31a4834bdc2301cfa3d94f4bbc62c2774dc Mon Sep 17 00:00:00 2001
|
|
||||||
From: Viicos <65306057+Viicos@users.noreply.github.com>
|
|
||||||
Date: Wed, 11 Jun 2025 14:52:26 +0200
|
|
||||||
Subject: [PATCH] Bump `pydantic-core` to v2.35.1
|
|
||||||
|
|
||||||
Make use of `ensure_ascii` option
|
|
||||||
Update typechecking tests
|
|
||||||
Remove core schema validation hook
|
|
||||||
---
|
|
||||||
docs/api/standard_library_types.md | 2 +-
|
|
||||||
docs/why.md | 2 +-
|
|
||||||
pydantic/_internal/_core_utils.py | 8 -
|
|
||||||
pydantic/_internal/_generate_schema.py | 5 +-
|
|
||||||
pydantic/functional_serializers.py | 4 +-
|
|
||||||
pydantic/functional_validators.py | 10 +-
|
|
||||||
pydantic/main.py | 4 +
|
|
||||||
pydantic/type_adapter.py | 3 +
|
|
||||||
pydantic/version.py | 2 +-
|
|
||||||
pyproject.toml | 4 +-
|
|
||||||
tests/typechecking/decorators.py | 79 +++++++--
|
|
||||||
12 files changed, 203 insertions(+), 140 deletions(-)
|
|
||||||
|
|
||||||
Index: pydantic-2.11.7/docs/api/standard_library_types.md
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.7.orig/docs/api/standard_library_types.md
|
|
||||||
+++ pydantic-2.11.7/docs/api/standard_library_types.md
|
|
||||||
@@ -81,7 +81,7 @@ event = Event(dt='2032-04-23T10:20:30.40
|
|
||||||
|
|
||||||
print(event.model_dump())
|
|
||||||
"""
|
|
||||||
-{'dt': datetime.datetime(2032, 4, 23, 10, 20, 30, 400000, tzinfo=TzInfo(+02:30))}
|
|
||||||
+{'dt': datetime.datetime(2032, 4, 23, 10, 20, 30, 400000, tzinfo=TzInfo(9000))}
|
|
||||||
"""
|
|
||||||
```
|
|
||||||
|
|
||||||
Index: pydantic-2.11.7/docs/why.md
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.7.orig/docs/why.md
|
|
||||||
+++ pydantic-2.11.7/docs/why.md
|
|
||||||
@@ -363,7 +363,7 @@ Functional validators and serializers, a
|
|
||||||
|
|
||||||
|
|
||||||
print(Meeting(when='2020-01-01T12:00+01:00'))
|
|
||||||
- #> when=datetime.datetime(2020, 1, 1, 12, 0, tzinfo=TzInfo(+01:00))
|
|
||||||
+ #> when=datetime.datetime(2020, 1, 1, 12, 0, tzinfo=TzInfo(3600))
|
|
||||||
print(Meeting(when='now'))
|
|
||||||
#> when=datetime.datetime(2032, 1, 2, 3, 4, 5, 6)
|
|
||||||
print(Meeting(when='2020-01-01T12:00'))
|
|
||||||
Index: pydantic-2.11.7/pydantic/_internal/_core_utils.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.7.orig/pydantic/_internal/_core_utils.py
|
|
||||||
+++ pydantic-2.11.7/pydantic/_internal/_core_utils.py
|
|
||||||
@@ -1,12 +1,10 @@
|
|
||||||
from __future__ import annotations
|
|
||||||
|
|
||||||
import inspect
|
|
||||||
-import os
|
|
||||||
from collections.abc import Mapping, Sequence
|
|
||||||
from typing import TYPE_CHECKING, Any, Union
|
|
||||||
|
|
||||||
from pydantic_core import CoreSchema, core_schema
|
|
||||||
-from pydantic_core import validate_core_schema as _validate_core_schema
|
|
||||||
from typing_extensions import TypeGuard, get_args, get_origin
|
|
||||||
from typing_inspection import typing_objects
|
|
||||||
|
|
||||||
@@ -109,12 +107,6 @@ def get_ref(s: core_schema.CoreSchema) -
|
|
||||||
return s.get('ref', None)
|
|
||||||
|
|
||||||
|
|
||||||
-def validate_core_schema(schema: CoreSchema) -> CoreSchema:
|
|
||||||
- if os.getenv('PYDANTIC_VALIDATE_CORE_SCHEMAS'):
|
|
||||||
- return _validate_core_schema(schema)
|
|
||||||
- return schema
|
|
||||||
-
|
|
||||||
-
|
|
||||||
def _clean_schema_for_pretty_print(obj: Any, strip_metadata: bool = True) -> Any: # pragma: no cover
|
|
||||||
"""A utility function to remove irrelevant information from a core schema."""
|
|
||||||
if isinstance(obj, Mapping):
|
|
||||||
Index: pydantic-2.11.7/pydantic/_internal/_generate_schema.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.7.orig/pydantic/_internal/_generate_schema.py
|
|
||||||
+++ pydantic-2.11.7/pydantic/_internal/_generate_schema.py
|
|
||||||
@@ -70,7 +70,6 @@ from ._core_utils import (
|
|
||||||
get_ref,
|
|
||||||
get_type_ref,
|
|
||||||
is_list_like_schema_with_items_schema,
|
|
||||||
- validate_core_schema,
|
|
||||||
)
|
|
||||||
from ._decorators import (
|
|
||||||
Decorator,
|
|
||||||
@@ -666,9 +665,7 @@ class GenerateSchema:
|
|
||||||
return schema
|
|
||||||
|
|
||||||
def clean_schema(self, schema: CoreSchema) -> CoreSchema:
|
|
||||||
- schema = self.defs.finalize_schema(schema)
|
|
||||||
- schema = validate_core_schema(schema)
|
|
||||||
- return schema
|
|
||||||
+ return self.defs.finalize_schema(schema)
|
|
||||||
|
|
||||||
def _add_js_function(self, metadata_schema: CoreSchema, js_function: Callable[..., Any]) -> None:
|
|
||||||
metadata = metadata_schema.get('metadata', {})
|
|
||||||
Index: pydantic-2.11.7/pydantic/functional_serializers.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.7.orig/pydantic/functional_serializers.py
|
|
||||||
+++ pydantic-2.11.7/pydantic/functional_serializers.py
|
|
||||||
@@ -300,7 +300,7 @@ def field_serializer(
|
|
||||||
if TYPE_CHECKING:
|
|
||||||
# The first argument in the following callables represent the `self` type:
|
|
||||||
|
|
||||||
- ModelPlainSerializerWithInfo: TypeAlias = Callable[[Any, SerializationInfo], Any]
|
|
||||||
+ ModelPlainSerializerWithInfo: TypeAlias = Callable[[Any, SerializationInfo[Any]], Any]
|
|
||||||
"""A model serializer method with the `info` argument, in `plain` mode."""
|
|
||||||
|
|
||||||
ModelPlainSerializerWithoutInfo: TypeAlias = Callable[[Any], Any]
|
|
||||||
@@ -309,7 +309,7 @@ if TYPE_CHECKING:
|
|
||||||
ModelPlainSerializer: TypeAlias = 'ModelPlainSerializerWithInfo | ModelPlainSerializerWithoutInfo'
|
|
||||||
"""A model serializer method in `plain` mode."""
|
|
||||||
|
|
||||||
- ModelWrapSerializerWithInfo: TypeAlias = Callable[[Any, SerializerFunctionWrapHandler, SerializationInfo], Any]
|
|
||||||
+ ModelWrapSerializerWithInfo: TypeAlias = Callable[[Any, SerializerFunctionWrapHandler, SerializationInfo[Any]], Any]
|
|
||||||
"""A model serializer method with the `info` argument, in `wrap` mode."""
|
|
||||||
|
|
||||||
ModelWrapSerializerWithoutInfo: TypeAlias = Callable[[Any, SerializerFunctionWrapHandler], Any]
|
|
||||||
Index: pydantic-2.11.7/pydantic/functional_validators.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.7.orig/pydantic/functional_validators.py
|
|
||||||
+++ pydantic-2.11.7/pydantic/functional_validators.py
|
|
||||||
@@ -332,7 +332,7 @@ if TYPE_CHECKING:
|
|
||||||
def __call__(self, cls: Any, value: Any, /) -> Any: ...
|
|
||||||
|
|
||||||
class _V2ValidatorClsMethod(Protocol):
|
|
||||||
- def __call__(self, cls: Any, value: Any, info: _core_schema.ValidationInfo, /) -> Any: ...
|
|
||||||
+ def __call__(self, cls: Any, value: Any, info: core_schema.ValidationInfo[Any], /) -> Any: ...
|
|
||||||
|
|
||||||
class _OnlyValueWrapValidatorClsMethod(Protocol):
|
|
||||||
def __call__(self, cls: Any, value: Any, handler: _core_schema.ValidatorFunctionWrapHandler, /) -> Any: ...
|
|
||||||
@@ -343,7 +343,7 @@ if TYPE_CHECKING:
|
|
||||||
cls: Any,
|
|
||||||
value: Any,
|
|
||||||
handler: _core_schema.ValidatorFunctionWrapHandler,
|
|
||||||
- info: _core_schema.ValidationInfo,
|
|
||||||
+ info: core_schema.ValidationInfo[Any],
|
|
||||||
/,
|
|
||||||
) -> Any: ...
|
|
||||||
|
|
||||||
@@ -559,7 +559,7 @@ class ModelWrapValidator(Protocol[_Model
|
|
||||||
# thus validators _must_ handle all cases
|
|
||||||
value: Any,
|
|
||||||
handler: ModelWrapValidatorHandler[_ModelType],
|
|
||||||
- info: _core_schema.ValidationInfo,
|
|
||||||
+ info: core_schema.ValidationInfo[Any],
|
|
||||||
/,
|
|
||||||
) -> _ModelType: ...
|
|
||||||
|
|
||||||
@@ -604,7 +604,7 @@ class FreeModelBeforeValidator(Protocol)
|
|
||||||
# or anything else that gets passed to validate_python
|
|
||||||
# thus validators _must_ handle all cases
|
|
||||||
value: Any,
|
|
||||||
- info: _core_schema.ValidationInfo,
|
|
||||||
+ info: core_schema.ValidationInfo[Any],
|
|
||||||
/,
|
|
||||||
) -> Any: ...
|
|
||||||
|
|
||||||
@@ -619,7 +619,7 @@ class ModelBeforeValidator(Protocol):
|
|
||||||
# or anything else that gets passed to validate_python
|
|
||||||
# thus validators _must_ handle all cases
|
|
||||||
value: Any,
|
|
||||||
- info: _core_schema.ValidationInfo,
|
|
||||||
+ info: core_schema.ValidationInfo[Any],
|
|
||||||
/,
|
|
||||||
) -> Any: ...
|
|
||||||
|
|
||||||
@@ -629,7 +629,7 @@ ModelAfterValidatorWithoutInfo = Callabl
|
|
||||||
have info argument.
|
|
||||||
"""
|
|
||||||
|
|
||||||
-ModelAfterValidator = Callable[[_ModelType, _core_schema.ValidationInfo], _ModelType]
|
|
||||||
+ModelAfterValidator = Callable[[_ModelType, core_schema.ValidationInfo[Any]], _ModelType]
|
|
||||||
"""A `@model_validator` decorated function signature. This is used when `mode='after'`."""
|
|
||||||
|
|
||||||
_AnyModelWrapValidator = Union[ModelWrapValidator[_ModelType], ModelWrapValidatorWithoutInfo[_ModelType]]
|
|
||||||
Index: pydantic-2.11.7/pydantic/main.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.7.orig/pydantic/main.py
|
|
||||||
+++ pydantic-2.11.7/pydantic/main.py
|
|
||||||
@@ -480,6 +480,7 @@ class BaseModel(metaclass=_model_constru
|
|
||||||
self,
|
|
||||||
*,
|
|
||||||
indent: int | None = None,
|
|
||||||
+ ensure_ascii: bool = False,
|
|
||||||
include: IncEx | None = None,
|
|
||||||
exclude: IncEx | None = None,
|
|
||||||
context: Any | None = None,
|
|
||||||
@@ -499,6 +500,8 @@ class BaseModel(metaclass=_model_constru
|
|
||||||
|
|
||||||
Args:
|
|
||||||
indent: Indentation to use in the JSON output. If None is passed, the output will be compact.
|
|
||||||
+ ensure_ascii: If `True`, the output is guaranteed to have all incoming non-ASCII characters escaped.
|
|
||||||
+ If `False` (the default), these characters will be output as-is.
|
|
||||||
include: Field(s) to include in the JSON output.
|
|
||||||
exclude: Field(s) to exclude from the JSON output.
|
|
||||||
context: Additional context to pass to the serializer.
|
|
||||||
@@ -519,6 +522,7 @@ class BaseModel(metaclass=_model_constru
|
|
||||||
return self.__pydantic_serializer__.to_json(
|
|
||||||
self,
|
|
||||||
indent=indent,
|
|
||||||
+ ensure_ascii=ensure_ascii,
|
|
||||||
include=include,
|
|
||||||
exclude=exclude,
|
|
||||||
context=context,
|
|
||||||
Index: pydantic-2.11.7/pydantic/type_adapter.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.7.orig/pydantic/type_adapter.py
|
|
||||||
+++ pydantic-2.11.7/pydantic/type_adapter.py
|
|
||||||
@@ -591,6 +591,7 @@ class TypeAdapter(Generic[T]):
|
|
||||||
/,
|
|
||||||
*,
|
|
||||||
indent: int | None = None,
|
|
||||||
+ ensure_ascii: bool = False,
|
|
||||||
include: IncEx | None = None,
|
|
||||||
exclude: IncEx | None = None,
|
|
||||||
by_alias: bool | None = None,
|
|
||||||
@@ -611,6 +612,8 @@ class TypeAdapter(Generic[T]):
|
|
||||||
Args:
|
|
||||||
instance: The instance to be serialized.
|
|
||||||
indent: Number of spaces for JSON indentation.
|
|
||||||
+ ensure_ascii: If `True`, the output is guaranteed to have all incoming non-ASCII characters escaped.
|
|
||||||
+ If `False` (the default), these characters will be output as-is.
|
|
||||||
include: Fields to include.
|
|
||||||
exclude: Fields to exclude.
|
|
||||||
by_alias: Whether to use alias names for field names.
|
|
||||||
Index: pydantic-2.11.7/pydantic/version.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.7.orig/pydantic/version.py
|
|
||||||
+++ pydantic-2.11.7/pydantic/version.py
|
|
||||||
@@ -66,7 +66,7 @@ def version_info() -> str:
|
|
||||||
def check_pydantic_core_version() -> bool:
|
|
||||||
"""Check that the installed `pydantic-core` dependency is compatible."""
|
|
||||||
# Keep this in sync with the version constraint in the `pyproject.toml` dependencies:
|
|
||||||
- return __pydantic_core_version__ == '2.33.2'
|
|
||||||
+ return __pydantic_core_version__ == '2.35.1'
|
|
||||||
|
|
||||||
|
|
||||||
def parse_mypy_version(version: str) -> tuple[int, int, int]:
|
|
||||||
Index: pydantic-2.11.7/pyproject.toml
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.7.orig/pyproject.toml
|
|
||||||
+++ pydantic-2.11.7/pyproject.toml
|
|
||||||
@@ -43,10 +43,10 @@ classifiers = [
|
|
||||||
]
|
|
||||||
requires-python = '>=3.9'
|
|
||||||
dependencies = [
|
|
||||||
- 'typing-extensions>=4.12.2',
|
|
||||||
+ 'typing-extensions>=4.13.0',
|
|
||||||
'annotated-types>=0.6.0',
|
|
||||||
# Keep this in sync with the version in the `check_pydantic_core_version()` function:
|
|
||||||
- 'pydantic-core==2.33.2',
|
|
||||||
+ 'pydantic-core==2.35.1',
|
|
||||||
'typing-inspection>=0.4.0',
|
|
||||||
]
|
|
||||||
dynamic = ['version', 'readme']
|
|
||||||
Index: pydantic-2.11.7/tests/typechecking/decorators.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.7.orig/tests/typechecking/decorators.py
|
|
||||||
+++ pydantic-2.11.7/tests/typechecking/decorators.py
|
|
||||||
@@ -31,13 +31,25 @@ class BeforeModelValidator(BaseModel):
|
|
||||||
"""TODO This shouldn't be valid. At runtime, `self` is the actual value and `value` is the `ValidationInfo` instance."""
|
|
||||||
|
|
||||||
@model_validator(mode='before')
|
|
||||||
- def valid_method_info(self, value: Any, info: ValidationInfo) -> Any: ...
|
|
||||||
+ def valid_method_info_default(self, value: Any, info: ValidationInfo) -> Any: ...
|
|
||||||
+
|
|
||||||
+ @model_validator(mode='before')
|
|
||||||
+ def valid_method_info(self, value: Any, info: ValidationInfo[int]) -> Any:
|
|
||||||
+ assert_type(info.context, int)
|
|
||||||
|
|
||||||
@model_validator(mode='before')
|
|
||||||
@classmethod
|
|
||||||
def valid_classmethod(cls, value: Any) -> Any: ...
|
|
||||||
|
|
||||||
@model_validator(mode='before')
|
|
||||||
+ @classmethod
|
|
||||||
+ def valid_classmethod_info_default(cls, value: Any, info: ValidationInfo) -> Any: ...
|
|
||||||
+
|
|
||||||
+ @model_validator(mode='before')
|
|
||||||
+ @classmethod
|
|
||||||
+ def valid_classmethod_info(cls, value: Any, info: ValidationInfo[int]) -> Any: ...
|
|
||||||
+
|
|
||||||
+ @model_validator(mode='before')
|
|
||||||
@staticmethod
|
|
||||||
def valid_staticmethod(value: Any) -> Any: ...
|
|
||||||
|
|
||||||
@@ -91,7 +103,10 @@ class AfterModelValidator(BaseModel):
|
|
||||||
def valid_method_no_info(self) -> Self: ...
|
|
||||||
|
|
||||||
@model_validator(mode='after')
|
|
||||||
- def valid_method_info(self, info: ValidationInfo) -> Self: ...
|
|
||||||
+ def valid_method_info_default(self, info: ValidationInfo) -> Self: ...
|
|
||||||
+
|
|
||||||
+ @model_validator(mode='after')
|
|
||||||
+ def valid_method_info(self, info: ValidationInfo[int]) -> Self: ...
|
|
||||||
|
|
||||||
|
|
||||||
class BeforeFieldValidator(BaseModel):
|
|
||||||
@@ -114,7 +129,11 @@ class BeforeFieldValidator(BaseModel):
|
|
||||||
|
|
||||||
@field_validator('foo', mode='before', json_schema_input_type=int) # `json_schema_input_type` allowed here.
|
|
||||||
@classmethod
|
|
||||||
- def valid_with_info(cls, value: Any, info: ValidationInfo) -> Any: ...
|
|
||||||
+ def valid_with_info_default(cls, value: Any, info: ValidationInfo) -> Any: ...
|
|
||||||
+
|
|
||||||
+ @field_validator('foo', mode='before', json_schema_input_type=int) # `json_schema_input_type` allowed here.
|
|
||||||
+ @classmethod
|
|
||||||
+ def valid_with_info(cls, value: Any, info: ValidationInfo[int]) -> Any: ...
|
|
||||||
|
|
||||||
|
|
||||||
class AfterFieldValidator(BaseModel):
|
|
||||||
@@ -122,6 +141,14 @@ class AfterFieldValidator(BaseModel):
|
|
||||||
@classmethod
|
|
||||||
def valid_classmethod(cls, value: Any) -> Any: ...
|
|
||||||
|
|
||||||
+ @field_validator('foo', mode='after')
|
|
||||||
+ @classmethod
|
|
||||||
+ def valid_classmethod_info_default(cls, value: Any, info: ValidationInfo) -> Any: ...
|
|
||||||
+
|
|
||||||
+ @field_validator('foo', mode='after')
|
|
||||||
+ @classmethod
|
|
||||||
+ def valid_classmethod_info(cls, value: Any, info: ValidationInfo[int]) -> Any: ...
|
|
||||||
+
|
|
||||||
@field_validator('foo', mode='after', json_schema_input_type=int) # type: ignore[call-overload] # pyright: ignore[reportCallIssue, reportArgumentType]
|
|
||||||
@classmethod
|
|
||||||
def invalid_input_type_not_allowed(cls, value: Any) -> Any: ...
|
|
||||||
@@ -148,7 +175,13 @@ class WrapFieldValidator(BaseModel):
|
|
||||||
|
|
||||||
@field_validator('foo', mode='wrap', json_schema_input_type=int) # `json_schema_input_type` allowed here.
|
|
||||||
@classmethod
|
|
||||||
- def valid_with_info(cls, value: Any, handler: ValidatorFunctionWrapHandler, info: ValidationInfo) -> Any: ...
|
|
||||||
+ def valid_with_info_default(
|
|
||||||
+ cls, value: Any, handler: ValidatorFunctionWrapHandler, info: ValidationInfo
|
|
||||||
+ ) -> Any: ...
|
|
||||||
+
|
|
||||||
+ @field_validator('foo', mode='wrap', json_schema_input_type=int) # `json_schema_input_type` allowed here.
|
|
||||||
+ @classmethod
|
|
||||||
+ def valid_with_info(cls, value: Any, handler: ValidatorFunctionWrapHandler, info: ValidationInfo[int]) -> Any: ...
|
|
||||||
|
|
||||||
|
|
||||||
class PlainModelSerializer(BaseModel):
|
|
||||||
@@ -162,7 +195,10 @@ class PlainModelSerializer(BaseModel):
|
|
||||||
def valid_plain_serializer_2(self) -> Any: ...
|
|
||||||
|
|
||||||
@model_serializer(mode='plain')
|
|
||||||
- def valid_plain_serializer_info(self, info: SerializationInfo) -> Any: ...
|
|
||||||
+ def valid_plain_serializer_info_default(self, info: SerializationInfo) -> Any: ...
|
|
||||||
+
|
|
||||||
+ @model_serializer(mode='plain')
|
|
||||||
+ def valid_plain_serializer_info(self, info: SerializationInfo[int]) -> Any: ...
|
|
||||||
|
|
||||||
|
|
||||||
class WrapModelSerializer(BaseModel):
|
|
||||||
@@ -175,7 +211,12 @@ class WrapModelSerializer(BaseModel):
|
|
||||||
return value
|
|
||||||
|
|
||||||
@model_serializer(mode='wrap')
|
|
||||||
- def valid_info(self, handler: SerializerFunctionWrapHandler, info: SerializationInfo) -> Any:
|
|
||||||
+ def valid_info_default(self, handler: SerializerFunctionWrapHandler, info: SerializationInfo) -> Any:
|
|
||||||
+ value = handler(self)
|
|
||||||
+ return value
|
|
||||||
+
|
|
||||||
+ @model_serializer(mode='wrap')
|
|
||||||
+ def valid_info(self, handler: SerializerFunctionWrapHandler, info: SerializationInfo[int]) -> Any:
|
|
||||||
value = handler(self)
|
|
||||||
return value
|
|
||||||
|
|
||||||
@@ -205,7 +246,10 @@ class PlainFieldSerializer(BaseModel):
|
|
||||||
"""
|
|
||||||
|
|
||||||
@field_serializer('a', mode='plain')
|
|
||||||
- def valid_method_info(self, value: Any, info: FieldSerializationInfo) -> Any: ...
|
|
||||||
+ def valid_method_info_default(self, value: Any, info: FieldSerializationInfo) -> Any: ...
|
|
||||||
+
|
|
||||||
+ @field_serializer('a', mode='plain')
|
|
||||||
+ def valid_method_info(self, value: Any, info: FieldSerializationInfo[int]) -> Any: ...
|
|
||||||
|
|
||||||
@field_serializer('a', mode='plain')
|
|
||||||
@staticmethod
|
|
||||||
@@ -213,7 +257,11 @@ class PlainFieldSerializer(BaseModel):
|
|
||||||
|
|
||||||
@field_serializer('a', mode='plain')
|
|
||||||
@staticmethod
|
|
||||||
- def valid_staticmethod_info(value: Any, info: FieldSerializationInfo) -> Any: ...
|
|
||||||
+ def valid_staticmethod_info_default(value: Any, info: FieldSerializationInfo) -> Any: ...
|
|
||||||
+
|
|
||||||
+ @field_serializer('a', mode='plain')
|
|
||||||
+ @staticmethod
|
|
||||||
+ def valid_staticmethod_info(value: Any, info: FieldSerializationInfo[int]) -> Any: ...
|
|
||||||
|
|
||||||
@field_serializer('a', mode='plain')
|
|
||||||
@classmethod
|
|
||||||
@@ -221,7 +269,11 @@ class PlainFieldSerializer(BaseModel):
|
|
||||||
|
|
||||||
@field_serializer('a', mode='plain')
|
|
||||||
@classmethod
|
|
||||||
- def valid_classmethod_info(cls, value: Any, info: FieldSerializationInfo) -> Any: ...
|
|
||||||
+ def valid_classmethod_info_default(cls, value: Any, info: FieldSerializationInfo) -> Any: ...
|
|
||||||
+
|
|
||||||
+ @field_serializer('a', mode='plain')
|
|
||||||
+ @classmethod
|
|
||||||
+ def valid_classmethod_info(cls, value: Any, info: FieldSerializationInfo[int]) -> Any: ...
|
|
||||||
|
|
||||||
partial_ = field_serializer('a', mode='plain')(partial(lambda v, x: v, x=1))
|
|
||||||
|
|
||||||
@@ -250,4 +302,11 @@ class WrapFieldSerializer(BaseModel):
|
|
||||||
def valid_no_info(self, value: Any, handler: SerializerFunctionWrapHandler) -> Any: ...
|
|
||||||
|
|
||||||
@field_serializer('a', mode='wrap')
|
|
||||||
- def valid_info(self, value: Any, handler: SerializerFunctionWrapHandler, info: FieldSerializationInfo) -> Any: ...
|
|
||||||
+ def valid_info_default(
|
|
||||||
+ self, value: Any, handler: SerializerFunctionWrapHandler, info: FieldSerializationInfo
|
|
||||||
+ ) -> Any: ...
|
|
||||||
+
|
|
||||||
+ @field_serializer('a', mode='wrap')
|
|
||||||
+ def valid_info(
|
|
||||||
+ self, value: Any, handler: SerializerFunctionWrapHandler, info: FieldSerializationInfo[int]
|
|
||||||
+ ) -> Any: ...
|
|
||||||
@@ -1,233 +0,0 @@
|
|||||||
From cd0d37c4c18f24b5624ae86cfe5288cd82edf2c1 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Douwe Maan <hi@douwe.me>
|
|
||||||
Date: Wed, 16 Apr 2025 18:01:58 +0000
|
|
||||||
Subject: [PATCH 1/4] Stop using deprecated field_name argument on validation
|
|
||||||
function schemas
|
|
||||||
|
|
||||||
---
|
|
||||||
docs/concepts/types.md | 2 +-
|
|
||||||
pydantic/_internal/_generate_schema.py | 45 ++++++++++----------------
|
|
||||||
pydantic/functional_validators.py | 5 +--
|
|
||||||
tests/test_validators.py | 2 +-
|
|
||||||
4 files changed, 20 insertions(+), 34 deletions(-)
|
|
||||||
|
|
||||||
Index: pydantic-2.11.7/docs/concepts/types.md
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.7.orig/docs/concepts/types.md
|
|
||||||
+++ pydantic-2.11.7/docs/concepts/types.md
|
|
||||||
@@ -979,7 +979,7 @@ class CustomType:
|
|
||||||
cls, source_type: Any, handler: GetCoreSchemaHandler
|
|
||||||
) -> core_schema.CoreSchema:
|
|
||||||
return core_schema.with_info_after_validator_function(
|
|
||||||
- cls.validate, handler(int), field_name=handler.field_name
|
|
||||||
+ cls.validate, handler(int)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
Index: pydantic-2.11.7/pydantic/_internal/_generate_schema.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.7.orig/pydantic/_internal/_generate_schema.py
|
|
||||||
+++ pydantic-2.11.7/pydantic/_internal/_generate_schema.py
|
|
||||||
@@ -222,7 +222,6 @@ def filter_field_decorator_info_by_field
|
|
||||||
def apply_each_item_validators(
|
|
||||||
schema: core_schema.CoreSchema,
|
|
||||||
each_item_validators: list[Decorator[ValidatorDecoratorInfo]],
|
|
||||||
- field_name: str | None,
|
|
||||||
) -> core_schema.CoreSchema:
|
|
||||||
# This V1 compatibility shim should eventually be removed
|
|
||||||
|
|
||||||
@@ -234,21 +233,20 @@ def apply_each_item_validators(
|
|
||||||
# note that this won't work for any Annotated types that get wrapped by a function validator
|
|
||||||
# but that's okay because that didn't exist in V1
|
|
||||||
if schema['type'] == 'nullable':
|
|
||||||
- schema['schema'] = apply_each_item_validators(schema['schema'], each_item_validators, field_name)
|
|
||||||
+ schema['schema'] = apply_each_item_validators(schema['schema'], each_item_validators)
|
|
||||||
return schema
|
|
||||||
elif schema['type'] == 'tuple':
|
|
||||||
if (variadic_item_index := schema.get('variadic_item_index')) is not None:
|
|
||||||
schema['items_schema'][variadic_item_index] = apply_validators(
|
|
||||||
schema['items_schema'][variadic_item_index],
|
|
||||||
each_item_validators,
|
|
||||||
- field_name,
|
|
||||||
)
|
|
||||||
elif is_list_like_schema_with_items_schema(schema):
|
|
||||||
inner_schema = schema.get('items_schema', core_schema.any_schema())
|
|
||||||
- schema['items_schema'] = apply_validators(inner_schema, each_item_validators, field_name)
|
|
||||||
+ schema['items_schema'] = apply_validators(inner_schema, each_item_validators)
|
|
||||||
elif schema['type'] == 'dict':
|
|
||||||
inner_schema = schema.get('values_schema', core_schema.any_schema())
|
|
||||||
- schema['values_schema'] = apply_validators(inner_schema, each_item_validators, field_name)
|
|
||||||
+ schema['values_schema'] = apply_validators(inner_schema, each_item_validators)
|
|
||||||
else:
|
|
||||||
raise TypeError(
|
|
||||||
f'`@validator(..., each_item=True)` cannot be applied to fields with a schema of {schema["type"]}'
|
|
||||||
@@ -840,7 +838,7 @@ class GenerateSchema:
|
|
||||||
extras_keys_schema=extras_keys_schema,
|
|
||||||
model_name=cls.__name__,
|
|
||||||
)
|
|
||||||
- inner_schema = apply_validators(fields_schema, decorators.root_validators.values(), None)
|
|
||||||
+ inner_schema = apply_validators(fields_schema, decorators.root_validators.values())
|
|
||||||
inner_schema = apply_model_validators(inner_schema, model_validators, 'inner')
|
|
||||||
|
|
||||||
model_schema = core_schema.model_schema(
|
|
||||||
@@ -1380,9 +1378,9 @@ class GenerateSchema:
|
|
||||||
field_info.validate_default = True
|
|
||||||
each_item_validators = [v for v in this_field_validators if v.info.each_item is True]
|
|
||||||
this_field_validators = [v for v in this_field_validators if v not in each_item_validators]
|
|
||||||
- schema = apply_each_item_validators(schema, each_item_validators, name)
|
|
||||||
+ schema = apply_each_item_validators(schema, each_item_validators)
|
|
||||||
|
|
||||||
- schema = apply_validators(schema, this_field_validators, name)
|
|
||||||
+ schema = apply_validators(schema, this_field_validators)
|
|
||||||
|
|
||||||
# the default validator needs to go outside of any other validators
|
|
||||||
# so that it is the topmost validator for the field validator
|
|
||||||
@@ -1972,7 +1970,7 @@ class GenerateSchema:
|
|
||||||
collect_init_only=has_post_init,
|
|
||||||
)
|
|
||||||
|
|
||||||
- inner_schema = apply_validators(args_schema, decorators.root_validators.values(), None)
|
|
||||||
+ inner_schema = apply_validators(args_schema, decorators.root_validators.values())
|
|
||||||
|
|
||||||
model_validators = decorators.model_validators.values()
|
|
||||||
inner_schema = apply_model_validators(inner_schema, model_validators, 'inner')
|
|
||||||
@@ -2484,24 +2482,16 @@ class GenerateSchema:
|
|
||||||
|
|
||||||
_VALIDATOR_F_MATCH: Mapping[
|
|
||||||
tuple[FieldValidatorModes, Literal['no-info', 'with-info']],
|
|
||||||
- Callable[[Callable[..., Any], core_schema.CoreSchema, str | None], core_schema.CoreSchema],
|
|
||||||
+ Callable[[Callable[..., Any], core_schema.CoreSchema], core_schema.CoreSchema],
|
|
||||||
] = {
|
|
||||||
- ('before', 'no-info'): lambda f, schema, _: core_schema.no_info_before_validator_function(f, schema),
|
|
||||||
- ('after', 'no-info'): lambda f, schema, _: core_schema.no_info_after_validator_function(f, schema),
|
|
||||||
- ('plain', 'no-info'): lambda f, _1, _2: core_schema.no_info_plain_validator_function(f),
|
|
||||||
- ('wrap', 'no-info'): lambda f, schema, _: core_schema.no_info_wrap_validator_function(f, schema),
|
|
||||||
- ('before', 'with-info'): lambda f, schema, field_name: core_schema.with_info_before_validator_function(
|
|
||||||
- f, schema, field_name=field_name
|
|
||||||
- ),
|
|
||||||
- ('after', 'with-info'): lambda f, schema, field_name: core_schema.with_info_after_validator_function(
|
|
||||||
- f, schema, field_name=field_name
|
|
||||||
- ),
|
|
||||||
- ('plain', 'with-info'): lambda f, _, field_name: core_schema.with_info_plain_validator_function(
|
|
||||||
- f, field_name=field_name
|
|
||||||
- ),
|
|
||||||
- ('wrap', 'with-info'): lambda f, schema, field_name: core_schema.with_info_wrap_validator_function(
|
|
||||||
- f, schema, field_name=field_name
|
|
||||||
- ),
|
|
||||||
+ ('before', 'no-info'): lambda f, schema: core_schema.no_info_before_validator_function(f, schema),
|
|
||||||
+ ('after', 'no-info'): lambda f, schema: core_schema.no_info_after_validator_function(f, schema),
|
|
||||||
+ ('plain', 'no-info'): lambda f, _: core_schema.no_info_plain_validator_function(f),
|
|
||||||
+ ('wrap', 'no-info'): lambda f, schema: core_schema.no_info_wrap_validator_function(f, schema),
|
|
||||||
+ ('before', 'with-info'): lambda f, schema: core_schema.with_info_before_validator_function(f, schema),
|
|
||||||
+ ('after', 'with-info'): lambda f, schema: core_schema.with_info_after_validator_function(f, schema),
|
|
||||||
+ ('plain', 'with-info'): lambda f, _: core_schema.with_info_plain_validator_function(f),
|
|
||||||
+ ('wrap', 'with-info'): lambda f, schema: core_schema.with_info_wrap_validator_function(f, schema),
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -2512,7 +2502,6 @@ def apply_validators(
|
|
||||||
validators: Iterable[Decorator[RootValidatorDecoratorInfo]]
|
|
||||||
| Iterable[Decorator[ValidatorDecoratorInfo]]
|
|
||||||
| Iterable[Decorator[FieldValidatorDecoratorInfo]],
|
|
||||||
- field_name: str | None,
|
|
||||||
) -> core_schema.CoreSchema:
|
|
||||||
"""Apply validators to a schema.
|
|
||||||
|
|
||||||
@@ -2528,7 +2517,7 @@ def apply_validators(
|
|
||||||
info_arg = inspect_validator(validator.func, validator.info.mode)
|
|
||||||
val_type = 'with-info' if info_arg else 'no-info'
|
|
||||||
|
|
||||||
- schema = _VALIDATOR_F_MATCH[(validator.info.mode, val_type)](validator.func, schema, field_name)
|
|
||||||
+ schema = _VALIDATOR_F_MATCH[(validator.info.mode, val_type)](validator.func, schema)
|
|
||||||
return schema
|
|
||||||
|
|
||||||
|
|
||||||
Index: pydantic-2.11.7/pydantic/functional_validators.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.7.orig/pydantic/functional_validators.py
|
|
||||||
+++ pydantic-2.11.7/pydantic/functional_validators.py
|
|
||||||
@@ -75,7 +75,7 @@ class AfterValidator:
|
|
||||||
info_arg = _inspect_validator(self.func, 'after')
|
|
||||||
if info_arg:
|
|
||||||
func = cast(core_schema.WithInfoValidatorFunction, self.func)
|
|
||||||
- return core_schema.with_info_after_validator_function(func, schema=schema, field_name=handler.field_name)
|
|
||||||
+ return core_schema.with_info_after_validator_function(func, schema=schema)
|
|
||||||
else:
|
|
||||||
func = cast(core_schema.NoInfoValidatorFunction, self.func)
|
|
||||||
return core_schema.no_info_after_validator_function(func, schema=schema)
|
|
||||||
@@ -136,7 +136,6 @@ class BeforeValidator:
|
|
||||||
return core_schema.with_info_before_validator_function(
|
|
||||||
func,
|
|
||||||
schema=schema,
|
|
||||||
- field_name=handler.field_name,
|
|
||||||
json_schema_input_schema=input_schema,
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
@@ -230,7 +229,6 @@ class PlainValidator:
|
|
||||||
func = cast(core_schema.WithInfoValidatorFunction, self.func)
|
|
||||||
return core_schema.with_info_plain_validator_function(
|
|
||||||
func,
|
|
||||||
- field_name=handler.field_name,
|
|
||||||
serialization=serialization, # pyright: ignore[reportArgumentType]
|
|
||||||
json_schema_input_schema=input_schema,
|
|
||||||
)
|
|
||||||
@@ -307,7 +305,6 @@ class WrapValidator:
|
|
||||||
return core_schema.with_info_wrap_validator_function(
|
|
||||||
func,
|
|
||||||
schema=schema,
|
|
||||||
- field_name=handler.field_name,
|
|
||||||
json_schema_input_schema=input_schema,
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
Index: pydantic-2.11.7/tests/test_validators.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.7.orig/tests/test_validators.py
|
|
||||||
+++ pydantic-2.11.7/tests/test_validators.py
|
|
||||||
@@ -21,7 +21,7 @@ from unittest.mock import MagicMock
|
|
||||||
import pytest
|
|
||||||
from dirty_equals import HasRepr, IsInstance
|
|
||||||
from pydantic_core import core_schema
|
|
||||||
-from typing_extensions import TypedDict
|
|
||||||
+from typing_extensions import TypeAliasType, TypedDict
|
|
||||||
|
|
||||||
from pydantic import (
|
|
||||||
BaseModel,
|
|
||||||
@@ -2684,7 +2684,7 @@ def foobar_validate(value: Any, info: co
|
|
||||||
class Foobar:
|
|
||||||
@classmethod
|
|
||||||
def __get_pydantic_core_schema__(cls, source_type: Any, handler: GetCoreSchemaHandler) -> core_schema.CoreSchema:
|
|
||||||
- return core_schema.with_info_plain_validator_function(foobar_validate, field_name=handler.field_name)
|
|
||||||
+ return core_schema.with_info_plain_validator_function(foobar_validate)
|
|
||||||
|
|
||||||
|
|
||||||
def test_custom_type_field_name_model():
|
|
||||||
@@ -2779,6 +2779,29 @@ def test_plain_validator_field_name():
|
|
||||||
assert m.foobar == {'value': '1', 'field_name': 'foobar', 'data': {'x': 123}}
|
|
||||||
|
|
||||||
|
|
||||||
+def test_validator_field_name_with_reused_type_alias():
|
|
||||||
+ calls = []
|
|
||||||
+
|
|
||||||
+ def validate_my_field(value: str, info: ValidationInfo):
|
|
||||||
+ calls.append((info.field_name, value))
|
|
||||||
+ return value
|
|
||||||
+
|
|
||||||
+ MyField = TypeAliasType('MyField', Annotated[str, AfterValidator(validate_my_field)])
|
|
||||||
+
|
|
||||||
+ class MyModel(BaseModel):
|
|
||||||
+ field1: MyField
|
|
||||||
+ field2: MyField
|
|
||||||
+
|
|
||||||
+ MyModel.model_validate(
|
|
||||||
+ {
|
|
||||||
+ 'field1': 'value1',
|
|
||||||
+ 'field2': 'value2',
|
|
||||||
+ }
|
|
||||||
+ )
|
|
||||||
+
|
|
||||||
+ assert calls == [('field1', 'value1'), ('field2', 'value2')]
|
|
||||||
+
|
|
||||||
+
|
|
||||||
def validate_wrap(value: Any, handler: core_schema.ValidatorFunctionWrapHandler, info: core_schema.ValidationInfo):
|
|
||||||
data = info.data
|
|
||||||
if isinstance(data, dict):
|
|
||||||
BIN
pydantic-2.11.7.tar.gz
LFS
BIN
pydantic-2.11.7.tar.gz
LFS
Binary file not shown.
3
pydantic-2.12.5.tar.gz
Normal file
3
pydantic-2.12.5.tar.gz
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:c79f06e47b8a49593a02ad0b3a0102089c4d22c55666183614dbbad33c12ae73
|
||||||
|
size 1976436
|
||||||
@@ -1,3 +1,24 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Wed Dec 3 20:31:21 UTC 2025 - Guang Yee <gyee@suse.com>
|
||||||
|
|
||||||
|
- Update to 2.12.5
|
||||||
|
* Fix pickle error when using model_construct() on a model with MISSING as a default value in #12522.
|
||||||
|
* Several updates to the documentation
|
||||||
|
- Remove patches bump-pydantic-core-2.35.1.patch, field-name-validator-core-schemas.patch,
|
||||||
|
py314.patch, and support-pydantic-core-2.39.0.patch as they've merged upstream.
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Sep 29 12:28:15 UTC 2025 - Markéta Machová <mmachova@suse.com>
|
||||||
|
|
||||||
|
- Add upstream py314.patch to fix compatibility with Python 3.14
|
||||||
|
|
||||||
|
-------------------------------------------------------------------
|
||||||
|
Sat Sep 13 16:02:48 UTC 2025 - Dirk Müller <dmueller@suse.com>
|
||||||
|
|
||||||
|
- update to 2.11.9:
|
||||||
|
* Backport v1.10.23 changes
|
||||||
|
* Fix mypy plugin for mypy 1.18
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Fri Aug 15 04:23:15 UTC 2025 - Steve Kowalik <steven.kowalik@suse.com>
|
Fri Aug 15 04:23:15 UTC 2025 - Steve Kowalik <steven.kowalik@suse.com>
|
||||||
|
|
||||||
@@ -271,181 +292,181 @@ Wed Oct 2 22:06:18 UTC 2024 - Meera Belur <mbelur@suse.com>
|
|||||||
- update to 2.9.2.
|
- update to 2.9.2.
|
||||||
* history updates
|
* history updates
|
||||||
* v bump
|
* v bump
|
||||||
* Fix `ZoneInfo` with various invalid types
|
* Fix `ZoneInfo` with various invalid types
|
||||||
* Fix variance issue in `_IncEx` type alias, only allow `True`
|
* Fix variance issue in `_IncEx` type alias, only allow `True`
|
||||||
* Fix serialization schema generation when using `PlainValidator`
|
* Fix serialization schema generation when using `PlainValidator`
|
||||||
* Adding notes on designing callable discriminators
|
* Adding notes on designing callable discriminators
|
||||||
* Do not error when trying to evaluate annotations of private attributes
|
* Do not error when trying to evaluate annotations of private attributes
|
||||||
* bump
|
* bump
|
||||||
* Fix evaluation of stringified annotations during namespace inspection
|
* Fix evaluation of stringified annotations during namespace inspection
|
||||||
* Use correct types namespace when building namedtuple core schemas
|
* Use correct types namespace when building namedtuple core schemas
|
||||||
* Fix `IncEx` type alias definition
|
* Fix `IncEx` type alias definition
|
||||||
* Turn `tzdata` install requirement into optional `timezone` dependency
|
* Turn `tzdata` install requirement into optional `timezone` dependency
|
||||||
* Fixing `annotated-types` bound
|
* Fixing `annotated-types` bound
|
||||||
* Fix `Predicate` issue in `v2.9.0`
|
* Fix `Predicate` issue in `v2.9.0`
|
||||||
* Prep for v2.9 release
|
* Prep for v2.9 release
|
||||||
* Fix lifecycle docs formatting
|
* Fix lifecycle docs formatting
|
||||||
* Add schema generation benchmarks for models with custom serializers
|
* Add schema generation benchmarks for models with custom serializers
|
||||||
* Add link for complex docs
|
* Add link for complex docs
|
||||||
* Respect `schema_generator` config value in `TypeAdapter`
|
* Respect `schema_generator` config value in `TypeAdapter`
|
||||||
* Ensure `__pydantic_complete__` is set when rebuilding dataclasses
|
* Ensure `__pydantic_complete__` is set when rebuilding dataclasses
|
||||||
* Try fix for `coverage` with hidden files
|
* Try fix for `coverage` with hidden files
|
||||||
* Ensure coverage data artifact is correctly uploaded
|
* Ensure coverage data artifact is correctly uploaded
|
||||||
* Support signature for wrap validators without `info`
|
* Support signature for wrap validators without `info`
|
||||||
* Reformat + add some benchmarks for annotated validators
|
* Reformat + add some benchmarks for annotated validators
|
||||||
* 👥 Update Pydantic People
|
* 👥 Update Pydantic People
|
||||||
* Fix typo in `orgs.toml`
|
* Fix typo in `orgs.toml`
|
||||||
* Add benchmarks for schema generation with custom validators
|
* Add benchmarks for schema generation with custom validators
|
||||||
* Bump to `v2.9.0b2`
|
* Bump to `v2.9.0b2`
|
||||||
* Reorganize types ns functions
|
* Reorganize types ns functions
|
||||||
* Add in Hyperlint Base Style Guide + Spellcheck Configurations
|
* Add in Hyperlint Base Style Guide + Spellcheck Configurations
|
||||||
* Bump `pydantic-core` to `v2.23.1` and other minor v bumps
|
* Bump `pydantic-core` to `v2.23.1` and other minor v bumps
|
||||||
* Use identity instead of equality after validating model in `__init__`
|
* Use identity instead of equality after validating model in `__init__`
|
||||||
* Update ns stack with already copied ns
|
* Update ns stack with already copied ns
|
||||||
* Remove defaults filter for namespace
|
* Remove defaults filter for namespace
|
||||||
* Improve concepts documentation related to models
|
* Improve concepts documentation related to models
|
||||||
* Add benchmarks for direct model instantiation
|
* Add benchmarks for direct model instantiation
|
||||||
* Fix parent namespace issue with model rebuilds
|
* Fix parent namespace issue with model rebuilds
|
||||||
* Raise helpful warning when `self` isn't returned from model validator
|
* Raise helpful warning when `self` isn't returned from model validator
|
||||||
* Fix history.md typos
|
* Fix history.md typos
|
||||||
* Minor reorganization of benchmarks
|
* Minor reorganization of benchmarks
|
||||||
* Add comment reflecting unexpected union cache behavior that affects validation order
|
* Add comment reflecting unexpected union cache behavior that affects validation order
|
||||||
* Update release tweet to encourage usage for beta versions
|
* Update release tweet to encourage usage for beta versions
|
||||||
* Add benchmarks for categories: serialization, validation and schema generation
|
* Add benchmarks for categories: serialization, validation and schema generation
|
||||||
* Fix a crash when cleaning the namespace in `ModelMetaclass`
|
* Fix a crash when cleaning the namespace in `ModelMetaclass`
|
||||||
* Fix warnings assertions to use `pytest.warns
|
* Fix warnings assertions to use `pytest.warns
|
||||||
* Prep for v2.9.0b1 release
|
* Prep for v2.9.0b1 release
|
||||||
* Add support for annotated_types.Not
|
* Add support for annotated_types.Not
|
||||||
* Add 'wss' for allowed schemes in NatsDsn
|
* Add 'wss' for allowed schemes in NatsDsn
|
||||||
* Add missing imports in documentation example
|
* Add missing imports in documentation example
|
||||||
* Bump `v1` version stub to `v1.10.18`
|
* Bump `v1` version stub to `v1.10.18`
|
||||||
* Use `pppr` for insiders install
|
* Use `pppr` for insiders install
|
||||||
* Apply misc. improvements to "Get started" documentation
|
* Apply misc. improvements to "Get started" documentation
|
||||||
* Allow validators to customize validation JSON schema
|
* Allow validators to customize validation JSON schema
|
||||||
* Update `mkdocs-material` to `9.5.31`
|
* Update `mkdocs-material` to `9.5.31`
|
||||||
* Update and clean up several aspects of documentation tooling
|
* Update and clean up several aspects of documentation tooling
|
||||||
* Fix key error with custom serializer
|
* Fix key error with custom serializer
|
||||||
* Remove `initial_metadata` from internal metadata construct
|
* Remove `initial_metadata` from internal metadata construct
|
||||||
* Remove unused environment variables in CI
|
* Remove unused environment variables in CI
|
||||||
* Make sure generated JSON Schemas are valid in tests
|
* Make sure generated JSON Schemas are valid in tests
|
||||||
* Fix invalid JSON Schemas being generated for functions in certain scenarios
|
* Fix invalid JSON Schemas being generated for functions in certain scenarios
|
||||||
* Breaking Change: Fix JSON Schema generation for constrained dates
|
* Breaking Change: Fix JSON Schema generation for constrained dates
|
||||||
* Deprecate passing a dict to the `Examples` class
|
* Deprecate passing a dict to the `Examples` class
|
||||||
* Remove `typed_dict_cls` data from `CoreMetadata`
|
* Remove `typed_dict_cls` data from `CoreMetadata`
|
||||||
* Fix JSON Schema generation of fields with plain validators in serialization mode
|
* Fix JSON Schema generation of fields with plain validators in serialization mode
|
||||||
* Fix JSON Schema `number` type for literal and enum schemas
|
* Fix JSON Schema `number` type for literal and enum schemas
|
||||||
* Remove docs about pydantic plugins
|
* Remove docs about pydantic plugins
|
||||||
* Allow `WithJsonSchema` to inject `$ref`s w/ `http` or `https` links
|
* Allow `WithJsonSchema` to inject `$ref`s w/ `http` or `https` links
|
||||||
* Improve runtime errors for string constraints like `pattern` for incompatible types
|
* Improve runtime errors for string constraints like `pattern` for incompatible types
|
||||||
* Add support for stringified annotations when using `PrivateAttr` with `Annotated`
|
* Add support for stringified annotations when using `PrivateAttr` with `Annotated`
|
||||||
* Fix core schema simplification when serialization schemas are involved in specific scenarios
|
* Fix core schema simplification when serialization schemas are involved in specific scenarios
|
||||||
* Reorganize `BaseModel` annotations
|
* Reorganize `BaseModel` annotations
|
||||||
* Support PDM `v2.18.1`
|
* Support PDM `v2.18.1`
|
||||||
* Support complex number
|
* Support complex number
|
||||||
* Add initial architeture documentation
|
* Add initial architeture documentation
|
||||||
* Handle `nullable` schemas with `serialization` schema available during JSON Schema generation
|
* Handle `nullable` schemas with `serialization` schema available during JSON Schema generation
|
||||||
* Blacklist default globals to support exotic user code with `__` prefixed annotations
|
* Blacklist default globals to support exotic user code with `__` prefixed annotations
|
||||||
* Fix `ImportString` special cases
|
* Fix `ImportString` special cases
|
||||||
* Add dsn for Snowflake
|
* Add dsn for Snowflake
|
||||||
* Temporary: cap `pdm` version for `mypy` tests
|
* Temporary: cap `pdm` version for `mypy` tests
|
||||||
* Temporary: use `pdm` v2.17.3 to unblock CI failures
|
* Temporary: use `pdm` v2.17.3 to unblock CI failures
|
||||||
* Performance boost: skip caching parent namespaces in most cases
|
* Performance boost: skip caching parent namespaces in most cases
|
||||||
* Do not compute JSON Schema default when plain serializers are used with `when_used` set to `'json-unless-none'` and the default value is `None`
|
* Do not compute JSON Schema default when plain serializers are used with `when_used` set to `'json-unless-none'` and the default value is `None`
|
||||||
* Add warning for double `frozen` config setting on dataclass
|
* Add warning for double `frozen` config setting on dataclass
|
||||||
* Revert "Experimental feature: opt-in fast build
|
* Revert "Experimental feature: opt-in fast build
|
||||||
* Remove default module globals from types namespace
|
* Remove default module globals from types namespace
|
||||||
* Docs update and warning frozen defined both
|
* Docs update and warning frozen defined both
|
||||||
* Fix ip schema serialization logic
|
* Fix ip schema serialization logic
|
||||||
* Improve documentation of the `@computed_field` decorator
|
* Improve documentation of the `@computed_field` decorator
|
||||||
* Improve `pyright` tests, refactor model decorators signatures
|
* Improve `pyright` tests, refactor model decorators signatures
|
||||||
* Update tests for changes to core
|
* Update tests for changes to core
|
||||||
* Fix `PydanticDeprecatedSince26.since` argument
|
* Fix `PydanticDeprecatedSince26.since` argument
|
||||||
* Use `is_annotated` consistently
|
* Use `is_annotated` consistently
|
||||||
* Adding tests for TODO union serialization fixes
|
* Adding tests for TODO union serialization fixes
|
||||||
* Update `griffe_doclinks` plugin and misc. docs improvements
|
* Update `griffe_doclinks` plugin and misc. docs improvements
|
||||||
* Remove allOf JSON schema workarounds
|
* Remove allOf JSON schema workarounds
|
||||||
* Remove logic to handle unused `__get_pydantic_core_schema__` signature
|
* Remove logic to handle unused `__get_pydantic_core_schema__` signature
|
||||||
* Fix `frozen` enforcement for dataclasses
|
* Fix `frozen` enforcement for dataclasses
|
||||||
* Experimental feature: opt-in fast build
|
* Experimental feature: opt-in fast build
|
||||||
* Docs update for `types.py`
|
* Docs update for `types.py`
|
||||||
* Fix evaluation of `__pydantic_extra__` annotation in specific circumstances
|
* Fix evaluation of `__pydantic_extra__` annotation in specific circumstances
|
||||||
* Removing old typing function
|
* Removing old typing function
|
||||||
* Simplify internal generics logic - remove generator overhead
|
* Simplify internal generics logic - remove generator overhead
|
||||||
* Minor speedup / cleanup for internal `FieldInfo` functions
|
* Minor speedup / cleanup for internal `FieldInfo` functions
|
||||||
* Bump `pydantic-core` to v2.21.0
|
* Bump `pydantic-core` to v2.21.0
|
||||||
* Raise a better user error when failing to evaluate a forward reference
|
* Raise a better user error when failing to evaluate a forward reference
|
||||||
* Add `Config.val_json_bytes`
|
* Add `Config.val_json_bytes`
|
||||||
* Enable more lint rules
|
* Enable more lint rules
|
||||||
* Clarify `model_serializer
|
* Clarify `model_serializer
|
||||||
* Fix `Mapping` and `MutableMapping` annotations to use mapping schema instead of dict schema
|
* Fix `Mapping` and `MutableMapping` annotations to use mapping schema instead of dict schema
|
||||||
* Bump CodSpeedHQ/action from 2 to 3
|
* Bump CodSpeedHQ/action from 2 to 3
|
||||||
* Bump dawidd6/action-download-artifact from 3 to 6
|
* Bump dawidd6/action-download-artifact from 3 to 6
|
||||||
* Move `import_module` import in `__getattr__`
|
* Move `import_module` import in `__getattr__`
|
||||||
* Refactor application of deque annotations
|
* Refactor application of deque annotations
|
||||||
* Using cached internal import for `BaseModel`
|
* Using cached internal import for `BaseModel`
|
||||||
* 👥 Update Pydantic People
|
* 👥 Update Pydantic People
|
||||||
* Initial start at improving import times for modules, using caching primarily
|
* Initial start at improving import times for modules, using caching primarily
|
||||||
* Add import / isinstance benchmarks
|
* Add import / isinstance benchmarks
|
||||||
* Move annotation compatibility errors to validation phase
|
* Move annotation compatibility errors to validation phase
|
||||||
* Support compatibility with `pdm v2.17.0`
|
* Support compatibility with `pdm v2.17.0`
|
||||||
* Apply `strict=True` to `__init__` in mypy plugin
|
* Apply `strict=True` to `__init__` in mypy plugin
|
||||||
* Fix false positives on v1 models in mypy plugin for from_orm check requiring from_attributes=True config
|
* Fix false positives on v1 models in mypy plugin for from_orm check requiring from_attributes=True config
|
||||||
* Fix typing for `IPvAnyAddress` and `IPvAnyInterface`
|
* Fix typing for `IPvAnyAddress` and `IPvAnyInterface`
|
||||||
* ⚡️ Speed up method `ConfigWrapper.core_config` by 28% in `pydantic/_internal/_config.py`
|
* ⚡️ Speed up method `ConfigWrapper.core_config` by 28% in `pydantic/_internal/_config.py`
|
||||||
* ⚡️ Speed up function `apply_each_item_validators` by 100% in `pydantic/_internal/_generate_schema.py`
|
* ⚡️ Speed up function `apply_each_item_validators` by 100% in `pydantic/_internal/_generate_schema.py`
|
||||||
* Refactor annotation injection for known
|
* Refactor annotation injection for known
|
||||||
* Fix Sequence ignoring discriminator
|
* Fix Sequence ignoring discriminator
|
||||||
* chore: fix entry in `.gitignore` to let `make format` work correctly
|
* chore: fix entry in `.gitignore` to let `make format` work correctly
|
||||||
* Move `decimal.Decimal` validation to `_generate_schema.py`
|
* Move `decimal.Decimal` validation to `_generate_schema.py`
|
||||||
* Move date schemas to `_generate_schema.py`
|
* Move date schemas to `_generate_schema.py`
|
||||||
* Simplify schema generation for uuid, url, and ip types
|
* Simplify schema generation for uuid, url, and ip types
|
||||||
* Fix dataclass ignoring default_factory passed in Annotated
|
* Fix dataclass ignoring default_factory passed in Annotated
|
||||||
* Changed `BaseModel.model_validate_json` raises docstring to mention `ValidationError` instead of `ValueError`
|
* Changed `BaseModel.model_validate_json` raises docstring to mention `ValidationError` instead of `ValueError`
|
||||||
* ⚡️ Speed up method `GenerateSchema._unpack_refs_defs` by 26% in `pydantic/_internal/_generate_schema.py`
|
* ⚡️ Speed up method `GenerateSchema._unpack_refs_defs` by 26% in `pydantic/_internal/_generate_schema.py`
|
||||||
* Move enum schema gen to `_generate_schema.py` for consistency
|
* Move enum schema gen to `_generate_schema.py` for consistency
|
||||||
* Add class name to "has conflict" warnings
|
* Add class name to "has conflict" warnings
|
||||||
* `Counter` is handled as a mapping, not a sequence, fix `SequenceValidator` accordingly
|
* `Counter` is handled as a mapping, not a sequence, fix `SequenceValidator` accordingly
|
||||||
* Fix type annotations for some potentially generic `GenerateSchema.match_type` options
|
* Fix type annotations for some potentially generic `GenerateSchema.match_type` options
|
||||||
* Simplify IP address schema in `_std_types_schema.py`
|
* Simplify IP address schema in `_std_types_schema.py`
|
||||||
* Fix typo in `invalid-annotated-type` error code
|
* Fix typo in `invalid-annotated-type` error code
|
||||||
* Fix _field_name_for_signature docstring
|
* Fix _field_name_for_signature docstring
|
||||||
* ⚡️ Speed up function `_field_name_for_signature` by 37% in `pydantic/_internal/_signature.py`
|
* ⚡️ Speed up function `_field_name_for_signature` by 37% in `pydantic/_internal/_signature.py`
|
||||||
* Add support for `ZoneInfo`
|
* Add support for `ZoneInfo`
|
||||||
* Fix a typo on Validators doc page
|
* Fix a typo on Validators doc page
|
||||||
* Adding new schema building benchmark
|
* Adding new schema building benchmark
|
||||||
* Handle frozen fields on a per-field basis
|
* Handle frozen fields on a per-field basis
|
||||||
* Allow usage of `type[Annotated[...]]`
|
* Allow usage of `type[Annotated[...]]`
|
||||||
* typing: fix recursive typing of `main.IncEnx`
|
* typing: fix recursive typing of `main.IncEnx`
|
||||||
* Fix `ComputedFieldInfo.wrapped_property` pointer when a property setter is assigned
|
* Fix `ComputedFieldInfo.wrapped_property` pointer when a property setter is assigned
|
||||||
* ⚡️ Speed up `dataclass
|
* ⚡️ Speed up `dataclass
|
||||||
* Replace str type annotation with Any in validator factories in documentation on validators
|
* Replace str type annotation with Any in validator factories in documentation on validators
|
||||||
* Fix typing issue with field_validator-decorated methods
|
* Fix typing issue with field_validator-decorated methods
|
||||||
* Prevent type error for exotic BaseModel/RootModel inheritance
|
* Prevent type error for exotic BaseModel/RootModel inheritance
|
||||||
* ⚡️ Speed up `ModelPrivateAttr.__set_name__
|
* ⚡️ Speed up `ModelPrivateAttr.__set_name__
|
||||||
* chore
|
* chore
|
||||||
* ⚡️ Speed up `multiple_of_validator
|
* ⚡️ Speed up `multiple_of_validator
|
||||||
* Update functional_serializers.py Typo in Docs Example Simple Fix
|
* Update functional_serializers.py Typo in Docs Example Simple Fix
|
||||||
* Update changelog to reflect breaking changes regarding PEP 570
|
* Update changelog to reflect breaking changes regarding PEP 570
|
||||||
* Update history, bump version to alpha on `main`
|
* Update history, bump version to alpha on `main`
|
||||||
* Fix issue with assertion caused by pluggable schema validator
|
* Fix issue with assertion caused by pluggable schema validator
|
||||||
* Fix #9706 PathLike with subtype
|
* Fix #9706 PathLike with subtype
|
||||||
* Adding coverage comment
|
* Adding coverage comment
|
||||||
* docs: Add documentation for Semantic Version and Timezone Name
|
* docs: Add documentation for Semantic Version and Timezone Name
|
||||||
* Bump `pydantic-core` to `v2.20.1`, `pydantic-extra-types` to `v2.9.0`
|
* Bump `pydantic-core` to `v2.20.1`, `pydantic-extra-types` to `v2.9.0`
|
||||||
* Remove spooky meetings file
|
* Remove spooky meetings file
|
||||||
* Pedantic typo correction within explanation of Pydantic's root in 'pedantic' in index.md
|
* Pedantic typo correction within explanation of Pydantic's root in 'pedantic' in index.md
|
||||||
* Breaking Change: Merge `dict` type `json_schema_extra`
|
* Breaking Change: Merge `dict` type `json_schema_extra`
|
||||||
* Fix list constraint json schema application
|
* Fix list constraint json schema application
|
||||||
* Respect use_enum_values on Literal types
|
* Respect use_enum_values on Literal types
|
||||||
* Bump `ruff` to `v0.5.0` and `pyright` to `v1.1.369`
|
* Bump `ruff` to `v0.5.0` and `pyright` to `v1.1.369`
|
||||||
* Fix breaking change in `to_snake` from v2.7 -> v2.8
|
* Fix breaking change in `to_snake` from v2.7 -> v2.8
|
||||||
* Fix labeler, again
|
* Fix labeler, again
|
||||||
* Hooky - switch to reviewers, labeler, fix ci bug
|
* Hooky - switch to reviewers, labeler, fix ci bug
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Fri Sep 27 02:01:34 UTC 2024 - Yogalakshmi Arunachalam <yarunachalam@suse.com>
|
Fri Sep 27 02:01:34 UTC 2024 - Yogalakshmi Arunachalam <yarunachalam@suse.com>
|
||||||
|
|
||||||
- update to 2.8.2.
|
- update to 2.8.2.
|
||||||
* Fix issue with assertion caused by pluggable schema validator by @dmontagu in #9838
|
* Fix issue with assertion caused by pluggable schema validator by @dmontagu in #9838
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
|
|||||||
@@ -27,23 +27,17 @@
|
|||||||
%endif
|
%endif
|
||||||
%{?sle15_python_module_pythons}
|
%{?sle15_python_module_pythons}
|
||||||
Name: python-pydantic%{psuffix}
|
Name: python-pydantic%{psuffix}
|
||||||
Version: 2.11.7
|
Version: 2.12.5
|
||||||
Release: 0
|
Release: 0
|
||||||
Summary: Data validation and settings management using python type hinting
|
Summary: Data validation and settings management using python type hinting
|
||||||
License: MIT
|
License: MIT
|
||||||
URL: https://github.com/pydantic/pydantic
|
URL: https://github.com/pydantic/pydantic
|
||||||
Source: https://github.com/pydantic/pydantic/archive/v%{version}.tar.gz#/pydantic-%{version}.tar.gz
|
Source: https://github.com/pydantic/pydantic/archive/v%{version}.tar.gz#/pydantic-%{version}.tar.gz
|
||||||
# PATCH-FIX-UPSTREAM bump-pydantic-core-2.35.1.patch gh#pydantic/pydantic#11963
|
|
||||||
Patch0: bump-pydantic-core-2.35.1.patch
|
|
||||||
# PATCH-FIX-UPSTREAM field-name-validator-core-schemas.patch gh#pydantic/pydantic#11761
|
|
||||||
Patch1: field-name-validator-core-schemas.patch
|
|
||||||
# PATCH-FIX-UPSTREAM Based on gh#pydantic/pydantic#11883
|
|
||||||
Patch2: support-pydantic-core-2.39.0.patch
|
|
||||||
BuildRequires: %{python_module hatch-fancy-pypi-readme}
|
BuildRequires: %{python_module hatch-fancy-pypi-readme}
|
||||||
BuildRequires: %{python_module hatchling}
|
BuildRequires: %{python_module hatchling}
|
||||||
BuildRequires: %{python_module packaging}
|
BuildRequires: %{python_module packaging}
|
||||||
BuildRequires: %{python_module pip}
|
BuildRequires: %{python_module pip}
|
||||||
BuildRequires: %{python_module pydantic-core = 2.39.0}
|
BuildRequires: %{python_module pydantic-core = 2.41.5}
|
||||||
BuildRequires: %{python_module wheel}
|
BuildRequires: %{python_module wheel}
|
||||||
BuildRequires: fdupes
|
BuildRequires: fdupes
|
||||||
BuildRequires: python-rpm-macros
|
BuildRequires: python-rpm-macros
|
||||||
@@ -63,9 +57,9 @@ BuildRequires: %{python_module python-dotenv >= 0.10.4}
|
|||||||
BuildRequires: %{python_module rich}
|
BuildRequires: %{python_module rich}
|
||||||
BuildRequires: %{python_module typing-inspection}
|
BuildRequires: %{python_module typing-inspection}
|
||||||
%endif
|
%endif
|
||||||
Requires: python-annotated-types >= 0.4.0
|
Requires: python-annotated-types >= 0.6.0
|
||||||
Requires: python-pydantic-core = 2.39.0
|
Requires: python-pydantic-core = 2.41.5
|
||||||
Requires: python-typing-extensions >= 4.12.2
|
Requires: python-typing-extensions >= 4.14.1
|
||||||
Requires: python-typing-inspection
|
Requires: python-typing-inspection
|
||||||
BuildArch: noarch
|
BuildArch: noarch
|
||||||
%python_subpackages
|
%python_subpackages
|
||||||
@@ -76,6 +70,10 @@ Data validation and settings management using Python type hinting.
|
|||||||
%prep
|
%prep
|
||||||
%autosetup -p1 -n pydantic-%{version}
|
%autosetup -p1 -n pydantic-%{version}
|
||||||
|
|
||||||
|
# FIXME: make it compatible with the older version of setuptools.
|
||||||
|
# make sure to remove this hack once we have a newer version of setuptools.
|
||||||
|
sed -i '/.*Programming Language :: Python :: 3\.14.*/d' pyproject.toml
|
||||||
|
|
||||||
%build
|
%build
|
||||||
%pyproject_wheel
|
%pyproject_wheel
|
||||||
|
|
||||||
|
|||||||
@@ -1,293 +0,0 @@
|
|||||||
From d6c65493a8436b22733d0f04d0bb3df1bc952ac9 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Viicos <65306057+Viicos@users.noreply.github.com>
|
|
||||||
Date: Fri, 16 May 2025 15:46:24 +0200
|
|
||||||
Subject: [PATCH 1/8] Add `UNSET` sentinel
|
|
||||||
|
|
||||||
---
|
|
||||||
pydantic/_internal/_generate_schema.py | 3 +
|
|
||||||
pydantic/fields.py | 4 +-
|
|
||||||
pydantic/json_schema.py | 7 +-
|
|
||||||
pyproject.toml | 2 +-
|
|
||||||
5 files changed, 15 insertions(+), 122 deletions(-)
|
|
||||||
|
|
||||||
Index: pydantic-2.11.7/pydantic/_internal/_generate_schema.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.7.orig/pydantic/_internal/_generate_schema.py
|
|
||||||
+++ pydantic-2.11.7/pydantic/_internal/_generate_schema.py
|
|
||||||
@@ -42,6 +42,7 @@ from zoneinfo import ZoneInfo
|
|
||||||
|
|
||||||
import typing_extensions
|
|
||||||
from pydantic_core import (
|
|
||||||
+ MISSING,
|
|
||||||
CoreSchema,
|
|
||||||
MultiHostUrl,
|
|
||||||
PydanticCustomError,
|
|
||||||
@@ -1050,6 +1051,8 @@ class GenerateSchema:
|
|
||||||
return core_schema.multi_host_url_schema()
|
|
||||||
elif obj is None or obj is _typing_extra.NoneType:
|
|
||||||
return core_schema.none_schema()
|
|
||||||
+ if obj is MISSING:
|
|
||||||
+ return core_schema.missing_sentinel_schema()
|
|
||||||
elif obj in IP_TYPES:
|
|
||||||
return self._ip_schema(obj)
|
|
||||||
elif obj in TUPLE_TYPES:
|
|
||||||
Index: pydantic-2.11.7/pydantic/fields.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.7.orig/pydantic/fields.py
|
|
||||||
+++ pydantic-2.11.7/pydantic/fields.py
|
|
||||||
@@ -15,7 +15,7 @@ from warnings import warn
|
|
||||||
|
|
||||||
import annotated_types
|
|
||||||
import typing_extensions
|
|
||||||
-from pydantic_core import PydanticUndefined
|
|
||||||
+from pydantic_core import MISSING, PydanticUndefined
|
|
||||||
from typing_extensions import Self, TypeAlias, Unpack, deprecated
|
|
||||||
from typing_inspection import typing_objects
|
|
||||||
from typing_inspection.introspection import UNKNOWN, AnnotationSource, ForbiddenQualifier, Qualifier, inspect_annotation
|
|
||||||
@@ -392,7 +392,7 @@ class FieldInfo(_repr.Representation):
|
|
||||||
Returns:
|
|
||||||
A field object with the passed values.
|
|
||||||
"""
|
|
||||||
- if annotation is default:
|
|
||||||
+ if annotation is not MISSING and annotation is default:
|
|
||||||
raise PydanticUserError(
|
|
||||||
'Error when building FieldInfo from annotated attribute. '
|
|
||||||
"Make sure you don't have any field name clashing with a type annotation.",
|
|
||||||
Index: pydantic-2.11.7/pydantic/json_schema.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.7.orig/pydantic/json_schema.py
|
|
||||||
+++ pydantic-2.11.7/pydantic/json_schema.py
|
|
||||||
@@ -36,7 +36,7 @@ from typing import (
|
|
||||||
)
|
|
||||||
|
|
||||||
import pydantic_core
|
|
||||||
-from pydantic_core import CoreSchema, PydanticOmit, core_schema, to_jsonable_python
|
|
||||||
+from pydantic_core import MISSING, CoreSchema, PydanticOmit, core_schema, to_jsonable_python
|
|
||||||
from pydantic_core.core_schema import ComputedField
|
|
||||||
from typing_extensions import TypeAlias, assert_never, deprecated, final
|
|
||||||
from typing_inspection.introspection import get_literal_values
|
|
||||||
@@ -805,6 +805,17 @@ class GenerateJsonSchema:
|
|
||||||
result['type'] = 'null'
|
|
||||||
return result
|
|
||||||
|
|
||||||
+ def missing_sentinel_schema(self, schema: core_schema.MissingSentinelSchema) -> JsonSchemaValue:
|
|
||||||
+ """Generates a JSON schema that matches the `MISSING` sentinel value.
|
|
||||||
+
|
|
||||||
+ Args:
|
|
||||||
+ schema: The core schema.
|
|
||||||
+
|
|
||||||
+ Returns:
|
|
||||||
+ The generated JSON schema.
|
|
||||||
+ """
|
|
||||||
+ raise PydanticOmit
|
|
||||||
+
|
|
||||||
def enum_schema(self, schema: core_schema.EnumSchema) -> JsonSchemaValue:
|
|
||||||
"""Generates a JSON schema that matches an Enum value.
|
|
||||||
|
|
||||||
@@ -1109,7 +1120,7 @@ class GenerateJsonSchema:
|
|
||||||
json_schema = self.generate_inner(schema['schema'])
|
|
||||||
|
|
||||||
default = self.get_default_value(schema)
|
|
||||||
- if default is NoDefault:
|
|
||||||
+ if default is NoDefault or default is MISSING:
|
|
||||||
return json_schema
|
|
||||||
|
|
||||||
# we reflect the application of custom plain, no-info serializers to defaults for
|
|
||||||
Index: pydantic-2.11.7/pydantic/version.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.7.orig/pydantic/version.py
|
|
||||||
+++ pydantic-2.11.7/pydantic/version.py
|
|
||||||
@@ -66,7 +66,7 @@ def version_info() -> str:
|
|
||||||
def check_pydantic_core_version() -> bool:
|
|
||||||
"""Check that the installed `pydantic-core` dependency is compatible."""
|
|
||||||
# Keep this in sync with the version constraint in the `pyproject.toml` dependencies:
|
|
||||||
- return __pydantic_core_version__ == '2.35.1'
|
|
||||||
+ return __pydantic_core_version__ == '2.39.0'
|
|
||||||
|
|
||||||
|
|
||||||
def parse_mypy_version(version: str) -> tuple[int, int, int]:
|
|
||||||
Index: pydantic-2.11.7/docs/concepts/experimental.md
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.7.orig/docs/concepts/experimental.md
|
|
||||||
+++ pydantic-2.11.7/docs/concepts/experimental.md
|
|
||||||
@@ -502,3 +502,49 @@ args, kwargs = val.validate_json('{"args
|
|
||||||
print(args, kwargs)
|
|
||||||
#> ('arg1',) {'extra': 1}
|
|
||||||
```
|
|
||||||
+
|
|
||||||
+## `MISSING` sentinel
|
|
||||||
+
|
|
||||||
+The `MISSING` sentinel is a singleton indicating a field value was not provided during validation.
|
|
||||||
+
|
|
||||||
+This singleton can be used as a default value, as an alternative to `None` when it has an explicit
|
|
||||||
+meaning. During serialization, any field with `MISSING` as a value is excluded from the output.
|
|
||||||
+
|
|
||||||
+```python
|
|
||||||
+from typing import Union
|
|
||||||
+
|
|
||||||
+from pydantic import BaseModel
|
|
||||||
+from pydantic.experimental.missing_sentinel import MISSING
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+class Configuration(BaseModel):
|
|
||||||
+ timeout: Union[int, None, MISSING] = MISSING
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+# configuration defaults, stored somewhere else:
|
|
||||||
+defaults = {'timeout': 200}
|
|
||||||
+
|
|
||||||
+conf = Configuration()
|
|
||||||
+
|
|
||||||
+# `timeout` is excluded from the serialization output:
|
|
||||||
+conf.model_dump()
|
|
||||||
+# {}
|
|
||||||
+
|
|
||||||
+# The `MISSING` value doesn't appear in the JSON Schema:
|
|
||||||
+Configuration.model_json_schema()['properties']['timeout']
|
|
||||||
+#> {'anyOf': [{'type': 'integer'}, {'type': 'null'}], 'title': 'Timeout'}}
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+# `is` can be used to discrimate between the sentinel and other values:
|
|
||||||
+timeout = conf.timeout if conf.timeout is not MISSING else defaults['timeout']
|
|
||||||
+```
|
|
||||||
+
|
|
||||||
+This feature is marked as experimental because it relies on the draft [PEP 661](https://peps.python.org/pep-0661/), introducing sentinels in the standard library.
|
|
||||||
+
|
|
||||||
+As such, the following limitations currently apply:
|
|
||||||
+
|
|
||||||
+* Static type checking of sentinels is only supported with Pyright
|
|
||||||
+ [1.1.402](https://github.com/microsoft/pyright/releases/tag/1.1.402)
|
|
||||||
+ or greater, and the `enableExperimentalFeatures` type evaluation setting
|
|
||||||
+ should be enabled.
|
|
||||||
+* Pickling of models containing `MISSING` as a value is not supported.
|
|
||||||
Index: pydantic-2.11.7/docs/errors/validation_errors.md
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.7.orig/docs/errors/validation_errors.md
|
|
||||||
+++ pydantic-2.11.7/docs/errors/validation_errors.md
|
|
||||||
@@ -1384,6 +1384,27 @@ except ValidationError as exc:
|
|
||||||
#> 'missing_positional_only_argument'
|
|
||||||
```
|
|
||||||
|
|
||||||
+## `missing_sentinel_error`
|
|
||||||
+
|
|
||||||
+This error is raised when the experimental `MISSING` sentinel is the only value allowed, and wasn't
|
|
||||||
+provided during validation:
|
|
||||||
+
|
|
||||||
+```python
|
|
||||||
+from pydantic import BaseModel, ValidationError
|
|
||||||
+from pydantic.experimental.missing_sentinel import MISSING
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+class Model(BaseModel):
|
|
||||||
+ f: MISSING
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+try:
|
|
||||||
+ Model(f=1)
|
|
||||||
+except ValidationError as exc:
|
|
||||||
+ print(repr(exc.errors()[0]['type']))
|
|
||||||
+ #> 'missing_sentinel_error'
|
|
||||||
+```
|
|
||||||
+
|
|
||||||
## `model_attributes_type`
|
|
||||||
|
|
||||||
This error is raised when the input value is not a valid dictionary, model instance, or instance that fields can be extracted from:
|
|
||||||
Index: pydantic-2.11.7/pydantic/experimental/missing_sentinel.py
|
|
||||||
===================================================================
|
|
||||||
--- /dev/null
|
|
||||||
+++ pydantic-2.11.7/pydantic/experimental/missing_sentinel.py
|
|
||||||
@@ -0,0 +1,5 @@
|
|
||||||
+"""Experimental module exposing a function a `MISSING` sentinel."""
|
|
||||||
+
|
|
||||||
+from pydantic_core import MISSING
|
|
||||||
+
|
|
||||||
+__all__ = ('MISSING',)
|
|
||||||
Index: pydantic-2.11.7/pyproject.toml
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.7.orig/pyproject.toml
|
|
||||||
+++ pydantic-2.11.7/pyproject.toml
|
|
||||||
@@ -46,7 +46,7 @@ dependencies = [
|
|
||||||
'typing-extensions>=4.13.0',
|
|
||||||
'annotated-types>=0.6.0',
|
|
||||||
# Keep this in sync with the version in the `check_pydantic_core_version()` function:
|
|
||||||
- 'pydantic-core==2.35.1',
|
|
||||||
+ 'pydantic-core==2.39.0',
|
|
||||||
'typing-inspection>=0.4.0',
|
|
||||||
]
|
|
||||||
dynamic = ['version', 'readme']
|
|
||||||
Index: pydantic-2.11.7/tests/test_missing_sentinel.py
|
|
||||||
===================================================================
|
|
||||||
--- /dev/null
|
|
||||||
+++ pydantic-2.11.7/tests/test_missing_sentinel.py
|
|
||||||
@@ -0,0 +1,71 @@
|
|
||||||
+import pickle
|
|
||||||
+from typing import Union
|
|
||||||
+
|
|
||||||
+import pytest
|
|
||||||
+from pydantic_core import MISSING, PydanticSerializationUnexpectedValue
|
|
||||||
+
|
|
||||||
+from pydantic import BaseModel, TypeAdapter, ValidationError
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+def test_missing_sentinel_model() -> None:
|
|
||||||
+ class Model(BaseModel):
|
|
||||||
+ f: Union[int, MISSING] = MISSING
|
|
||||||
+ g: MISSING = MISSING
|
|
||||||
+
|
|
||||||
+ m1 = Model()
|
|
||||||
+
|
|
||||||
+ assert m1.model_dump() == {}
|
|
||||||
+ assert m1.model_dump_json() == '{}'
|
|
||||||
+
|
|
||||||
+ m2 = Model.model_validate({'f': MISSING, 'g': MISSING})
|
|
||||||
+
|
|
||||||
+ assert m2.f is MISSING
|
|
||||||
+ assert m2.g is MISSING
|
|
||||||
+
|
|
||||||
+ m3 = Model(f=1)
|
|
||||||
+
|
|
||||||
+ assert m3.model_dump() == {'f': 1}
|
|
||||||
+ assert m3.model_dump_json() == '{"f":1}'
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+def test_missing_sentinel_type_adapter() -> None:
|
|
||||||
+ """Note that this usage isn't explicitly supported (and useless in practice)."""
|
|
||||||
+
|
|
||||||
+ # TODO Remove annotation with PEP 747:
|
|
||||||
+ ta: TypeAdapter[object] = TypeAdapter(MISSING)
|
|
||||||
+
|
|
||||||
+ assert ta.validate_python(MISSING) is MISSING
|
|
||||||
+
|
|
||||||
+ with pytest.raises(ValidationError) as exc_info:
|
|
||||||
+ ta.validate_python(1)
|
|
||||||
+
|
|
||||||
+ assert exc_info.value.errors()[0]['type'] == 'missing_sentinel_error'
|
|
||||||
+
|
|
||||||
+ assert ta.dump_python(MISSING) is MISSING
|
|
||||||
+
|
|
||||||
+ with pytest.raises(PydanticSerializationUnexpectedValue):
|
|
||||||
+ ta.dump_python(1)
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+# Defined in module to be picklable:
|
|
||||||
+class ModelPickle(BaseModel):
|
|
||||||
+ f: Union[int, MISSING] = MISSING
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+@pytest.mark.xfail(reason="PEP 661 sentinels aren't picklable yet in the experimental typing-extensions implementation")
|
|
||||||
+def test_missing_sentinel_pickle() -> None:
|
|
||||||
+ m = ModelPickle()
|
|
||||||
+ m_reconstructed = pickle.loads(pickle.dumps(m))
|
|
||||||
+
|
|
||||||
+ assert m_reconstructed.f is MISSING
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+def test_missing_sentinel_json_schema() -> None:
|
|
||||||
+ class Model(BaseModel):
|
|
||||||
+ f: Union[int, MISSING] = MISSING
|
|
||||||
+ g: MISSING = MISSING
|
|
||||||
+ h: MISSING
|
|
||||||
+
|
|
||||||
+ assert Model.model_json_schema()['properties'] == {
|
|
||||||
+ 'f': {'title': 'F', 'type': 'integer'},
|
|
||||||
+ }
|
|
||||||
Reference in New Issue
Block a user