Files
Aislo/resources/tester/test_m02_df_values_old.py
eomsangdonandClaude Opus 5.5 598b80eb26 refactor(794-1b): M01 흐름도 패널 걷음 — 로직 상세 오른쪽 = 원문만 · [신규 로직] = 빈 시트 줄 · 흐름 서버 길 · DataFlow 화면 지움
요구 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>
2026-11-05 19:38:39 +09:00

76 lines
3.7 KiB
Python

# ruff: noqa: E501
"""값 찾기(`M02_DF_Values` · 남긴 바닥) = 옛 셈과 같은 뜻 — 마스터 읽기만.
못박는 것
- 표 블록 끝 칸 「·범위규칙」 = 줄마다 경계 말(범위규칙 첫 낱말 · 「이하 포함」 이면 맨 윗줄 이상·이하)
- 재료 값이 로직 입력(자재지역 · 계약종별)을 읽음 · 빈 단가 = 알림(blank) — 셈은 계속
- 재료 조건 찾기 field 검색어 = 옛 검색어 찾기(틀의 {자리} 를 채운 글)
"""
from __future__ import annotations
import json
from M01_MasterData import M01_MasterData_Store as store
from M02_MasterTemplete.DataFlow import M02_DF_Values as dv
def _old(key: str) -> dict:
row = store.logic(key)["logic"]
given = {k: str(v) for k, v in store.cm.시험입력(row).items()}
return {"given": given, "got": store.calc(key, given), "row": row}
def test_표_범위규칙_칸() -> None:
tables = [
t
for d in store.loaded()[0].values()
if d.get("그룹") in store.cm.mf.TABLE_GROUPS
for t in d.get("표") or []
]
ranged = [t for t in tables if "범위" in (t.get("조건") or {}).values()]
for t in ranged[:40]:
got = dv._table(str(t["키"]))
head, rows = got["rows"][0], got["rows"][1:]
assert head[-1] == dv.RANGE_RULE
first = str(t.get("범위규칙") or "초과·이하").split(" · ")[0].split(" (")[0]
assert {r[-1] for r in rows} <= {first, "이상·이하"}, t["키"]
closed = [
t
for t in ranged
if str(t.get("범위규칙") or "").startswith("이상·미만")
and "이하 포함" in str(t.get("범위규칙"))
]
for t in closed[:5]: # 맨 윗줄(위 끝이 가장 큰 줄)만 이상·이하
words = [r[-1] for r in dv._table(str(t["키"]))["rows"][1:]]
assert "이상·이하" in words and "이상·미만" in words, t["키"]
plain = next(t for t in tables if "범위" not in (t.get("조건") or {}).values())
assert dv.RANGE_RULE not in dv._table(str(plain["키"]))["rows"][0]
def test_재료는_로직_입력을_읽고_빈_단가는_알림() -> None:
old = _old("GC000685") # 모래 — 「지역: 입력」 · 입력 자재지역
line = next(x for x in old["got"]["lines"] if x["이름"] == "모래")
cond = next(x["요소"] for x in old["row"]["호표"] if x["이름"] == "모래")
assert dv._material(cond, "㎥", old["given"])["value"] == line["단가"]
alone = dv._material(cond, "㎥")
assert alone["ok"] is False and alone["blank"] is True # 입력이 없으면 그 값만 비움
def test_검색어_조건_찾기는_옛_검색어_찾기() -> None:
old = _old("GF000185") # 레미콘 {굵은골재최대치수}-{강도}-{슬럼프}
item = next(
x
for x in old["row"]["호표"]
if isinstance(x["요소"], dict) and "{" in str(x["요소"].get("검색어"))
)
want = next(x for x in old["got"]["lines"] if x["이름"] == item["이름"])["단가"]
text = store.cm.mf.fill(item["요소"]["검색어"], old["given"])
slot = {"mode": "rule", "field": "검색어", "op": "같음", "unit": item["단위"],
"scope": {k: item["요소"][k] for k in ("구분", "상세구분") if item["요소"].get(k)},
"ref": json.dumps(store._dec(item["요소"]), ensure_ascii=False, default=str), "inputs": old["given"]} # fmt: skip
assert dv.slot_price(slot, text)["value"] == want
assert dv.slot_price({**slot, "ref": None}, text)["value"] == want # 묶음 없이 범위 + 검색어
assert dv._filled("레미콘 {a}-{b}-{c}", "레미콘 25-18-080") == "레미콘 25-18-080"
assert dv._filled("싱글코아바렐 {규격}", "BX") == "싱글코아바렐 BX"