File tree Expand file tree Collapse file tree 3 files changed +28
-0
lines changed Expand file tree Collapse file tree 3 files changed +28
-0
lines changed Original file line number Diff line number Diff line change 11# History
2+
23``` {currentmodule} cattrs
4+
35```
46
57This project adheres to [ Calendar Versioning] ( https://calver.org/ ) .
@@ -9,6 +11,11 @@ The third number is for emergencies when we need to start branches for older rel
911
1012Our backwards-compatibility policy can be found [ here] ( https://github.com/python-attrs/cattrs/blob/main/.github/SECURITY.md ) .
1113
14+ ## 24.1.3 (UNRELEASED)
15+
16+ - Fix structuring of keyword-only dataclass fields when not using detailed validation.
17+ ([ #637 ] ( https://github.com/python-attrs/cattrs/issues/637 ) [ #638 ] ( https://github.com/python-attrs/cattrs/pull/638 ) )
18+
1219## 24.1.2 (2024-09-22)
1320
1421- Fix {meth}` BaseConverter.register_structure_hook ` and {meth}` BaseConverter.register_unstructure_hook ` type hints.
Original file line number Diff line number Diff line change @@ -170,6 +170,7 @@ def adapted_fields(cl) -> List[Attribute]:
170170 True ,
171171 type = type_hints .get (attr .name , attr .type ),
172172 alias = attr .name ,
173+ kw_only = getattr (attr , "kw_only" , False ),
173174 )
174175 for attr in attrs
175176 ]
Original file line number Diff line number Diff line change 22from typing import List
33
44import attr
5+ import pytest
56
67from cattrs import BaseConverter
78
9+ from ._compat import is_py310_plus
10+
811
912@dataclasses .dataclass
1013class Foo :
@@ -41,3 +44,20 @@ def test_dataclasses(converter: BaseConverter):
4144
4245 assert converter .unstructure (struct ) == unstruct
4346 assert converter .structure (unstruct , Foo ) == struct
47+
48+
49+ @pytest .mark .skipif (not is_py310_plus , reason = "kwonly fields are Python 3.10+" )
50+ def test_kw_only_propagation (converter : BaseConverter ):
51+ """KW-only args work.
52+
53+ Reproducer from https://github.com/python-attrs/cattrs/issues/637.
54+ """
55+
56+ @dataclasses .dataclass
57+ class PartialKeywords :
58+ a1 : str = "Default"
59+ a2 : str = dataclasses .field (kw_only = True )
60+
61+ assert converter .structure ({"a2" : "Value" }, PartialKeywords ) == PartialKeywords (
62+ a1 = "Default" , a2 = "Value"
63+ )
You can’t perform that action at this time.
0 commit comments