Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion src/abstract_validation_base/runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@ def error_summary(self) -> list[tuple[str, str]]:
"""
errors: list[tuple[str, str]] = []
for pydantic_err in self.pydantic_errors:
field_name = str(pydantic_err.get("loc", ["unknown"])[-1])
loc = pydantic_err.get("loc", ())
field_name = str(loc[-1]) if loc else "unknown"
msg = pydantic_err.get("msg", pydantic_err.get("type", "validation_error"))
errors.append((field_name, msg))
if self.validator_result:
Expand Down
17 changes: 17 additions & 0 deletions tests/test_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,23 @@ def test_error_summary_uses_type_when_msg_missing(self) -> None:
errors = result.error_summary
assert errors[0][1] == "value_error"

def test_error_summary_handles_empty_loc_tuple(self) -> None:
"""Test error_summary handles Pydantic errors with empty loc tuple.

This can occur with model_validator failures on nested models where
Pydantic may return an empty location tuple.
"""
result: RowResult[SampleModel] = RowResult(
row_index=0,
raw_data={},
pydantic_errors=[{"type": "value_error", "loc": (), "msg": "Model validation failed"}],
)

errors = result.error_summary
assert len(errors) == 1
assert errors[0][0] == "unknown" # Default when loc is empty
assert errors[0][1] == "Model validation failed"


# =============================================================================
# RunnerStats Unit Tests
Expand Down
Loading