From c6b888b2676b10bf4c460542954f9f69b706de4c Mon Sep 17 00:00:00 2001 From: Erik Jaegervall Date: Fri, 14 Feb 2025 11:35:48 +0100 Subject: [PATCH 1/2] Better error message for implicit branches Fixes #407 Signed-off-by: Erik Jaegervall --- src/vss_tools/model.py | 14 +++++++++++++- .../test_description_error.py | 2 +- tests/vspec/test_overlay/test_overlay.py | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/vss_tools/model.py b/src/vss_tools/model.py index f05142ac..6889b99a 100644 --- a/src/vss_tools/model.py +++ b/src/vss_tools/model.py @@ -109,7 +109,7 @@ def as_dict( class VSSData(VSSRaw): model_config = ConfigDict(extra="allow") type: NodeType - description: str + description: str = "" comment: str | None = None delete: bool = False deprecation: str | None = None @@ -126,6 +126,18 @@ def check_const_uid_format(cls, v: str | None) -> str | None: assert bool(re.match(pattern, v)), f"'{v}' is not a valid 'constUID'" return v + @field_validator("description", mode="before") + @classmethod + def ensure_description(cls, value: Any) -> Any: + """Give better explanation for empty description.""" + + if value == "": + raise ValueError( + "all nodes in the final tree must have a description. " + "Implicit branches are not allowed in final tree!" + ) + return value + class VSSDataBranch(VSSData): instances: Any = None diff --git a/tests/vspec/test_description_error/test_description_error.py b/tests/vspec/test_description_error/test_description_error.py index ad26040d..b5769405 100644 --- a/tests/vspec/test_description_error/test_description_error.py +++ b/tests/vspec/test_description_error/test_description_error.py @@ -40,5 +40,5 @@ def test_description_error(vspec_file: str, type_file: str, type_out_file: str, assert process.returncode != 0 log_content = log.read_text() print(log_content) - assert "'type': 'missing'" in log_content + assert "'type': 'value_error'" in log_content assert "1 model error(s):" in log_content diff --git a/tests/vspec/test_overlay/test_overlay.py b/tests/vspec/test_overlay/test_overlay.py index 939ffda6..9eb28822 100644 --- a/tests/vspec/test_overlay/test_overlay.py +++ b/tests/vspec/test_overlay/test_overlay.py @@ -71,5 +71,5 @@ def test_overlay_branch_error(tmp_path): assert process.returncode != 0 log_content = log.read_text() assert "'A.AB' has 1 model error(s)" in log_content - assert "'type': 'missing'" in log_content + assert "'type': 'value_error'" in log_content assert "description" in log_content From 287d63a995820c226a08af25f51a6e7876d3bf05 Mon Sep 17 00:00:00 2001 From: Erik Jaegervall Date: Mon, 24 Feb 2025 14:17:41 +0100 Subject: [PATCH 2/2] Using model validator for error instead Signed-off-by: Erik Jaegervall --- src/vss_tools/model.py | 16 ++++++---------- .../test_description_error.py | 2 +- tests/vspec/test_overlay/test_overlay.py | 2 +- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/vss_tools/model.py b/src/vss_tools/model.py index 6889b99a..92165012 100644 --- a/src/vss_tools/model.py +++ b/src/vss_tools/model.py @@ -126,17 +126,13 @@ def check_const_uid_format(cls, v: str | None) -> str | None: assert bool(re.match(pattern, v)), f"'{v}' is not a valid 'constUID'" return v - @field_validator("description", mode="before") - @classmethod - def ensure_description(cls, value: Any) -> Any: + @model_validator(mode="after") + def ensure_description(self) -> Self: """Give better explanation for empty description.""" - - if value == "": - raise ValueError( - "all nodes in the final tree must have a description. " - "Implicit branches are not allowed in final tree!" - ) - return value + assert ( + self.description != "" + ), "All nodes in the final tree must have a description. Implicit branches are not allowed in final tree!" + return self class VSSDataBranch(VSSData): diff --git a/tests/vspec/test_description_error/test_description_error.py b/tests/vspec/test_description_error/test_description_error.py index b5769405..79ea35c0 100644 --- a/tests/vspec/test_description_error/test_description_error.py +++ b/tests/vspec/test_description_error/test_description_error.py @@ -40,5 +40,5 @@ def test_description_error(vspec_file: str, type_file: str, type_out_file: str, assert process.returncode != 0 log_content = log.read_text() print(log_content) - assert "'type': 'value_error'" in log_content + assert "'type': 'assertion_error'" in log_content assert "1 model error(s):" in log_content diff --git a/tests/vspec/test_overlay/test_overlay.py b/tests/vspec/test_overlay/test_overlay.py index 9eb28822..5b86e882 100644 --- a/tests/vspec/test_overlay/test_overlay.py +++ b/tests/vspec/test_overlay/test_overlay.py @@ -71,5 +71,5 @@ def test_overlay_branch_error(tmp_path): assert process.returncode != 0 log_content = log.read_text() assert "'A.AB' has 1 model error(s)" in log_content - assert "'type': 'value_error'" in log_content + assert "'type': 'assertion_error'" in log_content assert "description" in log_content