diff --git a/HISTORY.rst b/HISTORY.rst index 32765d9..8e4306b 100644 --- a/HISTORY.rst +++ b/HISTORY.rst @@ -8,6 +8,7 @@ v0.31 (unreleased) * better support for floating point `multiple_of` values, #652 by @justindujardin * fix schema generation for ``NewType`` and ``Literal``, #649 by @dmontagu * fix ``alias_generator`` and field config conflict, #645 by @gmetzker and #658 by @MrMrRobat +* more detailed message for ``EnumError``, #673 by @dmontagu * add advanced exclude support for ``dict``, ``json`` and ``copy``, #648 by @MrMrRobat * fix bug in ``GenericModel`` for models with concrete parameterized fields, #672 by @dmontagu * add documentation for Literal type, #651 by @dmontagu diff --git a/pydantic/errors.py b/pydantic/errors.py index eda450a..7e9b837 100644 --- a/pydantic/errors.py +++ b/pydantic/errors.py @@ -86,7 +86,9 @@ class UrlRegexError(PydanticValueError): class EnumError(PydanticTypeError): - msg_template = 'value is not a valid enumeration member' + def __str__(self) -> str: + permitted = ', '.join(repr(v.value) for v in self.ctx['enum_type']) # type: ignore + return f'value is not a valid enumeration member; permitted: {permitted}' class IntegerError(PydanticTypeError): diff --git a/pydantic/validators.py b/pydantic/validators.py index 9913030..7ecb9de 100644 --- a/pydantic/validators.py +++ b/pydantic/validators.py @@ -219,9 +219,10 @@ def set_validator(v: Any) -> Set[Any]: def enum_validator(v: Any, field: 'Field', config: 'BaseConfig') -> Enum: - with change_exception(errors.EnumError, ValueError): + try: enum_v = field.type_(v) - + except ValueError: + raise errors.EnumError(enum_type=field.type_) return enum_v.value if config.use_enum_values else enum_v diff --git a/tests/test_types.py b/tests/test_types.py index d22daee..4a7156e 100644 --- a/tests/test_types.py +++ b/tests/test_types.py @@ -473,7 +473,12 @@ def test_enum_fails(): with pytest.raises(ValueError) as exc_info: CookingModel(tool=3) assert exc_info.value.errors() == [ - {'loc': ('tool',), 'msg': 'value is not a valid enumeration member', 'type': 'type_error.enum'} + { + 'loc': ('tool',), + 'msg': 'value is not a valid enumeration member; permitted: 1, 2', + 'type': 'type_error.enum', + 'ctx': {'enum_type': ToolEnum}, + } ]