- 표지 = 수식 문서 머리 · 옛 로직 줄 칸 「부품」 — 기계경비식 9 · 작업량 틀 60(기종 = 기계표 상세구분 · 규격 열쇠) · 계수식 4 · 변환기가 옮김 · 틀 문서 9 장 - 지움 = 작업량당 기계경비 6(GC001145 · 1148 · 1151 · 1156 · 1159 · 1166 · 부르는 곳 0 · 요구 734-4 · 735-4) — 수식 문서 · 옛 로직 · 키대장 폐기 칸 · 빌더 · 변수표 - 이름 꼬리 4 = 원문 제목(지게운반 · 인력운반(기계설비) · 벽돌운반 · 수중펌프 설치 및 해체) · 키 폐기 0 - 서버 = `M01_MasterData_Parts` — M01 `/logics` · M02 `/logic-lib/logics` 목록에서 부품 뺌(1,440) · 키로 열기 · 부르기 그대로 · `/m01/parts`(기종 계산식 · 틀 · 계수식) · `/m02/logic-lib/machine-parts` · 연결 찾기 과녁에서 부품 뺌(1,444 → 1,435 · 판정 코드 그대로) - 금액 전후 = 문서 1,513 · 셈 9,626(기본 + 옵션 표본) 모두 같음 · 791_1 지문 남은 1,513 같음 → 지문 다시 뜸 · 802_2 변환 대조 1,513 · 목록 xlsx 다시 씀(요약 수) - 낡은 시험 = 1,519 · 1,518 기대 → 1,513 · GC001148 견본 → 같은 꼴 GF000089 토사깍기(기계)(블록 Q 39.293 · 합계 2,190) · 지운 6 을 셈하던 줄 걷음 · 목록 수 1,440 · 묶음 328 · 부르는 수 507 - 새 지킴 시험 test_813_2_parts Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
112 lines
4.9 KiB
Python
112 lines
4.9 KiB
Python
"""813-2 지킴 — 보조 문서 부품 표지 · 작업량당 기계경비 6 지움 · 목록에서 뺌 · 기계 → 부품.
|
|
|
|
① 표지 = 보조 문서 83 − 지움 6 − 단가산출로 남김 4 = 73(기계경비식 9 · 작업량 틀 60 · 계수식 4) · 옛 로직 줄 = 수식 문서
|
|
② 지움 6 = 수식 문서 · 옛 로직 · 키대장 「키」 에 없음 · 키대장 「폐기」 에 있음 · 부르는 곳 0 · 이름 꼬리 4 = 원문 제목
|
|
③ 목록(M01 `/logics` · M02 `/logic-lib/logics`)에서 뺌 · 키로 열기 · 부르기는 그대로(끊긴 단가산출 연결 0)
|
|
④ 기계 → 부품 — 굴착기 = 기계경비식 GC000267(기계 9) + 작업량 틀 · 0.7㎥ 원문번호 → 틀 문서(규격 열쇠)
|
|
⑤ 변환기(옛 로직 → 수식 문서)가 표지 칸을 옮김
|
|
금액 전후 = `test_791_1_engine_semantics.py` 지문(남은 1,513 같음) · `test_802_2_convert.py` 변환 대조.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import importlib
|
|
import json
|
|
from collections import Counter
|
|
|
|
from M01_MasterData import M01_MasterData_Doc as doc_store
|
|
from M01_MasterData import M01_MasterData_Parts as parts
|
|
from M01_MasterData import M01_MasterData_Router as m01_router
|
|
from M01_MasterData import M01_MasterData_Store as store
|
|
from M02_MasterTemplete import M02_Logic_Lib_Read as lib_read
|
|
from M02_MasterTemplete import M02_MasterTemplete_Router_Combos as combos
|
|
|
|
cv = importlib.import_module("master_doc_convert")
|
|
|
|
GONE = ["GC001145", "GC001148", "GC001151", "GC001156", "GC001159", "GC001166"]
|
|
NAMES = {
|
|
"GC001140": "지게운반",
|
|
"GC001141": "인력운반(기계설비)",
|
|
"GC001142": "벽돌운반",
|
|
"GC001184": "수중펌프 설치 및 해체",
|
|
}
|
|
|
|
|
|
def _rows() -> dict[str, dict]:
|
|
files = store.loaded()[0]
|
|
return {
|
|
str(r["키"]): r
|
|
for d in files.values()
|
|
if d.get("그룹") == "로직"
|
|
for r in d.get("줄") or []
|
|
}
|
|
|
|
|
|
def test_표지_73_갈래별_수_로직_문서_같음():
|
|
tags = parts.parts()
|
|
assert Counter(t["갈래"] for t in tags.values()) == {
|
|
"기계경비식": 9,
|
|
"작업량 틀": 60,
|
|
"계수식": 4,
|
|
}
|
|
rows = _rows()
|
|
assert all(rows[k].get("부품") == t for k, t in tags.items())
|
|
assert {k for k, r in rows.items() if r.get("부품")} == set(tags)
|
|
tpl = {k: t for k, t in tags.items() if t["갈래"] == "작업량 틀"}
|
|
assert all(isinstance(t["기종"], list) for t in tpl.values())
|
|
assert tpl["GF000088"] == {"갈래": "작업량 틀", "기종": ["굴착기"], "규격": "q"}
|
|
|
|
|
|
def test_지움_6_이름_4():
|
|
docs = doc_store.docs()
|
|
rows = _rows()
|
|
led = json.loads((store.FOLDER / "_키대장.json").read_text(encoding="utf-8"))
|
|
for k in GONE:
|
|
assert k not in docs and k not in rows and k not in led["키"] and k in led["폐기"]
|
|
assert len(docs) == len(rows) == 1513
|
|
for k, name in NAMES.items():
|
|
assert docs[k]["이름"] == rows[k]["이름"] == name and "부품" not in docs[k]
|
|
|
|
|
|
def test_목록에서_뺌_키로_열림_부르기_그대로():
|
|
tags = parts.parts()
|
|
m01 = {x["키"] for x in m01_router.get_logics()["logics"]}
|
|
m02 = {x["키"] for x in combos.get_logics()["logics"]}
|
|
assert not (m01 | m02) & set(tags) and len(m01) == len(m02) == 1513 - 73
|
|
for k in ("GC000267", "GF000088", "GC001191"):
|
|
assert doc_store.read(k)["문서"]["부품"] == tags[k]
|
|
assert m01_router.get_logic(k)["logic"]["키"] == k
|
|
docs = doc_store.docs()
|
|
links = [
|
|
str((v.get("연결") or {}).get("키"))
|
|
for d in docs.values()
|
|
for v in d.get("변수") or []
|
|
if (v.get("연결") or {}).get("갈래") == "단가산출"
|
|
and "{" not in str((v.get("연결") or {}).get("키"))
|
|
]
|
|
assert links and all(k in docs for k in links) # 끊긴 부름 0 · 지운 6 부르는 곳 0
|
|
assert sum(1 for k in links if tags.get(k, {}).get("갈래") == "기계경비식") >= 600
|
|
|
|
|
|
def test_기계_부품():
|
|
got = m01_router.get_parts("기계", "굴착기")
|
|
rule = {x["키"]: x["기계수"] for x in got["기계경비식"]}
|
|
assert rule["GC000267"] == 9
|
|
tpl = {x["키"] for x in got["작업량 틀"]}
|
|
assert {"GC001147", "GF000088"} <= tpl and len(tpl) == 15
|
|
coef = m01_router.get_parts("계수식")["계수식"]
|
|
assert {x["키"] for x in coef} == {"GC001143", "GC001191", "GC001192", "GC001193"}
|
|
one = lib_read.get_machine_parts("0201-0070")
|
|
assert one["기계"] == {"이름": "굴착기(무한궤도)", "규격": "0.7㎥", "상세구분": "굴착기"}
|
|
by = {t["키"]: t for t in one["틀"]}
|
|
assert by["GC001147"]["규격"] == "버킷용량" and by["GF000088"]["문서"]["결과"] == "Q"
|
|
|
|
|
|
def test_변환기가_표지를_옮김():
|
|
whole = store.loaded()[1]
|
|
rows = _rows()
|
|
doc, _ = cv.convert(whole, rows["GF000088"])
|
|
assert doc["부품"] == rows["GF000088"]["부품"]
|
|
assert list(doc).index("부품") == list(doc).index("출처") + 1
|
|
assert "부품" not in cv.convert(whole, rows["GF000089"])[0]
|