Files
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

133 lines
4.7 KiB
Python

"""PLAN 332-1 — 휠 확대 방향 한 설정(`A00_Common/input_prefs.ts`) · 모든 휠 화면이 그 판정을 거침.
· 기본 = 밂(휠을 앞으로 = 확대 · 오토캐드 · 337) · 당김 저장 뒤 뒤집힘 · 깨짐 · 모르는 값 · 막힌 저장소 · Node = 기본
· 핀치(트랙패드 · 손가락)는 설정과 상관없이 늘 벌리면 확대
· 키 = 등록표 `input-prefs`(pref · global) 와 같은 글자
· 화면 옮기기 단추(588-4) = 기본 가운데 · 고른 단추 + 가운데 · 모르는 값 = 가운데 · 바꾼 키 = 글자 목록만
짝: `helper_input_prefs.cjs`(실제 TS 를 Node 로 돌림).
"""
from __future__ import annotations
import json
import os
import re
import subprocess
import pytest
HERE = os.path.dirname(__file__)
ROOT = os.path.join(HERE, "..", "..")
pytestmark = pytest.mark.skipif(
not os.path.isdir(os.path.join(ROOT, "config", "node_modules")),
reason="프론트엔드 의존성 미설치",
)
def _read(rel: str) -> str:
with open(os.path.join(ROOT, rel), encoding="utf-8") as f:
return f.read()
@pytest.fixture(scope="module")
def r() -> dict:
proc = subprocess.run( # noqa: S603 — 고정 실행 파일
["node", os.path.join(HERE, "helper_input_prefs.cjs")],
capture_output=True,
text=True,
encoding="utf-8",
timeout=60,
)
assert proc.returncode == 0, proc.stderr
return json.loads(proc.stdout)
PULL = {"pull": True, "push": False, "mouseCtrl": True, "bridgePull": True}
PUSH = {"pull": False, "push": True, "mouseCtrl": False, "bridgePull": False}
PINCH = {"padSpread": True, "padPinch": False, "fingerSpread": True}
DEFAULT = {"wheelZoom": "push", "panButton": "middle", "keys": {}, "cadAliases": {}}
def _pick(case: dict, keys: dict) -> dict:
return {k: case[k] for k in keys}
def test_Node_기본_밂(r):
n = r["node"]
assert n["default"] == DEFAULT
assert n["prefs"] == n["default"]
assert _pick(n, PULL) == PUSH and _pick(n, PINCH) == PINCH
def test_당김_저장_뒤_뒤집힘_핀치는_그대로(r):
p = r["saved"]
assert p["prefs"]["wheelZoom"] == "pull"
assert _pick(p, PULL) == PULL
assert _pick(p, PINCH) == PINCH # 벌리면 확대는 설정과 상관없음
# 별칭 = 대문자 · 글자 아닌 것 · 빈 목록 버림
assert p["prefs"]["cadAliases"] == {"LINE": ["LL"]}
@pytest.mark.parametrize("case", ["broken", "unknown", "empty", "blocked"])
def test_깨짐_모르는_값_없음_막힘_기본(r, case):
c = r[case]
assert c["prefs"] == DEFAULT
assert _pick(c, PULL) == PUSH and _pick(c, PINCH) == PINCH
def test_등록표_키(r):
assert r["node"]["key"] == r["registryKey"] == "aislo:pref:input-prefs"
assert r["registryEntry"] == {"bucket": "pref", "scope": "global"}
def test_읽기_층은_의존_없음_불러올_때_window_안_만짐():
src = _read("A00_Common/input_prefs.ts")
assert not re.search(r"^import ", src, re.M)
assert "window." not in src
# 휠 줌 자리 — 직접 박은 방향(`deltaY < 0 ?` · `deltaY > 0 ?` · `-ev.deltaY`)이 없고 공용 판정을 부름
WHEEL_SITES = {
"A00_Common/touch_bridge.ts": "wheelEventIn(e, isPinchWheel(e))",
"A00_Common/b_svg_zoom_pan.ts": "wheelEventIn(event)",
"B04_PreProcess/B04_PreProcess_UI_Camera.ts": "wheelEventIn(event)",
"M02_MasterTemplete/M02_MasterTemplete_Labor_Diagram.ts": "wheelZoomsIn(e)",
"ui_template/ui_template_loupe.ts": "wheelIn(deltaY)",
"A00_Common/spreadsheet/spreadsheet_grid.ts": "wheelZoomsIn(ev)",
# wheelZoomsIn 을 거쳐 따라오는 셋
"B04_PreProcess/B04_PreProcess_UI_MapViewer.ts": "wheelZoomsIn(event)",
"B05_Profile/B05_Profile_UI_Drainage_Interact.ts": "wheelZoomsIn(event)",
"B05_Profile/B05_Profile_UI_RouteEdit_Input.ts": "wheelZoomsIn(event)",
}
@pytest.mark.parametrize("rel", sorted(WHEEL_SITES))
def test_휠_자리_공용_판정(rel):
src = _read(rel)
assert WHEEL_SITES[rel] in src
assert not re.search(r"deltaY [<>] 0 \?", src), rel
assert "-ev.deltaY" not in src and "Math.sign(-deltaY)" not in src
def test_700줄_안():
for rel in WHEEL_SITES:
assert _read(rel).count("\n") <= 700, rel
@pytest.mark.parametrize(
("case", "button", "pan"),
[
("node", "middle", [False, True, False]),
("pan_left", "left", [True, True, False]),
("pan_right", "right", [False, True, True]),
("pan_sideways", "middle", [False, True, False]),
],
)
def test_화면_옮기기_단추_고른_것_더하기_가운데(r, case, button, pan):
c = r[case]
assert c["prefs"]["panButton"] == button
assert c["pan"] == pan
if case != "node":
assert c["prefs"]["keys"] == {"plan.delete": ["X"]} # 글자 아닌 것 · 목록 아닌 것 버림