Skip to content

Commit

Permalink
Specify illegal character(s) found and respective attribute(s)
Browse files Browse the repository at this point in the history
  • Loading branch information
dc-almeida committed Jan 14, 2025
1 parent c62da7f commit 164ea29
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 14 deletions.
19 changes: 9 additions & 10 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):
errors.append(
ValueError(
f"Unexpected character in {self.name}: '{code.name}'."
f"Unexpected character(s) '{"', '".join(found)}' in {self.name}.{attr}: '{code.name}'."
" Check for illegal characters and/or if tags were spelled correctly."
)
)
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)
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"Unexpected character\(s\) '{', '}' in variable.name: 'Primary Energy\|{Feul}'",
),
(
"tag_in_list",
r"Unexpected character\(s\) '{' in variable.info: 'Share\|Coal'",
),
(
"tag_in_dict",
r"Unexpected character\(s\) '}' in variable.invalid: '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"Unexpected character\(s\) '\"' in variable.info: '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 164ea29

Please sign in to comment.