Files
Aislo/resources/tester/test_572_library_same.py
T
eomsangdonandClaude Opus 5.5 4c8a06559a feat(740-1): 단가산출 · 일위대가 서로 독립 — 넣기 펼침(M01 키 줄 + 덮개 사본 · 본뜬) · 초기화 길 · 옮기기 함수 · B09 덮개 줄 굳힘
- 새 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>
2026-11-02 19:47:33 +09:00

114 lines
5.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""서고 문서 내용 지문 규칙 · 같은 층 · 위 층 찾기(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)