Run download jobs and deliver books to CWA

Jobs download new chapters, recheck chapters, replace the book, update
metadata or rebuild from stored chapters. Locked metadata fields keep
their values. A scheduler queues updates. An update finds the library
book of a story through CWA, and fails with an error if it cannot, so
that it never makes a duplicate book.
This commit is contained in:
tim
2026-09-27 23:38:28 +02:00
parent 312dc3efc5
commit 49cd18a09f
8 changed files with 2581 additions and 0 deletions
+25
View File
@@ -0,0 +1,25 @@
"""Daily backups of the database and personal.ini."""
import sqlite3
from datetime import date
from bindery.backup import daily_backup
from bindery.store import Store
def test_one_backup_a_day_and_only_the_newest_are_kept(tmp_path):
store = Store(tmp_path / "bindery.db")
store.create_story("https://example.com/s/1", "example.com", "T", "A", [])
ini = tmp_path / "personal.ini"
ini.write_text("[defaults]\n")
folder = tmp_path / "backups"
for day in range(1, 11):
daily_backup(store, folder, ini, 7, date(2026, 9, day))
assert daily_backup(store, folder, ini, 7, date(2026, 9, 10)) is None
names = sorted(p.name for p in folder.iterdir())
assert names == [f"bindery-2026-09-{d:02}.db" for d in range(4, 11)] + [
f"personal-2026-09-{d:02}.ini" for d in range(4, 11)
]
copy = sqlite3.connect(folder / "bindery-2026-09-10.db")
assert copy.execute("SELECT title FROM stories").fetchall() == [("T",)]
copy.close()