- 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>
64 lines
3.4 KiB
Python
64 lines
3.4 KiB
Python
"""M02 불러오기 엑셀 보기 하이라이트 재료(PLAN 779-2 · 요구서 621 3장 5) — 읽기만(파일 · storage 변화 0).
|
|
|
|
블록 `[{번, 판정, SK, 갈래, 못옮김}]` = 단가산출 만들기 결과(`Sangeun.made`) + 맞춤셈 캐시(`Fit.result`)를 읽기만.
|
|
- `판정` = 그 블록을 부르는 첫 줄의 맞춤셈 판정 상태(맞음 · 다른 점 · 후보 …) · 안 불리거나 셈 전이면 None
|
|
- `SK` = 만든 SK 키 · 없으면 None / `갈래` · `못옮김` = 그 SK 본뜬(출처별) · 없으면 None · []
|
|
줄 상태는 `Match.view` 호표마다 `줄상태 [[차례, 상태, 체크]]` · `만든`(SC 키)로 실려 감.
|
|
|
|
칠 꼴(화면 779-4 가 정함 · 상태 이름 맞춤표 — 「이어짐」 = 확인 창과 한 규칙 `체크`):
|
|
| 칠 | 줄 상태 (`줄상태`) | 블록 (`판정` · `SK` · `못옮김`) |
|
|
| 초록 이어짐 | 맞음 · 별칭 · 호표(`체크`) · 체크한 다른 점 | SK 있음 + 못옮김 [] (갈래 「기초」 포함) |
|
|
| 주황 엑셀과 다름 | 다른 점 + `체크` | SK 있음 + 갈래 「SK」(차이) |
|
|
| 파랑 고를 것 | 후보 · `체크` 아닌 다른 점 · 호표(`체크` 아님) | SK 없음 + 판정 후보 · 고름 대기 |
|
|
| 빨강 못 이음 | 없음 · 노임 · (안 이은 줄 = 마법사 몫) | SK 있음 + 못옮김 남음 |
|
|
| 흐림 밖 | % · 뺌 | 판정 None (안 불리는 블록) |
|
|
| 띠 내가 고름 | 화면 캐시(서버 아님) | — |
|
|
최종 판정은 화면(`SheetMap`)이 이 재료 + 캐시 고름으로 내림 — 여기는 상태 이름을 그대로 실음.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
from M02_MasterTemplete import M02_Hopyo_Fit as fit
|
|
from M02_MasterTemplete import M02_Hopyo_Sangeun as sangeun
|
|
from M02_MasterTemplete import M02_Hopyo_Store as hopyo_store
|
|
from M02_MasterTemplete import M02_Labor_Ref as refs
|
|
|
|
|
|
def _origin(to: Path, sk: str, mark: str, here: refs.Here) -> dict[str, Any]:
|
|
try:
|
|
doc = json.loads((to / sangeun.KIND / f"{sk}.json").read_bytes())
|
|
except (OSError, ValueError):
|
|
return {}
|
|
return sangeun.origin_of(doc, mark, here)
|
|
|
|
|
|
def blocks(folder: Path, key: str, to: Path | None = None) -> list[dict[str, Any]]:
|
|
"""블록마다 `{번, 판정, SK, 갈래, 못옮김}` — `to` = 만든 SK 를 볼 층(없으면 파일 층)."""
|
|
folder, to = Path(folder), Path(to or folder)
|
|
hp = hopyo_store.read(folder, key)
|
|
here = refs.where(folder)
|
|
cache = (fit.result(folder, key) or {}).get("블록") or {}
|
|
have = sangeun.made(to, key, here)
|
|
all_, first = sangeun.calls(hp)
|
|
out = []
|
|
for no in sorted(all_):
|
|
line = first.get(no)
|
|
entry = cache.get(fit.unit_key(line)) if line else None
|
|
mark = sangeun.mark(key, no)
|
|
sk = have.get(mark)
|
|
origin = _origin(to, sk, mark, here) if sk else {}
|
|
out.append(
|
|
{
|
|
"번": no,
|
|
"판정": ((entry or {}).get("판정") or {}).get("상태"),
|
|
"SK": sk,
|
|
"갈래": origin.get("갈래"),
|
|
"못옮김": origin.get("못옮김") or [],
|
|
}
|
|
)
|
|
return out
|