Skip to content

Commit

Permalink
Merge pull request #1781 from puhoshville/fix-1038
Browse files Browse the repository at this point in the history
cli: add pipeline show --tree
  • Loading branch information
efiop authored Mar 26, 2019
2 parents b791e1f + 263dee8 commit 35218a7
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 3 deletions.
40 changes: 37 additions & 3 deletions dvc/command/pipeline.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,23 +71,47 @@ def __build_graph(self, target, commands, outs):
else:
edges.append((from_stage.relpath, to_stage.relpath))

return nodes, edges
return nodes, edges, networkx.is_tree(G)

def _show_ascii(self, target, commands, outs):
from dvc.dagascii import draw

nodes, edges = self.__build_graph(target, commands, outs)
nodes, edges, _ = self.__build_graph(target, commands, outs)

if not nodes:
return

draw(nodes, edges)

def _show_dependencies_tree(self, target, commands, outs):
from treelib import Tree

nodes, edges, is_tree = self.__build_graph(target, commands, outs)
if not nodes:
return
if not is_tree:
raise DvcException(
"DAG is not a tree, can not print it in tree-structure way, "
"please use --ascii instead"
)

tree = Tree()
tree.create_node(target, target) # Root node
observe_list = [target]
while len(observe_list) > 0:
current_root = observe_list[0]
for edge in edges:
if edge[0] == current_root:
tree.create_node(edge[1], edge[1], parent=current_root)
observe_list.append(edge[1])
observe_list.pop(0)
tree.show()

def __write_dot(self, target, commands, outs, filename):
import networkx
from networkx.drawing.nx_pydot import write_dot

_, edges = self.__build_graph(target, commands, outs)
_, edges, _ = self.__build_graph(target, commands, outs)
edges = [edge[::-1] for edge in edges]

simple_g = networkx.DiGraph()
Expand All @@ -111,6 +135,10 @@ def run(self, unlock=False):
self.args.outs,
self.args.dot,
)
elif self.args.tree:
self._show_dependencies_tree(
target, self.args.commands, self.args.outs
)
else:
self._show(target, self.args.commands, self.args.outs)
except DvcException:
Expand Down Expand Up @@ -185,6 +213,12 @@ def add_parser(subparsers, parent_parser):
pipeline_show_parser.add_argument(
"--dot", help="Write DAG in .dot format."
)
pipeline_show_parser.add_argument(
"--tree",
action="store_true",
default=False,
help="Output DAG as Dependencies Tree.",
)
pipeline_show_parser.add_argument(
"targets", nargs="*", help="DVC files. 'Dvcfile' by default."
)
Expand Down
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,4 @@ pydot>=1.2.4
asciimatics>=1.10.0
distro>=1.3.0
appdirs>=1.4.3
treelib>=1.5.5
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
"asciimatics>=1.10.0",
"distro>=1.3.0",
"appdirs>=1.4.3",
"treelib>=1.5.5",
]

# Extra dependencies for remote integrations
Expand Down
4 changes: 4 additions & 0 deletions tests/test_pipeline.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,10 @@ def test_dot(self):
self.assertEqual(ret, 0)
self.assertTrue(os.path.isfile(self.dotFile))

def test_tree(self):
ret = main(["pipeline", "show", "--tree", self.stage])
self.assertEqual(ret, 0)

def test_ascii_commands(self):
ret = main(["pipeline", "show", "--ascii", self.stage, "--commands"])
self.assertEqual(ret, 0)
Expand Down

0 comments on commit 35218a7

Please sign in to comment.