From abfb48e89696b66566abb63a1b43883c0fb816e9 Mon Sep 17 00:00:00 2001 From: Ruslan Kuprieiev Date: Wed, 7 Nov 2018 18:39:29 +0200 Subject: [PATCH] dvc: introduce `pipeline list` command Fixes #1301 Signed-off-by: Ruslan Kuprieiev --- dvc/cli.py | 10 +++++++++- dvc/command/pipeline.py | 16 ++++++++++++++++ tests/test_pipeline.py | 12 ++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/dvc/cli.py b/dvc/cli.py index c57a103ca..39ec74680 100644 --- a/dvc/cli.py +++ b/dvc/cli.py @@ -25,7 +25,7 @@ from dvc.command.metrics import CmdMetricsRemove, CmdMetricsModify from dvc.command.install import CmdInstall from dvc.command.root import CmdRoot from dvc.command.lock import CmdLock, CmdUnlock -from dvc.command.pipeline import CmdPipelineShow +from dvc.command.pipeline import CmdPipelineShow, CmdPipelineList from dvc.logger import Logger from dvc import VERSION @@ -927,6 +927,14 @@ def parse_args(argv=None): help="DVC files. 'Dvcfile' by default.") pipeline_show_parser.set_defaults(func=CmdPipelineShow) + PIPELINE_LIST_HELP = 'List pipelines.' + pipeline_list_parser = pipeline_subparsers.add_parser( + 'list', + parents=[parent_parser], + description=PIPELINE_LIST_HELP, + help=PIPELINE_LIST_HELP) + pipeline_list_parser.set_defaults(func=CmdPipelineList) + args = parser.parse_args(argv) if (issubclass(args.func, CmdRepro) diff --git a/dvc/command/pipeline.py b/dvc/command/pipeline.py index ac682b282..83eb40ebc 100644 --- a/dvc/command/pipeline.py +++ b/dvc/command/pipeline.py @@ -110,3 +110,19 @@ class CmdPipelineShow(CmdBase): self.project.logger.error(msg, ex) return 1 return 0 + + +class CmdPipelineList(CmdBase): + def run(self): + import networkx + + pipelines = self.project.pipelines() + for p in pipelines: + stages = networkx.get_node_attributes(p, 'stage') + for stage in stages: + self.project.logger.info(stage) + if len(stages) != 0: + self.project.logger.info("="*80) + self.project.logger.info("{} pipeline(s) total".format(len(pipelines))) + + return 0 diff --git a/tests/test_pipeline.py b/tests/test_pipeline.py index ec1d829c8..7fe287298 100644 --- a/tests/test_pipeline.py +++ b/tests/test_pipeline.py @@ -165,3 +165,15 @@ class TestPipelineShowDeep(TestReproChangedDeepData): def test_non_existing(self): ret = main(['pipeline', 'show', 'non-existing']) self.assertNotEqual(ret, 0) + + +class TestPipelineListEmpty(TestDvc): + def test(self): + ret = main(['pipeline', 'list']) + self.assertEqual(ret, 0) + + +class TestPipelineListSingle(TestPipelineShowDeep): + def test(self): + ret = main(['pipeline', 'list']) + self.assertEqual(ret, 0)