f-id / src /id /generator /archive.py
marcodsn's picture
Initial Gradio Space
0423b99
Raw
History Blame Contribute Delete
1.56 kB
"""Old-world archive (Section 10).
``worlds/`` retains every generated world; ``worlds/index.json`` is the
append-only index. Summaries feed the author as divergence context so new
worlds don't reuse premises/settings/twists.
"""
from __future__ import annotations
import json
from pathlib import Path
from typing import Any
class Archive:
def __init__(self, worlds_dir: Path) -> None:
self.worlds_dir = worlds_dir
self.index_path = worlds_dir / "index.json"
self.worlds_dir.mkdir(parents=True, exist_ok=True)
def entries(self) -> list[dict[str, Any]]:
if not self.index_path.exists():
return []
data: list[dict[str, Any]] = json.loads(self.index_path.read_text("utf-8"))
return data
def append(self, entry: dict[str, Any]) -> None:
entries = self.entries()
entries.append(entry)
self.index_path.write_text(json.dumps(entries, indent=2), "utf-8")
def bump_play_count(self, world_id: str) -> None:
entries = self.entries()
for e in entries:
if e.get("world_id") == world_id:
e["play_count"] = int(e.get("play_count", 0)) + 1
self.index_path.write_text(json.dumps(entries, indent=2), "utf-8")
def divergence_summaries(self) -> list[dict[str, str]]:
return [
{
"one_line": e.get("one_line", ""),
"setting": e.get("setting", ""),
"twist_tag": e.get("twist_tag", ""),
}
for e in self.entries()
]