From 34d3261e58c5508276b26c984dab57f0f6be0b56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Redzy=C5=84ski?= Date: Thu, 16 Jan 2020 15:56:23 +0100 Subject: [PATCH 1/2] utils: resolve_output: normpath before extracting basename --- dvc/utils/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dvc/utils/__init__.py b/dvc/utils/__init__.py index edb77e93bb..bf02ecdb24 100644 --- a/dvc/utils/__init__.py +++ b/dvc/utils/__init__.py @@ -336,7 +336,7 @@ def env2bool(var, undefined=False): def resolve_output(inp, out): from urllib.parse import urlparse - name = os.path.basename(urlparse(inp).path) + name = os.path.basename(os.path.normpath(urlparse(inp).path)) if not out: return name if os.path.isdir(out): From cf08529362b917535dceb18cf384aaf343534a7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Redzy=C5=84ski?= Date: Thu, 16 Jan 2020 16:14:04 +0100 Subject: [PATCH 2/2] utils: add tests for resolve out --- tests/unit/utils/test_utils.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/tests/unit/utils/test_utils.py b/tests/unit/utils/test_utils.py index e53c8df21e..62f31446b2 100644 --- a/tests/unit/utils/test_utils.py +++ b/tests/unit/utils/test_utils.py @@ -4,7 +4,7 @@ import pytest from dvc.path_info import PathInfo -from dvc.utils import file_md5 +from dvc.utils import file_md5, resolve_output from dvc.utils import fix_env from dvc.utils import relpath from dvc.utils import to_chunks @@ -104,3 +104,28 @@ def test_relpath(): path_info = PathInfo(path) assert relpath(path) == relpath(path_info) + + +@pytest.mark.parametrize( + "inp,out,is_dir,expected", + [ + ["target", None, False, "target"], + ["target", "dir", True, os.path.join("dir", "target")], + ["target", "file_target", False, "file_target"], + [ + "target", + os.path.join("dir", "subdir"), + True, + os.path.join("dir", "subdir", "target"), + ], + ["dir/", None, False, "dir"], + ["dir", None, False, "dir"], + ["dir", "other_dir", False, "other_dir"], + ["dir", "other_dir", True, os.path.join("other_dir", "dir")], + ], +) +def test_resolve_output(inp, out, is_dir, expected, mocker): + with mocker.patch("os.path.isdir", return_value=is_dir): + result = resolve_output(inp, out) + + assert result == expected