Spaces:
Configuration error
Configuration error
File size: 2,388 Bytes
e23172f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | """Response validation for FormFav payloads.
Guards against shape drift / missing fields. Never fabricates missing data —
it records what was present so the scoring model can degrade gracefully.
"""
from __future__ import annotations
from typing import Any
class ValidationIssue:
def __init__(self, level: str, field: str, message: str) -> None:
self.level = level # 'error' | 'warn'
self.field = field
self.message = message
def __repr__(self) -> str:
return f"[{self.level}] {self.field}: {self.message}"
def validate_meetings(payload: Any) -> list[ValidationIssue]:
issues: list[ValidationIssue] = []
if not isinstance(payload, dict):
return [ValidationIssue("error", "payload", "meetings payload is not an object")]
meetings = payload.get("meetings")
if not isinstance(meetings, list):
issues.append(ValidationIssue("error", "meetings", "missing 'meetings' array"))
return issues
for i, m in enumerate(meetings):
if not isinstance(m, dict):
issues.append(ValidationIssue("error", f"meetings[{i}]", "meeting is not an object"))
continue
if "slug" not in m and "track" not in m:
issues.append(ValidationIssue("warn", f"meetings[{i}]", "no slug/track"))
if "races" not in m:
issues.append(ValidationIssue("warn", f"meetings[{i}]", "no 'races' array"))
return issues
def validate_race_form(payload: Any) -> list[ValidationIssue]:
issues: list[ValidationIssue] = []
if not isinstance(payload, dict):
return [ValidationIssue("error", "payload", "race form payload is not an object")]
if "runners" not in payload:
issues.append(ValidationIssue("error", "runners", "missing 'runners' array"))
else:
runners = payload["runners"]
if not isinstance(runners, list):
issues.append(ValidationIssue("error", "runners", "'runners' is not a list"))
else:
for i, r in enumerate(runners):
if not isinstance(r, dict):
issues.append(ValidationIssue("error", f"runners[{i}]", "runner not an object"))
continue
if "number" not in r and "barrier" not in r:
issues.append(ValidationIssue("warn", f"runners[{i}]", "runner missing number/barrier"))
return issues
|