From abc232954e77c87958138647d0ef7a8293076e9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20Sch=C3=BCller?= Date: Tue, 8 Oct 2024 12:40:33 +0200 Subject: [PATCH] test: introduce new error message with file reference use the new hidden attributes for nicer error messages showing the source of the problem --- src/otk/document.py | 10 ++++++---- src/otk/transform.py | 2 +- src/otk/utils.py | 3 ++- test/data/error/03-lonely-keys.err | 3 ++- test/data/error/12-two-lonely-keys.err | 3 +++ test/data/error/12-two-lonely-keys.yaml | 10 ++++++++++ 6 files changed, 24 insertions(+), 7 deletions(-) create mode 100644 test/data/error/12-two-lonely-keys.err create mode 100644 test/data/error/12-two-lonely-keys.yaml diff --git a/src/otk/document.py b/src/otk/document.py index 14e94ed4..8a0d0c98 100644 --- a/src/otk/document.py +++ b/src/otk/document.py @@ -9,12 +9,13 @@ from .transform import process_include from .traversal import State from .target import OSBuildTarget +from .utils import HiddenAttrDict log = logging.getLogger(__name__) class Omnifest: - _tree: dict[str, Any] + _tree: HiddenAttrDict[str, Any] _ctx: CommonContext _osbuild_ctx: OSBuildContext _target: str @@ -39,7 +40,7 @@ def __init__(self, path: pathlib.Path, target: str = "", *, warn_duplicated_defs self._tree = tree @classmethod - def ensure(cls, deserialized_data: dict[str, Any]) -> None: + def ensure(cls, deserialized_data: HiddenAttrDict[str, Any]) -> None: """Take a dictionary and ensure that its keys and values would be considered an Omnifest.""" @@ -49,10 +50,11 @@ def ensure(cls, deserialized_data: dict[str, Any]) -> None: raise ParseVersionError(f"omnifest must contain a key by the name of {NAME_VERSION!r}") # no toplevel keys without a target or an otk directive - targetless_keys = [key for key in deserialized_data + targetless_keys = [f" * \"{key}\" in {deserialized_data.get_attribute(key, 'src')}" for key in deserialized_data if not key.startswith(PREFIX)] if len(targetless_keys): - raise ParseError(f"otk file contains top-level keys {targetless_keys} without a target") + targetless_keys_str = '\n'.join(targetless_keys) + raise ParseError(f"otk file contains top-level keys without a target:\n{targetless_keys_str}") target_available = _targets(deserialized_data) if not target_available: diff --git a/src/otk/transform.py b/src/otk/transform.py index c2ff54f4..a918a75d 100644 --- a/src/otk/transform.py +++ b/src/otk/transform.py @@ -67,7 +67,7 @@ def _find_data(node_list, key): def _add_hidden_attributes(obj, key, key_data): line_number = key_data.start_mark.line + 1 column = key_data.start_mark.column + 1 - filename = key_data.start_mark.name + filename = os.path.relpath(key_data.start_mark.name, os.path.curdir) obj.set_attribute(key, "src", f"{filename}:{line_number}") obj.set_attribute(key, "filename", filename) obj.set_attribute(key, "linenumber", line_number) diff --git a/src/otk/utils.py b/src/otk/utils.py index 3ca7a623..46a3ef60 100644 --- a/src/otk/utils.py +++ b/src/otk/utils.py @@ -93,7 +93,8 @@ def _add_comments_to_list(self, obj): ret = [] for index, value in enumerate(obj): - comment = f"# source of index {index}: {obj.get_attribute("self", "src")}" + src = obj.get_attribute("self", "src") + comment = f"# source of index {index}: {src}" if comment: ret.append(comment) ret.append(self._enrich_with_comment(value)) diff --git a/test/data/error/03-lonely-keys.err b/test/data/error/03-lonely-keys.err index a46b772e..3ddf1d9d 100644 --- a/test/data/error/03-lonely-keys.err +++ b/test/data/error/03-lonely-keys.err @@ -1 +1,2 @@ -otk file contains top-level keys ['targetless'] without a target +otk file contains top-level keys without a target: + * "targetless" in test/data/error/03-lonely-keys.yaml:6 diff --git a/test/data/error/12-two-lonely-keys.err b/test/data/error/12-two-lonely-keys.err new file mode 100644 index 00000000..8ab49163 --- /dev/null +++ b/test/data/error/12-two-lonely-keys.err @@ -0,0 +1,3 @@ +otk file contains top-level keys without a target: + * "targetless" in test/data/error/12-two-lonely-keys.yaml:6 + * "targetless2" in test/data/error/12-two-lonely-keys.yaml:9 diff --git a/test/data/error/12-two-lonely-keys.yaml b/test/data/error/12-two-lonely-keys.yaml new file mode 100644 index 00000000..c2255a10 --- /dev/null +++ b/test/data/error/12-two-lonely-keys.yaml @@ -0,0 +1,10 @@ +otk.version: 1 + +otk.target.osbuild.foo: + a: 1 + +targetless: + key: value + +targetless2: + key2: value2