fix(M01): 이름 꼴 식이 표 열쇠 별칭을 밑이름으로 풀어쓰던 흠 고침
별칭 이름이 QC001882 처럼 표 열쇠 그대로면 요소 열쇠로 읽혀 밑이름 풀어쓴 글자가 나옴. 요소 테이블(LB·EQ·MT·MP·MO)만 이름으로 풀고 그 밖은 별칭 이름 그대로. 로직 전수 1,291 — 새는 줄 0 (옛 동작과 다른 로직 196) · 값 식·계 그대로 · 시험 추가(21 통과). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JgUhN55Z3BCYhUJTjwTNfj
This commit is contained in:
@@ -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 통과).
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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["별칭"])
|
||||
|
||||
Reference in New Issue
Block a user