File tree Expand file tree Collapse file tree 3 files changed +30
-2
lines changed Expand file tree Collapse file tree 3 files changed +30
-2
lines changed Original file line number Diff line number Diff line change
1
+ Add `TypedDict ` subclass support to fields. These are treated the same as `Dict[str, Any] `.
Original file line number Diff line number Diff line change @@ -305,11 +305,19 @@ def field_for_schema(
305
305
field = field_for_schema (newtype_supertype , default = default )
306
306
307
307
# enumerations
308
- if type (typ ) is enum .EnumMeta :
308
+ elif type (typ ) is enum .EnumMeta :
309
309
import marshmallow_enum
310
310
311
311
field = marshmallow_enum .EnumField (typ , metadata = metadata )
312
312
313
+ # TypedDict
314
+ # TODO(python3.10) use t.is_typeddict
315
+ elif isinstance (typ , t ._TypedDictMeta ):
316
+ field = marshmallow .fields .Dict (
317
+ keys = marshmallow .fields .String ,
318
+ values = marshmallow .fields .Raw ,
319
+ )
320
+
313
321
# Nested dataclasses
314
322
forward_reference = getattr (typ , "__forward_arg__" , None )
315
323
Original file line number Diff line number Diff line change @@ -437,6 +437,26 @@ class A:
437
437
assert_dump_load (schema = schema , loaded = loaded , dumped = dumped )
438
438
439
439
440
+ def test_typed_dict (
441
+ module : DataclassModule ,
442
+ assert_dump_load : AssertLoadDumpProtocol ,
443
+ ) -> None :
444
+ """Test dataclasses with basic TypedDict support"""
445
+
446
+ class B (t .TypedDict ):
447
+ x : int
448
+
449
+ @module .dataclass
450
+ class A :
451
+ x : B
452
+
453
+ schema = desert .schema_class (A )()
454
+ dumped = {"x" : {"x" : 1 }}
455
+ loaded = A (x = {"x" : 1 })
456
+
457
+ assert_dump_load (schema = schema , loaded = loaded , dumped = dumped )
458
+
459
+
440
460
@pytest .mark .xfail (
441
461
strict = True ,
442
462
reason = (
@@ -568,7 +588,6 @@ class A:
568
588
assert schema .loads (schema .dumps (loaded )) == loaded
569
589
assert schema .dump (schema .load (actually_dumped )) == actually_dumped
570
590
571
-
572
591
def test_only () -> None :
573
592
"""only() extracts the only item in an iterable."""
574
593
assert desert ._make .only ([1 ]) == 1
You can’t perform that action at this time.
0 commit comments