aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xfanfictioner45
1 files changed, 45 insertions, 0 deletions
diff --git a/fanfictioner b/fanfictioner
index 43691b9..888d06e 100755
--- a/fanfictioner
+++ b/fanfictioner
@@ -152,6 +152,32 @@ Model: krea2
"""
+def edit_groups(chars):
+ """Qwen edit takes the scene plus at most 2 reference sheets, so chain groups of 2."""
+ return [chars[i:i + 2] for i in range(0, len(chars), 2)]
+
+
+def edit_hint(plan):
+ return "\n".join(f"Page {p['n']}: " + (" then ".join("[" + ", ".join(g) + "]"
+ for g in edit_groups(p["characters"]))
+ or "no edits")
+ for p in plan["pages"])
+
+
+def check_json(pj, plan):
+ errs = []
+ if [c["name"] for c in pj["characters"]] != list(plan["characters"]):
+ errs.append("characters differ from plan.md")
+ want = {p["n"]: p["characters"] for p in plan["pages"]}
+ if sorted(p["n"] for p in pj["pages"]) != sorted(want):
+ errs.append("pages differ from plan.md")
+ for p in pj["pages"]:
+ got, exp = [e["characters"] for e in p["edits"]], edit_groups(want.get(p["n"], []))
+ if got != exp:
+ errs.append(f"page {p['n']}: edit groups {got}, expected {exp}")
+ return errs
+
+
def selftest():
plan = parse_plan(SAMPLE_PLAN)
assert (plan["title"], plan["series"], plan["book"]) == ("Rooftop", "Test Series", "Book One"), plan
@@ -177,6 +203,25 @@ def selftest():
assert validate_plan(parse_plan("")) == ["missing title", "missing series", "missing book",
"no characters", "no pages"]
+ assert edit_groups([]) == []
+ assert edit_groups(["Mara", "Jon", "Kit"]) == [["Mara", "Jon"], ["Kit"]]
+ assert edit_groups(list("abcd")) == [["a", "b"], ["c", "d"]]
+ assert edit_hint(plan) == "Page 1: [Mara, Jon] then [Kit]\nPage 2: no edits"
+
+ good = {"characters": [{"name": n, "turnaround_prompt": "x"} for n in ("Mara", "Jon", "Kit")],
+ "pages": [{"n": 1, "orientation": "landscape", "base_prompt": "x",
+ "edits": [{"characters": ["Mara", "Jon"], "prompt": "x"},
+ {"characters": ["Kit"], "prompt": "x"}]},
+ {"n": 2, "orientation": "portrait", "base_prompt": "x", "edits": []}]}
+ assert check_json(good, plan) == []
+ regrouped = json.loads(json.dumps(good))
+ regrouped["pages"][0]["edits"] = [{"characters": ["Mara"], "prompt": "x"},
+ {"characters": ["Jon", "Kit"], "prompt": "x"}]
+ assert check_json(regrouped, plan) == [
+ "page 1: edit groups [['Mara'], ['Jon', 'Kit']], expected [['Mara', 'Jon'], ['Kit']]"]
+ short = json.loads(json.dumps(good))
+ del short["characters"][2], short["pages"][1]
+ assert check_json(short, plan) == ["characters differ from plan.md", "pages differ from plan.md"]
with tempfile.TemporaryDirectory() as t:
t = Path(t)
(t / "c.conf").write_text('# comment\nLIBRARY="/data/my lib"\nPORT=8642\n')