- M02_Labor_Migrate: 층마다 열마다 labor 문서 · 여러 열이 쓰던 조합은 열마다 복사 · 키 없는 열 = 빈 일위대가 · 다시 돌려도 같음 · --storage(회사 · 개인 층) · --dry-run - M02_Labor_Doc.from_combo: 옛 조합(실무문서 UA · UC · UP) → 일위대가 문서 몸(본뜬 = 층 · 주인 · 키) - 시스템 층 결과: labor/item1(← UA000008) · item2(빈) · item3(← UA000001) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EYJJRCfHfdCGNhmXTjQKV7
120 lines
5.1 KiB
Python
120 lines
5.1 KiB
Python
"""옛 일위대가 조합 → 열마다 일위대가 문서 옮기기(`M02_Labor_Migrate` · PLAN 39-1b).
|
|
|
|
시스템 층 = 견본 표(임시 폴더) · 조합은 M01 마스터(읽기만) · 개인 층 = 임시 storage.
|
|
"""
|
|
|
|
import json
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
from config import config_system
|
|
from M02_MasterTemplete import M02_Labor_Migrate as migrate
|
|
from M02_MasterTemplete import M02_MasterTemplete_Combo_Store as combos
|
|
from M02_MasterTemplete import M02_MasterTemplete_Items as items_store
|
|
from M02_MasterTemplete import M02_MasterTemplete_Store as store
|
|
from M02_MasterTemplete import M02_Template_Layers as layers
|
|
from resources.tester.test_m02_structure import write_sample_table
|
|
|
|
SHARED = "UP42-000001"
|
|
|
|
|
|
def _point(folder: Path, keys: dict[str, str]) -> None:
|
|
path = folder / "table" / f"{store.STRUCTURE_TABLE}.json"
|
|
doc = json.loads(path.read_bytes())
|
|
for col in doc["열"]:
|
|
if col["id"] in keys:
|
|
col["일위대가"] = keys[col["id"]]
|
|
path.write_text(json.dumps(doc, ensure_ascii=False), encoding="utf-8")
|
|
|
|
|
|
@pytest.fixture()
|
|
def world(tmp_path, monkeypatch):
|
|
system = tmp_path / "system"
|
|
system.mkdir()
|
|
write_sample_table(system)
|
|
monkeypatch.setattr(store, "FOLDER", system)
|
|
monkeypatch.setattr(layers, "SYSTEM_ROOT", system)
|
|
storage = tmp_path / "storage"
|
|
storage.mkdir()
|
|
monkeypatch.setattr(config_system, "STORAGE_BASE_DIR", str(storage))
|
|
_point(system, {"rv": "UA000008", "c1": "UA000008", "pv_b": "UA999999"})
|
|
personal = layers.personal_dir(7, 42)
|
|
items_store.ensure(personal)
|
|
with store.at(personal):
|
|
got = store.read("table", store.STRUCTURE_TABLE)
|
|
doc = got["문서"]
|
|
doc["열"] = [
|
|
{"id": "a", "머리": ["돌", "가"], "꼴": "수", "일위대가": SHARED},
|
|
{"id": "b", "머리": ["돌", "나"], "꼴": "수", "일위대가": SHARED},
|
|
]
|
|
store.write("table", store.STRUCTURE_TABLE, got["판"], doc)
|
|
combo = {
|
|
"그룹": "일위대가조합",
|
|
"다음": 2,
|
|
"줄": [
|
|
{
|
|
"키": SHARED,
|
|
"이름": "개인 조합",
|
|
"단위": "개소",
|
|
"담은로직": [{"로직": "GF000219", "메모": "메쌓기"}],
|
|
}
|
|
],
|
|
}
|
|
(personal / combos.FILE).write_text(json.dumps(combo, ensure_ascii=False), encoding="utf-8")
|
|
return {"system": system, "personal": personal, "storage": storage}
|
|
|
|
|
|
def _labor(folder: Path, cid: str) -> dict:
|
|
return json.loads((folder / "labor" / f"{cid}.json").read_bytes())
|
|
|
|
|
|
def test_시스템_층_열마다_복사_같은_조합도_따로_없는_조합은_못함(world):
|
|
system = world["system"]
|
|
got = migrate.migrate(system)
|
|
assert got["옮김"] == ["rv ← UA000008", "c1 ← UA000008"]
|
|
assert got["못함"] == ["pv_b · 없는 일위대가 조합 「UA999999」"]
|
|
rv, c1 = _labor(system, "rv"), _labor(system, "c1")
|
|
assert rv["본뜬"] == {"층": "system", "주인": None, "키": "UA000008"}
|
|
assert rv["담은로직"] == c1["담은로직"] and len(rv["담은로직"]) == 14
|
|
assert all(one["입력값"] == {} and one["수량"] is None for one in rv["담은로직"])
|
|
assert rv["일위대가번"] != c1["일위대가번"] # 열마다 자기 번호
|
|
with store.at(system): # 나중에 만든 도면도 같은 뒷자리
|
|
store.create_structure("rv")
|
|
doc = json.loads((system / "structure" / "rv.json").read_bytes())
|
|
assert doc["도번"][2:] == rv["일위대가번"][2:]
|
|
assert rv["계산값"]["줄"] # 서버가 계산값까지
|
|
assert _labor(system, "ms")["담은로직"] == [] # 키 없는 열 = 빈 일위대가
|
|
|
|
|
|
def test_개인_층_여러_열이_쓰던_조합은_열마다_본뜬은_그_층(world):
|
|
personal = world["personal"]
|
|
assert migrate.layer_folders(True) == [personal]
|
|
got = migrate.migrate(personal)
|
|
assert got["옮김"] == [f"a ← {SHARED}", f"b ← {SHARED}"]
|
|
a, b = _labor(personal, "a"), _labor(personal, "b")
|
|
assert a["본뜬"] == b["본뜬"] == {"층": "personal", "주인": "7/42", "키": SHARED}
|
|
assert (a["단위"], a["담은로직"][0]["메모"]) == ("개소", "메쌓기")
|
|
assert a["일위대가번"] != b["일위대가번"]
|
|
|
|
|
|
def test_다시_돌려도_같음_사람이_고친_문서는_그대로(world):
|
|
system = world["system"]
|
|
migrate.migrate(system)
|
|
before = {p.name: p.read_bytes() for p in (system / "labor").glob("*.json")}
|
|
assert migrate.migrate(system)["옮김"] == []
|
|
after = {p.name: p.read_bytes() for p in (system / "labor").glob("*.json")}
|
|
assert before == after
|
|
with store.at(system): # 사람이 비운 문서도 다시 안 채움
|
|
got = store.read("labor", "rv")
|
|
store.write("labor", "rv", got["판"], {**got["문서"], "담은로직": []})
|
|
assert "rv" in migrate.migrate(system)["그대로"]
|
|
assert _labor(system, "rv")["담은로직"] == []
|
|
|
|
|
|
def test_미리_보기는_파일을_안_씀(world):
|
|
system = world["system"]
|
|
got = migrate.migrate(system, dry=True)
|
|
assert "rv ← UA000008" in got["옮김"]
|
|
assert not list((system / "labor").glob("*.json"))
|