Skip to content

Commit d84dfbc

Browse files
committed
refactor(client)!: drop the legacy validation_error field from RG configs
- the server now exposes only the structured validation_errors list on RG configs (MR 3499 standard) - discovery configs and DC libraries keep the singular field; their API is unchanged
1 parent 665db70 commit d84dfbc

3 files changed

Lines changed: 6 additions & 11 deletions

File tree

datamasque/client/models/rg_config.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ class RGConfig(BaseModel):
4444
# Server-populated read-only fields, excluded from request bodies.
4545
id: Optional[RGConfigId] = Field(default=None, exclude=True)
4646
is_valid: Optional[ValidationStatus] = Field(default=None, exclude=True)
47-
validation_error: Optional[str] = Field(default=None, exclude=True)
4847
validation_errors: list[ValidationErrorDetails] = Field(default_factory=list, exclude=True)
4948
created: Optional[datetime] = Field(default=None, exclude=True)
5049
modified: Optional[datetime] = Field(default=None, exclude=True)

datamasque/client/rg_configs.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,14 @@ def create_rg_config(self, config: RGConfig) -> RGConfig:
7373
Creates a new RG config on the server.
7474
7575
Sets the config's server-assigned fields
76-
(`id`, `is_valid`, `validation_error`, `validation_errors`, `created`, `modified`) and returns the config.
76+
(`id`, `is_valid`, `validation_errors`, `created`, `modified`) and returns the config.
7777
"""
7878

7979
data = config.model_dump(exclude_none=True, by_alias=True, mode="json")
8080
response = self.make_request("POST", "/api/ruleset-generation-configs/", data=data)
8181
created = RGConfig.model_validate(response.json())
8282
config.id = created.id
8383
config.is_valid = created.is_valid
84-
config.validation_error = created.validation_error
8584
config.validation_errors = created.validation_errors
8685
config.created = created.created
8786
config.modified = created.modified
@@ -110,7 +109,6 @@ def update_rg_config(self, config: RGConfig) -> RGConfig:
110109
response = self.make_request("PUT", f"/api/ruleset-generation-configs/{config.id}/", data=data)
111110
updated = RGConfig.model_validate(response.json())
112111
config.is_valid = updated.is_valid
113-
config.validation_error = updated.validation_error
114112
config.validation_errors = updated.validation_errors
115113
config.modified = updated.modified
116114
logger.debug('Update of RG config "%s" successful', config.name)

tests/test_rg_configs.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,6 @@ def test_create_and_update_rg_config_populate_validation_errors(client: DataMasq
266266
"name": "test_config",
267267
"config_yaml": CONFIG_YAML,
268268
"is_valid": "invalid",
269-
"validation_error": "Missing required field: labels",
270269
"validation_errors": [
271270
{
272271
"message": "Missing required field: labels",
@@ -279,7 +278,7 @@ def test_create_and_update_rg_config_populate_validation_errors(client: DataMasq
279278
"created": "2025-06-01T10:00:00Z",
280279
"modified": "2025-06-01T10:00:00Z",
281280
}
282-
valid_response = {**invalid_response, "is_valid": "valid", "validation_error": None, "validation_errors": []}
281+
valid_response = {**invalid_response, "is_valid": "valid", "validation_errors": []}
283282

284283
with requests_mock.Mocker() as m:
285284
m.post("http://test-server/api/ruleset-generation-configs/", json=invalid_response, status_code=201)
@@ -305,7 +304,6 @@ def test_create_and_update_rg_config_populate_validation_errors(client: DataMasq
305304

306305
for request in m.request_history:
307306
assert "validation_errors" not in request.json()
308-
assert "validation_error" not in request.json()
309307

310308

311309
def test_update_rg_config(client: DataMasqueClient, rg_config: RGConfig) -> None:
@@ -476,21 +474,21 @@ def test_get_default_rg_config_yaml(client: DataMasqueClient) -> None:
476474

477475

478476
def test_rg_config_parses_validation_fields() -> None:
479-
"""`is_valid` and `validation_error` round-trip from API responses."""
477+
"""`is_valid` and `validation_errors` round-trip from API responses."""
480478
config = RGConfig.model_validate(
481479
{
482480
"id": CONFIG_ID_1,
483481
"name": "my_config",
484482
"config_yaml": "labels: []",
485483
"is_valid": "invalid",
486-
"validation_error": "bad shape on line 3",
484+
"validation_errors": [{"message": "bad shape on line 3", "line_number": 3, "column_number": 1}],
487485
"created": "2025-01-01T12:00:00Z",
488486
"modified": "2025-01-02T12:00:00Z",
489487
}
490488
)
491489

492490
assert config.is_valid is ValidationStatus.invalid
493-
assert config.validation_error == "bad shape on line 3"
491+
assert config.validation_errors[0].message == "bad shape on line 3"
494492

495493

496494
def test_rg_config_validation_fields_optional() -> None:
@@ -505,7 +503,7 @@ def test_rg_config_validation_fields_optional() -> None:
505503
)
506504

507505
assert config.is_valid is None
508-
assert config.validation_error is None
506+
assert config.validation_errors == []
509507

510508

511509
def test_unwrap_rg_config_id_passes_through_strings() -> None:

0 commit comments

Comments
 (0)