Skip to content

Commit c23e150

Browse files
vmphaseSiyet
andauthored
Fix json schema defaults for set / bytearray default_factory fields (#1183)
Fixes #1182 Now values are json-serializable: `[]` / `""` instead of raw `set()` / `bytearray()`. --------- Co-authored-by: Tseluiko Aleksandr <[email protected]>
1 parent fed9fc3 commit c23e150

2 files changed

Lines changed: 22 additions & 1 deletion

File tree

‎src/msgspec/_json_schema.py‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,9 @@ def to_schema(self, t: mi.Type, check_ref: bool = True) -> dict[str, Any]:
404404
elif field.default is not mi.NODEFAULT:
405405
field_schema["default"] = to_builtins(field.default, str_keys=True)
406406
elif field.default_factory in (list, dict, set, bytearray):
407-
field_schema["default"] = field.default_factory()
407+
field_schema["default"] = to_builtins(
408+
field.default_factory(), str_keys=True
409+
)
408410
names.append(field.encode_name)
409411
fields.append(field_schema)
410412

‎tests/unit/test_schema.py‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import datetime
22
import decimal
33
import enum
4+
import json
45
import sys
56
import typing
67
import uuid
@@ -373,6 +374,24 @@ class Polygon(msgspec.Struct):
373374
}
374375

375376

377+
@pytest.mark.parametrize(
378+
"factory, default",
379+
[
380+
(list, []),
381+
(dict, {}),
382+
(set, []),
383+
(bytearray, ""),
384+
],
385+
)
386+
def test_struct_default_factory_default(factory, default):
387+
class Example(msgspec.Struct):
388+
x: factory = msgspec.field(default_factory=factory)
389+
390+
schema = msgspec.json.schema(Example)["$defs"]["Example"]
391+
assert schema["properties"]["x"]["default"] == default
392+
json.dumps(schema)
393+
394+
376395
@pytest.mark.parametrize("forbid_unknown_fields", [False, True])
377396
def test_struct_array_like(forbid_unknown_fields):
378397
class Example(

0 commit comments

Comments
 (0)