fix(ui): 화면 글 「손입력 · 손 입력 · 손 줄」 → 「수기 입력 · 수기 줄」 전역(171-1)

- 화면 글 10 자리(8 파일) — 세월교 힌트 · B08 재료 엑셀 알림 · B09 내역 수기 줄 까닭(거울 둘) · 산근 쓰는 곳 · 단가 힌트 · 총괄 수기 입력 칸 · 로케일 둘
- 저장 키 · 주석 · 손료는 그대로 · 로케일 줄 수 그대로
- 걸린 시험 셋 글 맞춤 · 새 시험 test_171_1

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015KYZ2HWWdUwZWYnn3tQz7X
This commit is contained in:
2026-10-10 08:34:28 +09:00
co-authored by Claude Opus 5.5
parent 1f1646781f
commit ac1961c0a3
12 changed files with 71 additions and 13 deletions
@@ -41,7 +41,7 @@ def test_엑셀_검산_시멘트_모래_자갈_레미콘():
def test_엑셀_손값과_다른_상수는_알림만():
ui = (ROOT / "B08_Quantity" / "B08_Quantity_UI_Material.ts").read_text(encoding="utf-8")
assert "2공구 엑셀 손값과 다름" in ui and "b08MaterialExcel" in ui
assert "2공구 엑셀 수기 입력값과 다름" in ui and "b08MaterialExcel" in ui
# 기본 배합은 품셈 근거 그대로(124)
per = {r["key"]: r["per"] for r in compute(SUMMARY, clean_overrides({}))["concrete"]["rows"]}
assert per["c40"] == {"cement": 323, "sand": 0.456, "gravel": 0.612}
+1 -1
View File
@@ -177,7 +177,7 @@ def test_새_산근_사본_뒤_번호_호표_탭_집계표(tmp_path):
base = compute_base(prices.build_inputs(None, keys), {})
got = sg.collect([("s1", a)], base, sg.hand_sources(user))
listed = [(r["no"], r["logic"], r["uses"]) for r in got["sg_list"]]
assert listed == [(1, NET, ["s1", "손 줄 새 산근"]), (2, STONE, ["손 줄 메쌓기"])]
assert listed == [(1, NET, ["s1", "수기 줄 새 산근"]), (2, STONE, ["수기 줄 메쌓기"])]
assert got["sg_hand"] == {
"hand:c": got["sg_list"][1]["key"],
"hand:d": got["sg_list"][0]["key"],
@@ -0,0 +1,52 @@
"""171-1 「손입력 · 손 입력 · 손 줄」 → 「수기 입력 · 수기 줄」 화면 글 — 소스 시험.
화면 글(따옴표 안)만 바꿈 · 저장 키(`{손: 수}` · 수량출처 「손」 · 표 `손` 깃) · 주석 · 손료는 그대로.
"""
import re
from pathlib import Path
ROOT = Path(__file__).resolve().parents[2]
SPOTS = {
"A00_Common/design/design_structure_ford_calc.ts": ["설계유량 없음 — 수기 입력"],
"B08_Quantity/B08_Quantity_UI_Material.ts": ["2공구 엑셀 수기 입력값과 다름"],
"B09_Estimation/B09_Estimation_Calc_Bill.ts": ['"수기 줄 — 연결 없음(우클릭 [연결])"'],
"B09_Estimation/B09_Estimation_Calc_Bill.py": ['"수기 줄 — 연결 없음(우클릭 [연결])"'],
"B09_Estimation/B09_Estimation_Sangeun.py": ['f"수기 줄 {'],
"B09_Estimation/B09_Estimation_UI_Tabs_Base.ts": ["견적 단가 · 면 = 수기 입력"],
"B09_Estimation/B09_Estimation_UI_Tabs_Total.ts": ['"수기 입력"', '"수기 입력 = 안전관리비'],
"ui_template/ui_template_locale_b2.ts": [
"수량 원천: 수기 입력(직접비)",
"수량 원천: 수기 입력 공종",
],
}
# 따옴표 안 화면 글에 남은 옛 이름(주석 · 문서 글 빼고)
OLD = re.compile(r"[\"'`][^\"'`\n]*(손 ?입력|손 줄|손값)")
NOTE = re.compile(r'"""[\s\S]*?"""|/\*[\s\S]*?\*/|^\s*(//|#).*$', re.M)
def _text(rel: str) -> str:
return (ROOT / rel).read_text(encoding="utf-8")
def test_새_이름_자리():
for rel, wants in SPOTS.items():
src = _text(rel)
for w in wants:
assert w in src, f"{rel}: {w}"
def test_화면_글에_옛_이름_없음():
for rel in SPOTS:
for line in NOTE.sub("", _text(rel)).splitlines():
assert not OLD.search(line), f"{rel}: {line.strip()}"
def test_저장_키는_그대로():
calc = _text("M02_MasterTemplete/M02_MasterTemplete_Labor_Calc.ts")
assert 'export type QtySource = "손" | "칸" | "없음";' in calc
assert "export type Qty = { 손: number } | null;" in calc
assert "손?: boolean;" in _text("ui_template/sheet/ui_template_sheet_types.ts")
assert "rows[] 손 줄" in _text("B09_Estimation/B09_Estimation_Calc_Bill.ts") # 주석 그대로
@@ -100,7 +100,11 @@ def test_월류_높이는_폭과_연동_필요_수심_올림(out):
row = [h for q, b, h in out["table"] if q == 2.54]
assert row == sorted(row, reverse=True) and len(set(row)) == len(row)
assert out["none"] == [None, None] # 설계유량 · 폭이 없으면 손 입력
assert out["hints"] == ["필요 수심 0.08 이상", "월류 폭을 넣으면 셈", "설계유량 없음 — 손 입력"]
assert out["hints"] == [
"필요 수심 0.08 이상",
"월류 폭을 넣으면 셈",
"설계유량 없음 — 수기 입력",
]
def test_정의_파일에_세월교_이름_표가_올라_있음():