diff --git a/changes/2536-PrettyWood.md b/changes/2536-PrettyWood.md new file mode 100644 index 0000000000..e3c3bdbb57 --- /dev/null +++ b/changes/2536-PrettyWood.md @@ -0,0 +1 @@ +fix JSON schema generation with a `Literal` of an enum member diff --git a/pydantic/schema.py b/pydantic/schema.py index 4dc47f0d41..32a436778e 100644 --- a/pydantic/schema.py +++ b/pydantic/schema.py @@ -788,6 +788,7 @@ def field_singleton_schema( # noqa: C901 (ignore complexity) f_schema: Dict[str, Any] = {} if field.field_info is not None and field.field_info.const: f_schema['const'] = field.default + field_type = field.type_ if is_literal_type(field_type): values = all_literal_values(field_type) @@ -805,8 +806,8 @@ def field_singleton_schema( # noqa: C901 (ignore complexity) # All values have the same type field_type = values[0].__class__ f_schema['enum'] = list(values) - - if lenient_issubclass(field_type, Enum): + add_field_type_to_schema(field_type, f_schema) + elif lenient_issubclass(field_type, Enum): enum_name = model_name_map[field_type] f_schema, schema_overrides = get_field_info_schema(field) f_schema.update(get_schema_ref(enum_name, ref_prefix, ref_template, schema_overrides)) diff --git a/tests/test_schema.py b/tests/test_schema.py index 29a7e5667b..371c098343 100644 --- a/tests/test_schema.py +++ b/tests/test_schema.py @@ -1780,6 +1780,22 @@ class Model(BaseModel): } +def test_literal_enum(): + class MyEnum(str, Enum): + FOO = 'foo' + BAR = 'bar' + + class Model(BaseModel): + kind: Literal[MyEnum.FOO] + + assert Model.schema() == { + 'title': 'Model', + 'type': 'object', + 'properties': {'kind': {'title': 'Kind', 'enum': ['foo'], 'type': 'string'}}, + 'required': ['kind'], + } + + def test_color_type(): class Model(BaseModel): color: Color