Skip to content

Commit 540e108

Browse files
authored
Merge pull request #15 from Zaharid/dtfields
Enable ForwardRefs in dataclasses
2 parents 2c110e4 + 7ed7c0b commit 540e108

File tree

5 files changed

+26
-3
lines changed

5 files changed

+26
-3
lines changed

.github/workflows/pythonpackage.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ jobs:
99
strategy:
1010
max-parallel: 4
1111
matrix:
12-
python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13']
12+
python-version: ['3.8', '3.9', '3.10', '3.11', '3.12', '3.13', '3.14']
1313

1414
steps:
1515
- uses: actions/checkout@v1

validobj/tests/__init__.py

Whitespace-only changes.

validobj/tests/conftest.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
# https://docs.pytest.org/en/6.2.x/example/pythoncollection.html#customizing-test-collection
44

5+
collect_ignore = []
56

67
if sys.version_info < (3, 12): # pragma: nocover
7-
collect_ignore = ["test_type_syntax.py"]
8+
collect_ignore += ["test_type_syntax.py"]
9+
10+
if sys.version_info < (3, 14): # pragma: nocover
11+
collect_ignore += ["test_delayed_dataclasses.py"]
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from typing import Any
2+
import dataclasses
3+
4+
from validobj import parse_input
5+
6+
@dataclasses.dataclass
7+
class Linked:
8+
value: Any
9+
parents: Linked | list[Linked] | None = None
10+
11+
12+
def test_delayed_annotations():
13+
inp = {'value': 1, 'parents': {'value': 2, 'parents': [{'value': 3}, {'value': 4, 'parents': {'value': 5}}]}}
14+
assert parse_input(inp, Linked).parents.value == 2
15+
16+

validobj/validation.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,10 +209,13 @@ def _parse_dataclass(value, spec):
209209
header=f"Cannot process value into {_typename(spec)!r} because "
210210
f"fields do not match.",
211211
)
212+
# Note: We don't use field.type because of https://github.com/python/cpython/issues/137891
213+
types = spec.__annotations__
214+
212215
res = {}
213216
field_dict = {
214217
# Look inside InitVar
215-
f.name: f.type if not isinstance(f.type, dataclasses.InitVar) else f.type.type
218+
f.name: types[f.name] if not isinstance(f.type, dataclasses.InitVar) else f.type.type
216219
for f in fields
217220
}
218221
for k, v in value.items():

0 commit comments

Comments
 (0)