11import textwrap
22from contextlib import ExitStack as does_not_raise # noqa: N813
3+ from pathlib import Path
34
45import attr
56import networkx as nx
@@ -37,6 +38,10 @@ def state(self):
3738 raise NodeNotFoundError
3839
3940
41+ class DummySession :
42+ pass
43+
44+
4045@pytest .mark .unit
4146def test_create_dag ():
4247 task = Task (
@@ -53,22 +58,30 @@ def test_create_dag():
5358def test_check_if_root_nodes_are_available ():
5459 dag = nx .DiGraph ()
5560
61+ root = Path ("directory" )
62+ session = DummySession ()
63+ session .config = {"paths" : [root ]}
64+
5665 task = Task ("task" )
66+ task .path = root .joinpath ("task_dummy" )
67+ task .base_name = "task_dummy"
5768 dag .add_node (task .name , task = task )
5869
5970 available_node = Node ("available" )
71+ available_node .path = root .joinpath ("available_node" )
6072 dag .add_node (available_node .name , node = available_node )
6173 dag .add_edge (available_node .name , task .name )
6274
6375 with does_not_raise ():
64- _check_if_root_nodes_are_available (dag )
76+ _check_if_root_nodes_are_available (dag , session )
6577
6678 missing_node = Node ("missing" )
79+ missing_node .path = root .joinpath ("missing_node" )
6780 dag .add_node (missing_node .name , node = missing_node )
6881 dag .add_edge (missing_node .name , task .name )
6982
7083 with pytest .raises (ResolvingDependenciesError ):
71- _check_if_root_nodes_are_available (dag )
84+ _check_if_root_nodes_are_available (dag , session )
7285
7386
7487@pytest .mark .end_to_end
@@ -78,16 +91,24 @@ def test_check_if_root_nodes_are_available_end_to_end(tmp_path, runner):
7891
7992 @pytask.mark.depends_on("in.txt")
8093 @pytask.mark.produces("out.txt")
81- def task_dummy (produces):
94+ def task_d (produces):
8295 produces.write_text("1")
8396 """
84- tmp_path .joinpath ("task_dummy .py" ).write_text (textwrap .dedent (source ))
97+ tmp_path .joinpath ("task_d .py" ).write_text (textwrap .dedent (source ))
8598
8699 result = runner .invoke (cli , [tmp_path .as_posix ()])
87100
88101 assert result .exit_code == 4
89102 assert "Failures during resolving dependencies" in result .output
90103
104+ # Ensure that node names are reduced.
105+ assert "Failures during resolving dependencies" in result .output
106+ assert "There are some dependencies missing which do not" in result .output
107+ assert tmp_path .joinpath ("task_d.py" ).as_posix () + "::task_d" not in result .output
108+ assert tmp_path .name + "/task_d.py::task_d" in result .output
109+ assert tmp_path .joinpath ("in.txt" ).as_posix () not in result .output
110+ assert tmp_path .name + "/in.txt" in result .output
111+
91112
92113@pytest .mark .end_to_end
93114def test_cycle_in_dag (tmp_path , runner ):
@@ -110,6 +131,7 @@ def task_2(produces):
110131
111132 assert result .exit_code == 4
112133 assert "Failures during resolving dependencies" in result .output
134+ assert "The DAG contains cycles which means a dependency" in result .output
113135
114136
115137@pytest .mark .end_to_end
@@ -125,9 +147,18 @@ def task_1(produces):
125147 def task_2(produces):
126148 produces.write_text("2")
127149 """
128- tmp_path .joinpath ("task_dummy .py" ).write_text (textwrap .dedent (source ))
150+ tmp_path .joinpath ("task_d .py" ).write_text (textwrap .dedent (source ))
129151
130152 result = runner .invoke (cli , [tmp_path .as_posix ()])
131153
132154 assert result .exit_code == 4
133155 assert "Failures during resolving dependencies" in result .output
156+ assert "There are some tasks which produce the same output." in result .output
157+
158+ # Ensure that nodes names are reduced.
159+ assert tmp_path .joinpath ("task_d.py" ).as_posix () + "::task_1" not in result .output
160+ assert tmp_path .name + "/task_d.py::task_1" in result .output
161+ assert tmp_path .joinpath ("task_d.py" ).as_posix () + "::task_2" not in result .output
162+ assert tmp_path .name + "/task_d.py::task_2" in result .output
163+ assert tmp_path .joinpath ("out.txt" ).as_posix () not in result .output
164+ assert tmp_path .name + "/out.txt" in result .output
0 commit comments