mirror of
https://github.com/Stone-Red-Code/dvc.git
synced 2026-11-01 23:08:43 +01:00
exp save: simplify implementation
This commit is contained in:
@@ -1,16 +1,31 @@
|
||||
from contextlib import nullcontext
|
||||
|
||||
import pytest
|
||||
from funcy import first
|
||||
|
||||
from dvc.repo.experiments.exceptions import ExperimentExistsError
|
||||
from dvc.repo.experiments.exceptions import (
|
||||
ExperimentExistsError,
|
||||
InvalidArgumentError,
|
||||
UnchangedExperimentError,
|
||||
)
|
||||
from dvc.repo.experiments.utils import exp_refs_by_rev
|
||||
from dvc.scm import resolve_rev
|
||||
from dvc.stage.exceptions import StageCommitError
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def modified_exp_stage(exp_stage, tmp_dir):
|
||||
with open(tmp_dir / "copy.py", "a", encoding="utf-8") as fh:
|
||||
fh.write("\n# dummy change")
|
||||
yield
|
||||
|
||||
|
||||
def test_exp_save_unchanged(tmp_dir, dvc, scm, exp_stage):
|
||||
with pytest.raises(UnchangedExperimentError):
|
||||
dvc.experiments.save()
|
||||
|
||||
dvc.experiments.save(force=True)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("name", (None, "test"))
|
||||
def test_exp_save(tmp_dir, dvc, scm, exp_stage, name):
|
||||
def test_exp_save(tmp_dir, dvc, scm, exp_stage, name, modified_exp_stage):
|
||||
baseline = scm.get_rev()
|
||||
|
||||
exp = dvc.experiments.save(name=name)
|
||||
@@ -22,39 +37,39 @@ def test_exp_save(tmp_dir, dvc, scm, exp_stage, name):
|
||||
assert resolve_rev(scm, exp_name) == exp
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("force", "expected_raises"),
|
||||
(
|
||||
(False, pytest.raises(StageCommitError)),
|
||||
(True, nullcontext()),
|
||||
),
|
||||
)
|
||||
def test_exp_save_force(tmp_dir, dvc, scm, exp_stage, force, expected_raises):
|
||||
with open(tmp_dir / "copy.py", "a", encoding="utf-8") as fh:
|
||||
fh.write("\n# dummy change")
|
||||
|
||||
with expected_raises:
|
||||
dvc.experiments.save(force=force)
|
||||
|
||||
|
||||
def test_exp_save_overwrite_experiment(tmp_dir, dvc, scm, exp_stage):
|
||||
dvc.experiments.save(name="dummy")
|
||||
|
||||
with open(tmp_dir / "copy.py", "a", encoding="utf-8") as fh:
|
||||
fh.write("\n# dummy change")
|
||||
def test_exp_save_overwrite_experiment(
|
||||
tmp_dir, dvc, scm, exp_stage, modified_exp_stage
|
||||
):
|
||||
name = "dummy"
|
||||
dvc.experiments.save(name=name)
|
||||
|
||||
with pytest.raises(ExperimentExistsError):
|
||||
dvc.experiments.save(name="dummy")
|
||||
dvc.experiments.save(name=name)
|
||||
|
||||
dvc.experiments.save(name="dummy", force=True)
|
||||
dvc.experiments.save(name=name, force=True)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"name",
|
||||
(
|
||||
"invalid/name",
|
||||
"invalid..name",
|
||||
"invalid~name",
|
||||
"invalid?name",
|
||||
"invalidname.",
|
||||
),
|
||||
)
|
||||
def test_exp_save_invalid_name(tmp_dir, dvc, scm, exp_stage, name):
|
||||
with pytest.raises(InvalidArgumentError):
|
||||
dvc.experiments.save(name=name, force=True)
|
||||
|
||||
|
||||
def test_exp_save_after_commit(tmp_dir, dvc, scm, exp_stage):
|
||||
baseline = scm.get_rev()
|
||||
dvc.experiments.save(name="exp-1")
|
||||
dvc.experiments.save(name="exp-1", force=True)
|
||||
|
||||
tmp_dir.scm_gen({"new_file": "new_file"}, commit="new baseline")
|
||||
dvc.experiments.save(name="exp-2")
|
||||
dvc.experiments.save(name="exp-2", force=True)
|
||||
|
||||
all_exps = dvc.experiments.ls(all_commits=True)
|
||||
assert all_exps[baseline[:7]] == ["exp-1"]
|
||||
|
||||
Reference in New Issue
Block a user