Skip to content

Commit

Permalink
Specify illegal character(s) found and respective attribute(s) (#456)
Browse files Browse the repository at this point in the history
* Specify illegal character(s) found and respective attribute(s)

* Fix error message

* Refactor f-string for <3.12

* Rewrite error message

Co-authored-by: Daniel Huppmann <[email protected]>

* Update tests

* Shorten error message

* Use Code from external repo attribute

---------

Co-authored-by: Daniel Huppmann <[email protected]>
Co-authored-by: David Almeida <[email protected]>
  • Loading branch information
3 people authored Jan 30, 2025
1 parent 4456054 commit d5c355c
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 16 deletions.
23 changes: 11 additions & 12 deletions nomenclature/codelist.py
Original file line number Diff line number Diff line change
Expand Up @@ -339,28 +339,27 @@ def check_illegal_characters(self, config: NomenclatureConfig) -> dict[str, Code
illegal = ["{", "}"] + config.illegal_characters
errors = ErrorCollector()

def _check_string(value):
def _check_string(attr, value):
if isinstance(value, str):
if any(char in value for char in illegal):
if found := set(illegal).intersection(value):
found = "', '".join(sorted(found))
errors.append(
ValueError(
f"Unexpected character in {self.name}: '{code.name}'."
" Check for illegal characters and/or if tags were spelled correctly."
f"Illegal character(s) '{found}' in {attr} of {self.name} '{code.name}'."
)
)
elif isinstance(value, dict):
for k in value.keys():
_check_string(k)
for v in value.values():
_check_string(v)
for k, v in value.items():
_check_string(k, k)
_check_string(k, v)
elif isinstance(value, list):
for item in value:
_check_string(item)
_check_string(attr, item)

for code in self.mapping.values():
if not code.repository:
for value in code.model_dump(exclude="file").values():
_check_string(value)
if not code.from_external_repository:
for attr, value in code.model_dump(exclude="file").items():
_check_string(attr, value)
if errors:
raise ValueError(errors)

Expand Down
17 changes: 13 additions & 4 deletions tests/test_codelist.py
Original file line number Diff line number Diff line change
Expand Up @@ -271,9 +271,18 @@ def test_to_csv():
@pytest.mark.parametrize(
"subfolder, match",
[
("tag_in_str", r"Unexpected character in variable: 'Primary Energy\|{Feul}'"),
("tag_in_list", r"Unexpected character in variable: 'Share\|Coal'"),
("tag_in_dict", r"Unexpected character in variable: 'Primary Energy'"),
(
"tag_in_str",
r"Illegal character\(s\) '{', '}' in name of variable 'Primary Energy\|{Feul}'",
),
(
"tag_in_list",
r"Illegal character\(s\) '{' in info of variable 'Share\|Coal'",
),
(
"tag_in_dict",
r"Illegal character\(s\) '}' in invalid of variable 'Primary Energy'",
),
],
)
def test_stray_tag_fails(subfolder, match):
Expand All @@ -287,7 +296,7 @@ def test_stray_tag_fails(subfolder, match):

def test_illegal_char_fails():
"""Check that illegal character raises expected error."""
match = r"Unexpected character in variable: 'Primary Energy\|Coal'"
match = r"Illegal character\(s\) '\"' in info of variable 'Primary Energy\|Coal'"
with raises(ValueError, match=match):
DataStructureDefinition(
MODULE_TEST_DATA_DIR / "illegal_chars" / "char_in_str" / "definitions"
Expand Down

0 comments on commit d5c355c

Please sign in to comment.