Skip to content

Commit c777e8e

Browse files
committed
Fixes for Python 3.14.
1 parent 6c1af33 commit c777e8e

File tree

3 files changed

+28
-8
lines changed

3 files changed

+28
-8
lines changed

django_pydantic_field/compat/django.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -297,9 +297,12 @@ def serialize(self):
297297

298298
AnnotatedAlias = te._AnnotatedAlias
299299

300-
if sys.version_info >= (3, 9):
300+
if sys.version_info >= (3, 14):
301301
GenericAlias = types.GenericAlias
302-
GenericTypes: ty.Tuple[ty.Any, ...] = (
302+
GenericTypes: ty.Tuple[ty.Any, ...] = (GenericAlias, type(ty.List[int]), type(ty.List), ty.Union)
303+
elif sys.version_info >= (3, 9):
304+
GenericAlias = types.GenericAlias
305+
GenericTypes = (
303306
GenericAlias,
304307
type(ty.List[int]),
305308
type(ty.List),
@@ -325,6 +328,7 @@ def serialize(self):
325328

326329
MigrationWriter.register_serializer(ty.ForwardRef, TypingSerializer)
327330
MigrationWriter.register_serializer(type(ty.Union), TypingSerializer) # type: ignore
331+
MigrationWriter.register_serializer(ty._SpecialForm, TypingSerializer) # type: ignore
328332

329333

330334
if sys.version_info >= (3, 10):

django_pydantic_field/v2/utils.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,20 @@
99
if ty.TYPE_CHECKING:
1010
from collections.abc import Mapping
1111

12+
try:
13+
from annotationlib import get_annotations # Python >= 3.14
14+
except ImportError:
1215

13-
def get_annotated_type(obj, field, default=None) -> ty.Any:
14-
try:
16+
def get_annotations(obj):
1517
if isinstance(obj, type):
16-
annotations = obj.__dict__["__annotations__"]
18+
return obj.__dict__["__annotations__"]
1719
else:
18-
annotations = obj.__annotations__
20+
return obj.__annotations__
21+
22+
23+
def get_annotated_type(obj, field, default=None) -> ty.Any:
24+
try:
25+
annotations = get_annotations(obj)
1926

2027
return annotations[field]
2128
except (AttributeError, KeyError):

tests/test_migration_serializers.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,17 @@
66
import pytest
77

88
import django_pydantic_field
9+
910
try:
1011
from django_pydantic_field.compat.django import GenericContainer
1112
except ImportError:
1213
from django_pydantic_field._migration_serializers import GenericContainer # noqa
1314

15+
try:
16+
import annotationlib
17+
except ImportError:
18+
annotationlib = None
19+
1420
if sys.version_info < (3, 9):
1521
test_types = [
1622
str,
@@ -26,6 +32,7 @@
2632
str,
2733
list,
2834
list[str],
35+
t.Literal["foo"],
2936
t.Union[t.Literal["foo"], list[str]],
3037
list[t.Union[int, bool]],
3138
tuple[list[t.Literal[1]], t.Union[str, t.Literal["foo"]]],
@@ -42,6 +49,8 @@ def test_wrap_unwrap_idempotent(raw_type):
4249
@pytest.mark.parametrize("raw_type", test_types)
4350
def test_serialize_eval_idempotent(raw_type):
4451
raw_type = GenericContainer.wrap(raw_type)
45-
expression, _ = MigrationWriter.serialize(GenericContainer.wrap(raw_type))
46-
imports = dict(typing=t, typing_extensions=te, django_pydantic_field=django_pydantic_field)
52+
expression, _ = MigrationWriter.serialize(raw_type)
53+
imports = dict(
54+
typing=t, typing_extensions=te, django_pydantic_field=django_pydantic_field, annotationlib=annotationlib
55+
)
4756
assert eval(expression, imports) == raw_type

0 commit comments

Comments
 (0)