**① 기계 원천 벌 다시 뽑음**(`_build_mach.py`) — 랩탑 서브가 8장 md 를 크게 고친 뒤 · 연료 **214 → 274**(새 기계 60) · 손료 611 · 가격 613 — 값 바뀐 줄 가격 122 · 손료 122 · 연료 35 · 규격 세 줄짜리 표의 셋째 줄(출력 ㎾)이 되살아남 — 9070-0020 도 규격이 빈칸에서 「80ton대선 8ton달기」로 · ⭐ **금액 안 움직임** — 직접공사비 5,983,724 통과 ⬜ 남은 구멍 — 손료표 9020~9090 여덟 덩어리에서 코드를 못 읽음(`parse_audit`) · 연료 코드 수 272↔274 · 3108-0040 연료 갈래(중유↔경유). 장부에 주인(랩탑 메인)과 함께 적어 둠 **② 품셈 원천 벌도 다시 뽑음**(`_build_pum.py`) — 건설 표 둘 바뀜·둘 새로·둘 빠짐 **③ 「인」 밑수 셋 바로잡음**(안티그래비티 PDF 대조 · 브레인 판정) · F0046·F0068 — 비고의 「1인당」을 파서가 밑수로 읽고 있었음. **비워 둠**(사람 판정) · 미확보 목록에 「**원문 부재** — 사람 판정: …」 사유를 달아 다음 바퀴에 또 안 세어지게 함 ⭐ 「인은 밑수가 아니다」 2026-09-09 판정이 **넓게 옳았음** — 「숫자가 붙었을 때만 인정」이라는 예외(2-2-5 천공기)까지 물러남. 그 시험도 뒤집고 까닭을 적음 · F0076 — 목적물 1km 는 **정당한 밑수**였음(반쪽 아님). 뜻이 뒤집혀 있던 `productivity` 를 `requirement` 로 고침(값은 소요인력) ⇒ 사용자 판단이 **8 → 5** 로 줄어듦(남은 다섯: 부록 14-2 표 셋 · F0405 증가율표 성격 · 이형철근 범위) 밑수 확보 251 → 249 · 미확보 80 = 원문 부재 70 + 미판독 10 · 지문·이름표·시험 갱신 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QsGw1Dz9HmhuAxGisxmDPF
62 lines
2.3 KiB
Python
62 lines
2.3 KiB
Python
"""기계 카탈로그 이름 — 원천 파싱 병(쪽 끝 이름에 다음 쪽 머리글이 붙고 다음 분류 이름이 빔) 되살림.
|
|
|
|
2026-09-14 축 C 1장 ① (브레인 차례) · 원문 = 건설공사 표준품셈 제8장 기종 목록 줄.
|
|
① 표 머리글(「시 간 당」·「(10-7)」)이 붙은 이름이 하나도 없음
|
|
② 빈 이름이 하나도 없음
|
|
③ 되살린 이름·규격이 원문 차례와 같음 · 취득가는 원천 그대로
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
import sys
|
|
from decimal import Decimal
|
|
from pathlib import Path
|
|
|
|
ROOT = Path(__file__).resolve().parents[2]
|
|
sys.path.insert(0, str(ROOT))
|
|
|
|
from B09_Estimation.B09_Estimation_MachineCost import load_machine_catalog # noqa: E402
|
|
|
|
CATALOG = load_machine_catalog()
|
|
|
|
|
|
def test_표_머리글이_붙은_이름이_없다() -> None:
|
|
glued = [
|
|
m.machine_code
|
|
for m in CATALOG.machines.values()
|
|
if "시 간 당" in m.name or "(10-7)" in m.name
|
|
]
|
|
assert glued == []
|
|
|
|
|
|
def test_빈_이름이_없다() -> None:
|
|
assert [m.machine_code for m in CATALOG.machines.values() if not m.name.strip()] == []
|
|
|
|
|
|
def test_되살린_이름과_규격() -> None:
|
|
expected = {
|
|
"5220-0015": ("소형브레이커(전기식)", "1.5㎾"),
|
|
"7101-0450": ("고성능 착정기", "335.70㎾"),
|
|
"0240-0007": ("유압식 진동콤팩터(굴착기 부착용)", "0.7"),
|
|
"3611-0142": ("콘크리트 피니셔(중앙분리대용)", "105.9"),
|
|
"6802-0100": ("파일천공전용장비", "100"),
|
|
# 2026-09-18 규격이 되살아남 — 앞서 빈칸이던 것이 원문 규격으로 섰다(기계 원천 벌 재추출)
|
|
"9070-0020": ("이우선(비자항)", "80ton대선 8ton달기"),
|
|
}
|
|
for code, (name, spec) in expected.items():
|
|
machine = CATALOG.machines[code]
|
|
assert (machine.name, machine.specification) == (name, spec), code
|
|
|
|
|
|
def test_취득가는_원천_그대로() -> None:
|
|
raw = json.loads(
|
|
(ROOT / "resources/data_cost_input_value/mach_base_2026.json").read_text(encoding="utf-8")
|
|
)
|
|
prices = {
|
|
r["machine_code"]: r["price_thousand_krw"]
|
|
for r in raw["variables"]["mach_price"]["records"]
|
|
}
|
|
for code in ("5220-0015", "0240-0007", "6802-0040", "7930-0100"):
|
|
assert CATALOG.machines[code].price_thousand_krw == Decimal(str(prices[code]))
|