요구 651 · 653 — 계산 공식 참고용 흐름도(① M01 로직 상세 오른쪽 접는 패널)를 걷음. ② M02 일위대가 다이어그램은 그대로.
지움(64 파일 · 18,666 줄 · 되돌릴 길 = git 이력)
- M01 6 파일 1,064 줄 — Store_Flow.py · UI_LogicLab_Flow.ts/.css · FlowRows.ts · FlowView.ts/.css
- M02_MasterTemplete/DataFlow 43 파일 12,799 줄 — 흐름도 화면 · 셈(Compute · Convert · Lookup · Model · Eval …)
- 시험 15 파일 4,803 줄 — test_m01_logic_flow{view,_engine,_project,_save} · test_m02_df_*(값 찾기 values_old 뺌) — 지운 흐름 코드만 지키던 것
남김(바닥) — DataFlow M02_DF_UnitPick(일위대가 셋) · M02_DF_Values(M02_Item_Prices) · M02_DF_Round · _standard 표 ·
M02_DF_Router = GET /api/m02/df/standards 하나 · M02_DF_Api = cfStandards 하나 · CfRound 꼴은 Round 안으로
고침
- M01 Router — /save = Store_Make.save(개정 확인 · 자체 파일 새 줄 GX · added 그대로) · /calc /text /logic/auto = 옛 셈만 · /logic/flow 둘 지움
- master_formula — 흐름 훅 지움 · 줄에 「흐름」 이 남으면 「흐름도 로직은 걷음」 까닭 오류(저장된 흐름 로직 0 — 마스터 · storage 다시 확인)
- Sangeun_Calc._defaults = 옛 자동값 · M02_Logic_Lib_Read /logic/flow 지움 · main.py 주석
- 화면 — LogicLab(startFlow · scheduleFlow · 예시값 잇기 지움 · [신규 로직] 줄 = 입력 · 중간 · 호표 빈 목록 + 끝수 null) ·
Side(원문 패널 하나) · Source(머리 칸 이름 m01lab-src__top/__title · DF_Panel.css 안 씀) · Detail · View(nowInputs 지움) · Sheet(흐름 갈래 지움) · 글
- 시험 — 지운 파일을 가리키던 목록 넷(spreadsheet_size · 208_1 · 588 · input_prefs) · 717_1 흐름 길 두 줄 · values_old 흐름 셈 부분 지움
- test_713_3_list 기대 — 로직 1,461 → 1,515 · 묶음 307 → 335 · 작업량 21 → 65 · 부르는 506 → 512(782-1 · 2 · 3 건설 기초 로직 54 더함 ·
옛 키만 세면 307 · 21 · 506 그대로)
- 새 지킴 test_794_1b_flow_gone — 흐름 길 404 · 표준 표 남음 · 신규 로직 자체 GX · 흐름 남은 줄 까닭 오류
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
71 lines
2.7 KiB
Python
71 lines
2.7 KiB
Python
"""794-1b — M01 흐름도 걷음 뒤 지킴(마스터 사본 폴더 · 정본 안 바뀜).
|
|
|
|
못박는 것
|
|
- 흐름 길(`/api/m01/logic/flow` · `/api/m02/df/values` …) 없음 · 남긴 바닥 `GET /api/m02/df/standards` 는 그대로
|
|
- [신규 로직] = 흐름 없는 빈 시트 줄 → `/save` 가 자체 파일 GX 새 키 · 구분 자체 · 셈은 옛 셈
|
|
- 줄에 「흐름」 이 남아 있으면 엔진이 까닭 글로 막음(조용히 틀린 값 안 냄)
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import shutil
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
from fastapi import FastAPI
|
|
from fastapi.testclient import TestClient
|
|
|
|
from M01_MasterData import M01_MasterData_Router as m01_router
|
|
from M01_MasterData import M01_MasterData_Store as store
|
|
from M02_MasterTemplete.DataFlow import M02_DF_Router as df
|
|
|
|
REAL = store.FOLDER
|
|
OWN = "로직_자체.json"
|
|
|
|
|
|
@pytest.fixture
|
|
def client(tmp_path: Path, monkeypatch) -> TestClient:
|
|
master = tmp_path / "master"
|
|
master.mkdir()
|
|
for path in REAL.glob("*.json"):
|
|
shutil.copy(path, master / path.name)
|
|
monkeypatch.setattr(store, "FOLDER", master)
|
|
app = FastAPI()
|
|
app.include_router(m01_router.router)
|
|
app.include_router(df.router)
|
|
return TestClient(app)
|
|
|
|
|
|
def test_흐름_길은_없고_표준_표는_남음(client: TestClient) -> None:
|
|
assert client.get("/api/m01/logic/flow", params={"key": "GF000219"}).status_code == 404
|
|
assert client.post("/api/m02/df/values", json={"items": []}).status_code == 404
|
|
got = client.get("/api/m02/df/standards").json()
|
|
assert got["unit"]["줄"] and got["money"]["줄"]
|
|
|
|
|
|
def test_신규_로직은_시트_줄로_자체_GX(client: TestClient) -> None:
|
|
version = store.read(OWN)[1] if (store.FOLDER / OWN).is_file() else ""
|
|
row = {
|
|
"키": "",
|
|
"이름": "sub3임시 새 로직",
|
|
"결과단위": "원/㎡",
|
|
"출처": "자체",
|
|
"입력": [],
|
|
"중간": [],
|
|
"호표": [],
|
|
"끝수": None,
|
|
}
|
|
part = {"file": OWN, "version": version, "changes": [{"op": "add", "row": row}]}
|
|
res = client.post("/api/m01/save", json={"files": [part]})
|
|
assert res.status_code == 200, res.text
|
|
added = res.json()["added"]
|
|
assert len(added) == 1 and added[0]["key"].startswith("GX")
|
|
saved = client.get("/api/m01/logic", params={"key": added[0]["key"]}).json()["logic"]
|
|
assert saved["구분"] == "자체" and saved["이름"] == "sub3임시 새 로직" and "흐름" not in saved
|
|
|
|
|
|
def test_흐름이_남은_줄은_까닭으로_막음() -> None:
|
|
mf = store.cm.mf
|
|
with pytest.raises(mf.FormulaError, match="흐름도 로직은 걷음"):
|
|
mf.inputs_of({"흐름": {"boxes": [], "links": []}})
|