CI / ledger-and-tools (push) Successful in 17s
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
49 lines
2.2 KiB
Python
49 lines
2.2 KiB
Python
"""tools/ledger.py: runs as git-tracked JSON with fixed states."""
|
|
import json
|
|
|
|
import pytest
|
|
|
|
from tools import ledger
|
|
|
|
|
|
def test_new_set_metrics_render_check(tmp_path):
|
|
run = ledger.new_run("dataset/2026-10-02_alc", "yolo26n-seg.pt", "alc", note="first", root=tmp_path)
|
|
assert run["status"] == "exported" and run["id"].endswith("_alc")
|
|
assert (tmp_path / "runs" / run["id"] / "run.json").exists()
|
|
|
|
ledger.set_status(run["id"], "training", kv={"host": "spark"}, root=tmp_path)
|
|
again = ledger.load(run["id"], root=tmp_path)
|
|
assert again["status"] == "training" and again["host"] == "spark" and len(again["history"]) == 2
|
|
|
|
m = tmp_path / "m.json"
|
|
m.write_text(json.dumps({"overall": {"f1": 0.91, "mean_mask_iou": 0.8}, "gate": {"pass": True, "baseline": "b"}}))
|
|
ledger.record_metrics(run["id"], m, root=tmp_path)
|
|
ledger.set_status(run["id"], "gate_passed", root=tmp_path)
|
|
again = ledger.load(run["id"], root=tmp_path)
|
|
assert again["metrics"]["f1"] == 0.91 and again["metrics"]["gate_pass"] is True
|
|
assert (tmp_path / "runs" / run["id"] / "metrics.json").exists()
|
|
|
|
readme = ledger.render(root=tmp_path)
|
|
text = readme.read_text()
|
|
assert run["id"] in text and "gate_passed" in text and "0.910" in text
|
|
assert ledger.check(root=tmp_path) == []
|
|
assert run["id"] in ledger.table(root=tmp_path)
|
|
|
|
|
|
def test_second_run_same_day_gets_a_suffix(tmp_path):
|
|
a = ledger.new_run("dataset/x", "yolo26n-seg.pt", "alc", root=tmp_path)
|
|
b = ledger.new_run("dataset/x", "yolo26n-seg.pt", "alc", root=tmp_path)
|
|
assert b["id"] == a["id"] + "-2"
|
|
|
|
|
|
def test_unknown_state_and_check_problems(tmp_path):
|
|
run = ledger.new_run("dataset/x", "yolo26n-seg.pt", "t", root=tmp_path)
|
|
with pytest.raises(SystemExit):
|
|
ledger.set_status(run["id"], "done", root=tmp_path)
|
|
# measured without a metrics.json is a problem the CI check reports
|
|
p = tmp_path / "runs" / run["id"] / "run.json"
|
|
d = json.loads(p.read_text()); d["status"] = "measured"; p.write_text(json.dumps(d))
|
|
problems = ledger.check(root=tmp_path)
|
|
assert any("no metrics.json" in x for x in problems)
|
|
assert ledger.main(["--root", str(tmp_path), "check"]) == 1
|