"""서고 문서 내용 지문 규칙 · 같은 층 · 위 층 찾기(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)