From 3b09290ed8e6d7f6eb18cdd87c1b7cad9c47c280 Mon Sep 17 00:00:00 2001 From: Ruslan Kuprieiev Date: Wed, 10 Jan 2018 18:45:52 +0200 Subject: [PATCH] test: improve coverage and fix bugs Signed-off-by: Ruslan Kuprieiev --- .appveyor.yml | 6 ++++++ dvc/command/common/base.py | 10 ++++++---- dvc/command/show_pipeline.py | 4 ++-- dvc/main.py | 10 +++++++++- requirements.txt | 1 + setup.py | 1 + tests/test_checkout.py | 35 ++++++++++++++++++++--------------- tests/test_show_pipeline.py | 33 +++++++++++++++++++++++++++++++++ tests/test_workflow.py | 14 +++++++++++--- 9 files changed, 89 insertions(+), 25 deletions(-) create mode 100644 tests/test_show_pipeline.py diff --git a/.appveyor.yml b/.appveyor.yml index 7fd978af4..3645702c9 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -2,6 +2,8 @@ branches: only: - master +platform: x86 + environment: matrix: @@ -31,6 +33,10 @@ environment: # PYTHON_ARCH: "64" install: + - cinst graphviz + - cinst wget + - wget --no-check-certificate https://github.com/dpinney/omf/raw/master/omf/static/pygraphviz-1.3.1-cp27-none-win32.whl + - pip install pygraphviz-1.3.1-cp27-none-win32.whl - pip install -r requirements.txt - python setup.py install diff --git a/dvc/command/common/base.py b/dvc/command/common/base.py index 7d9316b2c..2b5bb77db 100644 --- a/dvc/command/common/base.py +++ b/dvc/command/common/base.py @@ -1,18 +1,20 @@ import os from dvc.project import Project +from dvc.logger import Logger +from dvc.exceptions import DvcException class CmdBase(object): def __init__(self, args): - self.project = Project(self._find_root()) - self.args = args - if args.quiet and not args.verbose: self.project.logger.be_quiet() elif not args.quiet and args.verbose: self.project.logger.be_verbose() + self.project = Project(self._find_root()) + self.args = args + def _find_root(self): root = os.getcwd() while not os.path.ismount(root): @@ -21,7 +23,7 @@ class CmdBase(object): return root root = os.path.dirname(root) msg = "Not a dvc repository (or any parent up to mount point {})" - self.project.logger.error(msg.format(root)) + raise DvcException(msg.format(root)) def run_cmd(self): with self.project.lock: diff --git a/dvc/command/show_pipeline.py b/dvc/command/show_pipeline.py index 09af857ae..2da408523 100644 --- a/dvc/command/show_pipeline.py +++ b/dvc/command/show_pipeline.py @@ -12,7 +12,7 @@ class CmdShowPipeline(CmdBase): A.write(fname + '.dot') A.draw(fname + '.jpeg', format='jpeg', prog='dot') except Exception as exc: - Logger.error('Failed to draw dependency graph for {}: {}'.format(target, exc)) + self.project.logger.error('Failed to draw dependency graph for {}: {}'.format(target, exc)) return 1 return 0 @@ -22,7 +22,7 @@ class CmdShowPipeline(CmdBase): if fname in s.nodes(): return s - return self.g + return None def draw_targets(self, target): if not target: diff --git a/dvc/main.py b/dvc/main.py index a97dfdde8..afc0f0be5 100644 --- a/dvc/main.py +++ b/dvc/main.py @@ -1,5 +1,13 @@ +from dvc.logger import Logger from dvc.cli import parse_args def main(argv=None): args = parse_args(argv) - return args.func(args).run_cmd() + + try: + cmd = args.func(args) + except Exception as ex: + Logger.error('Initialization error: {}'.format(str(ex))) + return 255 + + return cmd.run_cmd() diff --git a/requirements.txt b/requirements.txt index 80ba6217b..822ec5f4e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -94,3 +94,4 @@ pyyaml==3.12 tinydb==3.7.0 gitpython==2.1.8 ntfsutils==0.1.3 +pygraphviz==1.3.1 diff --git a/setup.py b/setup.py index 2d6fd037f..4115c98d0 100644 --- a/setup.py +++ b/setup.py @@ -99,6 +99,7 @@ install_requires = [ 'tinydb==3.7.0', 'gitpython==2.1.8', 'ntfsutils==0.1.3', + 'pygraphviz==1.3.1', ] if platform.system() == 'Darwin': diff --git a/tests/test_checkout.py b/tests/test_checkout.py index 57ef09b7d..c1c9ce004 100644 --- a/tests/test_checkout.py +++ b/tests/test_checkout.py @@ -3,30 +3,35 @@ import stat import shutil import filecmp +from dvc.main import main from dvc.data_cloud import file_md5 from dvc.stage import Stage, OutputNoCacheError, OutputOutsideOfRepoError from dvc.stage import OutputDoesNotExistError, OutputIsNotFileError from dvc.project import StageNotFoundError -from tests.basic_env import TestDvc +from tests.test_repro import TestRepro -class TestCheckout(TestDvc): - def test_checkout(self): - cmd = 'python {} {} {}'.format(self.CODE, self.FOO, 'out') - deps = [self.FOO, self.CODE] - outs = [os.path.join(self.dvc.root_dir, 'out')] - outs_no_cache = [] - locked = False - fname = os.path.join(self.dvc.root_dir, 'out.dvc') - cwd = os.curdir +class TestCheckout(TestRepro): + def setUp(self): + super(TestCheckout, self).setUp() - self.dvc.add(self.FOO) - stage = self.dvc.run(cmd, deps, outs, outs_no_cache, locked, fname, cwd) - - shutil.copy(self.FOO, 'orig') + self.orig = 'orig' + shutil.copy(self.FOO, self.orig) os.chmod(self.FOO, stat.S_IWRITE) os.unlink(self.FOO) + + def test(self): self.dvc.checkout() + self._test_checkout() + + def _test_checkout(self): self.assertTrue(os.path.isfile(self.FOO)) - self.assertTrue(filecmp.cmp(self.FOO, 'orig')) + self.assertTrue(filecmp.cmp(self.FOO, self.orig)) + + +class TestCmdCheckout(TestCheckout): + def test(self): + ret = main(['checkout']) + self.assertEqual(ret, 0) + self._test_checkout() diff --git a/tests/test_show_pipeline.py b/tests/test_show_pipeline.py new file mode 100644 index 000000000..9cb0605b5 --- /dev/null +++ b/tests/test_show_pipeline.py @@ -0,0 +1,33 @@ +import os +import pygraphviz + +from dvc.main import main + +from tests.test_repro import TestRepro + + +class TestShowPipeline(TestRepro): + def test_show(self): + ret = main(['show', + 'pipeline']) + + self.assertEqual(ret, 0) + self.assertTrue(os.path.isfile('pipeline_all.dot')) + self.assertTrue(os.path.isfile('pipeline_all.jpeg')) + + def test_target(self): + base = 'pipeline_' + os.path.basename(self.file1_stage) + ret = main(['show', + 'pipeline', + self.file1_stage]) + + self.assertEqual(ret, 0) + self.assertTrue(os.path.isfile(base + '.dot')) + self.assertTrue(os.path.isfile(base + '.jpeg')) + + def test_non_existing_target(self): + ret = main(['show', + 'pipeline', + 'non-existing-target']) + + self.assertNotEqual(ret, 0) diff --git a/tests/test_workflow.py b/tests/test_workflow.py index ec55ad633..0bdc9ab7a 100644 --- a/tests/test_workflow.py +++ b/tests/test_workflow.py @@ -1,12 +1,15 @@ -from unittest import TestCase - +from dvc.main import main from dvc.graph.workflow import Workflow,\ CollapseDvcReproCommitsStrategy, CollapseNotMeticsCommitsStrategy from dvc.graph.commit import Commit +from tests.basic_env import TestDvc -class TestWorkflow(TestCase): + +class TestWorkflow(TestDvc): def setUp(self): + super(TestWorkflow, self).setUp() + self._commit4 = Commit('4', '3', 'name1', 'today', 'comment4') self._commit3 = Commit('3', '2', 'name1', 'today', 'DVC repro-run ...') self._commit2 = Commit('2', '1', 'name1', 'today', 'DVC repro-run ...') @@ -148,3 +151,8 @@ class TestWorkflow(TestCase): is_collapsed_commit_presented(self, wf._commits['3'], not_metric_commit2) is_collapsed_commit_presented(self, wf._commits['3'], self._commit1) pass + + def test_cli(self): + ret = main(['show', + 'workflow']) + self.assertEqual(ret, 0)