Skip to content

Commit 743168b

Browse files
refined the error messages
1 parent 22a1127 commit 743168b

File tree

3 files changed

+40
-18
lines changed

3 files changed

+40
-18
lines changed

src/rules_validation_api/app.py

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,37 @@
44
import sys
55
from pathlib import Path
66

7+
from pydantic import ValidationError
8+
79
from rules_validation_api.validators.rules_validator import RulesValidation
810

911
logging.basicConfig(
10-
level=logging.INFO, # or DEBUG for more detail
12+
level=logging.INFO,
1113
format="%(asctime)s | %(levelname)s | %(name)s | %(message)s",
1214
force=True,
1315
)
1416

15-
GREEN = "\033[92m" # pragma: no cover
16-
RESET = "\033[0m" # pragma: no cover
17-
YELLOW = "\033[93m" # pragma: no cover
18-
RED = "\033[91m" # pragma: no cover
17+
GREEN = "\033[92m"
18+
RESET = "\033[0m"
19+
YELLOW = "\033[93m"
20+
RED = "\033[91m"
21+
22+
23+
def refine_error(e: ValidationError) -> str:
24+
"""Return a very short, single-line error message."""
25+
lines = [f"Validation Error: {len(e.errors())} validation error(s)"]
26+
27+
for err in e.errors():
28+
loc = ".".join(str(x) for x in err["loc"])
29+
msg = err["msg"]
30+
type_ = err["type"]
1931

32+
lines.append(f"{loc} : {msg} [type={type_}]")
2033

21-
def main() -> None: # pragma: no cover
34+
return "\n".join(lines)
35+
36+
37+
def main() -> None:
2238
parser = argparse.ArgumentParser(description="Validate campaign configuration.")
2339
parser.add_argument("--config_path", required=True, help="Path to the campaign config JSON file")
2440
args = parser.parse_args()
@@ -28,9 +44,11 @@ def main() -> None: # pragma: no cover
2844
json_data = json.load(file)
2945
RulesValidation(**json_data)
3046
sys.stdout.write(f"{GREEN}Valid Config{RESET}\n")
31-
except ValueError as e:
32-
sys.stderr.write(f"{YELLOW}Validation Error:{RESET} {RED}{e}{RESET}\n")
47+
48+
except ValidationError as e:
49+
clean = refine_error(e)
50+
sys.stderr.write(f"{YELLOW}{clean}{RESET}\n")
3351

3452

35-
if __name__ == "__main__": # pragma: no cover
53+
if __name__ == "__main__":
3654
main()

src/rules_validation_api/validators/campaign_config_validator.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,20 @@ def validate_campaign_has_iteration_within_schedule(self) -> typing.Self:
3737
errors: list[str] = []
3838
iterations_by_date = sorted(self.iterations, key=attrgetter("iteration_date"))
3939

40-
for iteration in iterations_by_date:
40+
for idx, iteration in enumerate(iterations_by_date):
4141
if iteration.iteration_date < self.start_date:
4242
errors.append(
43-
f"\nIteration {iteration.id} starts before campaign {self.id} start date {self.start_date}."
43+
f"CampaignConfig.Iterations.{idx}.IterationDate : "
44+
f"Starts before campaign start date {self.start_date} [type=invalid]"
4445
)
4546
if iteration.iteration_date > self.end_date:
46-
errors.append(f"\nIteration {iteration.id} starts after campaign {self.id} end date {self.end_date}.")
47+
errors.append(
48+
f"CampaignConfig.Iterations.{idx}.IterationDate : "
49+
f"Starts after campaign end date {self.end_date} [type=invalid]"
50+
)
4751

4852
if errors:
49-
# Raise one exception with all messages joined
50-
raise ValueError("".join(errors))
53+
# Raise one exception with all messages joined by newlines
54+
raise ValueError("\n".join(errors))
5155

5256
return self

tests/unit/validation/test_campaign_config_validator.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -244,8 +244,8 @@ def test_invalid_end_dates_and_iteration_dates_relation(
244244
CampaignConfigValidation(**data)
245245

246246
errors = exc_info.value.errors()
247-
assert "Iteration ITER001 starts after" in errors[0]["msg"]
248-
assert "Iteration ITER002 starts after" in errors[0]["msg"]
247+
assert "Starts after" in errors[0]["msg"]
248+
assert "Starts after" in errors[0]["msg"]
249249

250250
@pytest.mark.parametrize(
251251
("start_date", "end_date"),
@@ -265,8 +265,8 @@ def test_invalid_start_date_and_iteration_dates_relation(
265265
CampaignConfigValidation(**data)
266266

267267
errors = exc_info.value.errors()
268-
assert "Iteration ITER001 starts before" in errors[0]["msg"]
269-
assert "Iteration ITER002 starts before" in errors[0]["msg"]
268+
assert "Starts before" in errors[0]["msg"]
269+
assert "Starts before" in errors[0]["msg"]
270270

271271
# Iteration
272272
def test_validate_iterations_non_empty(self, valid_campaign_config_with_only_mandatory_fields):

0 commit comments

Comments
 (0)