54 lines
2.5 KiB
Python
54 lines
2.5 KiB
Python
from __future__ import annotations
|
|
from pathlib import Path
|
|
import json, yaml
|
|
from .course_repo import resolve_course_repo
|
|
from .review_schema import ReviewSession
|
|
|
|
def export_review_state_json(session: ReviewSession, path: str | Path) -> None:
|
|
Path(path).write_text(session.model_dump_json(indent=2), encoding="utf-8")
|
|
|
|
def export_promoted_pack(session: ReviewSession, outdir: str | Path) -> None:
|
|
outdir = Path(outdir)
|
|
outdir.mkdir(parents=True, exist_ok=True)
|
|
promoted_pack = dict(session.draft_pack.pack)
|
|
promoted_pack["version"] = str(promoted_pack.get("version", "0.1.0-draft")).replace("-draft", "-reviewed")
|
|
promoted_pack["curation"] = {"reviewer": session.reviewer, "ledger_entries": len(session.ledger)}
|
|
|
|
concepts = []
|
|
for concept in session.draft_pack.concepts:
|
|
if concept.status == "rejected":
|
|
continue
|
|
concepts.append({
|
|
"id": concept.concept_id,
|
|
"title": concept.title,
|
|
"description": concept.description,
|
|
"prerequisites": concept.prerequisites,
|
|
"mastery_signals": concept.mastery_signals,
|
|
"status": concept.status,
|
|
"notes": concept.notes,
|
|
"mastery_profile": {},
|
|
})
|
|
|
|
(outdir / "pack.yaml").write_text(yaml.safe_dump(promoted_pack, sort_keys=False), encoding="utf-8")
|
|
(outdir / "concepts.yaml").write_text(yaml.safe_dump({"concepts": concepts}, sort_keys=False), encoding="utf-8")
|
|
(outdir / "review_ledger.json").write_text(json.dumps(session.model_dump(), indent=2), encoding="utf-8")
|
|
(outdir / "license_attribution.json").write_text(json.dumps(session.draft_pack.attribution, indent=2), encoding="utf-8")
|
|
|
|
|
|
def export_promoted_pack_to_course_repo(session: ReviewSession, course_repo: str | Path, outdir: str | Path | None = None) -> Path:
|
|
resolved = resolve_course_repo(course_repo)
|
|
target = Path(outdir) if outdir is not None else Path(resolved.generated_pack_dir or (Path(resolved.repo_root) / "generated" / "pack"))
|
|
export_promoted_pack(session, target)
|
|
return target
|
|
|
|
|
|
def export_review_ui_data(session: ReviewSession, outdir: str | Path) -> None:
|
|
outdir = Path(outdir)
|
|
outdir.mkdir(parents=True, exist_ok=True)
|
|
payload = {
|
|
"reviewer": session.reviewer,
|
|
"draft_pack": session.draft_pack.model_dump(),
|
|
"ledger": [entry.model_dump() for entry in session.ledger],
|
|
}
|
|
(outdir / "review_data.json").write_text(json.dumps(payload, indent=2), encoding="utf-8")
|