diff --git a/src/validators/enum_.rs b/src/validators/enum_.rs index 03393829a..0e34cb182 100644 --- a/src/validators/enum_.rs +++ b/src/validators/enum_.rs @@ -8,7 +8,7 @@ use pyo3::types::{PyDict, PyFloat, PyInt, PyList, PyString, PyType}; use crate::build_tools::{is_strict, py_schema_err}; use crate::errors::{ErrorType, ValError, ValResult}; -use crate::input::Input; +use crate::input::{Input, InputType}; use crate::tools::{safe_repr, SchemaDict}; use super::is_instance::class_repr; @@ -107,7 +107,7 @@ impl Validator for EnumValidator { return Ok(exact_py_input.clone().unbind()); } let strict = state.strict_or(self.strict); - if strict && input.as_python().is_some() { + if strict && state.extra().input_type == InputType::Python { // TODO what about instances of subclasses? return Err(ValError::new( ErrorType::IsInstanceOf { diff --git a/tests/validators/test_enums.py b/tests/validators/test_enums.py index 83e286417..1e932d7ce 100644 --- a/tests/validators/test_enums.py +++ b/tests/validators/test_enums.py @@ -487,3 +487,20 @@ def __new__(cls, species: str, sound: str): assert v.validate_python('meow') is Animal.CAT assert v.validate_python('dog') is Animal.DOG assert v.validate_python('woof') is Animal.DOG + + +def test_strict_enum_wrap_json() -> None: + """https://github.com/pydantic/pydantic/issues/11070""" + + class Animal(str, Enum): + CAT = 'cat' + DOG = 'dog' + + schema = core_schema.no_info_wrap_validator_function( + lambda v, handler: handler(v), + core_schema.enum_schema(Animal, list(Animal.__members__.values()), sub_type='str', strict=True), + ) + v = SchemaValidator(schema) + + assert v.validate_python(Animal.CAT) == Animal.CAT + assert v.validate_json('"dog"') == Animal.DOG