diff --git a/changes/4155-aminalaee.md b/changes/4155-aminalaee.md new file mode 100644 index 0000000000..8eae2e1c3f --- /dev/null +++ b/changes/4155-aminalaee.md @@ -0,0 +1 @@ +Fix JSON schema for `set` and `frozenset` when they include default values. diff --git a/docs/build/schema_mapping.py b/docs/build/schema_mapping.py index c9b6c018fd..96c7b74a01 100755 --- a/docs/build/schema_mapping.py +++ b/docs/build/schema_mapping.py @@ -74,6 +74,13 @@ 'JSON Schema Validation', '' ], + [ + 'frozenset', + 'array', + {'items': {}, 'uniqueItems': True}, + 'JSON Schema Validation', + '' + ], [ 'List[str]', 'array', diff --git a/pydantic/schema.py b/pydantic/schema.py index c0e032f81e..593cab5ad5 100644 --- a/pydantic/schema.py +++ b/pydantic/schema.py @@ -77,7 +77,7 @@ is_none_type, is_union, ) -from .utils import ROOT_KEY, get_model, lenient_issubclass, sequence_like +from .utils import ROOT_KEY, get_model, lenient_issubclass if TYPE_CHECKING: from .dataclasses import Dataclass @@ -970,7 +970,7 @@ def encode_default(dft: Any) -> Any: return dft.value elif isinstance(dft, (int, float, str)): return dft - elif sequence_like(dft): + elif isinstance(dft, (list, tuple)): t = dft.__class__ seq_args = (encode_default(v) for v in dft) return t(*seq_args) if is_namedtuple(t) else t(seq_args) diff --git a/tests/test_schema.py b/tests/test_schema.py index b1bb7fd80f..f8db3129ab 100644 --- a/tests/test_schema.py +++ b/tests/test_schema.py @@ -530,6 +530,7 @@ def test_set(): class Model(BaseModel): a: Set[int] b: set + c: set = {1} assert Model.schema() == { 'title': 'Model', @@ -537,6 +538,7 @@ class Model(BaseModel): 'properties': { 'a': {'title': 'A', 'type': 'array', 'uniqueItems': True, 'items': {'type': 'integer'}}, 'b': {'title': 'B', 'type': 'array', 'items': {}, 'uniqueItems': True}, + 'c': {'title': 'C', 'type': 'array', 'items': {}, 'default': [1], 'uniqueItems': True}, }, 'required': ['a', 'b'], } @@ -2187,13 +2189,13 @@ class Model(BaseModel): 'properties': { 'a': { 'title': 'A', - 'default': frozenset({1, 2, 3}), + 'default': [1, 2, 3], 'type': 'array', 'items': {'type': 'integer'}, 'uniqueItems': True, }, - 'b': {'title': 'B', 'default': frozenset({1, 2, 3}), 'type': 'array', 'items': {}, 'uniqueItems': True}, - 'c': {'title': 'C', 'default': frozenset({1, 2, 3}), 'type': 'array', 'items': {}, 'uniqueItems': True}, + 'b': {'title': 'B', 'default': [1, 2, 3], 'type': 'array', 'items': {}, 'uniqueItems': True}, + 'c': {'title': 'C', 'default': [1, 2, 3], 'type': 'array', 'items': {}, 'uniqueItems': True}, 'd': {'title': 'D', 'type': 'array', 'items': {}, 'uniqueItems': True}, }, 'required': ['d'],