Skip to content

Commit 0425954

Browse files
authored
Populate field_name in InternalValidator (#1834)
1 parent 1e1c962 commit 0425954

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

src/validators/generator.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@ pub struct InternalValidator {
224224
extra_behavior: Option<ExtraBehavior>,
225225
from_attributes: Option<bool>,
226226
context: Option<Py<PyAny>>,
227+
field_name: Option<Py<PyString>>,
227228
self_instance: Option<Py<PyAny>>,
228229
recursion_guard: RecursionState,
229230
pub(crate) exactness: Option<Exactness>,
@@ -257,6 +258,7 @@ impl InternalValidator {
257258
extra_behavior: extra.extra_behavior,
258259
from_attributes: extra.from_attributes,
259260
context: extra.context.map(|d| d.clone().unbind()),
261+
field_name: extra.field_name.as_ref().map(|d| d.clone().unbind()),
260262
self_instance: extra.self_instance.map(|d| d.clone().unbind()),
261263
recursion_guard: state.recursion_guard.clone(),
262264
exactness: state.exactness,
@@ -321,7 +323,7 @@ impl InternalValidator {
321323
strict: self.strict,
322324
extra_behavior: self.extra_behavior,
323325
from_attributes: self.from_attributes,
324-
field_name: None,
326+
field_name: self.field_name.as_ref().map(|d| d.bind(py).clone()),
325327
context: self.context.as_ref().map(|data| data.bind(py)),
326328
self_instance: self.self_instance.as_ref().map(|data| data.bind(py)),
327329
cache_str: self.cache_str,

tests/validators/test_function.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,3 +1008,42 @@ def identity(v):
10081008
assert v.validate_json(b'"2000-01-01"') == datetime.date(2000, 1, 1)
10091009
with pytest.raises(ValidationError):
10101010
v.validate_python(b'"2000-01-01"')
1011+
1012+
1013+
def test_field_name_preserved_wrap_validator() -> None:
1014+
class Model:
1015+
pass
1016+
1017+
field_names: list[tuple[str, str]] = []
1018+
1019+
def val1(value, handler, info):
1020+
nonlocal field_names
1021+
field_names.append(('val1', info.field_name))
1022+
return handler(value)
1023+
1024+
def val2(value, handler, info):
1025+
nonlocal field_names
1026+
field_names.append(('val2', info.field_name))
1027+
return handler(value)
1028+
1029+
schema = core_schema.model_schema(
1030+
cls=Model,
1031+
schema=core_schema.model_fields_schema(
1032+
fields={
1033+
'f': core_schema.model_field(
1034+
schema=core_schema.with_info_wrap_validator_function(
1035+
function=val1,
1036+
schema=core_schema.with_info_wrap_validator_function(
1037+
function=val2, schema=core_schema.int_schema()
1038+
),
1039+
)
1040+
)
1041+
}
1042+
),
1043+
config={},
1044+
)
1045+
1046+
v = SchemaValidator(schema)
1047+
v.validate_python({'f': 1})
1048+
1049+
assert field_names == [('val1', 'f'), ('val2', 'f')]

0 commit comments

Comments
 (0)