Compare commits
20 Commits
| Author | SHA256 | Date | |
|---|---|---|---|
| 47ae5f04b7 | |||
| 6ff2e7b297 | |||
| 8fa841d96f | |||
| f07b39b7ee | |||
| da23bc9bcd | |||
| 471770ba28 | |||
| 8c78ba441f | |||
| 792c6d9221 | |||
| 51e012857a | |||
| 6e5b9a0d5f | |||
| da00c576a5 | |||
| ece5a4cbec | |||
| 81554033f9 | |||
| ed34bd7f24 | |||
| 7010590fbd | |||
| 516f52d744 | |||
| 3ed8cb7b37 | |||
| 03aec1e9b4 | |||
| f93ee20198 | |||
| 37a899ef23 |
566
py314.patch
566
py314.patch
@@ -1,566 +0,0 @@
|
|||||||
From 9452e13c571db7d31051768c3b4d47a6e2ceea7d Mon Sep 17 00:00:00 2001
|
|
||||||
From: Victorien <65306057+Viicos@users.noreply.github.com>
|
|
||||||
Date: Thu, 10 Jul 2025 11:31:03 +0200
|
|
||||||
Subject: [PATCH] Add initial support for Python 3.14 (#11991)
|
|
||||||
|
|
||||||
Adds basic support for Python 3.14. Deferred annotations work for simple cases, but will need to be improved in the future.
|
|
||||||
---
|
|
||||||
.github/workflows/ci.yml | 11 +-
|
|
||||||
.github/workflows/integration.yml | 4 +-
|
|
||||||
docs/migration.md | 4 +-
|
|
||||||
pydantic/_internal/_config.py | 10 +-
|
|
||||||
pydantic/_internal/_fields.py | 7 +-
|
|
||||||
pydantic/_internal/_generics.py | 7 +-
|
|
||||||
pydantic/_internal/_model_construction.py | 24 +-
|
|
||||||
pydantic/_internal/_typing_extra.py | 36 +-
|
|
||||||
pydantic/dataclasses.py | 13 +-
|
|
||||||
pyproject.toml | 3 +
|
|
||||||
tests/test_dataclasses.py | 11 +-
|
|
||||||
tests/test_deferred_annotations.py | 81 ++++
|
|
||||||
tests/test_forward_ref.py | 15 -
|
|
||||||
tests/test_model_signature.py | 2 +-
|
|
||||||
tests/test_pickle.py | 12 +-
|
|
||||||
tests/test_v1.py | 2 +
|
|
||||||
uv.lock | 512 ++++++++++++----------
|
|
||||||
17 files changed, 469 insertions(+), 285 deletions(-)
|
|
||||||
create mode 100644 tests/test_deferred_annotations.py
|
|
||||||
|
|
||||||
|
|
||||||
Index: pydantic-2.11.9/docs/migration.md
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.9.orig/docs/migration.md
|
|
||||||
+++ pydantic-2.11.9/docs/migration.md
|
|
||||||
@@ -188,7 +188,7 @@ to help ease migration, but calling them
|
|
||||||
If you'd still like to use said arguments, you can use [this workaround](https://github.com/pydantic/pydantic/issues/8825#issuecomment-1946206415).
|
|
||||||
* JSON serialization of non-string key values is generally done with `str(key)`, leading to some changes in behavior such as the following:
|
|
||||||
|
|
||||||
-```python
|
|
||||||
+```python {test="skip"}
|
|
||||||
from typing import Optional
|
|
||||||
|
|
||||||
from pydantic import BaseModel as V2BaseModel
|
|
||||||
@@ -218,7 +218,7 @@ print(v2_model.model_dump_json())
|
|
||||||
* `model_dump_json()` results are compacted in order to save space, and don't always exactly match that of `json.dumps()` output.
|
|
||||||
That being said, you can easily modify the separators used in `json.dumps()` results in order to align the two outputs:
|
|
||||||
|
|
||||||
-```python
|
|
||||||
+```python {test="skip"}
|
|
||||||
import json
|
|
||||||
|
|
||||||
from pydantic import BaseModel as V2BaseModel
|
|
||||||
Index: pydantic-2.11.9/pydantic/_internal/_config.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.9.orig/pydantic/_internal/_config.py
|
|
||||||
+++ pydantic-2.11.9/pydantic/_internal/_config.py
|
|
||||||
@@ -98,7 +98,13 @@ class ConfigWrapper:
|
|
||||||
self.config_dict = cast(ConfigDict, config)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
- def for_model(cls, bases: tuple[type[Any], ...], namespace: dict[str, Any], kwargs: dict[str, Any]) -> Self:
|
|
||||||
+ def for_model(
|
|
||||||
+ cls,
|
|
||||||
+ bases: tuple[type[Any], ...],
|
|
||||||
+ namespace: dict[str, Any],
|
|
||||||
+ raw_annotations: dict[str, Any],
|
|
||||||
+ kwargs: dict[str, Any],
|
|
||||||
+ ) -> Self:
|
|
||||||
"""Build a new `ConfigWrapper` instance for a `BaseModel`.
|
|
||||||
|
|
||||||
The config wrapper built based on (in descending order of priority):
|
|
||||||
@@ -109,6 +115,7 @@ class ConfigWrapper:
|
|
||||||
Args:
|
|
||||||
bases: A tuple of base classes.
|
|
||||||
namespace: The namespace of the class being created.
|
|
||||||
+ raw_annotations: The (non-evaluated) annotations of the model.
|
|
||||||
kwargs: The kwargs passed to the class being created.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
@@ -123,7 +130,6 @@ class ConfigWrapper:
|
|
||||||
config_class_from_namespace = namespace.get('Config')
|
|
||||||
config_dict_from_namespace = namespace.get('model_config')
|
|
||||||
|
|
||||||
- raw_annotations = namespace.get('__annotations__', {})
|
|
||||||
if raw_annotations.get('model_config') and config_dict_from_namespace is None:
|
|
||||||
raise PydanticUserError(
|
|
||||||
'`model_config` cannot be used as a model field name. Use `model_config` for model configuration.',
|
|
||||||
Index: pydantic-2.11.9/pydantic/_internal/_fields.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.9.orig/pydantic/_internal/_fields.py
|
|
||||||
+++ pydantic-2.11.9/pydantic/_internal/_fields.py
|
|
||||||
@@ -119,7 +119,8 @@ def collect_model_fields( # noqa: C901
|
|
||||||
|
|
||||||
# https://docs.python.org/3/howto/annotations.html#accessing-the-annotations-dict-of-an-object-in-python-3-9-and-older
|
|
||||||
# annotations is only used for finding fields in parent classes
|
|
||||||
- annotations = cls.__dict__.get('__annotations__', {})
|
|
||||||
+ annotations = _typing_extra.safe_get_annotations(cls)
|
|
||||||
+
|
|
||||||
fields: dict[str, FieldInfo] = {}
|
|
||||||
|
|
||||||
class_vars: set[str] = set()
|
|
||||||
@@ -375,7 +376,9 @@ def collect_dataclass_fields(
|
|
||||||
|
|
||||||
with ns_resolver.push(base):
|
|
||||||
for ann_name, dataclass_field in dataclass_fields.items():
|
|
||||||
- if ann_name not in base.__dict__.get('__annotations__', {}):
|
|
||||||
+ base_anns = _typing_extra.safe_get_annotations(base)
|
|
||||||
+
|
|
||||||
+ if ann_name not in base_anns:
|
|
||||||
# `__dataclass_fields__`contains every field, even the ones from base classes.
|
|
||||||
# Only collect the ones defined on `base`.
|
|
||||||
continue
|
|
||||||
Index: pydantic-2.11.9/pydantic/_internal/_generics.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.9.orig/pydantic/_internal/_generics.py
|
|
||||||
+++ pydantic-2.11.9/pydantic/_internal/_generics.py
|
|
||||||
@@ -1,5 +1,6 @@
|
|
||||||
from __future__ import annotations
|
|
||||||
|
|
||||||
+import operator
|
|
||||||
import sys
|
|
||||||
import types
|
|
||||||
import typing
|
|
||||||
@@ -7,6 +8,7 @@ from collections import ChainMap
|
|
||||||
from collections.abc import Iterator, Mapping
|
|
||||||
from contextlib import contextmanager
|
|
||||||
from contextvars import ContextVar
|
|
||||||
+from functools import reduce
|
|
||||||
from itertools import zip_longest
|
|
||||||
from types import prepare_class
|
|
||||||
from typing import TYPE_CHECKING, Annotated, Any, TypeVar
|
|
||||||
@@ -21,9 +23,6 @@ from ._core_utils import get_type_ref
|
|
||||||
from ._forward_ref import PydanticRecursiveRef
|
|
||||||
from ._utils import all_identical, is_model_class
|
|
||||||
|
|
||||||
-if sys.version_info >= (3, 10):
|
|
||||||
- from typing import _UnionGenericAlias # type: ignore[attr-defined]
|
|
||||||
-
|
|
||||||
if TYPE_CHECKING:
|
|
||||||
from ..main import BaseModel
|
|
||||||
|
|
||||||
@@ -311,7 +310,7 @@ def replace_types(type_: Any, type_map:
|
|
||||||
# PEP-604 syntax (Ex.: list | str) is represented with a types.UnionType object that does not have __getitem__.
|
|
||||||
# We also cannot use isinstance() since we have to compare types.
|
|
||||||
if sys.version_info >= (3, 10) and origin_type is types.UnionType:
|
|
||||||
- return _UnionGenericAlias(origin_type, resolved_type_args)
|
|
||||||
+ return reduce(operator.or_, resolved_type_args)
|
|
||||||
# NotRequired[T] and Required[T] don't support tuple type resolved_type_args, hence the condition below
|
|
||||||
return origin_type[resolved_type_args[0] if len(resolved_type_args) == 1 else resolved_type_args]
|
|
||||||
|
|
||||||
Index: pydantic-2.11.9/pydantic/_internal/_model_construction.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.9.orig/pydantic/_internal/_model_construction.py
|
|
||||||
+++ pydantic-2.11.9/pydantic/_internal/_model_construction.py
|
|
||||||
@@ -105,12 +105,29 @@ class ModelMetaclass(ABCMeta):
|
|
||||||
# that `BaseModel` itself won't have any bases, but any subclass of it will, to determine whether the `__new__`
|
|
||||||
# call we're in the middle of is for the `BaseModel` class.
|
|
||||||
if bases:
|
|
||||||
+ raw_annotations: dict[str, Any]
|
|
||||||
+ if sys.version_info >= (3, 14):
|
|
||||||
+ if (
|
|
||||||
+ '__annotations__' in namespace
|
|
||||||
+ ): # `from __future__ import annotations` was used in the model's module
|
|
||||||
+ raw_annotations = namespace['__annotations__']
|
|
||||||
+ else:
|
|
||||||
+ # See https://docs.python.org/3.14/library/annotationlib.html#using-annotations-in-a-metaclass:
|
|
||||||
+ from annotationlib import Format, call_annotate_function, get_annotate_from_class_namespace
|
|
||||||
+
|
|
||||||
+ if annotate := get_annotate_from_class_namespace(namespace):
|
|
||||||
+ raw_annotations = call_annotate_function(annotate, format=Format.FORWARDREF)
|
|
||||||
+ else:
|
|
||||||
+ raw_annotations = {}
|
|
||||||
+ else:
|
|
||||||
+ raw_annotations = namespace.get('__annotations__', {})
|
|
||||||
+
|
|
||||||
base_field_names, class_vars, base_private_attributes = mcs._collect_bases_data(bases)
|
|
||||||
|
|
||||||
- config_wrapper = ConfigWrapper.for_model(bases, namespace, kwargs)
|
|
||||||
+ config_wrapper = ConfigWrapper.for_model(bases, namespace, raw_annotations, kwargs)
|
|
||||||
namespace['model_config'] = config_wrapper.config_dict
|
|
||||||
private_attributes = inspect_namespace(
|
|
||||||
- namespace, config_wrapper.ignored_types, class_vars, base_field_names
|
|
||||||
+ namespace, raw_annotations, config_wrapper.ignored_types, class_vars, base_field_names
|
|
||||||
)
|
|
||||||
if private_attributes or base_private_attributes:
|
|
||||||
original_model_post_init = get_model_post_init(namespace, bases)
|
|
||||||
@@ -365,6 +382,7 @@ def get_model_post_init(namespace: dict[
|
|
||||||
|
|
||||||
def inspect_namespace( # noqa C901
|
|
||||||
namespace: dict[str, Any],
|
|
||||||
+ raw_annotations: dict[str, Any],
|
|
||||||
ignored_types: tuple[type[Any], ...],
|
|
||||||
base_class_vars: set[str],
|
|
||||||
base_class_fields: set[str],
|
|
||||||
@@ -375,6 +393,7 @@ def inspect_namespace( # noqa C901
|
|
||||||
|
|
||||||
Args:
|
|
||||||
namespace: The attribute dictionary of the class to be created.
|
|
||||||
+ raw_annotations: The (non-evaluated) annotations of the model.
|
|
||||||
ignored_types: A tuple of ignore types.
|
|
||||||
base_class_vars: A set of base class class variables.
|
|
||||||
base_class_fields: A set of base class fields.
|
|
||||||
@@ -396,7 +415,6 @@ def inspect_namespace( # noqa C901
|
|
||||||
all_ignored_types = ignored_types + default_ignored_types()
|
|
||||||
|
|
||||||
private_attributes: dict[str, ModelPrivateAttr] = {}
|
|
||||||
- raw_annotations = namespace.get('__annotations__', {})
|
|
||||||
|
|
||||||
if '__root__' in raw_annotations or '__root__' in namespace:
|
|
||||||
raise TypeError("To define root models, use `pydantic.RootModel` rather than a field called '__root__'")
|
|
||||||
Index: pydantic-2.11.9/pydantic/_internal/_typing_extra.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.9.orig/pydantic/_internal/_typing_extra.py
|
|
||||||
+++ pydantic-2.11.9/pydantic/_internal/_typing_extra.py
|
|
||||||
@@ -26,6 +26,9 @@ else:
|
|
||||||
from types import EllipsisType as EllipsisType
|
|
||||||
from types import NoneType as NoneType
|
|
||||||
|
|
||||||
+if sys.version_info >= (3, 14):
|
|
||||||
+ import annotationlib
|
|
||||||
+
|
|
||||||
if TYPE_CHECKING:
|
|
||||||
from pydantic import BaseModel
|
|
||||||
|
|
||||||
@@ -289,6 +292,19 @@ def _type_convert(arg: Any) -> Any:
|
|
||||||
return arg
|
|
||||||
|
|
||||||
|
|
||||||
+def safe_get_annotations(cls: type[Any]) -> dict[str, Any]:
|
|
||||||
+ """Get the annotations for the provided class, accounting for potential deferred forward references.
|
|
||||||
+
|
|
||||||
+ Starting with Python 3.14, accessing the `__annotations__` attribute might raise a `NameError` if
|
|
||||||
+ a referenced symbol isn't defined yet. In this case, we return the annotation in the *forward ref*
|
|
||||||
+ format.
|
|
||||||
+ """
|
|
||||||
+ if sys.version_info >= (3, 14):
|
|
||||||
+ return annotationlib.get_annotations(cls, format=annotationlib.Format.FORWARDREF)
|
|
||||||
+ else:
|
|
||||||
+ return cls.__dict__.get('__annotations__', {})
|
|
||||||
+
|
|
||||||
+
|
|
||||||
def get_model_type_hints(
|
|
||||||
obj: type[BaseModel],
|
|
||||||
*,
|
|
||||||
@@ -309,9 +325,14 @@ def get_model_type_hints(
|
|
||||||
ns_resolver = ns_resolver or NsResolver()
|
|
||||||
|
|
||||||
for base in reversed(obj.__mro__):
|
|
||||||
- ann: dict[str, Any] | None = base.__dict__.get('__annotations__')
|
|
||||||
- if not ann or isinstance(ann, types.GetSetDescriptorType):
|
|
||||||
+ # For Python 3.14, we could also use `Format.VALUE` and pass the globals/locals
|
|
||||||
+ # from the ns_resolver, but we want to be able to know which specific field failed
|
|
||||||
+ # to evaluate:
|
|
||||||
+ ann = safe_get_annotations(base)
|
|
||||||
+
|
|
||||||
+ if not ann:
|
|
||||||
continue
|
|
||||||
+
|
|
||||||
with ns_resolver.push(base):
|
|
||||||
globalns, localns = ns_resolver.types_namespace
|
|
||||||
for name, value in ann.items():
|
|
||||||
@@ -341,13 +362,18 @@ def get_cls_type_hints(
|
|
||||||
obj: The class to inspect.
|
|
||||||
ns_resolver: A namespace resolver instance to use. Defaults to an empty instance.
|
|
||||||
"""
|
|
||||||
- hints: dict[str, Any] | dict[str, tuple[Any, bool]] = {}
|
|
||||||
+ hints: dict[str, Any] = {}
|
|
||||||
ns_resolver = ns_resolver or NsResolver()
|
|
||||||
|
|
||||||
for base in reversed(obj.__mro__):
|
|
||||||
- ann: dict[str, Any] | None = base.__dict__.get('__annotations__')
|
|
||||||
- if not ann or isinstance(ann, types.GetSetDescriptorType):
|
|
||||||
+ # For Python 3.14, we could also use `Format.VALUE` and pass the globals/locals
|
|
||||||
+ # from the ns_resolver, but we want to be able to know which specific field failed
|
|
||||||
+ # to evaluate:
|
|
||||||
+ ann = safe_get_annotations(base)
|
|
||||||
+
|
|
||||||
+ if not ann:
|
|
||||||
continue
|
|
||||||
+
|
|
||||||
with ns_resolver.push(base):
|
|
||||||
globalns, localns = ns_resolver.types_namespace
|
|
||||||
for name, value in ann.items():
|
|
||||||
Index: pydantic-2.11.9/pydantic/dataclasses.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.9.orig/pydantic/dataclasses.py
|
|
||||||
+++ pydantic-2.11.9/pydantic/dataclasses.py
|
|
||||||
@@ -157,7 +157,12 @@ def dataclass(
|
|
||||||
`x: int = dataclasses.field(default=pydantic.Field(..., kw_only=True), kw_only=True)`
|
|
||||||
"""
|
|
||||||
for annotation_cls in cls.__mro__:
|
|
||||||
- annotations: dict[str, Any] = getattr(annotation_cls, '__annotations__', {})
|
|
||||||
+ if sys.version_info >= (3, 14):
|
|
||||||
+ from annotationlib import Format, get_annotations
|
|
||||||
+
|
|
||||||
+ annotations = get_annotations(annotation_cls, format=Format.FORWARDREF)
|
|
||||||
+ else:
|
|
||||||
+ annotations: dict[str, Any] = getattr(annotation_cls, '__annotations__', {})
|
|
||||||
for field_name in annotations:
|
|
||||||
field_value = getattr(cls, field_name, None)
|
|
||||||
# Process only if this is an instance of `FieldInfo`.
|
|
||||||
@@ -176,9 +181,9 @@ def dataclass(
|
|
||||||
field_args['repr'] = field_value.repr
|
|
||||||
|
|
||||||
setattr(cls, field_name, dataclasses.field(**field_args))
|
|
||||||
- # In Python 3.9, when subclassing, information is pulled from cls.__dict__['__annotations__']
|
|
||||||
- # for annotations, so we must make sure it's initialized before we add to it.
|
|
||||||
- if cls.__dict__.get('__annotations__') is None:
|
|
||||||
+ if sys.version_info < (3, 10) and cls.__dict__.get('__annotations__') is None:
|
|
||||||
+ # In Python 3.9, when a class doesn't have any annotations, accessing `__annotations__`
|
|
||||||
+ # raises an `AttributeError`.
|
|
||||||
cls.__annotations__ = {}
|
|
||||||
cls.__annotations__[field_name] = annotations[field_name]
|
|
||||||
|
|
||||||
Index: pydantic-2.11.9/pyproject.toml
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.9.orig/pyproject.toml
|
|
||||||
+++ pydantic-2.11.9/pyproject.toml
|
|
||||||
@@ -32,6 +32,7 @@ classifiers = [
|
|
||||||
'Programming Language :: Python :: 3.11',
|
|
||||||
'Programming Language :: Python :: 3.12',
|
|
||||||
'Programming Language :: Python :: 3.13',
|
|
||||||
+ 'Programming Language :: Python :: 3.14',
|
|
||||||
'Intended Audience :: Developers',
|
|
||||||
'Intended Audience :: Information Technology',
|
|
||||||
'License :: OSI Approved :: MIT License',
|
|
||||||
@@ -220,6 +221,8 @@ pydocstyle = { convention = 'google' }
|
|
||||||
'docs/*' = ['D']
|
|
||||||
'pydantic/__init__.py' = ['F405', 'F403', 'D']
|
|
||||||
'tests/test_forward_ref.py' = ['F821']
|
|
||||||
+# We can't configure a specific Python version per file (this one only supports 3.14+):
|
|
||||||
+'tests/test_deferred_annotations.py' = ['F821', 'F841']
|
|
||||||
'tests/*' = ['D', 'B', 'C4']
|
|
||||||
'pydantic/deprecated/*' = ['D', 'PYI']
|
|
||||||
'pydantic/color.py' = ['PYI']
|
|
||||||
Index: pydantic-2.11.9/tests/test_dataclasses.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.9.orig/tests/test_dataclasses.py
|
|
||||||
+++ pydantic-2.11.9/tests/test_dataclasses.py
|
|
||||||
@@ -30,6 +30,7 @@ from pydantic import (
|
|
||||||
BaseModel,
|
|
||||||
BeforeValidator,
|
|
||||||
ConfigDict,
|
|
||||||
+ Field,
|
|
||||||
PydanticDeprecatedSince20,
|
|
||||||
PydanticUndefinedAnnotation,
|
|
||||||
PydanticUserError,
|
|
||||||
@@ -45,7 +46,6 @@ from pydantic import (
|
|
||||||
)
|
|
||||||
from pydantic._internal._mock_val_ser import MockValSer
|
|
||||||
from pydantic.dataclasses import is_pydantic_dataclass, rebuild_dataclass
|
|
||||||
-from pydantic.fields import Field, FieldInfo
|
|
||||||
from pydantic.json_schema import model_json_schema
|
|
||||||
|
|
||||||
|
|
||||||
@@ -2072,15 +2072,14 @@ def test_inheritance_replace(decorator1:
|
|
||||||
def test_dataclasses_inheritance_default_value_is_not_deleted(
|
|
||||||
decorator1: Callable[[Any], Any], default: Literal[1]
|
|
||||||
) -> None:
|
|
||||||
- if decorator1 is dataclasses.dataclass and isinstance(default, FieldInfo):
|
|
||||||
- pytest.skip(reason="stdlib dataclasses don't support Pydantic fields")
|
|
||||||
-
|
|
||||||
@decorator1
|
|
||||||
class Parent:
|
|
||||||
a: int = default
|
|
||||||
|
|
||||||
- assert Parent.a == 1
|
|
||||||
- assert Parent().a == 1
|
|
||||||
+ # stdlib dataclasses don't support Pydantic's `Field()`:
|
|
||||||
+ if decorator1 is pydantic.dataclasses.dataclass:
|
|
||||||
+ assert Parent.a == 1
|
|
||||||
+ assert Parent().a == 1
|
|
||||||
|
|
||||||
@pydantic.dataclasses.dataclass
|
|
||||||
class Child(Parent):
|
|
||||||
Index: pydantic-2.11.9/tests/test_deferred_annotations.py
|
|
||||||
===================================================================
|
|
||||||
--- /dev/null
|
|
||||||
+++ pydantic-2.11.9/tests/test_deferred_annotations.py
|
|
||||||
@@ -0,0 +1,81 @@
|
|
||||||
+"""Tests related to deferred evaluation of annotations introduced in Python 3.14 by PEP 649 and 749."""
|
|
||||||
+
|
|
||||||
+import sys
|
|
||||||
+from dataclasses import field
|
|
||||||
+from typing import Annotated
|
|
||||||
+
|
|
||||||
+import pytest
|
|
||||||
+from annotated_types import MaxLen
|
|
||||||
+
|
|
||||||
+from pydantic import BaseModel, Field, ValidationError
|
|
||||||
+from pydantic.dataclasses import dataclass
|
|
||||||
+
|
|
||||||
+pytestmark = pytest.mark.skipif(
|
|
||||||
+ sys.version_info < (3, 14), reason='Requires deferred evaluation of annotations introduced in Python 3.14'
|
|
||||||
+)
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+def test_deferred_annotations_model() -> None:
|
|
||||||
+ class Model(BaseModel):
|
|
||||||
+ a: Int
|
|
||||||
+ b: Str = 'a'
|
|
||||||
+
|
|
||||||
+ Int = int
|
|
||||||
+ Str = str
|
|
||||||
+
|
|
||||||
+ inst = Model(a='1', b=b'test')
|
|
||||||
+ assert inst.a == 1
|
|
||||||
+ assert inst.b == 'test'
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+@pytest.mark.xfail(
|
|
||||||
+ reason=(
|
|
||||||
+ 'When rebuilding model fields, we individually re-evaluate all fields (using `_eval_type()`) '
|
|
||||||
+ "and as such we don't benefit from PEP 649's capabilities."
|
|
||||||
+ ),
|
|
||||||
+)
|
|
||||||
+def test_deferred_annotations_nested_model() -> None:
|
|
||||||
+ def outer():
|
|
||||||
+ def inner():
|
|
||||||
+ class Model(BaseModel):
|
|
||||||
+ ann: Annotated[List[Dict[str, str]], MaxLen(1)]
|
|
||||||
+
|
|
||||||
+ Dict = dict
|
|
||||||
+
|
|
||||||
+ return Model
|
|
||||||
+
|
|
||||||
+ List = list
|
|
||||||
+
|
|
||||||
+ Model = inner()
|
|
||||||
+
|
|
||||||
+ return Model
|
|
||||||
+
|
|
||||||
+ Model = outer()
|
|
||||||
+
|
|
||||||
+ with pytest.raises(ValidationError) as exc_info:
|
|
||||||
+ Model(ann=[{'a': 'b'}, {'c': 'd'}])
|
|
||||||
+
|
|
||||||
+ assert exc_info.value.errors()[0]['type'] == 'too_long'
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+def test_deferred_annotations_pydantic_dataclass() -> None:
|
|
||||||
+ @dataclass
|
|
||||||
+ class A:
|
|
||||||
+ a: Int = field(default=1)
|
|
||||||
+
|
|
||||||
+ Int = int
|
|
||||||
+
|
|
||||||
+ assert A(a='1').a == 1
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+@pytest.mark.xfail(
|
|
||||||
+ reason="To support Pydantic's `Field()` function in dataclasses, we directly write to `__annotations__`"
|
|
||||||
+)
|
|
||||||
+def test_deferred_annotations_pydantic_dataclass_pydantic_field() -> None:
|
|
||||||
+ @dataclass
|
|
||||||
+ class A:
|
|
||||||
+ a: Int = Field(default=1)
|
|
||||||
+
|
|
||||||
+ Int = int
|
|
||||||
+
|
|
||||||
+ assert A(a='1').a == 1
|
|
||||||
Index: pydantic-2.11.9/tests/test_forward_ref.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.9.orig/tests/test_forward_ref.py
|
|
||||||
+++ pydantic-2.11.9/tests/test_forward_ref.py
|
|
||||||
@@ -74,21 +74,6 @@ def test_forward_ref_auto_update_no_mode
|
|
||||||
assert f.model_dump() == {'a': {'b': {'a': {'b': {'a': None}}}}}
|
|
||||||
|
|
||||||
|
|
||||||
-def test_forward_ref_one_of_fields_not_defined(create_module):
|
|
||||||
- @create_module
|
|
||||||
- def module():
|
|
||||||
- from pydantic import BaseModel
|
|
||||||
-
|
|
||||||
- class Foo(BaseModel):
|
|
||||||
- foo: 'Foo'
|
|
||||||
- bar: 'Bar'
|
|
||||||
-
|
|
||||||
- assert {k: repr(v) for k, v in module.Foo.model_fields.items()} == {
|
|
||||||
- 'foo': 'FieldInfo(annotation=Foo, required=True)',
|
|
||||||
- 'bar': "FieldInfo(annotation=ForwardRef('Bar'), required=True)",
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
-
|
|
||||||
def test_basic_forward_ref(create_module):
|
|
||||||
@create_module
|
|
||||||
def module():
|
|
||||||
Index: pydantic-2.11.9/tests/test_model_signature.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.9.orig/tests/test_model_signature.py
|
|
||||||
+++ pydantic-2.11.9/tests/test_model_signature.py
|
|
||||||
@@ -184,7 +184,7 @@ def test_annotated_field():
|
|
||||||
assert typing_objects.is_annotated(get_origin(sig.parameters['foo'].annotation))
|
|
||||||
|
|
||||||
|
|
||||||
-@pytest.mark.skipif(sys.version_info < (3, 10), reason='repr different on older versions')
|
|
||||||
+@pytest.mark.skipif(sys.version_info < (3, 10), sys.version_info >= (3, 14), reason='repr different on older versions')
|
|
||||||
def test_annotated_optional_field():
|
|
||||||
from annotated_types import Gt
|
|
||||||
|
|
||||||
Index: pydantic-2.11.9/tests/test_pickle.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.9.orig/tests/test_pickle.py
|
|
||||||
+++ pydantic-2.11.9/tests/test_pickle.py
|
|
||||||
@@ -1,6 +1,7 @@
|
|
||||||
import dataclasses
|
|
||||||
import gc
|
|
||||||
import pickle
|
|
||||||
+import sys
|
|
||||||
from typing import Optional
|
|
||||||
|
|
||||||
import pytest
|
|
||||||
@@ -17,6 +18,11 @@ except ImportError:
|
|
||||||
|
|
||||||
pytestmark = pytest.mark.skipif(cloudpickle is None, reason='cloudpickle is not installed')
|
|
||||||
|
|
||||||
+cloudpickle_xfail = pytest.mark.xfail(
|
|
||||||
+ condition=sys.version_info >= (3, 14),
|
|
||||||
+ reason='Cloudpickle issue: https://github.com/cloudpipe/cloudpickle/issues/572',
|
|
||||||
+)
|
|
||||||
+
|
|
||||||
|
|
||||||
class IntWrapper:
|
|
||||||
def __init__(self, v: int):
|
|
||||||
@@ -88,7 +94,7 @@ def model_factory() -> type:
|
|
||||||
(ImportableModel, False),
|
|
||||||
(ImportableModel, True),
|
|
||||||
# Locally-defined model can only be pickled with cloudpickle.
|
|
||||||
- (model_factory(), True),
|
|
||||||
+ pytest.param(model_factory(), True, marks=cloudpickle_xfail),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
def test_pickle_model(model_type: type, use_cloudpickle: bool):
|
|
||||||
@@ -133,7 +139,7 @@ def nested_model_factory() -> type:
|
|
||||||
(ImportableNestedModel, False),
|
|
||||||
(ImportableNestedModel, True),
|
|
||||||
# Locally-defined model can only be pickled with cloudpickle.
|
|
||||||
- (nested_model_factory(), True),
|
|
||||||
+ pytest.param(nested_model_factory(), True, marks=cloudpickle_xfail),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
def test_pickle_nested_model(model_type: type, use_cloudpickle: bool):
|
|
||||||
@@ -264,7 +270,7 @@ def nested_dataclass_model_factory() ->
|
|
||||||
(ImportableNestedDataclassModel, False),
|
|
||||||
(ImportableNestedDataclassModel, True),
|
|
||||||
# Locally-defined model can only be pickled with cloudpickle.
|
|
||||||
- (nested_dataclass_model_factory(), True),
|
|
||||||
+ pytest.param(nested_dataclass_model_factory(), True, marks=cloudpickle_xfail),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
def test_pickle_dataclass_nested_in_model(model_type: type, use_cloudpickle: bool):
|
|
||||||
Index: pydantic-2.11.9/tests/test_v1.py
|
|
||||||
===================================================================
|
|
||||||
--- pydantic-2.11.9.orig/tests/test_v1.py
|
|
||||||
+++ pydantic-2.11.9/tests/test_v1.py
|
|
||||||
@@ -1,3 +1,4 @@
|
|
||||||
+import sys
|
|
||||||
import warnings
|
|
||||||
|
|
||||||
import pytest
|
|
||||||
@@ -14,6 +15,7 @@ def test_version():
|
|
||||||
assert V1_VERSION != VERSION
|
|
||||||
|
|
||||||
|
|
||||||
+@pytest.mark.skipif(sys.version_info >= (3, 14), reason='Python 3.14+ not supported')
|
|
||||||
@pytest.mark.thread_unsafe(reason='Mutates the value')
|
|
||||||
def test_root_validator():
|
|
||||||
class Model(V1BaseModel):
|
|
||||||
BIN
pydantic-2.11.7.tar.gz
(Stored with Git LFS)
Normal file
BIN
pydantic-2.11.7.tar.gz
(Stored with Git LFS)
Normal file
Binary file not shown.
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:e14caadd65cf15f778c90cd9f4878942b44aeaeaf3a6b595fbc88b0555df0dc1
|
|
||||||
size 3090332
|
|
||||||
@@ -1,15 +1,3 @@
|
|||||||
-------------------------------------------------------------------
|
|
||||||
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>
|
||||||
|
|
||||||
@@ -283,181 +271,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,7 +27,7 @@
|
|||||||
%endif
|
%endif
|
||||||
%{?sle15_python_module_pythons}
|
%{?sle15_python_module_pythons}
|
||||||
Name: python-pydantic%{psuffix}
|
Name: python-pydantic%{psuffix}
|
||||||
Version: 2.11.9
|
Version: 2.11.7
|
||||||
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
|
||||||
@@ -39,8 +39,6 @@ Patch0: bump-pydantic-core-2.35.1.patch
|
|||||||
Patch1: field-name-validator-core-schemas.patch
|
Patch1: field-name-validator-core-schemas.patch
|
||||||
# PATCH-FIX-UPSTREAM Based on gh#pydantic/pydantic#11883
|
# PATCH-FIX-UPSTREAM Based on gh#pydantic/pydantic#11883
|
||||||
Patch2: support-pydantic-core-2.39.0.patch
|
Patch2: support-pydantic-core-2.39.0.patch
|
||||||
# PATCH-FIX-UPSTREAM https://github.com/pydantic/pydantic/pull/11991 Add initial support for Python 3.14
|
|
||||||
Patch3: py314.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}
|
||||||
|
|||||||
Reference in New Issue
Block a user