From eb252e055bb646d4292e0d222dcc6fd0612f0b45 Mon Sep 17 00:00:00 2001 From: Saugat Pachhai Date: Thu, 16 Jan 2020 11:46:40 +0545 Subject: [PATCH] get: split command for getting url and getting files from url functions --- dvc/command/get.py | 24 +++++++++++++++++++----- tests/func/test_get.py | 27 +++++++++++++++++++++------ tests/unit/command/test_get.py | 1 + 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/dvc/command/get.py b/dvc/command/get.py index e01ce4180..eb0decf39 100644 --- a/dvc/command/get.py +++ b/dvc/command/get.py @@ -3,21 +3,32 @@ import logging from .base import append_doc_link from .base import CmdBaseNoRepo -from dvc.exceptions import DvcException +from dvc.exceptions import DvcException, NotDvcRepoError logger = logging.getLogger(__name__) class CmdGet(CmdBaseNoRepo): - def _run_get_url(self): + def _show_url(self): from dvc.api import get_url try: url = get_url( self.args.path, repo=self.args.url, rev=self.args.rev ) - logger.info("{} {}".format(self.args.path, url)) + logger.info(url) + except NotDvcRepoError: + # NOTE: there's no way to get direct links to files inside + # git repository. + logger.exception( + "Could not show url for '{}' from '{}'. ".format( + self.args.path, self.args.url + ) + + "Only DVC repository is supported currently.", + exc_info=None, + ) + return 1 except DvcException: logger.exception( "failed to show url for '{}' from '{}'".format( @@ -25,13 +36,16 @@ class CmdGet(CmdBaseNoRepo): ) ) return 1 + return 0 def run(self): - if self.args.show_url: - return self._run_get_url() + return self._show_url() + return self._get_file_from_repo() + + def _get_file_from_repo(self): from dvc.repo import Repo try: diff --git a/tests/func/test_get.py b/tests/func/test_get.py index 7ee1ba40f..a208a99d2 100644 --- a/tests/func/test_get.py +++ b/tests/func/test_get.py @@ -187,13 +187,28 @@ def test_get_from_non_dvc_master(tmp_dir, erepo_dir, caplog): assert (tmp_dir / dst).read_text() == "some_contents" -def test_get_url(tmp_dir, erepo_dir): +def test_get_url_positive(tmp_dir, erepo_dir, caplog): with erepo_dir.chdir(): erepo_dir.dvc_gen("foo", "foo") - assert main(["get", ".", "foo", "--show-url"]) == 0 + + caplog.clear() + with caplog.at_level(logging.ERROR, logger="dvc"): + assert main(["get", fspath(erepo_dir), "foo", "--show-url"]) == 0 + assert caplog.text == "" -def test_get_url_not_existing(tmp_dir, erepo_dir): - with erepo_dir.chdir(): - erepo_dir.dvc_gen("foo", "foo") - assert main(["get", ".", "food", "--show-url"]) == 1 +def test_get_url_not_existing(tmp_dir, erepo_dir, caplog): + with caplog.at_level(logging.ERROR, logger="dvc"): + assert ( + main(["get", fspath(erepo_dir), "not-existing-file", "--show-url"]) + == 1 + ) + assert "failed to show url for 'not-existing-file'" in caplog.text + + +def test_get_url_git_only_repo(tmp_dir, scm, caplog): + tmp_dir.scm_gen({"foo": "foo"}, commit="initial") + + with caplog.at_level(logging.ERROR): + assert main(["get", fspath(tmp_dir), "foo", "--show-url"]) == 1 + assert "Only DVC repository is supported currently" in caplog.text diff --git a/tests/unit/command/test_get.py b/tests/unit/command/test_get.py index 6327b4293..f62659e04 100644 --- a/tests/unit/command/test_get.py +++ b/tests/unit/command/test_get.py @@ -24,6 +24,7 @@ def test_get_url(mocker): cmd = cli_args.func(cli_args) m = mocker.patch("dvc.api.get_url") + m.return_value = "url" assert cmd.run() == 0