exp: Unify dvc exp list and show output (#9808)

* use _describe in exp list

* fix pre-commit checks

* simplistic fix

* single _describe, too complex

* slightly simpler

* even simpler

* simple, but with regex

* less substitutions

* describe public

* name handling in UI (tests need updating)

* fixed old tests

* lazy imports

---------

Co-authored-by: Tibor Mach <[email protected]>
This commit is contained in:
Tibor Mach
2023-08-10 19:23:27 +09:00
committed by GitHub
co-authored by Tibor Mach
parent f5dda2d3cc
commit 04e891cef9
8 changed files with 97 additions and 86 deletions
+14 -11
View File
@@ -348,7 +348,8 @@ def test_packed_args_exists(tmp_dir, scm, dvc, exp_stage, caplog):
def test_list(tmp_dir, scm, dvc, exp_stage):
baseline_a = scm.get_rev()
baseline_old = scm.get_rev()
results = dvc.experiments.run(exp_stage.addressing, params=["foo=2"])
exp_a = first(results)
ref_info_a = first(exp_refs_by_rev(scm, exp_a))
@@ -358,34 +359,36 @@ def test_list(tmp_dir, scm, dvc, exp_stage):
ref_info_b = first(exp_refs_by_rev(scm, exp_b))
tmp_dir.scm_gen("new", "new", commit="new")
baseline_new = scm.get_rev()
results = dvc.experiments.run(exp_stage.addressing, params=["foo=4"])
exp_c = first(results)
ref_info_c = first(exp_refs_by_rev(scm, exp_c))
assert dvc.experiments.ls() == {"refs/heads/master": [(ref_info_c.name, exp_c)]}
assert dvc.experiments.ls() == {baseline_new: [(ref_info_c.name, exp_c)]}
exp_list = dvc.experiments.ls(rev=ref_info_a.baseline_sha)
assert {key: set(val) for key, val in exp_list.items()} == {
baseline_a: {(ref_info_a.name, exp_a), (ref_info_b.name, exp_b)}
baseline_old: {(ref_info_a.name, exp_a), (ref_info_b.name, exp_b)}
}
exp_list = dvc.experiments.ls(rev=[baseline_a, scm.get_rev()])
exp_list = dvc.experiments.ls(rev=[baseline_old, baseline_new])
assert {key: set(val) for key, val in exp_list.items()} == {
baseline_a: {(ref_info_a.name, exp_a), (ref_info_b.name, exp_b)},
"refs/heads/master": {(ref_info_c.name, exp_c)},
baseline_old: {(ref_info_a.name, exp_a), (ref_info_b.name, exp_b)},
baseline_new: {(ref_info_c.name, exp_c)},
}
exp_list = dvc.experiments.ls(all_commits=True)
assert {key: set(val) for key, val in exp_list.items()} == {
baseline_a: {(ref_info_a.name, exp_a), (ref_info_b.name, exp_b)},
"refs/heads/master": {(ref_info_c.name, exp_c)},
baseline_old: {(ref_info_a.name, exp_a), (ref_info_b.name, exp_b)},
baseline_new: {(ref_info_c.name, exp_c)},
}
scm.checkout("branch", True)
exp_list = dvc.experiments.ls(all_commits=True)
assert {key: set(val) for key, val in exp_list.items()} == {
baseline_a: {(ref_info_a.name, exp_a), (ref_info_b.name, exp_b)},
"refs/heads/branch": {(ref_info_c.name, exp_c)},
baseline_old: {(ref_info_a.name, exp_a), (ref_info_b.name, exp_b)},
baseline_new: {(ref_info_c.name, exp_c)},
}
@@ -666,7 +669,7 @@ def test_experiment_unchanged(tmp_dir, scm, dvc, exp_stage):
dvc.experiments.run(exp_stage.addressing)
dvc.experiments.run(exp_stage.addressing)
assert len(dvc.experiments.ls()["refs/heads/master"]) == 2
assert len(dvc.experiments.ls()[scm.get_rev()]) == 2
def test_experiment_run_dry(tmp_dir, scm, dvc, exp_stage):
+7 -5
View File
@@ -139,7 +139,7 @@ def test_push_ambiguous_name(tmp_dir, scm, dvc, git_upstream, exp_stage):
@pytest.mark.parametrize("use_url", [True, False])
def test_list_remote(tmp_dir, scm, dvc, git_downstream, exp_stage, use_url):
baseline_a = scm.get_rev()
baseline_old = scm.get_rev()
results = dvc.experiments.run(exp_stage.addressing, params=["foo=2"])
exp_a = first(results)
ref_info_a = first(exp_refs_by_rev(scm, exp_a))
@@ -149,6 +149,8 @@ def test_list_remote(tmp_dir, scm, dvc, git_downstream, exp_stage, use_url):
ref_info_b = first(exp_refs_by_rev(scm, exp_b))
tmp_dir.scm_gen("new", "new", commit="new")
baseline_new = scm.get_rev()
results = dvc.experiments.run(exp_stage.addressing, params=["foo=4"])
exp_c = first(results)
ref_info_c = first(exp_refs_by_rev(scm, exp_c))
@@ -160,15 +162,15 @@ def test_list_remote(tmp_dir, scm, dvc, git_downstream, exp_stage, use_url):
assert downstream_exp.ls(git_remote=remote) == {}
git_downstream.tmp_dir.scm.fetch_refspecs(remote, ["master:master"])
exp_list = downstream_exp.ls(rev=baseline_a, git_remote=remote)
exp_list = downstream_exp.ls(rev=baseline_old, git_remote=remote)
assert {key: set(val) for key, val in exp_list.items()} == {
baseline_a: {(ref_info_a.name, None), (ref_info_b.name, None)}
baseline_old: {(ref_info_a.name, None), (ref_info_b.name, None)}
}
exp_list = downstream_exp.ls(all_commits=True, git_remote=remote)
assert {key: set(val) for key, val in exp_list.items()} == {
baseline_a: {(ref_info_a.name, None), (ref_info_b.name, None)},
"refs/heads/master": {(ref_info_c.name, None)},
baseline_old: {(ref_info_a.name, None), (ref_info_b.name, None)},
baseline_new: {(ref_info_c.name, None)},
}
+2 -1
View File
@@ -67,11 +67,12 @@ def test_exp_save_after_commit(tmp_dir, dvc, scm):
dvc.experiments.save(name="exp-1", force=True)
tmp_dir.scm_gen({"new_file": "new_file"}, commit="new baseline")
baseline_new = scm.get_rev()
dvc.experiments.save(name="exp-2", force=True)
all_exps = dvc.experiments.ls(all_commits=True)
assert all_exps[baseline][0][0] == "exp-1"
assert all_exps["refs/heads/master"][0][0] == "exp-2"
assert all_exps[baseline_new][0][0] == "exp-2"
def test_exp_save_with_staged_changes(tmp_dir, dvc, scm):
+2 -2
View File
@@ -189,7 +189,7 @@ def test_experiments_list(dvc, scm, mocker):
@pytest.mark.parametrize(
"args,expected",
[
([], "main:\n\tsha-a [exp-a]\n"),
([], "master:\n\tsha-a [exp-a]\n"),
(["--name-only"], "exp-a\n"),
(["--sha-only"], "sha-a\n"),
],
@@ -198,7 +198,7 @@ def test_experiments_list_format(mocker, capsys, args, expected, dvc, scm):
mocker.patch(
"dvc.repo.experiments.ls.ls",
return_value={
"refs/heads/main": [
scm.get_rev(): [
("exp-a", "sha-a"),
]
},