def test_try_loading_dvcfile_that_is_gitignored(tmp_dir, dvc, scm, file): with open(tmp_dir / ".gitignore", "a+", encoding="utf-8") as fd: fd.write(file) # create a file just to avoid other checks (tmp_dir / file).write_text("") scm._reset() dvcfile = Dvcfile(dvc, file) with pytest.raises(FileIsGitIgnored) as exc_info: dvcfile._load() assert str(exc_info.value) == f"bad DVC file name '{file}' is git-ignored."
def test_repro_when_new_deps_is_moved(tmp_dir, dvc): from dvc.dvcfile import Dvcfile tmp_dir.gen("copy.py", COPY_SCRIPT) tmp_dir.gen({"foo": "foo", "bar": "foo"}) stage = dvc.run( cmd="python copy.py {} {}".format("foo", "foobar"), outs=["foobar"], deps=["foo"], name="copy-file", ) target = ":copy-file" assert not dvc.reproduce(target) tmp_dir.gen("copy.py", COPY_SCRIPT_FORMAT.format("'bar'", "'foobar'")) from shutil import move move("foo", "bar") dvcfile = Dvcfile(dvc, stage.path) data, _ = dvcfile._load() data["stages"]["copy-file"]["deps"] = ["bar"] dump_stage_file(stage.path, data) assert dvc.reproduce(target)[0] == stage
def test_repro_when_new_deps_is_moved(tmp_dir, dvc): from dvc.dvcfile import Dvcfile tmp_dir.gen("copy.py", COPY_SCRIPT) tmp_dir.gen({"foo": "foo", "bar": "foo"}) stage = dvc.run( cmd="python copy.py {} {}".format("foo", "foobar"), outs=["foobar"], deps=["foo"], name="copy-file", ) target = ":copy-file" assert not dvc.reproduce(target) # hardcode values in source code, ignore sys.argv tmp_dir.gen("copy.py", COPY_SCRIPT.replace("func(*argv)", 'func("bar", "foobar")')) from shutil import move move("foo", "bar") dvcfile = Dvcfile(dvc, stage.path) data, _ = dvcfile._load() data["stages"]["copy-file"]["deps"] = ["bar"] (tmp_dir / stage.path).dump(data) assert dvc.reproduce(target)[0] == stage
def test_remove_stage(tmp_dir, dvc, run_copy): tmp_dir.gen("foo", "foo") stage = run_copy("foo", "bar", name="copy-foo-bar") stage2 = run_copy("bar", "foobar", name="copy-bar-foobar") dvc_file = Dvcfile(dvc, PIPELINE_FILE) assert dvc_file.exists() assert {"copy-bar-foobar", "copy-foo-bar"} == set(dvc_file._load()[0]["stages"].keys()) dvc_file.remove_stage(stage) assert ["copy-bar-foobar"] == list(dvc_file._load()[0]["stages"].keys()) # sanity check stage2.reload() # re-check to see if it fails if there's no stage entry dvc_file.remove_stage(stage) dvc_file.remove(force=True) # should not fail when there's no file at all. dvc_file.remove_stage(stage)
def test_repro_when_new_outs_is_added_in_dvcfile(tmp_dir, dvc): from dvc.dvcfile import Dvcfile tmp_dir.gen("copy.py", COPY_SCRIPT) tmp_dir.gen({"foo": "foo", "bar": "bar"}) stage = dvc.run( cmd="python copy.py {} {}".format("foo", "foobar"), outs=[], # scenario where user forgot to add deps=["foo"], name="copy-file", ) target = ":copy-file" assert not dvc.reproduce(target) dvcfile = Dvcfile(dvc, stage.path) data, _ = dvcfile._load() data["stages"]["copy-file"]["outs"] = ["foobar"] dump_stage_file(stage.path, data) assert dvc.reproduce(target)[0] == stage
def test_repro_when_new_deps_is_added_in_dvcfile(tmp_dir, dvc, run_copy): from dvc.dvcfile import Dvcfile tmp_dir.gen("copy.py", COPY_SCRIPT) tmp_dir.gen({"foo": "foo", "bar": "bar"}) stage = dvc.run( cmd="python copy.py {} {}".format("foo", "foobar"), outs=["foobar"], deps=["foo"], name="copy-file", ) target = PIPELINE_FILE + ":copy-file" assert not dvc.reproduce(target) dvcfile = Dvcfile(dvc, stage.path) data, _ = dvcfile._load() data["stages"]["copy-file"]["deps"] += ["copy.py"] dump_stage_file(stage.path, data) assert dvc.reproduce(target)[0] == stage
def test_remove_stage_on_lockfile_format_error(tmp_dir, dvc, run_copy): tmp_dir.gen("foo", "foo") stage = run_copy("foo", "bar", name="copy-foo-bar") dvc_file = Dvcfile(dvc, stage.path) lock_file = dvc_file._lockfile data = dvc_file._load()[0] lock_data = lock_file.load() lock_data["gibberish"] = True data["gibberish"] = True dump_yaml(lock_file.relpath, lock_data) with pytest.raises(StageFileFormatError): dvc_file.remove_stage(stage) lock_file.remove() dvc_file.dump(stage, update_pipeline=False) dump_yaml(dvc_file.relpath, data) with pytest.raises(StageFileFormatError): dvc_file.remove_stage(stage)
def test_dvcfile_encoding_error(tmp_dir, dvc): tmp_dir.gen(PIPELINE_FILE, b"\x80some: stuff") dvcfile = Dvcfile(dvc, PIPELINE_FILE) with pytest.raises(EncodingError): dvcfile._load()