Merge remote-tracking branch 'origin/dev' into main_desktop_1

# Conflicts:
#	M01_MasterData/M01_MasterData_Router.py
#	resources/master_data/_화면_계약.md
This commit is contained in:
2026-09-21 20:22:00 +09:00
8 changed files with 949 additions and 5 deletions
@@ -268,3 +268,33 @@ def logic_delete(key: str, version: str) -> dict:
if store.read(OWN)[1] != version:
raise store.StoreError(409, {"stale": [OWN]})
return _write([{"op": "delete", "key": key}])
# ── 식으로 만들기 ──────────────────────────────────────────────────────
def logic_draft(
text: str,
decided: dict | None = None,
head: dict | None = None,
save: bool = False,
owner: str = OWNERS[0],
) -> dict:
"""줄로 적은 식 → 변수 · 검사(`_화면_계약.md` 7장).
`head`(이름 · 결과단위 …)가 오면 로직 한 줄까지 미리 보이고, `save` 면 다 정해진 때만
자체 로직으로 저장(키 GX 는 서버) · 덜 정했거나 걸리면 422 로 아무것도 안 씀.
"""
import master_draft as draft # store 가 scripts 를 길에 올린 뒤라야 함
got = draft.read(text, decided)
if head is None:
return {**got, "logic": None}
row, bad = draft.옮기기(text, decided, head)
got["문제"] = got["문제"] + [x for x in bad if x not in got["문제"]]
got["다됨"] = not got["문제"]
if save and got["문제"]:
raise store.StoreError(
422, {"errors": [f"{x['줄']}줄 · {x['말']}" for x in got["문제"]], "문제": got["문제"]}
)
if not save:
return {**got, "logic": row or None}
return {**got, **logic_new(row, owner)}