Skip to content

Commit 9dddf4c

Browse files
author
Nejc Stebe
committed
fix: report the searched directories when a linked resource is missing
Now that linked resources resolve against the .plain file's directory, the syntax error lists the directories that were searched, in precedence order, so the user can see where codeplain looked. The must-be-a-file error reports the path it resolved to.
1 parent 03dede9 commit 9dddf4c

3 files changed

Lines changed: 34 additions & 2 deletions

File tree

‎plain_file.py‎

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,17 @@ def check_section_for_linked_resources(section, template_dirs):
101101

102102
resolved_target = file_utils.resolve_linked_resource(template_dirs, link.node.target)
103103
if resolved_target is None:
104-
raise PlainSyntaxError(f"Plain syntax error: Link {link.node.target} does not exist.")
104+
searched_dirs = "\n".join(f" {position}. {dir}" for position, dir in enumerate(template_dirs, start=1))
105+
raise PlainSyntaxError(
106+
f"Plain syntax error: Link {link.node.target} does not exist. "
107+
f"Linked resources are looked up relative to the following directories "
108+
f"(highest to lowest precedence):\n{searched_dirs}"
109+
)
105110

106111
if not os.path.isfile(resolved_target):
107-
raise PlainSyntaxError(f"Plain syntax error: Link {link.node.target} must be a file.")
112+
raise PlainSyntaxError(
113+
f"Plain syntax error: Link {link.node.target} must be a file (resolved to {resolved_target})."
114+
)
108115

109116
if len(link.node.children) != 1:
110117
raise PlainSyntaxError(f"Plain syntax error: Link must have text specified (link: {link.node.target}).")
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
***definitions***
2+
3+
***implementation reqs***
4+
5+
- Implementation should be written in Python.
6+
7+
***functional specs***
8+
9+
- Links must point at an existing file [missing resource](resources/missing_resource.yaml).

‎tests/test_plainfileparser.py‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,22 @@ def test_invalid_absolute_link(get_test_data_path):
146146
)
147147

148148

149+
def test_missing_link_error_lists_searched_directories(get_test_data_path):
150+
"""The error tells the user which directories were searched for the linked resource."""
151+
plain_file_dir = get_test_data_path("data/plainfile")
152+
153+
with pytest.raises(PlainSyntaxError) as exception_info:
154+
plain_file.plain_file_parser(
155+
"plain_source_with_missing_link.plain",
156+
[plain_file_dir],
157+
)
158+
159+
message = str(exception_info.value)
160+
assert "resources/missing_resource.yaml does not exist" in message
161+
assert "highest to lowest precedence" in message
162+
assert plain_file_dir in message
163+
164+
149165
def test_reference_link_parsing(get_test_data_path):
150166
_, plain_sections, _ = plain_file.plain_file_parser(
151167
"task_manager_with_reference_links.plain",

0 commit comments

Comments
 (0)