mirror of
https://github.com/Stone-Red-Code/dvc.git
synced 2026-11-04 15:28:27 +01:00
run: rerun deterministic callback (#2254)
* run: rerun deterministic callback * test_run: refactor deterministic run tests to use pytest
This commit is contained in:
committed by
Ruslan Kuprieiev
parent
2c2f573897
commit
e8623a0c69
+5
-1
@@ -534,7 +534,11 @@ class Stage(object):
|
||||
|
||||
if validate_state:
|
||||
if os.path.exists(path):
|
||||
if not ignore_build_cache and stage.is_cached:
|
||||
if (
|
||||
not ignore_build_cache
|
||||
and stage.is_cached
|
||||
and not stage.is_callback
|
||||
):
|
||||
logger.info("Stage is cached, skipping.")
|
||||
return None
|
||||
|
||||
|
||||
+55
-55
@@ -671,21 +671,22 @@ class TestCmdRunWorkingDirectory(TestDvc):
|
||||
)
|
||||
|
||||
|
||||
class TestRunDeterministicBase(TestDvc):
|
||||
def setUp(self):
|
||||
super(TestRunDeterministicBase, self).setUp()
|
||||
class DeterministicRunBaseFixture(object):
|
||||
def __init__(self, repo_dir, dvc_repo):
|
||||
self.out_file = "out"
|
||||
self.stage_file = self.out_file + ".dvc"
|
||||
self.cmd = "python {} {} {}".format(self.CODE, self.FOO, self.out_file)
|
||||
self.deps = [self.FOO, self.CODE]
|
||||
self.cmd = "python {} {} {}".format(
|
||||
repo_dir.CODE, repo_dir.FOO, self.out_file
|
||||
)
|
||||
self.deps = [repo_dir.FOO, repo_dir.CODE]
|
||||
self.outs = [self.out_file]
|
||||
self.overwrite = False
|
||||
self.ignore_build_cache = False
|
||||
self.dvc_repo = dvc_repo
|
||||
self.stage = None
|
||||
|
||||
self._run()
|
||||
|
||||
def _run(self):
|
||||
self.stage = self.dvc.run(
|
||||
def run(self):
|
||||
self.stage = self.dvc_repo.run(
|
||||
cmd=self.cmd,
|
||||
fname=self.stage_file,
|
||||
overwrite=self.overwrite,
|
||||
@@ -693,70 +694,69 @@ class TestRunDeterministicBase(TestDvc):
|
||||
deps=self.deps,
|
||||
outs=self.outs,
|
||||
)
|
||||
return self.stage
|
||||
|
||||
|
||||
class TestRunDeterministic(TestRunDeterministicBase):
|
||||
def test(self):
|
||||
self._run()
|
||||
@pytest.fixture
|
||||
def deterministic_run(dvc_repo, repo_dir):
|
||||
run_base = DeterministicRunBaseFixture(repo_dir, dvc_repo)
|
||||
run_base.run()
|
||||
yield run_base
|
||||
|
||||
|
||||
class TestRunDeterministicOverwrite(TestRunDeterministicBase):
|
||||
def test(self):
|
||||
self.overwrite = True
|
||||
self.ignore_build_cache = True
|
||||
self._run()
|
||||
def test_run_deterministic(deterministic_run):
|
||||
deterministic_run.run()
|
||||
|
||||
|
||||
class TestRunDeterministicCallback(TestRunDeterministicBase):
|
||||
def test(self):
|
||||
self.stage.remove()
|
||||
self.deps = []
|
||||
self._run()
|
||||
self._run()
|
||||
def test_run_deterministic_overwrite(deterministic_run):
|
||||
deterministic_run.overwrite = True
|
||||
deterministic_run.ignore_build_cache = True
|
||||
deterministic_run.run()
|
||||
|
||||
|
||||
class TestRunDeterministicChangedDep(TestRunDeterministicBase):
|
||||
def test(self):
|
||||
os.unlink(self.FOO)
|
||||
shutil.copy(self.BAR, self.FOO)
|
||||
with self.assertRaises(StageFileAlreadyExistsError):
|
||||
self._run()
|
||||
def test_run_deterministic_callback(deterministic_run):
|
||||
deterministic_run.stage.remove()
|
||||
deterministic_run.deps = []
|
||||
deterministic_run.run()
|
||||
with mock.patch("dvc.prompt.confirm", return_value=True):
|
||||
assert deterministic_run.run()
|
||||
|
||||
|
||||
class TestRunDeterministicChangedDepsList(TestRunDeterministicBase):
|
||||
def test(self):
|
||||
self.deps = [self.BAR, self.CODE]
|
||||
with self.assertRaises(StageFileAlreadyExistsError):
|
||||
self._run()
|
||||
def test_run_deterministic_changed_dep(deterministic_run, repo_dir):
|
||||
os.unlink(repo_dir.FOO)
|
||||
shutil.copy(repo_dir.BAR, repo_dir.FOO)
|
||||
with pytest.raises(StageFileAlreadyExistsError):
|
||||
deterministic_run.run()
|
||||
|
||||
|
||||
class TestRunDeterministicNewDep(TestRunDeterministicBase):
|
||||
def test(self):
|
||||
self.deps = [self.FOO, self.BAR, self.CODE]
|
||||
with self.assertRaises(StageFileAlreadyExistsError):
|
||||
self._run()
|
||||
def test_run_deterministic_changed_deps_list(deterministic_run, repo_dir):
|
||||
deterministic_run.deps = [repo_dir.BAR, repo_dir.CODE]
|
||||
with pytest.raises(StageFileAlreadyExistsError):
|
||||
deterministic_run.run()
|
||||
|
||||
|
||||
class TestRunDeterministicRemoveDep(TestRunDeterministicBase):
|
||||
def test(self):
|
||||
self.deps = [self.CODE]
|
||||
with self.assertRaises(StageFileAlreadyExistsError):
|
||||
self._run()
|
||||
def test_run_deterministic_new_dep(deterministic_run, repo_dir):
|
||||
deterministic_run.deps = [repo_dir.FOO, repo_dir.BAR, repo_dir.CODE]
|
||||
with pytest.raises(StageFileAlreadyExistsError):
|
||||
deterministic_run.run()
|
||||
|
||||
|
||||
class TestRunDeterministicChangedOut(TestRunDeterministicBase):
|
||||
def test(self):
|
||||
os.unlink(self.out_file)
|
||||
self.out_file_mtime = None
|
||||
with self.assertRaises(StageFileAlreadyExistsError):
|
||||
self._run()
|
||||
def test_run_deterministic_remove_dep(deterministic_run, repo_dir):
|
||||
deterministic_run.deps = [repo_dir.CODE]
|
||||
with pytest.raises(StageFileAlreadyExistsError):
|
||||
deterministic_run.run()
|
||||
|
||||
|
||||
class TestRunDeterministicChangedCmd(TestRunDeterministicBase):
|
||||
def test(self):
|
||||
self.cmd += " arg"
|
||||
with self.assertRaises(StageFileAlreadyExistsError):
|
||||
self._run()
|
||||
def test_run_deterministic_changed_out(deterministic_run):
|
||||
os.unlink(deterministic_run.out_file)
|
||||
with pytest.raises(StageFileAlreadyExistsError):
|
||||
deterministic_run.run()
|
||||
|
||||
|
||||
def test_run_deterministic_changed_cmd(deterministic_run):
|
||||
deterministic_run.cmd += " arg"
|
||||
with pytest.raises(StageFileAlreadyExistsError):
|
||||
deterministic_run.run()
|
||||
|
||||
|
||||
class TestRunCommit(TestDvc):
|
||||
|
||||
Reference in New Issue
Block a user