feat(779-2): 불러오기 엑셀 하이라이트 재료 — 목록 호표마다 줄상태 · 만든 SC 키 + 새 hopyo-marks 길(블록 판정 · SK · 갈래 · 못옮김, 읽기만)
- Match.view 목록: 호표마다 줄상태 [[차례, 상태, 체크]] · 만든 (이미 센 줄 상태 실음 · 덧 셈 0)
- 새 M02_Hopyo_Marks.py: 블록 [{번, 판정, SK, 갈래, 못옮김}] = Sangeun.made + Fit.result 읽기만 · 머리에 칠 꼴 대응표
- Router: GET /layers/{layer}/hopyo-marks/{key} (파일 끝에 한 덩이)
- 시험: test_779_2_hopyo_marks (줄상태 수 = 줄 수 · 읽기만 = 파일 변화 0 · 판정 = 캐시)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
"""779-2 불러오기 엑셀 하이라이트 재료 — 목록 `줄상태` 수 = 줄 수 · 상태 = 확인 창 상태 ·
|
||||
`hopyo-marks` 길 읽기만(층 폴더 파일 변화 0) · 블록 판정 = 맞춤셈 캐시 · SK = 만든 것."""
|
||||
|
||||
import hashlib
|
||||
|
||||
from M02_MasterTemplete import M02_Hopyo_Fit as fit
|
||||
from M02_MasterTemplete import M02_Hopyo_Sangeun as sangeun
|
||||
from M02_MasterTemplete import M02_Template_Layers as layers
|
||||
from resources.tester.test_m02_hopyo_excel import NORTH, URL, _post, client # noqa: F401
|
||||
|
||||
# ruff: noqa: F811
|
||||
KEY = "HP-000001"
|
||||
|
||||
|
||||
def _tree(root) -> dict[str, str]:
|
||||
return {
|
||||
str(p.relative_to(root)): hashlib.sha256(p.read_bytes()).hexdigest()
|
||||
for p in sorted(root.rglob("*"))
|
||||
if p.is_file()
|
||||
}
|
||||
|
||||
|
||||
def _ready(client):
|
||||
res = _post(client, data=NORTH.read_bytes(), name=NORTH.name)
|
||||
assert res.status_code == 200 and res.json()["키"] == KEY
|
||||
folder = layers.personal_dir(7, 42)
|
||||
fit.run_job(folder, KEY)
|
||||
return folder
|
||||
|
||||
|
||||
def test_줄상태_수_줄_수_확인창_같음(client):
|
||||
_ready(client)
|
||||
base = URL.format("personal")
|
||||
whole = client.get(f"{base}/{KEY}").json()
|
||||
assert whole["호표"]
|
||||
diff = {}
|
||||
for h in whole["호표"]:
|
||||
one = client.get(f"{base}/{KEY}/{h['번']}").json()["호표"]
|
||||
assert len(h["줄상태"]) == len(one["줄"]) == h["맞춤"][1], h["번"]
|
||||
for (i, state, check), line in zip(h["줄상태"], one["줄"]):
|
||||
full = line["맞춤"]["상태"]
|
||||
if state != full:
|
||||
diff[(state, full)] = diff.get((state, full), 0) + 1
|
||||
assert check == line["맞춤"]["체크"]
|
||||
assert h["만든"] is None # 확인된 사전조합 전
|
||||
assert [x[0] for x in h["줄상태"]] == list(range(len(h["줄상태"])))
|
||||
# 목록 = 줄 맞춤 `full=False`(덧 셈 0) — 이름 후보 안 찾은 줄(없음)은 「후보」로 옴
|
||||
assert set(diff) <= {("후보", "없음")}, diff
|
||||
|
||||
|
||||
def test_marks_읽기만_판정_캐시_같음_SK(client):
|
||||
folder = _ready(client)
|
||||
base = URL.format("personal")
|
||||
before = _tree(folder)
|
||||
got = client.get(f"{base}-marks/{KEY}")
|
||||
assert got.status_code == 200, got.text
|
||||
rows = got.json()["블록"]
|
||||
assert _tree(folder) == before # 읽기만 — 파일 변화 0
|
||||
cache = fit.result(folder, KEY)["블록"]
|
||||
hp = client.get(f"{base}-grid/{KEY}") # 길 살아 있음(블록 수는 파일에서)
|
||||
assert hp.status_code == 200
|
||||
assert rows and [r["번"] for r in rows] == sorted(r["번"] for r in rows)
|
||||
judged = [r for r in rows if r["판정"]]
|
||||
assert judged and all(r["판정"] in ("맞음", "다른 점", "후보", "없음") for r in judged)
|
||||
assert {r["판정"] for r in judged} <= {e["판정"]["상태"] for e in cache.values()}
|
||||
assert all(r["SK"] is None and r["갈래"] is None and r["못옮김"] == [] for r in rows)
|
||||
# [단가산출 만들기] 뒤 = SK · 갈래 · 못옮김 실림
|
||||
made = client.post(f"{base}/{KEY}/sangeun")
|
||||
assert made.status_code == 200, made.text
|
||||
after = {r["번"]: r for r in client.get(f"{base}-marks/{KEY}").json()["블록"]}
|
||||
for one in made.json()["만듦"]:
|
||||
row = after[one["번"]]
|
||||
assert (row["SK"], row["갈래"], row["못옮김"]) == (one["키"], one["갈래"], one["못옮김"])
|
||||
assert sangeun.made(folder, KEY)
|
||||
snap = _tree(folder)
|
||||
client.get(f"{base}-marks/{KEY}")
|
||||
assert _tree(folder) == snap
|
||||
assert client.get(f"{base}-marks/HP-999999").status_code in (404, 400)
|
||||
Reference in New Issue
Block a user