"""713-4 지킴 — 정본 로직 원문 대조 정리(내역 15) 뒤 꼴. 조종원 = 하루 노임 × 1/8(질의회신 상여 · 휴지계수 없음) · 지운 키(쪼갠 로직 · 쪽 표 · 터파기 작업량)를 쓰는 곳 0 · 방제 8-3 열 여덟 모두 로직 · 플랜트 13-1-1 표 하나. """ from __future__ import annotations import json import re import sys from pathlib import Path ROOT = Path(__file__).resolve().parents[2] sys.path.insert(0, str(ROOT / "resources/master_data/scripts")) import check_master as cm # noqa: E402 GONE = [ *("GF000100", "GF000102", "GF000104", "GF000106", "GF000108", "GF000110"), *("GC000872", "GC000873", "GC000874", "GC000875", "GF000216", "GF000217"), *("QC001609", "QC001610", "QC001611", "QC001612"), ] MACHINE = ( "GC000267", "GC000268", "GC000269", "GC000270", "GC000271", "GC000275", "GC000276", "GF000145", ) def _rows(files): return { str(r["키"]): r for d in files.values() for r in (d.get("줄") or []) + (d.get("표") or []) } def _bare(v): """비고 글(옛 키를 적어 둔 내력)은 뺌 — 식 · 요소 · 용도만 봄.""" if isinstance(v, dict): return {k: _bare(x) for k, x in v.items() if k != "비고"} if isinstance(v, list): return [_bare(x) for x in v] return v def test_지운_키는_어디에도_없음() -> None: pattern = re.compile("|".join(GONE)) for name, data in cm.load().items(): # 대장(`_키대장.json`)은 준 키를 지님(키 불변) · 안 읽음 assert not pattern.search(json.dumps(_bare(data), ensure_ascii=False, default=str)), name for path in (ROOT / "resources/master_template").rglob("*.json"): assert not pattern.search(path.read_text(encoding="utf-8", errors="ignore")), path.name def test_조종원_시간환산_본문대로() -> None: rows = _rows(cm.load()) for key in MACHINE: text = str(rows[key]["중간"]) assert "상여계수" not in text and "휴지계수" not in text, key def test_방제_열_여덟_플랜트_한_표() -> None: files = cm.load() rows = _rows(files) assert len(rows["QF000229"]["용도"]["로직키"]) == 8 # 8-3 원문 열 여덟 pipe = rows["QC001608"]["줄"] assert {r["구분"] for r in pipe} == { "배관용 탄소강관 KSD3507", "압력배관용 탄소강관 KSD3562 SCH#40", } whole = cm.mf.Master(files) passed, stuck = cm.calc_all(files, whole) assert not stuck and passed == sum( 1 for d in files.values() if d.get("그룹") == "로직" for _ in d["줄"] )