feat(733-2): 사람 길 만들 때 같은 내용 409 물음 · 복사 딸림 재사용

- 새 M02_Library_Ask — 같은 층 같은 내용(733-1 지문) = 409 {같은것: [{키, 이름, 층, 주인}], 까닭} · 몸 새로 = 그래도 새로 · 씀 = 그 키(새 문서 0 · 같은 내용 아닌 키 = 다시 409)
- 길 = 새로 만들기(빈 문서 · 같은 층 복사 = 안 물음) · [단가산출로 저장] from-line · B09 내 자료집(같은이름 409 와 한 몸 · 하위 호표 지문 = 굳힌 문서) · 공유 요청 승인(일위대가 · 씀 = 사본 키) · 실무 호표 [구조물 조합으로](구조물 조합 지문 = 줄 수량 넣음)
- 복사 딸림 carry — 받는 층에 같은 원본 + 같은 내용 사본이 있으면 그 키 재사용(refs.copied_from) · B09 하위 호표 재사용 목록 = 실무자료 한정 → 모든 사본 원본
- 낡은 시험 고침: test_703 자료집 같은 이름 물음 — 새 이름이라도 같은 내용이면 409(정함 3장 3) → new=True 로 새로 · 씀 확인 더함
- 새 시험 test_733_2_library_ask(새로 · from-line · 승인 · carry) · test_705_2 구조물 조합으로 409

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-02 13:54:28 +09:00
co-authored by Claude Opus 5.5
parent 8588743906
commit 40980910fa
12 changed files with 379 additions and 33 deletions
+26 -4
View File
@@ -383,9 +383,30 @@ def origin_mark(doc: dict[str, Any], ref: Ref) -> dict[str, Any]:
return {**doc, "본뜬": ref}
def copied_from(doc: Any) -> Ref | None:
"""복사 문서의 원본 참조(`origin_mark` 거꾸로) — 실무자료 본뜬 = `복사원본` · 그 밖 = `본뜬`."""
own = doc.get("본뜬") if isinstance(doc, dict) else None
if isinstance(own, dict) and own.get("층") == "실무자료":
own = own.get("복사원본")
return own if isinstance(own, dict) and own.get("키") else None
def _reused(kind: str, doc: dict[str, Any], ref: Ref) -> str | None:
"""지금 층에 같은 원본(`ref`) 본뜬 같은 내용 사본이 있으면 그 키(733-2 · 다시 복사 = 재사용)."""
from M02_MasterTemplete.M02_Library_Same import Same
rid = ref_id(ref)
for key in Same().find_same(store.root(), kind, doc):
got = copied_from(read_ref({"층": here()[0], "주인": here()[1], "키": key}))
if got is not None and ref_id(got) == rid:
return key
return None
def carry(doc: dict[str, Any], source: Here) -> dict[str, Any]:
"""복사(원본 층 `source` → 지금 층) — 지금 층이 못 읽는 참조는 그 문서를 지금 층에 새 키로
같이 복사(`본뜬` = 원래 참조) · 참조를 새 키로 바꿈. 원본 층 읽기 권한은 부르는 쪽 몫."""
같이 복사(`본뜬` = 원래 참조) · 참조를 새 키로 바꿈 · 같은 원본 같은 내용 사본이 이미 있으면
그 키(733-2). 원본 층 읽기 권한은 부르는 쪽 몫."""
target, done = here(), {}
def move(ref: Ref, depth: int) -> Ref:
@@ -398,9 +419,10 @@ def carry(doc: dict[str, Any], source: Here) -> dict[str, Any]:
got = read_ref(ref)
if got is None:
raise _bad(f"없는 참조 「{ref['키']}」")
body = _move_doc(got, move, depth + 1)
made = create(kind_of(ref["키"]), origin_mark(_spec_moved(body, done), ref))
done[ref_id(ref)] = {"층": target[0], "주인": target[1], "키": made["이름"]}
body = origin_mark(_spec_moved(_move_doc(got, move, depth + 1), done), ref)
kind = kind_of(ref["키"])
key = _reused(kind, body, ref) or create(kind, body)["이름"]
done[ref_id(ref)] = {"층": target[0], "주인": target[1], "키": key}
return done[ref_id(ref)]
return _spec_moved(_move_doc(doc, move, 1), done)