Skip to content

Commit ddcbcae

Browse files
jopemachineclaude
andcommitted
refactor(BA-5978): add to_dict/from_error_details on SchemaValidationError
Per review feedback, expose the dict conversion as a method on the dataclass rather than calling ``asdict`` at every site. Also expose ``from_error_details`` for the reverse direction so callers that catch both ``BackendAISchemaValidationFailed`` and ``ValidationError`` can normalize the latter into a ``SchemaValidationError`` list. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent e1c61aa commit ddcbcae

2 files changed

Lines changed: 17 additions & 3 deletions

File tree

src/ai/backend/common/exception.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import enum
44
from abc import ABC, abstractmethod
55
from collections.abc import Mapping
6-
from dataclasses import dataclass
6+
from dataclasses import asdict, dataclass
77
from typing import Any, Self
88

99
from aiohttp import web
@@ -458,6 +458,20 @@ class SchemaValidationError:
458458
msg: str
459459
url: str | None = None
460460

461+
@classmethod
462+
def from_error_details(cls, details: ErrorDetails) -> Self:
463+
"""Build from a single ``pydantic_core.ErrorDetails`` entry."""
464+
return cls(
465+
type=details["type"],
466+
loc=tuple(details["loc"]),
467+
msg=details["msg"],
468+
url=details.get("url"),
469+
)
470+
471+
def to_dict(self) -> dict[str, Any]:
472+
"""JSON-friendly representation for ``extra_data`` / HTTP responses."""
473+
return asdict(self)
474+
461475

462476
@dataclass(frozen=True)
463477
class SchemaValidationFailureInfo:

src/ai/backend/common/types.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from collections import UserDict, UserString, defaultdict, namedtuple
1414
from collections.abc import AsyncIterator, Iterable, Mapping, Sequence
1515
from contextvars import ContextVar
16-
from dataclasses import asdict, dataclass, field
16+
from dataclasses import dataclass, field
1717
from decimal import Decimal, InvalidOperation
1818
from functools import lru_cache
1919
from ipaddress import ip_address, ip_network
@@ -209,7 +209,7 @@ def build_validation_error(cls, info: SchemaValidationFailureInfo) -> BackendAIE
209209
:class:`BackendAISchemaValidationFailed`."""
210210
return BackendAISchemaValidationFailed(
211211
extra_msg=info.summary,
212-
extra_data={"errors": [asdict(e) for e in info.errors]},
212+
extra_data={"errors": [e.to_dict() for e in info.errors]},
213213
)
214214

215215
@classmethod

0 commit comments

Comments
 (0)