Skip to content

v3.45.0: # 3.45.0 (2026-09-15)

Choose a tag to compare

@github-actions github-actions released this 15 Sep 18:09
· 105 commits to main since this release

3.45.0 (2026-09-15)

The curation verbs land over the 1.19.0 riders, the trash gets a surface, and the live prose layer cleans up

  • --rename-entity KIND OLD NEW: the fix-the-misspelled-name verb over cquarry 1.19's rename_entity, which had ridden the floor for two releases with zero consumers. Renames a tag, author, series, or publisher everywhere; a rename into an existing name MERGES the rows (links move to the survivor, duplicate links drop); a no-match old name is a clean exit 1 and an unknown kind a usage exit 2. Author renames recompute author_sort and re-lay paths; series merges renumber incoming books.
  • --set-author-sort / --set-title-sort BOOK SORT: the passthrough sort setters, storing hand-tuned corrections verbatim; a later --set-authors / --set-title deliberately recomputes over them.
  • The trash surface: --trash lists the library's .caltrash entries (category, book id, age, files) through a pure read-only filesystem inventory, and run trash --empty / --expire DAYS owns the lifecycle through cquarry 1.20's verbs, dry-run listing by default with --apply executing. The apply half opens metadata.db writable to reach the upstream verbs, so the closed-Calibre guard applies; no backup is owed because the database itself never changes. --format json carries the plan/results shape.
  • restrict's refusal list, SINGLE_BOOK_DESTS, and the setwrite combination guard keep step with the three new write dests, with a test pinning that they must; the README's full-help dump is regenerated byte-identical from the live parser.
  • The live em-dash layer is gone: all eleven rendered CLI separators (including the catalog header frozen into README's sample output), the README/spec titles, and every live README/spec line are recast; the patchnotes 3.40.0 entry's ASCII-dash sites are recast; the "not crying wolf" echo now appears once; the CalibreQuarry (cquarry-cli) rename injections are down to one first-use mention (fixing the possessive grammar break). Comments keep their dashes by convention.
  • Comment truths: _fetch_metadata's docstring names the failed return; the download-segment comment no longer names calibredb; integrate's docstring says which verbs actually drive external programs; setwrite's JSON report shape names the ids key; treeaudit's tolerance wording matches its extra_cover_file class; audit_isbns' exit contract names the advisory rider; spot_check's 99 means "99 or more failures"; compress_pdf's workflow names both synced size records; the three "Stdlib only" headers that import vir_tui say so; cli.py and tui.py carry module docstrings.
  • Polish: the five dead [DRY RUN] conditionals are gone; audit's dead nested quiet-guard is unwound; run_cover counts already-so rows like run_convert; run_flush honors --format json; the FTS extraction-errors preview gains its tail; the run.py/setwrite.py/fetch_library_codes.py pgrep guards fail closed on OSError like integrate and reconcile already did.
  • Housekeeping: scripts/ exec bits normalized (every shebang'd script executable; the shared db_util.py helper and the JSON template not), and pyproject takes the PEP 639 shape (SPDX license = "MIT" + license-files, the License classifier dropped, Python :: 3 :: Only added; wheel metadata verified). GitHub topics drop the duplicate python3 and near-zero python-314.
  • New-work boxes recorded on the roadmap: the dest-list constants module, the _backup_db triplication, the per-mode --format corners, bindery's unmirrored manual_watermark_repair decisions, the lossy double-manifest wrinkle, and the UI-only pypi tag policy.
  • Suite: 542 → 559 tests.