|
11 | 11 | from _pytask.console import console |
12 | 12 | from _pytask.console import create_summary_panel |
13 | 13 | from _pytask.console import create_url_style_for_task |
| 14 | +from _pytask.console import format_strings_as_flat_tree |
14 | 15 | from _pytask.console import format_task_id |
15 | 16 | from _pytask.console import unify_styles |
16 | 17 | from _pytask.dag import descending_tasks |
|
27 | 28 | from _pytask.report import ExecutionReport |
28 | 29 | from _pytask.session import Session |
29 | 30 | from _pytask.shared import get_first_non_none_value |
| 31 | +from _pytask.shared import reduce_node_name |
30 | 32 | from _pytask.traceback import format_exception_without_traceback |
31 | 33 | from _pytask.traceback import remove_traceback_from_exc_info |
32 | 34 | from _pytask.traceback import render_exc_info |
@@ -167,15 +169,23 @@ def pytask_execute_task(task: Task) -> bool: |
167 | 169 |
|
168 | 170 | @hookimpl |
169 | 171 | def pytask_execute_task_teardown(session: Session, task: Task) -> None: |
170 | | - """Check if each produced node was indeed produced.""" |
| 172 | + """Check if :class:`_pytask.nodes.FilePathNode` are produced by a task.""" |
| 173 | + missing_nodes = [] |
171 | 174 | for product in session.dag.successors(task.name): |
172 | 175 | node = session.dag.nodes[product]["node"] |
173 | | - try: |
174 | | - node.state() |
175 | | - except NodeNotFoundError as e: |
176 | | - raise NodeNotFoundError( |
177 | | - f"{node.name} was not produced by {task.name}." |
178 | | - ) from e |
| 176 | + if isinstance(node, FilePathNode): |
| 177 | + |
| 178 | + try: |
| 179 | + node.state() |
| 180 | + except NodeNotFoundError: |
| 181 | + missing_nodes.append(node) |
| 182 | + |
| 183 | + if missing_nodes: |
| 184 | + paths = [reduce_node_name(i, session.config["paths"]) for i in missing_nodes] |
| 185 | + formatted = format_strings_as_flat_tree( |
| 186 | + paths, "The task did not produce the following files:\n", "" |
| 187 | + ) |
| 188 | + raise NodeNotFoundError(formatted) |
179 | 189 |
|
180 | 190 |
|
181 | 191 | @hookimpl(trylast=True) |
|
0 commit comments