From 0227c4b5d57ec06a933531e53420817327c7ca73 Mon Sep 17 00:00:00 2001 From: Tobias Raabe Date: Sun, 9 Jun 2024 22:55:39 +0200 Subject: [PATCH 1/4] Add test to ensure root_dir is created. --- tests/test_provisional.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/tests/test_provisional.py b/tests/test_provisional.py index 5cf11913f..e0059c6c5 100644 --- a/tests/test_provisional.py +++ b/tests/test_provisional.py @@ -268,3 +268,26 @@ def task_example(path = DirectoryNode(root_dir=Path("files"), pattern="*.py")): result = runner.invoke(cli, [tmp_path.as_posix()]) assert result.exit_code == ExitCode.OK + + +@pytest.mark.end_to_end() +def test_root_dir_is_created(runner, tmp_path): + source = """ + from typing_extensions import Annotated + from pytask import DirectoryNode, Product + from pathlib import Path + + def task_example( + root_path: Annotated[ + Path, DirectoryNode(root_dir=Path("subfolder"), pattern="*.txt"), Product + ] + ): + root_path.joinpath("a.txt").write_text("Hello, ") + root_path.joinpath("b.txt").write_text("World!") + """ + tmp_path.joinpath("task_module.py").write_text(textwrap.dedent(source)) + + result = runner.invoke(cli, [tmp_path.as_posix()]) + assert result.exit_code == ExitCode.OK + assert tmp_path.joinpath("subfolder", "a.txt").exists() + assert tmp_path.joinpath("subfolder", "b.txt").exists() From af652a600448c999a7ec9869d9c4b56a5abc4c49 Mon Sep 17 00:00:00 2001 From: Tobias Raabe Date: Sun, 9 Jun 2024 22:56:42 +0200 Subject: [PATCH 2/4] to changes: --- docs/source/changes.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/source/changes.md b/docs/source/changes.md index 719370a12..212bcf8bf 100644 --- a/docs/source/changes.md +++ b/docs/source/changes.md @@ -8,6 +8,8 @@ releases are available on [PyPI](https://pypi.org/project/pytask) and ## 0.5.1 - 2024-xx-xx - {pull}`617` fixes an interaction with provisional nodes and `@mark.persist`. +- {pull}`618` ensures that `root_dir` of `DirectoryNode` is created before the task is + executed. ## 0.5.0 - 2024-05-26 From 66468af05f6c7ffdabdb150a3eb8e7711ac36a65 Mon Sep 17 00:00:00 2001 From: Tobias Raabe Date: Sun, 9 Jun 2024 22:58:09 +0200 Subject: [PATCH 3/4] Ensure root_dir is created. --- src/_pytask/execute.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/_pytask/execute.py b/src/_pytask/execute.py index 039c7f9be..1c89cff12 100644 --- a/src/_pytask/execute.py +++ b/src/_pytask/execute.py @@ -31,6 +31,7 @@ from _pytask.node_protocols import PPathNode from _pytask.node_protocols import PProvisionalNode from _pytask.node_protocols import PTask +from _pytask.nodes import DirectoryNode from _pytask.outcomes import Exit from _pytask.outcomes import SkippedUnchanged from _pytask.outcomes import TaskOutcome @@ -173,6 +174,8 @@ def pytask_execute_task_setup(session: Session, task: PTask) -> None: # noqa: C node = dag.nodes[product]["node"] if isinstance(node, PPathNode): node.path.parent.mkdir(parents=True, exist_ok=True) + if isinstance(node, DirectoryNode): + node.root_dir.mkdir(parents=True, exist_ok=True) def _safe_load(node: PNode | PProvisionalNode, task: PTask, *, is_product: bool) -> Any: From cf06440bd85c5d68c8f3d5a707ab99ef4e28ebcd Mon Sep 17 00:00:00 2001 From: Tobias Raabe Date: Sun, 9 Jun 2024 23:02:29 +0200 Subject: [PATCH 4/4] FIx typing. --- src/_pytask/execute.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/_pytask/execute.py b/src/_pytask/execute.py index 1c89cff12..1cc9f1676 100644 --- a/src/_pytask/execute.py +++ b/src/_pytask/execute.py @@ -174,7 +174,7 @@ def pytask_execute_task_setup(session: Session, task: PTask) -> None: # noqa: C node = dag.nodes[product]["node"] if isinstance(node, PPathNode): node.path.parent.mkdir(parents=True, exist_ok=True) - if isinstance(node, DirectoryNode): + if isinstance(node, DirectoryNode) and node.root_dir: node.root_dir.mkdir(parents=True, exist_ok=True)