- 새 M02_Library_Flat: SK 에 SK = 더한줄 로직 한 줄에 원본 몸 통째(덮개 · 뺀줄 · 고름 · 더한줄 · % 덧줄까지 같은 금액) · SC 에 SK = 로직 줄 + 패치 · SK 에 SC = 줄마다 더한줄(수량 = 저장 수량.손 › 실무수량 › 1) · 바탕 SK · 패치 SK 참조 = 덮개 겹침 · 줄 본뜬 {층, 주인, 키, 이름, 때}
- 저장 · 읽기 · 층 복사 때 서버가 펼침(못 펼친 줄 = 옛 참조 그대로) · SC 안 SC(하위 호표)는 저장 · 읽기에서 참조 그대로(엑셀 하위 호표 끝수 · B09 하위 대가) · 찾아 넣기 길만 펴 넣음
- 길: POST {kind}-flat(넣을 줄 · 못 펼침 400) · POST {kind}-reset(미리 보기 걷힐 수 · 씀)
- 초기화 = 덮개 · 뺀줄 · 더한줄 단가 걷음(안쪽 넣은 몸까지) · 항목 · 수량 · 입력값 · 고름 남김
- 옮기기 = migrate(apply) · 전후 1 단위 금액 같을 때만 씀 · 공유 storage 는 브레인
- 둘째 기초 세부 셈 = 넣은 SK 몸이면 이름 없는 SK 로(Sangeun_Calc.sub_run)
- B09: SC 사본 덮개 줄 = 굳힌 줄(굳힌 {키, 줄 …}) → 사본 셈 · 대가 블록이 덮개를 읽음(옛 산근 길은 덮개 무시 · 실측 6,451 대 M02 210,866)
- 733 지문 = 옛 참조 줄 펼친 꼴로 대조
- 낡은 시험 고침(까닭 = 단가산출이 낀 참조가 이제 펼쳐 담김): 715 store(바탕 · 사전조합 SK · 층 복사) · 717-2a 목록 바탕 · 717-4 SC 안 SK · 719-1 원본판(원본 고쳐도 그대로) · 719-2 속 일위대가(빠진 줄 없음 · 쓰지 않는 _calc_given 지움) · 725-1 SK 안 SC · 729 SK 줄 본뜬 · 733-3 쓰는 곳 = 구조물 조합(SK 안 SK 참조 없음) · 572 지문 대조 대상
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, "더한줄": []}) == []
|
||
# 참조 = 펼친 꼴(740-1) 지문 — 층 넘어 같은 내용 사본을 가리키면 같음 · 다른 내용이면 다름
|
||
a = {**SK, "바탕": {"참조": {"층": "company", "주인": "7", "키": "SK-000005"}}, "덮개": {}}
|
||
b = {**a, "바탕": {"참조": {"층": "system", "주인": None, "키": "SK-000006"}}}
|
||
c = {**a, "바탕": {"참조": {"층": "personal", "주인": "7/42", "키": "SK-000004"}}}
|
||
assert same.finger("sangeun", a) == same.finger("sangeun", b) != same.finger("sangeun", c)
|