feat(M01): 복사해서 만들기 엔진·서버 — 정본 로직을 별칭 꼴 식으로 펴고 되돌려 자체 로직으로 저장

- `scripts/master_copy.py` — `찾기()`·`로직()` 한 덩이를 별칭 이름으로 · 원문은 별칭표에 그대로
  (자르기는 `master_formula` 파서 그대로 · 완전 같은 부르기는 합침 · 인자가 갈리면 등장 차례로 번호)
- `GET /logic/formula` · `POST /logic/formula/save` — 저장은 별칭을 원문으로 되돌린 뒤 `logic/new` 재사용
- 계약 `_화면_계약.md` 7장 · 시험 `test_m01_copy.py` 8 통과(로직 1,354줄 되돌리기 전수 포함)
This commit is contained in:
2026-09-21 20:02:12 +09:00
parent b99585da59
commit c57f0ea06d
6 changed files with 545 additions and 3 deletions
+22
View File
@@ -63,6 +63,16 @@ class DeleteLogic(BaseModel):
version: str
class FormulaLogic(BaseModel):
"""복사해서 만들기 — 별칭 꼴 식이 든 로직 줄과 그 별칭표(되돌릴 원문)."""
로직: dict[str, Any]
별칭: list[dict[str, Any]] = []
owner: str = make.OWNERS[0]
이름: str = ""
본뜬키: str = ""
def _num(v):
"""Decimal → JSON 수(그냥 두면 글자로 나감)."""
if isinstance(v, Decimal):
@@ -214,3 +224,15 @@ def post_logic_edit(body: EditLogic) -> dict:
@router.post("/logic/delete")
def post_logic_delete(body: DeleteLogic) -> dict:
return _call(make.logic_delete, body.key, body.version)
@router.get("/logic/formula")
def get_logic_formula(key: str) -> dict:
"""복사해서 만들기 — 로직 한 줄을 별칭 꼴 식 묶음으로."""
return _call(make.logic_formula, key)
@router.post("/logic/formula/save")
def post_logic_formula_save(body: FormulaLogic) -> dict:
"""고친 식 묶음을 자체 로직(`GX`)으로 — 별칭은 원문으로 되돌려 저장."""
return _call(make.logic_from_formula, body.로직, body.별칭, body.owner, body.이름, body.본뜬키)
+1
View File
@@ -19,6 +19,7 @@ SCRIPTS = Path(__file__).resolve().parents[1] / "resources/master_data/scripts"
sys.path.insert(0, str(SCRIPTS))
import check_master as cm # noqa: E402
import master_copy as mcp # noqa: E402,F401 (`_Store_Make` 가 `store.mcp` 로 씀)
import master_keys as mk # noqa: E402
import master_text as mtx # noqa: E402
+34 -3
View File
@@ -1,6 +1,7 @@
"""M01 「만들기」 저장소 — 원문 절 목록 · 표 조건 값 · 자체 로직 만들기·본뜨기·고치기·지우기.
"""M01 「만들기」 저장소 — 원문 절 목록 · 표 조건 값 · 자체 로직 만들기·본뜨기·고치기·지우기
· 복사해서 만들기(정본 로직을 별칭 꼴 식으로 펴 보이고 되돌려 저장).
계약: `resources/master_data/_화면_계약.md` 2장·5장 · 파일 모양: `_틀.md` 7장.
계약: `resources/master_data/_화면_계약.md` 2장·5장·7장 · 파일 모양: `_틀.md` 7장.
자체 로직은 `로직_자체.json` 한 파일 · 키는 `_키대장.json` 의 `GX` 다음 번호(서버가 줌).
"""
@@ -12,7 +13,7 @@ from pathlib import Path
from M01_MasterData import M01_MasterData_Store as store
cm, mk = store.cm, store.mk
cm, mk, mcp = store.cm, store.mk, store.mcp
OWN = "로직_자체.json" # 자체 로직 한 자리 — 이 파일 줄만 고치고 지울 수 있음
OWNERS = ("현장", "공용")
@@ -231,6 +232,36 @@ def logic_edit(key: str, version: str, logic: dict, owner: str = "") -> dict:
return {**done, "logic": store.logic(key)["logic"]}
# ── 복사해서 만들기 ────────────────────────────────────────────────────
def logic_formula(key: str) -> dict:
"""로직 한 줄을 별칭 꼴 식 묶음으로 펴 보임 — 되돌릴 원문은 `별칭` 에 그대로(정본은 안 바뀜)."""
got = store.logic(key)
master = cm.mf.Master(cm.load(folder=store.FOLDER))
return {
"file": got["file"],
"version": got["version"],
"key": key,
"소유": got["logic"].get("소유") or "",
"prices": got["prices"],
**mcp.spread(master, got["logic"]),
}
def logic_from_formula(
logic: dict, marks: list[dict], owner: str = OWNERS[0], 이름: str = "", 본뜬키: str = ""
) -> dict:
"""고친 식 묶음을 자체 로직으로 저장 — 별칭을 원문으로 되돌린 뒤 `logic_new` 를 그대로 씀."""
try:
row = mcp.gather(logic, marks)
except cm.mf.FormulaError as e:
raise store.StoreError(400, str(e)) from e
if 이름:
row["이름"] = 이름
if 본뜬키:
row["비고"] = " · ".join(x for x in (str(row.get("비고") or ""), f"{본뜬키} 를 본뜸") if x)
return logic_new(row, owner)
def logic_delete(key: str, version: str) -> dict:
file, _ = _find(key)
_own_only(file, key)