diff --git a/changes/1857-PrettyWood.md b/changes/1857-PrettyWood.md new file mode 100644 index 0000000000..f62bff6757 --- /dev/null +++ b/changes/1857-PrettyWood.md @@ -0,0 +1 @@ +fix schema generation with multiple Enums having the same name \ No newline at end of file diff --git a/pydantic/schema.py b/pydantic/schema.py index bb43245230..cf4dc4c7b8 100644 --- a/pydantic/schema.py +++ b/pydantic/schema.py @@ -791,7 +791,7 @@ def field_singleton_schema( # noqa: C901 (ignore complexity) f_schema['const'] = literal_value if lenient_issubclass(field_type, Enum): - enum_name = normalize_name(field_type.__name__) + 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)) definitions[enum_name] = enum_process_schema(field_type) diff --git a/tests/test_schema.py b/tests/test_schema.py index ddea9ede3c..3566716233 100644 --- a/tests/test_schema.py +++ b/tests/test_schema.py @@ -2097,3 +2097,55 @@ class Model(BaseModel): 'properties': {'a': {'title': 'A', 'type': 'string'}}, 'required': ['a'], } + + +def test_multiple_enums_with_same_name(create_module): + module_1 = create_module( + # language=Python + """ +from enum import Enum + +from pydantic import BaseModel + + +class MyEnum(str, Enum): + a = 'a' + b = 'b' + c = 'c' + + +class MyModel(BaseModel): + my_enum_1: MyEnum + """ + ) + + module_2 = create_module( + # language=Python + """ +from enum import Enum + +from pydantic import BaseModel + + +class MyEnum(str, Enum): + d = 'd' + e = 'e' + f = 'f' + + +class MyModel(BaseModel): + my_enum_2: MyEnum + """ + ) + + class Model(BaseModel): + my_model_1: module_1.MyModel + my_model_2: module_2.MyModel + + assert len(Model.schema()['definitions']) == 4 + assert set(Model.schema()['definitions']) == { + f'{module_1.__name__}__MyEnum', + f'{module_1.__name__}__MyModel', + f'{module_2.__name__}__MyEnum', + f'{module_2.__name__}__MyModel', + }