From e3de8aac6567894c2b1e530fc421dc5cb0749475 Mon Sep 17 00:00:00 2001 From: TomHortons Date: Wed, 22 May 2019 11:02:40 +0900 Subject: [PATCH] pipeline: show: dot: print dot --- dvc/command/pipeline.py | 18 +++++---- tests/func/test_pipeline.py | 78 +++++-------------------------------- 2 files changed, 20 insertions(+), 76 deletions(-) diff --git a/dvc/command/pipeline.py b/dvc/command/pipeline.py index de0c1ecd3..f1ca928bc 100644 --- a/dvc/command/pipeline.py +++ b/dvc/command/pipeline.py @@ -115,7 +115,8 @@ class CmdPipelineShow(CmdBase): observe_list.pop(0) tree.show() - def __write_dot(self, target, commands, outs, filename): + def __write_dot(self, target, commands, outs): + from io import StringIO import networkx from networkx.drawing.nx_pydot import write_dot @@ -124,7 +125,10 @@ class CmdPipelineShow(CmdBase): simple_g = networkx.DiGraph() simple_g.add_edges_from(edges) - write_dot(simple_g, filename) + + dot_file = StringIO() + write_dot(simple_g, dot_file) + logger.info(dot_file.getvalue()) def run(self): if not self.args.targets: @@ -138,10 +142,7 @@ class CmdPipelineShow(CmdBase): ) elif self.args.dot: self.__write_dot( - target, - self.args.commands, - self.args.outs, - self.args.dot, + target, self.args.commands, self.args.outs ) elif self.args.tree: self._show_dependencies_tree( @@ -231,7 +232,10 @@ def add_parser(subparsers, parent_parser): help="Output DAG as ASCII.", ) pipeline_show_parser.add_argument( - "--dot", help="Write DAG in .dot format." + "--dot", + action="store_true", + default=False, + help="Print DAG with .dot format.", ) pipeline_show_parser.add_argument( "--tree", diff --git a/tests/func/test_pipeline.py b/tests/func/test_pipeline.py index 34cc63933..889499457 100644 --- a/tests/func/test_pipeline.py +++ b/tests/func/test_pipeline.py @@ -4,14 +4,12 @@ from dvc.main import main from tests.basic_env import TestDvc from tests.func.test_repro import TestRepro, TestReproChangedDeepData -import os class TestPipelineShowSingle(TestDvc): def setUp(self): super(TestPipelineShowSingle, self).setUp() self.stage = "foo.dvc" - self.dotFile = "graph.dot" ret = main(["add", self.FOO]) self.assertEqual(ret, 0) @@ -32,9 +30,8 @@ class TestPipelineShowSingle(TestDvc): self.assertEqual(ret, 0) def test_dot(self): - ret = main(["pipeline", "show", "--dot", self.dotFile, self.stage]) + ret = main(["pipeline", "show", "--dot", self.stage]) self.assertEqual(ret, 0) - self.assertTrue(os.path.isfile(self.dotFile)) def test_tree(self): ret = main(["pipeline", "show", "--tree", self.stage]) @@ -49,25 +46,12 @@ class TestPipelineShowSingle(TestDvc): self.assertEqual(ret, 0) def test_dot_commands(self): - ret = main( - [ - "pipeline", - "show", - "--dot", - self.dotFile, - self.stage, - "--commands", - ] - ) + ret = main(["pipeline", "show", "--dot", self.stage, "--commands"]) self.assertEqual(ret, 0) - self.assertTrue(os.path.isfile(self.dotFile)) def test_dot_outs(self): - ret = main( - ["pipeline", "show", "--dot", self.dotFile, self.stage, "--outs"] - ) + ret = main(["pipeline", "show", "--dot", self.stage, "--outs"]) self.assertEqual(ret, 0) - self.assertTrue(os.path.isfile(self.dotFile)) def test_not_dvc_file(self): ret = main(["pipeline", "show", self.FOO]) @@ -81,7 +65,6 @@ class TestPipelineShowSingle(TestDvc): class TestPipelineShow(TestRepro): def setUp(self): super(TestPipelineShow, self).setUp() - self.dotFile = "graph.dot" def test(self): ret = main(["pipeline", "show", self.file1_stage]) @@ -100,11 +83,8 @@ class TestPipelineShow(TestRepro): self.assertEqual(ret, 0) def test_dot(self): - ret = main( - ["pipeline", "show", "--dot", self.dotFile, self.file1_stage] - ) + ret = main(["pipeline", "show", "--dot", self.file1_stage]) self.assertEqual(ret, 0) - self.assertTrue(os.path.isfile(self.dotFile)) def test_ascii_commands(self): ret = main( @@ -118,31 +98,13 @@ class TestPipelineShow(TestRepro): def test_dot_commands(self): ret = main( - [ - "pipeline", - "show", - "--dot", - self.dotFile, - self.file1_stage, - "--commands", - ] + ["pipeline", "show", "--dot", self.file1_stage, "--commands"] ) self.assertEqual(ret, 0) - self.assertTrue(os.path.isfile(self.dotFile)) def test_dot_outs(self): - ret = main( - [ - "pipeline", - "show", - "--dot", - self.dotFile, - self.file1_stage, - "--outs", - ] - ) + ret = main(["pipeline", "show", "--dot", self.file1_stage, "--outs"]) self.assertEqual(ret, 0) - self.assertTrue(os.path.isfile(self.dotFile)) def test_not_dvc_file(self): ret = main(["pipeline", "show", self.file1]) @@ -169,7 +131,6 @@ class TestPipelineShow(TestRepro): class TestPipelineShowDeep(TestReproChangedDeepData): def setUp(self): super(TestPipelineShowDeep, self).setUp() - self.dotFile = "graph.dot" def test(self): ret = main(["pipeline", "show", self.file1_stage]) @@ -188,11 +149,8 @@ class TestPipelineShowDeep(TestReproChangedDeepData): self.assertEqual(ret, 0) def test_dot(self): - ret = main( - ["pipeline", "show", "--dot", self.dotFile, self.file1_stage] - ) + ret = main(["pipeline", "show", "--dot", self.file1_stage]) self.assertEqual(ret, 0) - self.assertTrue(os.path.isfile(self.dotFile)) def test_ascii_commands(self): ret = main( @@ -206,31 +164,13 @@ class TestPipelineShowDeep(TestReproChangedDeepData): def test_dot_commands(self): ret = main( - [ - "pipeline", - "show", - "--dot", - self.dotFile, - self.file1_stage, - "--commands", - ] + ["pipeline", "show", "--dot", self.file1_stage, "--commands"] ) self.assertEqual(ret, 0) - self.assertTrue(os.path.isfile(self.dotFile)) def test_dot_outs(self): - ret = main( - [ - "pipeline", - "show", - "--dot", - self.dotFile, - self.file1_stage, - "--outs", - ] - ) + ret = main(["pipeline", "show", "--dot", self.file1_stage, "--outs"]) self.assertEqual(ret, 0) - self.assertTrue(os.path.isfile(self.dotFile)) def test_not_dvc_file(self): ret = main(["pipeline", "show", self.file1])