Files
Aislo/common_util/common_util_sheet_recalc.py
T

41 lines
1.7 KiB
Python

"""표 문서(마스터 템플릿 표 양식) 서버 재계산 — 화면과 같은 TS 를 Node 로 돌리는 껍데기.
CLAUDE.md 5장 ② — 계산은 `ui_template/sheet/ui_template_sheet_recalc.ts` 한 벌.
여기는 번들을 부르기만 함(`npm run build:formula` → `config/formula_node/`).
[저장] 때 브라우저 값을 받아 적지 않고 이 결과를 정본으로 씀.
결과 = `{계산: {줄: {열: 값}}, 합계: {합계줄: {열: 값}}, 오류: [{줄, 열, 까닭}]}` · 값은 십진 글.
"""
from __future__ import annotations
from typing import Any
from common_util.common_util_node_bundle import ROOT, build_bundle, run_bundle_json
BUNDLE = ROOT / "config" / "formula_node" / "common_util_sheet_recalc_node.js"
NPM_SCRIPT = "build:formula"
SOURCE_DIR = ROOT / "ui_template" / "sheet"
ENTRY = ROOT / "common_util" / "common_util_sheet_recalc_node.ts"
def _stale() -> bool:
"""번들이 없거나 표 TS 원본보다 오래됐으면 참 — 낡으면 화면과 서버가 다른 값을 냄."""
if not BUNDLE.is_file():
return True
built_at = BUNDLE.stat().st_mtime
return any(p.stat().st_mtime > built_at for p in [ENTRY, *SOURCE_DIR.glob("*.ts")])
def recalc_sheets(docs: list[dict[str, Any]]) -> list[dict[str, Any]] | None:
"""표 문서 여럿을 한 번에 — 입력 차례 그대로 결과. 번들 빌드·실행 실패는 None."""
if _stale() and not build_bundle(NPM_SCRIPT):
return None
out = run_bundle_json(BUNDLE, NPM_SCRIPT, {"docs": docs})
return None if out is None else out["results"]
def recalc_sheet(doc: dict[str, Any]) -> dict[str, Any] | None:
results = recalc_sheets([doc])
return None if results is None else results[0]