Skip to content

Commit 67715e6

Browse files
authored
Ensure that root_dir of DirectoryNode is created. (#618)
1 parent ffe691e commit 67715e6

File tree

3 files changed

+28
-0
lines changed

3 files changed

+28
-0
lines changed

docs/source/changes.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ releases are available on [PyPI](https://pypi.org/project/pytask) and
88
## 0.5.1 - 2024-xx-xx
99

1010
- {pull}`617` fixes an interaction with provisional nodes and `@mark.persist`.
11+
- {pull}`618` ensures that `root_dir` of `DirectoryNode` is created before the task is
12+
executed.
1113

1214
## 0.5.0 - 2024-05-26
1315

src/_pytask/execute.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
from _pytask.node_protocols import PPathNode
3232
from _pytask.node_protocols import PProvisionalNode
3333
from _pytask.node_protocols import PTask
34+
from _pytask.nodes import DirectoryNode
3435
from _pytask.outcomes import Exit
3536
from _pytask.outcomes import SkippedUnchanged
3637
from _pytask.outcomes import TaskOutcome
@@ -173,6 +174,8 @@ def pytask_execute_task_setup(session: Session, task: PTask) -> None: # noqa: C
173174
node = dag.nodes[product]["node"]
174175
if isinstance(node, PPathNode):
175176
node.path.parent.mkdir(parents=True, exist_ok=True)
177+
if isinstance(node, DirectoryNode) and node.root_dir:
178+
node.root_dir.mkdir(parents=True, exist_ok=True)
176179

177180

178181
def _safe_load(node: PNode | PProvisionalNode, task: PTask, *, is_product: bool) -> Any:

tests/test_provisional.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,3 +268,26 @@ def task_example(path = DirectoryNode(root_dir=Path("files"), pattern="*.py")):
268268

269269
result = runner.invoke(cli, [tmp_path.as_posix()])
270270
assert result.exit_code == ExitCode.OK
271+
272+
273+
@pytest.mark.end_to_end()
274+
def test_root_dir_is_created(runner, tmp_path):
275+
source = """
276+
from typing_extensions import Annotated
277+
from pytask import DirectoryNode, Product
278+
from pathlib import Path
279+
280+
def task_example(
281+
root_path: Annotated[
282+
Path, DirectoryNode(root_dir=Path("subfolder"), pattern="*.txt"), Product
283+
]
284+
):
285+
root_path.joinpath("a.txt").write_text("Hello, ")
286+
root_path.joinpath("b.txt").write_text("World!")
287+
"""
288+
tmp_path.joinpath("task_module.py").write_text(textwrap.dedent(source))
289+
290+
result = runner.invoke(cli, [tmp_path.as_posix()])
291+
assert result.exit_code == ExitCode.OK
292+
assert tmp_path.joinpath("subfolder", "a.txt").exists()
293+
assert tmp_path.joinpath("subfolder", "b.txt").exists()

0 commit comments

Comments
 (0)