From f50bf7e4943258d7f2b323cab8d55b44e4ae42a3 Mon Sep 17 00:00:00 2001 From: umsangdon Date: Mon, 21 Sep 2026 23:56:03 +0900 Subject: [PATCH] =?UTF-8?q?fix(M01):=20=EC=9D=B4=EB=A6=84=20=EA=BC=B4=20?= =?UTF-8?q?=EC=8B=9D=EC=9D=B4=20=ED=91=9C=20=EC=97=B4=EC=87=A0=20=EB=B3=84?= =?UTF-8?q?=EC=B9=AD=EC=9D=84=20=EB=B0=91=EC=9D=B4=EB=A6=84=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=ED=92=80=EC=96=B4=EC=93=B0=EB=8D=98=20=ED=9D=A0=20?= =?UTF-8?q?=EA=B3=A0=EC=B9=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 별칭 이름이 QC001882 처럼 표 열쇠 그대로면 요소 열쇠로 읽혀 밑이름 풀어쓴 글자가 나옴. 요소 테이블(LB·EQ·MT·MP·MO)만 이름으로 풀고 그 밖은 별칭 이름 그대로. 로직 전수 1,291 — 새는 줄 0 (옛 동작과 다른 로직 196) · 값 식·계 그대로 · 시험 추가(21 통과). Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj --- resources/master_data/ref/_검증_이름식.md | 5 +++++ resources/master_data/scripts/master_text.py | 5 +++++ resources/tester/test_m01_text.py | 9 +++++++++ 3 files changed, 19 insertions(+) diff --git a/resources/master_data/ref/_검증_이름식.md b/resources/master_data/ref/_검증_이름식.md index 7158999b..f3163eaf 100644 --- a/resources/master_data/ref/_검증_이름식.md +++ b/resources/master_data/ref/_검증_이름식.md @@ -24,3 +24,8 @@ ## 뺀 것 — 검증 도구 자체의 오탐(제품 결함 아님) GC000996 짝=6·7 — 별칭 값칸 이름이 「그라우팅 믹서(190×2ℓ)」처럼 **띄어쓰기가 든 값칸 키**라, 이번 검증 스크립트가 공백으로 토큰을 가르다 오탐(값칸 이름 자체는 별칭 목록의 실제 값칸과 그대로 같음 — 실제 어긋남 아님, 목록에서 뺌). + +## 고친 뒤 (2026-09-21) + +원인 — 별칭 이름이 표 열쇠 그대로(`QC001882`)면 식 읽기가 그것을 「요소 열쇠」 로 읽어 이름을 밑이름 풀어쓴 글자로 바꿈. `master_text._elem_name` 이 요소 테이블(LB·EQ·MT·MP·MO)만 이름으로 풀고 그 밖 열쇠(QC·QF…)는 별칭 이름 그대로 두게 고침. +로직 전수 1,291 — 이름 식에 별칭 목록 밖 열쇠·풀어쓴 밑이름이 새는 줄 **0**. 이전 동작과 비교하면 이름 식이 달라지는 로직은 **196**(표본 2건이 아니라 같은 꼴 196). 값 식·계는 그대로. 시험 `test_m01_text.py` 에 GC001008 추가(21 통과). diff --git a/resources/master_data/scripts/master_text.py b/resources/master_data/scripts/master_text.py index cfdf7203..f234e6c2 100644 --- a/resources/master_data/scripts/master_text.py +++ b/resources/master_data/scripts/master_text.py @@ -19,6 +19,7 @@ import master_formula as mf PLACES = Decimal("0.0001") # 화면 `formatNumber` 와 같음(소수 넷째 자리까지) PRICE_TAIL = {"인력": "노임", "기계": "손료"} # 단가 자리의 이름 꼬리(그 밖은 「단가」) +ELEM_KEYS = ("LB", "EQ", "MT", "MP", "MO") # 요소 테이블 — 그 밖의 열쇠(QC · QF …)는 별칭 이름 ELEM_TAIL = {"LB": "노임", "EQ": "손료"} # 식 안 요소 키의 이름 꼬리(그 밖은 「단가」) _PREC = {"또는": 1, "그리고": 2, "==": 3, "!=": 3, "<": 3, "<=": 3, ">": 3, ">=": 3} _PREC |= {"+": 4, "-": 4, "*": 5, "/": 5} @@ -86,6 +87,10 @@ def named(show, real, env: dict, master, depth: int = 0) -> str: def _elem_name(master, ref: str) -> str: """식 안 요소 한 줄의 이름 — 「석공노임」 꼴(같은 이름의 중간 값과 헷갈리지 않게).""" + if ( + str(ref)[:2] not in ELEM_KEYS + ): # 별칭 이름이 표 열쇠 그대로인 것(QC…) — 밑이름을 풀어쓰지 않음 + return ref try: name = mc.plain(master.get(ref).get("이름")) except mf.FormulaError: diff --git a/resources/tester/test_m01_text.py b/resources/tester/test_m01_text.py index 22479b75..4ff426c0 100644 --- a/resources/tester/test_m01_text.py +++ b/resources/tester/test_m01_text.py @@ -151,3 +151,12 @@ def test_끝수는_줄이_아니라_소계에_붙는다(client: TestClient) -> N assert group["끝수"] == "원 미만 버림" assert Decimal(str(group["소계"])) == Decimal(str(group["소계"])).to_integral_value() assert not any("버림" in one["글"] for one in group["줄"]) + + +def test_이름_꼴_찾기_별칭이_표_열쇠_그대로면_밑이름으로_풀지_않는다(client: TestClient) -> None: + """GC001008 덧줄 — 별칭 이름이 QC001882 뿐이라 이름 식도 별칭 목록의 그 이름을 씀.""" + got, _ = _both(client, "GC001008") + extra = next(one for one in _all_lines(got) if one["이름"].startswith("공구손료")) + assert "QC001882.요율 %" in extra["이름글"] + assert "잔디깎기공구손료" not in extra["이름글"] + assert any(one["이름"] == "QC001882" for one in got["별칭"])