fix: parse malformed schedule_days string from Robot Framework
Robot Framework's Create Dictionary converts ['mon', 'tue'] into a string. Add _parse_schedule_days to handle JSON/Python-literal parsing before Pydantic type validation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -2,7 +2,7 @@ import ast
|
||||
import json
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from pydantic import BaseModel, Field, ValidationError, field_validator
|
||||
from pydantic import BaseModel, Field, ValidationError, field_validator, model_validator
|
||||
|
||||
_VALID_DAYS = frozenset(["mon", "tue", "wed", "thu", "fri", "sat", "sun"])
|
||||
_ALL_DAYS = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"]
|
||||
@@ -74,6 +74,40 @@ class SchedulerConfig(BaseModel):
|
||||
)
|
||||
return v
|
||||
|
||||
@classmethod
|
||||
def _parse_schedule_days(cls, v):
|
||||
"""Parse schedule_days that may arrive as a malformed string.
|
||||
|
||||
Robot Framework's Create Dictionary converts Python-style lists
|
||||
like ['monday', 'tuesday'] into strings. Handle that here before
|
||||
Pydantic's type validation runs.
|
||||
"""
|
||||
if not isinstance(v, str):
|
||||
return v
|
||||
# Try JSON first (double-quoted), then Python literal (single-quoted)
|
||||
for parse_fn in (json.loads, ast.literal_eval):
|
||||
try:
|
||||
parsed = parse_fn(v)
|
||||
if isinstance(parsed, list):
|
||||
return parsed
|
||||
except Exception:
|
||||
pass
|
||||
# Cannot parse - let Pydantic handle the error
|
||||
return v
|
||||
|
||||
@model_validator(mode="before")
|
||||
@classmethod
|
||||
def _pre_validate(cls, data):
|
||||
"""Handle malformed schedule_days from Robot Framework before type validation."""
|
||||
if isinstance(data, dict):
|
||||
sd = data.get("schedule_days")
|
||||
if isinstance(sd, str):
|
||||
parsed = cls._parse_schedule_days(sd)
|
||||
if isinstance(parsed, list):
|
||||
data = dict(data)
|
||||
data["schedule_days"] = parsed
|
||||
return data
|
||||
|
||||
@field_validator("schedule_days")
|
||||
@classmethod
|
||||
def validate_schedule_days(cls, v: List[str]) -> List[str]:
|
||||
|
||||
Reference in New Issue
Block a user