tmp/ 가 창끼리 안 건너가는 것이 확정돼(랩탑이 시간 두고 두 번 확인) 시험·예외가 저절로 건너가도록 git 안으로 옮김. 사용자 확정. - 내용은 하나도 안 고침 — 자리만 옮김. tmp/tests 는 남겨 둠. - 같은 이름이 이미 있던 64 개는 랩탑 것을 그대로 두고 건너뜀. - helper_b05_*.js 둘은 랩탑이 .cjs 로 이미 올린 것과 **줄바꿈만 다른 같은 내용**이라 복사본을 도로 뺌(시험이 .cjs 를 부름). - resources/tester/ 에서 전체 1176 통과 · 29 건너뜀 · 실패 0. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
80 lines
3.3 KiB
Python
80 lines
3.3 KiB
Python
"""마스터 밑수 판독 — 「인」과 「칸 이어붙임」 두 자리 (2026-09-09).
|
||
|
||
⚠⚠ **「인」은 품의 단위이지 공종 밑수가 아니다.** 원문 대조로 넷이 오독으로 드러났다 —
|
||
8-6-2 드론방제·8-6-3 지상방제 「(단위 : 인)」(그 「인」은 **소요인력**) ·
|
||
13-2-4 야면석 채집 「(단위: 인 당)」(표 안이 **㎡당·㎥당** 두 줄).
|
||
⚠ 넓게 「인」을 버리면 **2-2-5 천공기가 사라진다** — 「천공인부 **1인당** 1대」는 숫자가 붙었다.
|
||
⇒ **숫자가 붙었을 때만** 인정한다.
|
||
|
||
⚠⚠ **칸을 이어 붙여 읽지 않는다.** 앞 칸의 **값**과 뒤 칸의 **단위**가 붙어 없는 밑수가 생겼다 —
|
||
13-2-4 … 0.28 | **0.36** / **㎥당** | 0.60 … ⇒ 「0.36㎥당」(원문에 없는 값)
|
||
5-19-2 15 | **30**(표토두께 ㎝) / **㎥ 당** | … ⇒ 「30㎥당」(두께를 밑수로 읽음)
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import json
|
||
import sys
|
||
from pathlib import Path
|
||
|
||
ROOT = Path(__file__).resolve().parents[2]
|
||
sys.path.insert(0, str(ROOT))
|
||
|
||
from B08_Quantity.B08_Quantity_Build_WorkItemMaster import ( # noqa: E402
|
||
detect_basis,
|
||
person_basis_ok,
|
||
)
|
||
|
||
MASTER = json.loads(
|
||
(ROOT / "resources" / "data_work_item_master" / "work_item_master_2026-01-01.json").read_text(
|
||
encoding="utf-8"
|
||
)
|
||
)
|
||
|
||
|
||
def 밑수(code: str) -> list[tuple]:
|
||
for item in MASTER["work_items"]:
|
||
if item["work_item_code"] == code:
|
||
return [
|
||
(t.get("basis_unit"), t.get("basis_quantity")) for t in (item.get("tables") or [])
|
||
]
|
||
return []
|
||
|
||
|
||
def test_숫자가_붙어야_인을_인정한다() -> None:
|
||
assert person_basis_ok("1", "인") is True
|
||
assert person_basis_ok("", "인") is False
|
||
assert person_basis_ok(None, "인") is False
|
||
# 「인」이 아닌 단위는 숫자가 없어도 그대로 — 종전 동작을 안 바꾼다.
|
||
assert person_basis_ok("", "㎥") is True
|
||
|
||
|
||
def test_방제_둘은_밑수가_안_선다() -> None:
|
||
"""「(단위 : 인)」은 소요인력이지 밑수가 아니다 — 미확보가 정직하다."""
|
||
assert all(unit != "인" for unit, _ in 밑수("FP-08-06-02"))
|
||
assert all(unit != "인" for unit, _ in 밑수("FP-08-06-03"))
|
||
|
||
|
||
def test_천공기는_그대로_선다() -> None:
|
||
"""⚠ 넓게 버리면 사라지는 자리 — 「천공인부 1인당 1대」는 숫자가 붙었다."""
|
||
assert ("인", 1.0) in 밑수("FP-02-02-05")
|
||
|
||
|
||
def test_칸을_이어_붙여_읽지_않는다() -> None:
|
||
"""앞 칸 값 + 뒤 칸 단위 = 없는 밑수. 두 실례를 그대로 잰다."""
|
||
table = {
|
||
"headers": ["뒷 길 이(㎝)", "25", "35", "45", "55", "60", ""],
|
||
"rows": [["인 부", "㎡당", "0.11", "0.17", "0.22", "0.28", "0.36"], ["㎥당", "0.60"]],
|
||
}
|
||
assert detect_basis(table) == (None, None)
|
||
두께표 = {
|
||
"headers": ["구 분", "직 종", "표 토 두 께(㎝)", "비고", ""],
|
||
"rows": [["15", "30", "", "", ""], ["㎥ 당", "보통인부", "0.14", "0.11", ""]],
|
||
}
|
||
assert 두께표 and detect_basis(두께표) == (None, None)
|
||
|
||
|
||
def test_한_칸_안의_밑수는_그대로_읽는다() -> None:
|
||
"""「100㎥당」처럼 한 칸에 다 있는 것은 종전대로 선다."""
|
||
assert detect_basis({"headers": ["(단위: 100㎥당)"], "rows": []}) == (100.0, "㎥")
|