feat(pose_3d): named poses GET/PUT/DELETE

Adds CRUD for named wrist poses persisted in config.yaml under
pose_3d.named_poses. PUT validates the name against ^[A-Za-z0-9_-]{1,40}$
and normalizes the quaternion. DELETE returns 404 if the pose is missing.

Bypasses update_config's deep-merge for wholesale named_poses replacement
(deep-merge cannot remove nested keys) via a small helper that mutates
the in-memory singleton then persists with an empty patch.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Adriano Dal PastroandClaude Opus 4.7 committed 2026-05-21 15:39:37 +02:00
1 parent df949c6989
commit fb05409403
2 files changed
+110 -1

No files matched your search

+43
View File
@@ -117,3 +117,46 @@ def test_apply_normalizes_quaternion_before_forwarding():
q = captured["quaternion"]
norm = sum(x*x for x in q) ** 0.5
assert abs(norm - 1.0) < 1e-6
def test_put_pose_persists_in_config():
payload = {
"side": "right",
"position": [0.30, -0.20, 0.30],
"quaternion": [0, 0, 0, 1],
"note": "test pose",
}
r = client.put("/api/pose_3d/poses/test1", json=payload)
assert r.status_code == 200
body = r.json()
assert body["pose"]["side"] == "right"
assert body["pose"]["note"] == "test pose"
# Verifica che sia anche in GET /poses
r2 = client.get("/api/pose_3d/poses")
assert "test1" in r2.json()
def test_put_pose_422_bad_name():
r = client.put("/api/pose_3d/poses/with spaces!", json={
"side": "right", "position": [0,0,0], "quaternion": [0,0,0,1],
})
assert r.status_code == 422
assert "name" in r.json()["detail"].lower()
def test_delete_pose_removes_it():
# prima salva
client.put("/api/pose_3d/poses/todelete", json={
"side": "left", "position": [0,0,0], "quaternion": [0,0,0,1],
})
# poi cancella
r = client.delete("/api/pose_3d/poses/todelete")
assert r.status_code == 200
# verifica non presente
r2 = client.get("/api/pose_3d/poses")
assert "todelete" not in r2.json()
def test_delete_pose_404_when_missing():
r = client.delete("/api/pose_3d/poses/nonexistent")
assert r.status_code == 404