"""옛 로직 사본 단위 글 새로 쓰기 — 한 번 돌리는 도구(PLAN 801-5 · 요구 663-2). M01 로직 단위 글을 건설품셈 원문 꼴(`master_unit_text`)로 바꾼 뒤, 사본 줄의 입력 · 중간 `단위` · `결과단위` 를 같은 규칙으로 바꿈(`M02_Copy_Symbols` 와 같은 길 — 금액 전후 같을 때만 씀 · 쓰기 전 `--backup` 사본 · 사본 `판` 다시 셈 · 프로젝트 층 문서는 안 건드림). ./venv/Scripts/python.exe -m M02_MasterTemplete.M02_Copy_Units # 보기만 ./venv/Scripts/python.exe -m M02_MasterTemplete.M02_Copy_Units --apply --backup tmp/801_5 """ from __future__ import annotations import json import sys from pathlib import Path from typing import Any from M02_MasterTemplete import M02_Copy_Symbols as cs from M02_MasterTemplete import M02_Sangeun_Copy as skc def fill(copy: dict, whole: Any) -> tuple[dict, int, int]: """(새 사본, 바꾼 칸 수, 0) — 줄 단위 글만 고치고 `판` 다시 셈.""" import master_unit_text as ut # M01 이 길을 둔 뒤 done, rows = 0, [] for row in copy["로직"]: new = {**row} for part in ("입력", "중간"): specs = [] for spec in row.get(part) or []: now = ut.canon(spec.get("단위")) done += now != (spec.get("단위") or "") specs.append({**spec, "단위": now} if now != (spec.get("단위") or "") else spec) if row.get(part): new[part] = specs if row.get("결과단위"): now = ut.canon(row["결과단위"]) done += now != row["결과단위"] new["결과단위"] = now rows.append(new) return {**copy, "로직": rows, "판": skc._fp(rows)}, done, 0 if __name__ == "__main__": # 브레인 지시 뒤만 --apply args = sys.argv[1:] at = Path(args[args.index("--backup") + 1]) if "--backup" in args else None rows = cs.run("--apply" in args, at, fill) for one in rows: if one["상태"] not in ("사본없음", "채울것없음", "같음"): print(json.dumps(one, ensure_ascii=False, default=str)) count: dict[str, int] = {} for one in rows: count[one["상태"]] = count.get(one["상태"], 0) + 1 print(json.dumps(count, ensure_ascii=False), "바꿈", sum(r.get("채움", 0) for r in rows))