Skip to content

Commit 352fbf2

Browse files
jopemachineclaude
andcommitted
refactor(BA-6003): route CLI _build_dto through model_validate
The seven ``_build_dto`` helpers in ``client/cli/v2/admin/*`` and ``client/cli/v2/model_card/commands.py`` used to invoke the DTO via its constructor (``dto_cls(**data)``) and catch the raw pydantic ``ValidationError``. Switch them to ``dto_cls.model_validate(data)`` so the call flows through ``BackendAIModel``'s override path, and catch the resulting ``BackendAIModelValidationFailed`` instead. The per-field rendering uses ``extra_data["errors"]`` (same shape as ``pydantic.ValidationError.errors()``). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent c8708d1 commit 352fbf2

7 files changed

Lines changed: 28 additions & 28 deletions

File tree

src/ai/backend/client/cli/v2/admin/deployment_revision_preset.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@
1919

2020

2121
def _build_dto(dto_cls: type, data: dict[str, Any]) -> Any:
22-
from pydantic import ValidationError
22+
from ai.backend.common.exception import BackendAIModelValidationFailed
2323

2424
try:
25-
return dto_cls(**data)
26-
except ValidationError as e:
25+
return dto_cls.model_validate(data)
26+
except BackendAIModelValidationFailed as e:
2727
click.echo("Validation error:", err=True)
28-
for err in e.errors():
28+
for err in (e.extra_data or {}).get("errors", []):
2929
field = ".".join(str(loc) for loc in err["loc"])
3030
click.echo(f" {field}: {err['msg']}", err=True)
3131
sys.exit(1)

src/ai/backend/client/cli/v2/admin/model_card.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@
1919

2020

2121
def _build_dto(dto_cls: type, data: dict[str, Any]) -> Any:
22-
from pydantic import ValidationError
22+
from ai.backend.common.exception import BackendAIModelValidationFailed
2323

2424
try:
25-
return dto_cls(**data)
26-
except ValidationError as e:
25+
return dto_cls.model_validate(data)
26+
except BackendAIModelValidationFailed as e:
2727
click.echo("Validation error:", err=True)
28-
for err in e.errors():
28+
for err in (e.extra_data or {}).get("errors", []):
2929
field = ".".join(str(loc) for loc in err["loc"])
3030
click.echo(f" {field}: {err['msg']}", err=True)
3131
sys.exit(1)

src/ai/backend/client/cli/v2/admin/resource_policy.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,13 @@ def _load_input(
4848

4949
def _build_dto(dto_cls: type, data: dict[str, Any]) -> Any:
5050
"""Build a Pydantic DTO from a dict, catching validation errors."""
51-
from pydantic import ValidationError
51+
from ai.backend.common.exception import BackendAIModelValidationFailed
5252

5353
try:
54-
return dto_cls(**data)
55-
except ValidationError as e:
54+
return dto_cls.model_validate(data)
55+
except BackendAIModelValidationFailed as e:
5656
click.echo("Validation error:", err=True)
57-
for err in e.errors():
57+
for err in (e.extra_data or {}).get("errors", []):
5858
field = ".".join(str(loc) for loc in err["loc"])
5959
click.echo(f" {field}: {err['msg']}", err=True)
6060
sys.exit(1)

src/ai/backend/client/cli/v2/admin/resource_preset.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@
2020

2121
def _build_dto(dto_cls: type, data: dict[str, Any]) -> Any:
2222
"""Build a Pydantic DTO from a dict, catching validation errors."""
23-
from pydantic import ValidationError
23+
from ai.backend.common.exception import BackendAIModelValidationFailed
2424

2525
try:
26-
return dto_cls(**data)
27-
except ValidationError as e:
26+
return dto_cls.model_validate(data)
27+
except BackendAIModelValidationFailed as e:
2828
click.echo("Validation error:", err=True)
29-
for err in e.errors():
29+
for err in (e.extra_data or {}).get("errors", []):
3030
field = ".".join(str(loc) for loc in err["loc"])
3131
click.echo(f" {field}: {err['msg']}", err=True)
3232
sys.exit(1)

src/ai/backend/client/cli/v2/admin/runtime_variant.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@
1919

2020

2121
def _build_dto(dto_cls: type, data: dict[str, Any]) -> Any:
22-
from pydantic import ValidationError
22+
from ai.backend.common.exception import BackendAIModelValidationFailed
2323

2424
try:
25-
return dto_cls(**data)
26-
except ValidationError as e:
25+
return dto_cls.model_validate(data)
26+
except BackendAIModelValidationFailed as e:
2727
click.echo("Validation error:", err=True)
28-
for err in e.errors():
28+
for err in (e.extra_data or {}).get("errors", []):
2929
field = ".".join(str(loc) for loc in err["loc"])
3030
click.echo(f" {field}: {err['msg']}", err=True)
3131
sys.exit(1)

src/ai/backend/client/cli/v2/admin/runtime_variant_preset.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@
1919

2020

2121
def _build_dto(dto_cls: type, data: dict[str, Any]) -> Any:
22-
from pydantic import ValidationError
22+
from ai.backend.common.exception import BackendAIModelValidationFailed
2323

2424
try:
25-
return dto_cls(**data)
26-
except ValidationError as e:
25+
return dto_cls.model_validate(data)
26+
except BackendAIModelValidationFailed as e:
2727
click.echo("Validation error:", err=True)
28-
for err in e.errors():
28+
for err in (e.extra_data or {}).get("errors", []):
2929
field = ".".join(str(loc) for loc in err["loc"])
3030
click.echo(f" {field}: {err['msg']}", err=True)
3131
sys.exit(1)

src/ai/backend/client/cli/v2/model_card/commands.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@
1919

2020

2121
def _build_dto(dto_cls: type, data: dict[str, Any]) -> Any:
22-
from pydantic import ValidationError
22+
from ai.backend.common.exception import BackendAIModelValidationFailed
2323

2424
try:
25-
return dto_cls(**data)
26-
except ValidationError as e:
25+
return dto_cls.model_validate(data)
26+
except BackendAIModelValidationFailed as e:
2727
click.echo("Validation error:", err=True)
28-
for err in e.errors():
28+
for err in (e.extra_data or {}).get("errors", []):
2929
field = ".".join(str(loc) for loc in err["loc"])
3030
click.echo(f" {field}: {err['msg']}", err=True)
3131
sys.exit(1)

0 commit comments

Comments
 (0)