From 2b3f2ffc889ef5c2ff162879d525e937d816557a Mon Sep 17 00:00:00 2001 From: Ethanfel Date: Sun, 21 Jun 2026 12:59:09 +0200 Subject: [PATCH] feat: pool set_label Co-Authored-By: Claude Opus 4.8 --- gates/pool.py | 8 ++++++++ tests/test_pool.py | 12 ++++++++++++ 2 files changed, 20 insertions(+) diff --git a/gates/pool.py b/gates/pool.py index e3e94e4..64bb7ff 100644 --- a/gates/pool.py +++ b/gates/pool.py @@ -103,6 +103,14 @@ def resolve_slot(manifest, index_widget): return max(0, min(idx, n - 1)) +def set_label(base_dir, pool_id, index, label): + m = read_manifest(base_dir, pool_id) + if 0 <= index < len(m["slots"]): + m["slots"][index]["label"] = str(label) + write_manifest(base_dir, pool_id, m) + return m + + def rebuild_manifest(base_dir, pool_id): # Temporary stub — replaced in Task 7. return empty_manifest() diff --git a/tests/test_pool.py b/tests/test_pool.py index 0edb908..c1539da 100644 --- a/tests/test_pool.py +++ b/tests/test_pool.py @@ -85,3 +85,15 @@ def test_resolve_slot_rules(): assert pool.resolve_slot(m, 0) == 0 # forced assert pool.resolve_slot(m, 9) == 2 # clamp high assert pool.resolve_slot({"active": 0, "slots": [], "next_seq": 1}, -1) == -1 # empty + + +def test_set_label(tmp_path): + pool.add_image(str(tmp_path), "p1", b"a", ts=1) + m = pool.set_label(str(tmp_path), "p1", 0, "front view") + assert m["slots"][0]["label"] == "front view" + + +def test_set_label_out_of_range_noop(tmp_path): + pool.add_image(str(tmp_path), "p1", b"a", ts=1) + m = pool.set_label(str(tmp_path), "p1", 5, "x") + assert m["slots"][0]["label"] == ""