diff options
| -rwxr-xr-x | fanfictioner | 45 |
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') |
