diff --git a/src/validators/generator.rs b/src/validators/generator.rs index 6dc63a752..f363d9a36 100644 --- a/src/validators/generator.rs +++ b/src/validators/generator.rs @@ -224,6 +224,7 @@ pub struct InternalValidator { extra_behavior: Option, from_attributes: Option, context: Option>, + field_name: Option>, self_instance: Option>, recursion_guard: RecursionState, pub(crate) exactness: Option, @@ -257,6 +258,7 @@ impl InternalValidator { extra_behavior: extra.extra_behavior, from_attributes: extra.from_attributes, context: extra.context.map(|d| d.clone().unbind()), + field_name: extra.field_name.as_ref().map(|d| d.clone().unbind()), self_instance: extra.self_instance.map(|d| d.clone().unbind()), recursion_guard: state.recursion_guard.clone(), exactness: state.exactness, @@ -321,7 +323,7 @@ impl InternalValidator { strict: self.strict, extra_behavior: self.extra_behavior, from_attributes: self.from_attributes, - field_name: None, + field_name: self.field_name.as_ref().map(|d| d.bind(py).clone()), context: self.context.as_ref().map(|data| data.bind(py)), self_instance: self.self_instance.as_ref().map(|data| data.bind(py)), cache_str: self.cache_str, diff --git a/tests/validators/test_function.py b/tests/validators/test_function.py index 8d138d16c..326138128 100644 --- a/tests/validators/test_function.py +++ b/tests/validators/test_function.py @@ -1008,3 +1008,42 @@ def identity(v): assert v.validate_json(b'"2000-01-01"') == datetime.date(2000, 1, 1) with pytest.raises(ValidationError): v.validate_python(b'"2000-01-01"') + + +def test_field_name_preserved_wrap_validator() -> None: + class Model: + pass + + field_names: list[tuple[str, str]] = [] + + def val1(value, handler, info): + nonlocal field_names + field_names.append(('val1', info.field_name)) + return handler(value) + + def val2(value, handler, info): + nonlocal field_names + field_names.append(('val2', info.field_name)) + return handler(value) + + schema = core_schema.model_schema( + cls=Model, + schema=core_schema.model_fields_schema( + fields={ + 'f': core_schema.model_field( + schema=core_schema.with_info_wrap_validator_function( + function=val1, + schema=core_schema.with_info_wrap_validator_function( + function=val2, schema=core_schema.int_schema() + ), + ) + ) + } + ), + config={}, + ) + + v = SchemaValidator(schema) + v.validate_python({'f': 1}) + + assert field_names == [('val1', 'f'), ('val2', 'f')]