feat(b08): 내 라이브러리에 저장·내 것 지우기 — 개인 단만 씀, 프로젝트 작업본은 그대로
- [내 라이브러리에 저장]: 그 장의 양식 + 고친 식을 로그인한 사람 개인 단에 한 벌로 씀(같은 종류는 그 코드로 덮어씀) · 저장 안 한 식이 있으면 막음 - [내 것 지우기]: 개인 단의 그 종류만 지움 · 박힌 양식·고친 식은 안 바뀜 - 기본 찰쌓기 양식에 pum_edition 2026-01-01(명세 17장 ③) - 결함: 식 저장 뒤 다시 그린 표에 「저장 안 한 식」 표시가 남아 헛물음이 뜨던 것 — 장을 그릴 때 비움 - 시험 2개 추가 · 전체 1531 통과 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016VBGFXB9AbJBwXP19z75Qq
This commit is contained in:
@@ -12,6 +12,7 @@ from __future__ import annotations
|
||||
|
||||
import json
|
||||
import re
|
||||
import secrets
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
@@ -96,6 +97,43 @@ def import_item(project_root: str | Path, item: dict[str, Any], tier: str) -> No
|
||||
path.unlink()
|
||||
|
||||
|
||||
def _write(folder: Path, item: dict[str, Any]) -> None:
|
||||
folder.mkdir(parents=True, exist_ok=True)
|
||||
text = json.dumps(item, ensure_ascii=False, indent=2)
|
||||
(folder / f"{item['code']}.json").write_text(text, encoding="utf-8")
|
||||
|
||||
|
||||
def save_personal(folder: Path, template: dict[str, Any], overrides: dict[str, Any] | None) -> str:
|
||||
"""[내 라이브러리에 저장] — 양식 + 프로젝트에서 고친 식을 **개인 단에 한 벌**로 씀. 코드.
|
||||
|
||||
⚠ 반대 방향(작업본 → 개인 단)이라 프로젝트는 안 바꿈(브레인 판정 Ⓑ).
|
||||
⚠ 개인 단에 같은 종류가 있으면 **그 코드로 덮어씀** — 지금은 종류당 하나(판정 Ⓐ).
|
||||
"""
|
||||
from B08_Quantity.B08_Quantity_Engine_StructureTemplate import overridden_rows
|
||||
|
||||
type_id = template.get("type_id")
|
||||
same = [item for item in _items(folder) if item.get("type_id") == type_id]
|
||||
code = str(same[0]["code"]) if same else f"AX-ST-{secrets.token_hex(4)}"
|
||||
# 고친 식이 곧 이 항목의 식 — 「사용자 식」 표시와 되돌릴 자리는 떼어 냄.
|
||||
rows = [
|
||||
{**{k: v for k, v in row.items() if k != "default_formula"}, "source": "library"}
|
||||
for row in overridden_rows(template, overrides)
|
||||
]
|
||||
item = {k: v for k, v in template.items() if k != "imported_from"}
|
||||
_write(folder, {**item, "code": code, "library_tier": "personal", "rows": rows})
|
||||
return code
|
||||
|
||||
|
||||
def delete_personal(folder: Path, type_id: str) -> int:
|
||||
"""[내 것 지우기] — 개인 단의 그 종류만 지움. 프로젝트 작업본은 안 바꿈. 지운 수."""
|
||||
count = 0
|
||||
for path in folder.glob("*.json") if folder.is_dir() else []:
|
||||
if json.loads(path.read_text(encoding="utf-8")).get("type_id") == type_id:
|
||||
path.unlink()
|
||||
count += 1
|
||||
return count
|
||||
|
||||
|
||||
def pin_program_templates(project_root: str | Path) -> int:
|
||||
"""[확정] 때 — 아직 안 박힌 종류는 **그 시점 프로그램 기본**을 박음. 박은 수.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user