From bb9de4b691aeb6a45ff14ab1a5292a22adcedc26 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Mon, 18 Sep 2017 05:09:29 -0700 Subject: [PATCH] Define max limit to commits per graph node --- dvc/cli.py | 8 +++++++- dvc/command/show_workflow.py | 4 +++- dvc/graph/commit.py | 17 ++++++++++++----- dvc/graph/workflow.py | 4 ++-- tests/test_workflow.py | 20 ++++++++++---------- 5 files changed, 34 insertions(+), 19 deletions(-) diff --git a/dvc/cli.py b/dvc/cli.py index d76907aad..cf96ab7a9 100644 --- a/dvc/cli.py +++ b/dvc/cli.py @@ -15,7 +15,6 @@ from dvc.command.show_workflow import CmdShowWorkflow from dvc.command.instance_create import CmdInstanceCreate from dvc.command.config import CmdConfig from dvc.command.show_pipeline import CmdShowPipeline -from dvc.config import Config from dvc import VERSION @@ -399,6 +398,13 @@ def parse_args(argv=None): action='store_true', default=False, help='Show all commits') + workflow_parser.add_argument( + '-m', + '--max-commits', + metavar='M', + type=int, + default=4, + help='Max commits per graph vertex. 4 by default.') workflow_parser.set_defaults(func=CmdShowWorkflow) diff --git a/dvc/command/show_workflow.py b/dvc/command/show_workflow.py index 617242995..80322d99c 100644 --- a/dvc/command/show_workflow.py +++ b/dvc/command/show_workflow.py @@ -15,7 +15,9 @@ class CmdShowWorkflow(CmdBase): Logger.debug(u'Set show workflow target as {}'.format(target)) wf = self.git.get_all_commits(target, self.settings) - wf.build_graph(self.settings.parsed_args.dvc_commits, self.settings.parsed_args.all_commits) + wf.build_graph(self.settings.parsed_args.dvc_commits, + self.settings.parsed_args.all_commits, + self.settings.parsed_args.max_commits) return 0 @property diff --git a/dvc/graph/commit.py b/dvc/graph/commit.py index a52071f98..19fe7ac46 100644 --- a/dvc/graph/commit.py +++ b/dvc/graph/commit.py @@ -38,13 +38,12 @@ class Commit(object): self._collapsed_commits.append(commit) self._collapsed_commits += commit._collapsed_commits - @property - def text(self): + def text(self, max_commits=None): branch_text = '' if self._branch_tips: branch_text = 'BRANCH TIPS: {}\n'.format(', '.join(self._branch_tips)) - return self._text_metrics_line() + branch_text + self._comments_text + return self._text_metrics_line() + branch_text + self._comments_text(max_commits) @staticmethod def _text_comment(commit): @@ -61,8 +60,7 @@ class Commit(object): else: return comment[:Commit.TEXT_LIMIT-3] + '...' - @property - def _comments_text(self): + def _comments_text(self, max_commits): res = [] if not self.is_repro: res.append(self._text_comment(self)) @@ -74,8 +72,17 @@ class Commit(object): if len(res) == 0: return self._text_comment(self) + was_collapsed = False + if max_commits: + was_collapsed = len(res) > max_commits + res = res[:max_commits] + max_len = max(map(lambda x: len(x), res)) res_extended_len = map(lambda x: x.ljust(max_len), res) + + if was_collapsed: + res_extended_len.append('<>') + return '\n'.join(res_extended_len) def _text_metrics_line(self): diff --git a/dvc/graph/workflow.py b/dvc/graph/workflow.py index 846b21fdf..56a0c68f7 100644 --- a/dvc/graph/workflow.py +++ b/dvc/graph/workflow.py @@ -104,7 +104,7 @@ class Workflow(object): return [] return [self._commits[h] for h in self._edges[hash]] - def build_graph(self, show_dvc_commits, show_all_commits): + def build_graph(self, show_dvc_commits, show_all_commits, max_commits): self.modify_workflow(show_all_commits, show_dvc_commits) g = nx.DiGraph(name='DVC Workflow', directed=False) @@ -114,7 +114,7 @@ class Workflow(object): g.add_node(hash, attr_dict={ - 'label': commit.text, + 'label': commit.text(max_commits), 'color': self.node_color(commit) } ) diff --git a/tests/test_workflow.py b/tests/test_workflow.py index a940c4fca..50ca6c453 100644 --- a/tests/test_workflow.py +++ b/tests/test_workflow.py @@ -35,10 +35,10 @@ class TestWorkflow(TestCase): self.assertEqual(len(wf._commits), 4) - self.assertEqual(wf._commits['1'].text, self._showed_text1) - self.assertEqual(wf._commits['2'].text, self._showed_text2) - self.assertEqual(wf._commits['3'].text, self._showed_text3) - self.assertEqual(wf._commits['4'].text, self._showed_text4) + self.assertEqual(wf._commits['1'].text(), self._showed_text1) + self.assertEqual(wf._commits['2'].text(), self._showed_text2) + self.assertEqual(wf._commits['3'].text(), self._showed_text3) + self.assertEqual(wf._commits['4'].text(), self._showed_text4) pass def collapse_test(self): @@ -51,8 +51,8 @@ class TestWorkflow(TestCase): wf.collapse_commits(CollapseDvcReproCommitsStrategy(wf)) self.assertEqual(len(wf._commits), 3) - self.assertEqual(wf._commits[self._commit1.hash].text, self._showed_text1) - self.assertEqual(wf._commits[self._commit3.hash].text, self._showed_text3_collapsed) + self.assertEqual(wf._commits[self._commit1.hash].text(), self._showed_text1) + self.assertEqual(wf._commits[self._commit3.hash].text(), self._showed_text3_collapsed) self.assertTrue('2' not in wf._commits) self.assertFalse('2' in wf._edges) @@ -69,8 +69,8 @@ class TestWorkflow(TestCase): wf.collapse_commits(CollapseDvcReproCommitsStrategy(wf)) self.assertEqual(len(wf._commits), 2) - self.assertEqual(wf._commits[self._commit1.hash].text, self._showed_text1) - self.assertEqual(wf._commits[self._commit3.hash].text, self._showed_text3) + self.assertEqual(wf._commits[self._commit1.hash].text(), self._showed_text1) + self.assertEqual(wf._commits[self._commit3.hash].text(), self._showed_text3) self.assertTrue('2' not in wf._commits) pass @@ -137,8 +137,8 @@ class TestWorkflow(TestCase): self.assertEqual(len(wf._commits), 2) def is_collapsed_commit_presented(self, commit, collapsed_commit): - self.assertTrue('[' + collapsed_commit.hash + ']' in commit.text) - self.assertTrue(collapsed_commit._comment in commit.text) + self.assertTrue('[' + collapsed_commit.hash + ']' in commit.text()) + self.assertTrue(collapsed_commit._comment in commit.text()) is_collapsed_commit_presented(self, wf._commits['3'], metric_commit3) is_collapsed_commit_presented(self, wf._commits['3'], not_metric_commit2)