migrate some files to pytest

This commit is contained in:
Saugat Pachhai (सौगात)
2022-11-03 23:07:28 +05:45
committed by skshetry
parent fe1d805c80
commit c02bd7f318
14 changed files with 236 additions and 293 deletions
+2 -5
View File
@@ -9,7 +9,7 @@ from dvc.testing.fixtures import * # noqa, pylint: disable=wildcard-import
from .dir_helpers import * # noqa, pylint: disable=wildcard-import
from .remotes import * # noqa, pylint: disable=wildcard-import
from .utils.scriptify import scriptify
from .scripts import * # noqa, pylint: disable=wildcard-import
# Prevent updater and analytics from running their processes
os.environ["DVC_TEST"] = "true"
@@ -172,9 +172,6 @@ def custom_template(tmp_dir, dvc):
return template
scriptify_fixture = pytest.fixture(lambda: scriptify, name="scriptify")
@pytest.fixture(autouse=True)
def mocked_webbrowser_open(mocker):
mocker.patch("webbrowser.open")
@@ -218,7 +215,7 @@ defaultBranch=master
@pytest.fixture
def run_copy_metrics(tmp_dir, run_copy):
def run_copy_metrics(tmp_dir, copy_script):
def run(
file1,
file2,
+2 -29
View File
@@ -47,7 +47,6 @@ from global repo template to creating everything inplace, which:
import os
import pathlib
from textwrap import dedent
import pytest
@@ -67,17 +66,7 @@ disable_other_loggers()
@pytest.fixture
def run_copy(tmp_dir, dvc):
tmp_dir.gen(
"copy.py",
(
"import sys, shutil, os\n"
"shutil.copyfile(sys.argv[1], sys.argv[2]) "
"if os.path.isfile(sys.argv[1]) "
"else shutil.copytree(sys.argv[1], sys.argv[2])"
),
)
def run_copy(tmp_dir, copy_script, dvc):
def run_copy(src, dst, **run_kwargs):
wdir = pathlib.Path(run_kwargs.get("wdir", "."))
wdir = pathlib.Path("../" * len(wdir.parts))
@@ -94,23 +83,7 @@ def run_copy(tmp_dir, dvc):
@pytest.fixture
def run_head(tmp_dir, dvc):
"""Output first line of each file to different file with '-1' appended.
Useful for tracking multiple outputs/dependencies which are not a copy
of each others.
"""
tmp_dir.gen(
{
"head.py": dedent(
"""
import sys
for file in sys.argv[1:]:
with open(file) as f, open(file +"-1","w+") as w:
w.write(f.readline())
"""
)
}
)
def run_head(tmp_dir, head_script, dvc):
script = os.path.abspath(tmp_dir / "head.py")
def run(*args, **run_kwargs):
+6 -7
View File
@@ -13,7 +13,7 @@ from dvc.repo.experiments.utils import exp_refs_by_rev
from dvc.scm import resolve_rev
from dvc.stage.exceptions import StageFileDoesNotExistError
from dvc.utils.serialize import PythonFileCorruptedError
from tests.func.test_repro_multistage import COPY_SCRIPT
from tests.scripts import COPY_SCRIPT
@pytest.mark.parametrize("name", [None, "foo"])
@@ -209,8 +209,7 @@ def test_get_baseline(tmp_dir, scm, dvc, exp_stage):
assert dvc.experiments.get_baseline(f"{CELERY_STASH}@{{1}}") == init_rev
def test_update_py_params(tmp_dir, scm, dvc, test_queue):
tmp_dir.gen("copy.py", COPY_SCRIPT)
def test_update_py_params(tmp_dir, scm, dvc, test_queue, copy_script):
tmp_dir.gen("params.py", "INT = 1\n")
stage = dvc.run(
cmd="python copy.py params.py metrics.py",
@@ -371,8 +370,7 @@ def test_no_scm(tmp_dir):
getattr(dvc.experiments, cmd)()
def test_untracked(tmp_dir, scm, dvc, caplog, workspace):
tmp_dir.gen("copy.py", COPY_SCRIPT)
def test_untracked(tmp_dir, scm, dvc, caplog, workspace, copy_script):
tmp_dir.scm_gen("params.yaml", "foo: 1", commit="track params")
stage = dvc.run(
cmd="python copy.py params.yaml metrics.yaml",
@@ -600,9 +598,10 @@ def test_fix_exp_head(tmp_dir, scm, tail):
"params, target",
itertools.product(("foo: 1", "foo: 2"), (True, False)),
)
def test_modified_data_dep(tmp_dir, scm, dvc, workspace, params, target):
def test_modified_data_dep(
tmp_dir, scm, dvc, workspace, params, target, copy_script
):
tmp_dir.dvc_gen("data", "data")
tmp_dir.gen("copy.py", COPY_SCRIPT)
tmp_dir.gen("params.yaml", "foo: 1")
exp_stage = dvc.run(
cmd="python copy.py params.yaml metrics.yaml",
+4 -10
View File
@@ -1,12 +1,9 @@
import pytest
from funcy import first
from tests.func.test_repro_multistage import COPY_SCRIPT
@pytest.mark.parametrize("queued, expected", [(True, 0), (False, 1)])
def test_workspace(tmp_dir, scm, dvc, queued, expected):
tmp_dir.gen("copy.py", COPY_SCRIPT)
def test_workspace(tmp_dir, scm, dvc, queued, expected, copy_script):
tmp_dir.gen("params.yaml", "foo: 1")
stage = dvc.run(
@@ -26,8 +23,7 @@ def test_workspace(tmp_dir, scm, dvc, queued, expected):
@pytest.mark.parametrize("queued, expected", [(True, 0), (False, 2)])
def test_all_commits(tmp_dir, scm, dvc, queued, expected):
tmp_dir.gen("copy.py", COPY_SCRIPT)
def test_all_commits(tmp_dir, scm, dvc, queued, expected, copy_script):
tmp_dir.gen("params.yaml", "foo: 1")
stage = dvc.run(
@@ -55,8 +51,7 @@ def test_all_commits(tmp_dir, scm, dvc, queued, expected):
@pytest.mark.parametrize("queued, expected", [(True, 2), (False, 3)])
def test_all_branches(tmp_dir, scm, dvc, queued, expected):
tmp_dir.gen("copy.py", COPY_SCRIPT)
def test_all_branches(tmp_dir, scm, dvc, queued, expected, copy_script):
tmp_dir.gen("params.yaml", "foo: 1")
stage = dvc.run(
@@ -91,8 +86,7 @@ def test_all_branches(tmp_dir, scm, dvc, queued, expected):
@pytest.mark.parametrize("queued, expected", [(True, 2), (False, 3)])
def test_all_tags(tmp_dir, scm, dvc, queued, expected):
tmp_dir.gen("copy.py", COPY_SCRIPT)
def test_all_tags(tmp_dir, scm, dvc, queued, expected, copy_script):
tmp_dir.gen("params.yaml", "foo: 1")
stage = dvc.run(
+7 -10
View File
@@ -20,7 +20,6 @@ from dvc.repo.experiments.utils import exp_refs_by_rev
from dvc.utils import relpath
from dvc.utils.fs import makedirs
from dvc.utils.serialize import YAMLFileCorruptedError
from tests.func.test_repro_multistage import COPY_SCRIPT
LOCK_CONTENTS = {
"read": {
@@ -313,10 +312,10 @@ def test_show_filter(
scm,
dvc,
capsys,
copy_script,
):
capsys.readouterr()
tmp_dir.gen("copy.py", COPY_SCRIPT)
params_file = tmp_dir / "params.yaml"
params_data = {
"foo": 1,
@@ -679,8 +678,7 @@ def test_show_csv(tmp_dir, scm, dvc, exp_stage, capsys):
)
def test_show_only_changed(tmp_dir, dvc, scm, capsys):
tmp_dir.gen("copy.py", COPY_SCRIPT)
def test_show_only_changed(tmp_dir, dvc, scm, capsys, copy_script):
params_file = tmp_dir / "params.yaml"
params_data = {
"foo": 1,
@@ -726,13 +724,14 @@ def test_show_only_changed(tmp_dir, dvc, scm, capsys):
assert "metrics.yaml:bar" in cap.out
def test_show_parallel_coordinates(tmp_dir, dvc, scm, mocker, capsys):
def test_show_parallel_coordinates(
tmp_dir, dvc, scm, mocker, capsys, copy_script
):
from dvc.commands.experiments import show
webbroser_open = mocker.patch("webbrowser.open")
show_experiments = mocker.spy(show, "show_experiments")
tmp_dir.gen("copy.py", COPY_SCRIPT)
params_file = tmp_dir / "params.yaml"
params_data = {
"foo": 1,
@@ -807,8 +806,7 @@ def test_show_parallel_coordinates(tmp_dir, dvc, scm, mocker, capsys):
@pytest.mark.vscode
def test_show_outs(tmp_dir, dvc, scm, erepo_dir):
tmp_dir.gen("copy.py", COPY_SCRIPT)
def test_show_outs(tmp_dir, dvc, scm, erepo_dir, copy_script):
params_file = tmp_dir / "params.yaml"
params_data = {
"foo": 1,
@@ -889,8 +887,7 @@ def test_show_outs(tmp_dir, dvc, scm, erepo_dir):
}
def test_metrics_renaming(tmp_dir, dvc, scm, capsys):
tmp_dir.gen("copy.py", COPY_SCRIPT)
def test_metrics_renaming(tmp_dir, dvc, scm, capsys, copy_script):
params_file = tmp_dir / "params.yaml"
params_data = {
"foo": 1,
+33 -42
View File
@@ -13,37 +13,32 @@ from dvc.exceptions import InvalidArgumentError
from dvc.stage import Stage
from dvc.testing.workspace_tests import TestImport as _TestImport
from dvc.utils.fs import makedirs
from tests.basic_env import TestDvc
class TestCmdImport(TestDvc):
def test(self):
ret = main(["import-url", self.FOO, "import"])
self.assertEqual(ret, 0)
self.assertTrue(os.path.exists("import.dvc"))
def test_cmd_import(tmp_dir, dvc):
tmp_dir.gen("foo", "foo")
ret = main(["import-url", "foo", "import"])
assert ret == 0
assert os.path.exists("import.dvc")
ret = main(["import-url", "non-existing-file", "import"])
self.assertNotEqual(ret, 0)
def test_unsupported(self):
ret = main(["import-url", "unsupported://path", "import_unsupported"])
self.assertNotEqual(ret, 0)
ret = main(["import-url", "non-existing-file", "import"])
assert ret != 0
class TestDefaultOutput(TestDvc):
def test(self):
tmpdir = self.mkdtemp()
filename = str(uuid4())
tmpfile = os.path.join(tmpdir, filename)
def test_cmd_unsupported_scheme(dvc):
ret = main(["import-url", "unsupported://path", "import_unsupported"])
assert ret != 0
with open(tmpfile, "w", encoding="utf-8") as fd:
fd.write("content")
ret = main(["import-url", tmpfile])
self.assertEqual(ret, 0)
self.assertTrue(os.path.exists(filename))
with open(filename, encoding="utf-8") as fd:
self.assertEqual(fd.read(), "content")
def test_default_output(tmp_dir, dvc, cloud):
filename = str(uuid4())
tmpfile = cloud / filename
tmpfile.write_bytes(b"content")
cloud.gen(filename, "content")
ret = main(["import-url", tmpfile.fs_path])
assert ret == 0
assert (tmp_dir / filename).read_bytes() == b"content"
def test_should_remove_outs_before_import(tmp_dir, dvc, mocker, erepo_dir):
@@ -56,26 +51,22 @@ def test_should_remove_outs_before_import(tmp_dir, dvc, mocker, erepo_dir):
assert remove_outs_call_counter.mock.call_count == 1
class TestImportFilename(TestDvc):
def setUp(self):
super().setUp()
tmp_dir = self.mkdtemp()
self.external_source = os.path.join(tmp_dir, "file")
with open(self.external_source, "w", encoding="utf-8") as fobj:
fobj.write("content")
def test_import_filename(tmp_dir, dvc, cloud):
external_source = cloud / "file"
(cloud / "file").write_text("content", encoding="utf-8")
ret = main(["import-url", "--file", "bar.dvc", external_source.fs_path])
assert ret == 0
assert (tmp_dir / "bar.dvc").exists()
def test(self):
ret = main(["import-url", "--file", "bar.dvc", self.external_source])
self.assertEqual(0, ret)
self.assertTrue(os.path.exists("bar.dvc"))
(tmp_dir / "bar.dvc").unlink()
(tmp_dir / "sub").mkdir()
os.remove("bar.dvc")
os.mkdir("sub")
path = os.path.join("sub", "bar.dvc")
ret = main(["import-url", "--file", path, self.external_source, "out"])
self.assertEqual(0, ret)
self.assertTrue(os.path.exists(path))
path = tmp_dir / "sub" / "bar.dvc"
ret = main(
["import-url", "--file", path.fs_path, external_source.fs_path, "out"]
)
assert ret == 0
assert path.exists()
@pytest.mark.parametrize("dname", [".", "dir", "dir/subdir"])
+56 -65
View File
@@ -10,58 +10,51 @@ from dvc.cli import main
from dvc.config import Config
from dvc.exceptions import DownloadError, RemoteCacheRequiredError, UploadError
from dvc.utils.fs import remove
from tests.basic_env import TestDvc
class TestRemote(TestDvc):
def test(self):
remotes = ["a", "b", "c"]
def test_remote(dvc):
remotes = ["a", "b", "c"]
self.assertEqual(main(["remote", "list"]), 0)
self.assertNotEqual(main(["remote", "remove", remotes[0]]), 0)
assert main(["remote", "list"]) == 0
assert main(["remote", "remove", remotes[0]]) != 0
for r in remotes:
self.assertEqual(
main(["remote", "add", "--default", r, "s3://bucket/name"]), 0
)
for r in remotes:
assert main(["remote", "add", "--default", r, "s3://bucket/name"]) == 0
self.assertEqual(main(["remote", "list"]), 0)
assert main(["remote", "list"]) == 0
self.assertEqual(
main(["remote", "modify", remotes[0], "checksum_jobs", "1"]), 0
)
self.assertEqual(main(["remote", "remove", remotes[0]]), 0)
assert main(["remote", "modify", remotes[0], "checksum_jobs", "1"]) == 0
assert main(["remote", "remove", remotes[0]]) == 0
self.assertEqual(main(["remote", "list"]), 0)
assert main(["remote", "list"]) == 0
def test_relative_path(self):
dname = os.path.join("..", "path", "to", "dir")
ret = main(["remote", "add", "mylocal", dname])
self.assertEqual(ret, 0)
# NOTE: we are in the repo's root and config is in .dvc/, so
# dir path written to config should be just one level above.
rel = os.path.join("..", dname)
config = configobj.ConfigObj(self.dvc.config.files["repo"])
self.assertEqual(
config['remote "mylocal"']["url"], rel.replace("\\", "/")
)
def test_remote_add_relative_path(dvc):
dname = os.path.join("..", "path", "to", "dir")
ret = main(["remote", "add", "mylocal", dname])
assert ret == 0
def test_overwrite(self):
remote_name = "a"
remote_url = "s3://bucket/name"
self.assertEqual(main(["remote", "add", remote_name, remote_url]), 0)
self.assertEqual(main(["remote", "add", remote_name, remote_url]), 251)
self.assertEqual(
main(["remote", "add", "-f", remote_name, remote_url]), 0
)
# NOTE: we are in the repo's root and config is in .dvc/, so
# dir path written to config should be just one level above.
rel = os.path.join("..", dname)
config = configobj.ConfigObj(dvc.config.files["repo"])
assert config['remote "mylocal"']["url"] == rel.replace("\\", "/")
def test_referencing_other_remotes(self):
assert main(["remote", "add", "foo", "ssh://localhost/"]) == 0
assert main(["remote", "add", "bar", "remote://foo/dvc-storage"]) == 0
config = configobj.ConfigObj(self.dvc.config.files["repo"])
assert config['remote "bar"']["url"] == "remote://foo/dvc-storage"
def test_remote_overwrite(dvc):
remote_name = "a"
remote_url = "s3://bucket/name"
assert main(["remote", "add", remote_name, remote_url]) == 0
assert main(["remote", "add", remote_name, remote_url]) == 251
assert main(["remote", "add", "-f", remote_name, remote_url]) == 0
def test_referencing_other_remotes(dvc):
assert main(["remote", "add", "foo", "ssh://localhost/"]) == 0
assert main(["remote", "add", "bar", "remote://foo/dvc-storage"]) == 0
config = configobj.ConfigObj(dvc.config.files["repo"])
assert config['remote "bar"']["url"] == "remote://foo/dvc-storage"
def test_remove_default(tmp_dir, dvc):
@@ -85,37 +78,35 @@ def test_remove_default(tmp_dir, dvc):
assert local_config.get("core", {}).get("remote") is None
class TestRemoteRemove(TestDvc):
def test(self):
ret = main(["config", "core.checksum_jobs", "1"])
self.assertEqual(ret, 0)
def test_remote_remove(dvc):
ret = main(["config", "core.checksum_jobs", "1"])
assert ret == 0
remote = "mys3"
ret = main(["remote", "add", remote, "s3://bucket/name"])
self.assertEqual(ret, 0)
remote = "mys3"
ret = main(["remote", "add", remote, "s3://bucket/name"])
assert ret == 0
ret = main(["remote", "remove", remote])
self.assertEqual(ret, 0)
ret = main(["remote", "remove", remote])
assert ret == 0
class TestRemoteDefault(TestDvc):
def test(self):
remote = "mys3"
ret = main(["remote", "add", "mys3", "s3://bucket/path"])
self.assertEqual(ret, 0)
def test_remote_default_cmd(dvc):
remote = "mys3"
ret = main(["remote", "add", "mys3", "s3://bucket/path"])
assert ret == 0
ret = main(["remote", "default", "mys3"])
self.assertEqual(ret, 0)
config_file = os.path.join(self.dvc.dvc_dir, Config.CONFIG)
config = configobj.ConfigObj(config_file)
default = config["core"]["remote"]
self.assertEqual(default, remote)
ret = main(["remote", "default", "mys3"])
assert ret == 0
config_file = os.path.join(dvc.dvc_dir, Config.CONFIG)
config = configobj.ConfigObj(config_file)
default = config["core"]["remote"]
assert default == remote
ret = main(["remote", "default", "--unset"])
self.assertEqual(ret, 0)
config = configobj.ConfigObj(config_file)
default = config.get("core", {}).get("remote")
self.assertEqual(default, None)
ret = main(["remote", "default", "--unset"])
assert ret == 0
config = configobj.ConfigObj(config_file)
default = config.get("core", {}).get("remote")
assert default is None
def test_show_default(dvc, capsys):
+1 -1
View File
@@ -220,7 +220,7 @@ def test_unique_identifier(tmp_dir, dvc, scm, run_copy):
# we get "workspace" as well from the brancher by default
assert len(revs) + 1 == len(ids)
possible_ids = {
True: "2ba7c7c5b395d4211348d6274b869fc7",
True: "dd9cf3a3dc2caac5835e64f258ac2d7b",
False: "8406970ad2fcafaa84d9310330a67576",
}
assert set(ids) == {possible_ids[os.name == "posix"]}
+53 -72
View File
@@ -1,10 +1,8 @@
import os
import tempfile
import pytest
from dvc.annotations import Annotation
from dvc.cli import main
from dvc.dvcfile import SingleStageFile
from dvc.fs import LocalFileSystem
from dvc.output import Output
@@ -15,7 +13,6 @@ from dvc.stage.utils import compute_md5
from dvc.utils import dict_md5
from dvc.utils.serialize import dump_yaml, load_yaml
from dvc.utils.strictyaml import YAMLValidationError
from tests.basic_env import TestDvc
def test_cmd_obj():
@@ -71,90 +68,74 @@ def test_list():
SingleStageFile.validate(d)
class TestReload(TestDvc):
def test(self):
stages = self.dvc.add(self.FOO)
self.assertEqual(len(stages), 1)
stage = stages[0]
self.assertTrue(stage is not None)
def test_reload(tmp_dir, dvc):
(stage,) = tmp_dir.dvc_gen("foo", "foo")
d = load_yaml(stage.relpath)
d = load_yaml(stage.relpath)
# NOTE: checking that reloaded stage didn't change its checksum
md5 = "11111111111111111111111111111111"
d[stage.PARAM_MD5] = md5
dump_yaml(stage.relpath, d)
# NOTE: checking that reloaded stage didn't change its checksum
md5 = "11111111111111111111111111111111"
d[stage.PARAM_MD5] = md5
dump_yaml(stage.relpath, d)
dvcfile = SingleStageFile(dvc, stage.relpath)
stage = dvcfile.stage
dvcfile = SingleStageFile(self.dvc, stage.relpath)
stage = dvcfile.stage
assert stage is not None
dvcfile.dump(stage)
self.assertTrue(stage is not None)
dvcfile.dump(stage)
d = load_yaml(stage.relpath)
self.assertEqual(d[stage.PARAM_MD5], md5)
d = load_yaml(stage.relpath)
assert d[stage.PARAM_MD5] == md5
class TestDefaultWorkingDirectory(TestDvc):
def test_ignored_in_checksum(self):
stage = self.dvc.run(
cmd=f"echo test > {self.FOO}",
deps=[self.BAR],
outs=[self.FOO],
single_stage=True,
)
def test_default_wdir_ignored_in_checksum(tmp_dir, dvc):
tmp_dir.gen("bar", "bar")
stage = dvc.run(
cmd="cp bar foo",
deps=["bar"],
outs=["foo"],
single_stage=True,
)
d = stage.dumpd()
self.assertNotIn(Stage.PARAM_WDIR, d.keys())
d = stage.dumpd()
assert Stage.PARAM_WDIR not in d.keys()
d = load_yaml(stage.relpath)
self.assertNotIn(Stage.PARAM_WDIR, d.keys())
d = load_yaml(stage.relpath)
assert Stage.PARAM_WDIR not in d.keys()
with self.dvc.lock:
stage = SingleStageFile(self.dvc, stage.relpath).stage
self.assertFalse(stage.changed())
with dvc.lock:
stage = SingleStageFile(dvc, stage.relpath).stage
assert not stage.changed()
class TestExternalRemoteResolution(TestDvc):
def test_remote_output(self):
tmp_path = tempfile.mkdtemp()
storage = os.path.join(tmp_path, "storage")
file_path = os.path.join(storage, "file")
def test_external_remote_output_resolution(tmp_dir, dvc, make_remote):
tmp_path = make_remote("tmp", default=False)
tmp_dir.add_remote(
url="remote://tmp/storage", name="storage", default=False
)
storage = tmp_path / "storage"
storage.mkdir()
file_path = storage / "file"
os.makedirs(storage)
dvc.run(
cmd=f"echo file > {file_path}",
outs_no_cache=["remote://storage/file"],
single_stage=True,
)
assert os.path.exists(file_path)
assert main(["remote", "add", "tmp", tmp_path]) == 0
assert main(["remote", "add", "storage", "remote://tmp/storage"]) == 0
assert (
main(
[
"run",
"--single-stage",
"-O",
"remote://storage/file",
f"echo file > {file_path}",
]
)
== 0
)
assert os.path.exists(file_path)
def test_external_remote_dependency_resolution(tmp_dir, dvc, make_remote):
tmp_path = make_remote("tmp", default=False)
tmp_dir.add_remote(
url="remote://tmp/storage", name="storage", default=False
)
storage = tmp_path / "storage"
storage.mkdir()
file_path = storage / "file"
file_path.write_text("Isle of Dogs", encoding="utf-8")
def test_remote_dependency(self):
tmp_path = tempfile.mkdtemp()
storage = os.path.join(tmp_path, "storage")
file_path = os.path.join(storage, "file")
os.makedirs(storage)
with open(file_path, "w", encoding="utf-8") as fobj:
fobj.write("Isle of Dogs")
assert main(["remote", "add", "tmp", tmp_path]) == 0
assert main(["remote", "add", "storage", "remote://tmp/storage"]) == 0
assert main(["import-url", "remote://storage/file", "movie.txt"]) == 0
assert os.path.exists("movie.txt")
dvc.imp_url("remote://storage/file", "movie.txt")
assert (tmp_dir / "movie.txt").read_text() == "Isle of Dogs"
def test_md5_ignores_comments(tmp_dir, dvc):
+59
View File
@@ -0,0 +1,59 @@
import pytest
COPY_SCRIPT = """
import os
import shutil
import sys
if os.path.isfile(sys.argv[1]):
shutil.copyfile(sys.argv[1], sys.argv[2])
else:
shutil.copytree(sys.argv[1], sys.argv[2])
"""
def _add_script(tmp_dir, path, contents=""):
script, *_ = tmp_dir.gen(path, contents)
if hasattr(tmp_dir, "scm"):
tmp_dir.scm_add(path, commit=f"add {path}")
return script.fs_path
@pytest.fixture
def append_foo_script(tmp_dir):
return _add_script(
tmp_dir,
"append_foo.py",
"""
import sys
from pathlib import Path
with Path(sys.argv[1]).open("a+", encoding="utf-8") as f:
f.write("foo")
""",
)
@pytest.fixture
def copy_script(
tmp_dir,
):
return _add_script(tmp_dir, "copy.py", COPY_SCRIPT)
@pytest.fixture
def head_script(tmp_dir):
"""Output first line of each file to different file with '-1' appended.
Useful for tracking multiple outputs/dependencies which are not a copy
of each others.
"""
return _add_script(
tmp_dir,
"head.py",
"""
import sys
for file in sys.argv[1:]:
with open(file) as f, open(file +"-1","w+") as w:
w.write(f.readline())
""",
)
+8 -8
View File
@@ -39,7 +39,7 @@ def test_default(mocker, capsys):
}
mocker.patch("dvc.repo.Repo.diff", return_value=diff)
assert 0 == cmd.run()
assert cmd.run() == 0
assert (
"Added:\n"
" file\n"
@@ -77,7 +77,7 @@ def test_show_hash(mocker, capsys):
"not in cache": [],
}
mocker.patch("dvc.repo.Repo.diff", return_value=diff)
assert 0 == cmd.run()
assert cmd.run() == 0
out, _ = capsys.readouterr()
assert (
@@ -115,7 +115,7 @@ def test_show_json(mocker, capsys):
}
mocker.patch("dvc.repo.Repo.diff", return_value=diff)
assert 0 == cmd.run()
assert cmd.run() == 0
out, _ = capsys.readouterr()
assert '"added": [{"path": "file1"}, {"path": "file2"}]' in out
assert '"deleted": []' in out
@@ -145,7 +145,7 @@ def test_show_json_and_hash(mocker, capsys):
}
mocker.patch("dvc.repo.Repo.diff", return_value=diff)
assert 0 == cmd.run()
assert cmd.run() == 0
out, _ = capsys.readouterr()
assert (
'"added": [{"path": "file1", "hash": "11111111"}, '
@@ -180,7 +180,7 @@ def test_show_json_hide_missing(mocker, capsys):
}
mocker.patch("dvc.repo.Repo.diff", return_value=diff)
assert 0 == cmd.run()
assert cmd.run() == 0
out, _ = capsys.readouterr()
assert '"added": [{"path": "file1"}, {"path": "file2"}]' in out
assert '"deleted": []' in out
@@ -200,7 +200,7 @@ def test_diff_show_markdown_and_hash(mocker, show_hash):
mock_show_markdown = mocker.patch("dvc.commands.diff._show_markdown")
mocker.patch("dvc.repo.Repo.diff", return_value=diff.copy())
assert 0 == cmd.run()
assert cmd.run() == 0
mock_show_markdown.assert_called_once_with(diff, show_hash, False)
@@ -226,7 +226,7 @@ def test_no_changes(mocker, capsys, opts, show, expected):
cmd = args.func(args)
mocker.patch("dvc.repo.Repo.diff", return_value={})
assert 0 == cmd.run()
assert cmd.run() == 0
out, _ = capsys.readouterr()
assert expected == out.strip()
@@ -349,7 +349,7 @@ def test_hide_missing(mocker, capsys):
}
mocker.patch("dvc.repo.Repo.diff", return_value=diff)
assert 0 == cmd.run()
assert cmd.run() == 0
out, _ = capsys.readouterr()
assert (
"Added:\n"
+2 -5
View File
@@ -4,7 +4,6 @@ from textwrap import dedent
import pytest
from dvc.repo.experiments.queue.celery import LocalCeleryQueue
from tests.func.test_repro_multistage import COPY_SCRIPT
DEFAULT_ITERATIONS = 2
CHECKPOINT_SCRIPT_FORMAT = dedent(
@@ -44,8 +43,7 @@ CHECKPOINT_SCRIPT = CHECKPOINT_SCRIPT_FORMAT.format(
@pytest.fixture
def exp_stage(tmp_dir, scm, dvc):
tmp_dir.gen("copy.py", COPY_SCRIPT)
def exp_stage(tmp_dir, scm, dvc, copy_script):
tmp_dir.gen("params.yaml", "foo: 1")
stage = dvc.run(
cmd="python copy.py params.yaml metrics.yaml",
@@ -93,8 +91,7 @@ def checkpoint_stage(tmp_dir, scm, dvc, mocker):
@pytest.fixture
def failed_exp_stage(tmp_dir, scm, dvc):
tmp_dir.gen("copy.py", COPY_SCRIPT)
def failed_exp_stage(tmp_dir, scm, dvc, copy_script):
tmp_dir.gen("params.yaml", "foo: 1")
stage = dvc.stage.add(
cmd="python -c 'import sys; sys.exit(1)'",
+3 -3
View File
@@ -180,14 +180,14 @@ def test_shared_stage_cache(tmp_dir, dvc, run_copy):
run_copy("foo", "bar", name="copy-foo-bar")
parent_cache_dir = os.path.join(dvc.stage_cache.cache_dir, "88")
parent_cache_dir = os.path.join(dvc.stage_cache.cache_dir, "fd")
cache_dir = os.path.join(
parent_cache_dir,
"883395068439203a9de3d1e1649a16e9027bfd1ab5dab4f438d321c4a928b328",
"fdbe7847136ebe88f59a29ee5a568f893cab031f74f7d3ab050828b53fd0033a",
)
cache_file = os.path.join(
cache_dir,
"e42b7ebb9bc5ac4bccab769c8d1338914dad25d7ffecc8671dbd4581bad4aa15",
"8716052b2074f5acf1a379529d47d6ef1c1f50c2281a7489b8d7ce251f234f86",
)
# sanity check
-36
View File
@@ -1,36 +0,0 @@
import inspect
import sys
import textwrap
from pathlib import Path
SCRIPT_TEMPLATE = """\
#! {executable}
# AUTOGENERATED USING SCRIPTIFY FOR USE IN TESTS FOR DVC
{code}
if __name__ == "__main__":
import sys
_, *argv = sys.argv
func = {func!s}
func(*argv)
"""
def scriptify(func, path=None):
# you can use `breakpoint()` inside functions too
# just remember to run the test in `-s` mode.
code = textwrap.dedent(inspect.getsource(func))
executable = sys.executable
source = SCRIPT_TEMPLATE.format(
executable=executable, code=code, func=func.__name__
)
if not path:
return source, None
Path(path).write_text(source, encoding="utf-8")
return source, f"{executable} {path}"