- 새 M02_Library_Same.py — 단가산출(SK) · 일위대가(SC) 내용 지문(derived_key) · 이름 · 본뜬 · 메모 · 바탕판 · 원값 · 고정 출처 뺌 · 수 · 단위 정규화 · 줄 차례 무시 · SC 수량 null(비율 줄 율만) · 빈 문서 None · 참조 = 가리킨 문서 지문 - Same 한 벌 = 한 요청 안 메모 · find_same(folder, kind, doc, skip) = 같은 층 키 · find_above = 위 층 참조 - 새 시험 test_572_library_same.py — 지문 규칙 · 같은 층 · 위 층 · 참조 지문 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
114 lines
5.5 KiB
Python
114 lines
5.5 KiB
Python
"""서고 문서 내용 지문 규칙 · 같은 층 · 위 층 찾기(PLAN 733-1a · 요구서_572 3장 1).
|
||
|
||
지문 규칙 = 이름 · 본뜬 · 메모 · 바탕판 · 원값 · 고정 출처 뺌 · 수 · 단위 정규화 · 줄 차례 무시 · SC 수량 null ·
|
||
빈 문서 None · 참조 = 가리킨 문서 지문 · 같은 층 찾기 · 위 층 찾기(임시 층).
|
||
"""
|
||
|
||
import json
|
||
|
||
from M02_MasterTemplete import M02_Library_Same as same
|
||
from M02_MasterTemplete import M02_Template_Layers as layers
|
||
from resources.tester.test_m02_hopyo_excel import client # noqa: F401
|
||
|
||
SK = {
|
||
"종류": "단가산출",
|
||
"키": "SK-000001",
|
||
"이름": "유로폼(보통)",
|
||
"단위": "m2",
|
||
"구분": "실무자료",
|
||
"상세구분": "가.xlsx",
|
||
"본뜬": {"층": "실무자료", "키": "HP-000001 단산3"},
|
||
"바탕": {"로직": "GF000113"},
|
||
"입력값": {"횟수": 6},
|
||
"열린입력": [],
|
||
"고름": {},
|
||
"덮개": {"labor:LB000002#0": {"qty": 0.20, "원값": 0.1}},
|
||
"더한줄": [
|
||
{"종류": "인력", "요소": "LB000001", "이름": "보통인부", "단위": "인", "수량": 0.5},
|
||
{"종류": "로직", "로직": "GC000206", "입력값": {}, "수량": 1, "바탕판": "abc"},
|
||
],
|
||
"뺀줄": ["labor:LB000003#0", "machine:EQ000001#0"],
|
||
"바탕판": "x1",
|
||
}
|
||
SC = {
|
||
"종류": "사전조합",
|
||
"키": "SC-000001",
|
||
"이름": "수로BOX 4.0×2.0",
|
||
"단위": "m",
|
||
"본뜬": {"층": "실무자료", "키": "HP-000001 제3호표"},
|
||
"담은로직": [
|
||
{"로직": "GF000001", "입력값": {"두께": "0.20"}, "수량": {"손": 3}, "메모": "가"},
|
||
{"고정": {"이름": "잡비", "단위": "%", "비율": True, "출처": {"파일": "가"}}, "수량": 3},
|
||
],
|
||
"자재": [{"코드": "MT000001", "수량": {"손": 2}}],
|
||
}
|
||
|
||
|
||
def _put(folder, kind, key, doc):
|
||
(folder / kind).mkdir(parents=True, exist_ok=True)
|
||
(folder / kind / f"{key}.json").write_text(json.dumps({**doc, "키": key}), encoding="utf-8")
|
||
|
||
|
||
def test_지문_규칙():
|
||
f = same.finger
|
||
base = f("sangeun", SK)
|
||
assert base and base.startswith("SK:")
|
||
other = {**SK, "키": "SK-000009", "이름": "유로폼(Euro Form)(6회, 보통)", "상세구분": "나.xls"}
|
||
other |= {"본뜬": {"층": "실무자료", "키": "HP-000002 단산7"}, "바탕판": "y2", "메모": "다"}
|
||
other["단위"] = " M2 "
|
||
other["입력값"] = {"횟수": "6.0"}
|
||
other["덮개"] = {"labor:LB000002#0": {"qty": "0.2", "원값": 9}}
|
||
other["더한줄"] = [
|
||
{"종류": "로직", "로직": "GC000206", "입력값": {}, "수량": "1.00", "바탕판": "zz"},
|
||
{"종류": "인력", "요소": "LB000001", "이름": "인부(보통)", "단위": "인", "수량": 0.50},
|
||
]
|
||
other["뺀줄"] = list(reversed(SK["뺀줄"]))
|
||
assert f("sangeun", other) == base # 이름 · 본뜬 · 바탕판 · 원값 · 차례 · 수 꼴 · 단위 꼴 뺌
|
||
for diff in (
|
||
{"입력값": {"횟수": 4}},
|
||
{"단위": "m3"},
|
||
{"덮개": {}},
|
||
{"뺀줄": []},
|
||
{"바탕": {"로직": "GF000114"}},
|
||
{"더한줄": SK["더한줄"][:1]},
|
||
):
|
||
assert f("sangeun", {**SK, **diff}) != base, diff
|
||
assert f("sangeun", {**SK, "바탕": None, "더한줄": []}) is None # 빈 문서
|
||
# SC — 수량 null(비율 줄 율만) · 고정 출처 · 메모 뺌
|
||
sc = f("precombo", SC)
|
||
size = {**SC, "이름": "수로BOX 2.5×2.5", "자재": [{"코드": "MT000001", "수량": {"손": 9}}]}
|
||
size["담은로직"] = [
|
||
{**SC["담은로직"][1], "고정": {**SC["담은로직"][1]["고정"], "출처": {"파일": "나"}}},
|
||
{**SC["담은로직"][0], "수량": {"손": 7}, "메모": "나"},
|
||
]
|
||
assert f("precombo", size) == sc
|
||
rate = [SC["담은로직"][0], {**SC["담은로직"][1], "수량": 5}]
|
||
assert f("precombo", {**SC, "담은로직": rate}) != sc # 비율 줄 율은 넣음
|
||
assert f("precombo", {**SC, "담은로직": [], "자재": []}) is None
|
||
|
||
|
||
def test_같은층_위층_찾기_참조_지문(client):
|
||
me, firm = layers.personal_dir(7, 42), layers.company_dir(7)
|
||
_put(me, "sangeun", "SK-000001", SK)
|
||
_put(me, "sangeun", "SK-000002", {**SK, "이름": "다른 이름"})
|
||
_put(me, "sangeun", "SK-000003", {**SK, "입력값": {"횟수": 4}})
|
||
_put(me, "sangeun", "SK-000004", {**SK, "바탕": None, "더한줄": []})
|
||
_put(firm, "sangeun", "SK-000005", {**SK, "이름": "회사 것"})
|
||
_put(client.system, "sangeun", "SK-000006", SK)
|
||
new = {**SK, "이름": "새것", "본뜬": {"층": "실무자료", "키": "HP-000003 단산1"}}
|
||
assert same.find_same(me, "sangeun", new) == ["SK-000001", "SK-000002"]
|
||
assert same.find_same(me, "sangeun", new, skip="SK-000001") == ["SK-000002"]
|
||
assert same.find_above(me, "sangeun", new) == [
|
||
{"층": "company", "주인": "7", "키": "SK-000005"},
|
||
{"층": "system", "주인": None, "키": "SK-000006"},
|
||
]
|
||
assert same.find_above(firm, "sangeun", new) == [
|
||
{"층": "system", "주인": None, "키": "SK-000006"}
|
||
]
|
||
assert same.find_same(me, "sangeun", {**SK, "바탕": None, "더한줄": []}) == []
|
||
# 참조 = 가리킨 문서 지문 — 층 넘어 같은 내용 사본을 가리키면 같음
|
||
a = {**SK, "바탕": {"참조": {"층": "company", "주인": "7", "키": "SK-000005"}}, "덮개": {}}
|
||
b = {**a, "바탕": {"참조": {"층": "system", "주인": None, "키": "SK-000006"}}}
|
||
c = {**a, "바탕": {"참조": {"층": "personal", "주인": "7/42", "키": "SK-000003"}}}
|
||
assert same.finger("sangeun", a) == same.finger("sangeun", b) != same.finger("sangeun", c)
|