comicbox 5.2.2__tar.gz → 5.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (627) hide show
  1. {comicbox-5.2.2 → comicbox-5.3.0}/.dockerignore +8 -11
  2. {comicbox-5.2.2 → comicbox-5.3.0}/.gitignore +0 -41
  3. {comicbox-5.2.2 → comicbox-5.3.0}/.prettierignore +0 -3
  4. comicbox-5.3.0/.shellignore +2 -0
  5. {comicbox-5.2.2 → comicbox-5.3.0}/NEWS.md +27 -0
  6. {comicbox-5.2.2 → comicbox-5.3.0}/PKG-INFO +43 -11
  7. {comicbox-5.2.2 → comicbox-5.3.0}/README.md +35 -3
  8. comicbox-5.3.0/bin/find-sh.sh +79 -0
  9. comicbox-5.3.0/bin/fix-sh.sh +13 -0
  10. comicbox-5.3.0/bin/lint-sh.sh +14 -0
  11. comicbox-5.3.0/bin/sort-ignore.sh +21 -0
  12. {comicbox-5.2.2 → comicbox-5.3.0}/bun.lock +29 -29
  13. {comicbox-5.2.2 → comicbox-5.3.0}/cfg/eslint.config.base.js +4 -1
  14. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/_pdf.py +14 -5
  15. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/_rar.py +42 -3
  16. comicbox-5.3.0/comicbox/_rar_probe.rar +0 -0
  17. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/archive/archiveinfo.py +3 -3
  18. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/archive/filenames.py +2 -2
  19. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/archive/init.py +35 -4
  20. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/archive/mtime.py +2 -2
  21. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/archive/read.py +4 -17
  22. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/archive/write.py +2 -2
  23. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/computed/stamp.py +2 -4
  24. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/init.py +4 -5
  25. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/print.py +20 -15
  26. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/cli/__init__.py +25 -4
  27. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/cli/epilog.py +18 -0
  28. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/cli/parser.py +13 -2
  29. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/config/__init__.py +2 -1
  30. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/config/online/build.py +17 -11
  31. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/config/online/settings.py +7 -7
  32. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/config/online/template.py +7 -1
  33. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/config/read.py +7 -3
  34. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/config/settings.py +5 -3
  35. comicbox-5.3.0/comicbox/doctor/__init__.py +182 -0
  36. comicbox-5.3.0/comicbox/doctor/archives.py +325 -0
  37. comicbox-5.3.0/comicbox/doctor/context.py +41 -0
  38. comicbox-5.3.0/comicbox/doctor/images.py +133 -0
  39. comicbox-5.3.0/comicbox/doctor/online.py +433 -0
  40. comicbox-5.3.0/comicbox/doctor/packages.py +166 -0
  41. comicbox-5.3.0/comicbox/doctor/render.py +199 -0
  42. comicbox-5.3.0/comicbox/doctor/result.py +73 -0
  43. comicbox-5.3.0/comicbox/doctor/settings.py +307 -0
  44. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/exceptions.py +9 -0
  45. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/fields/time_fields.py +2 -2
  46. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/online/cli_overrides.py +7 -5
  47. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/online/cover_hash.py +94 -14
  48. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/online/matcher.py +3 -3
  49. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/online/rate_gate.py +1 -1
  50. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/online/session_state.py +3 -1
  51. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/online/sources/base.py +16 -1
  52. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comicvine_api/online_source.py +39 -7
  53. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/metron_api/online_source.py +38 -0
  54. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/metron_api/paced_session.py +12 -1
  55. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/logger.py +1 -1
  56. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/online_session.py +1 -2
  57. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/process.py +19 -7
  58. {comicbox-5.2.2 → comicbox-5.3.0}/docs/NEWS.md +27 -0
  59. {comicbox-5.2.2 → comicbox-5.3.0}/docs/README.md +35 -3
  60. {comicbox-5.2.2 → comicbox-5.3.0}/package.json +3 -3
  61. {comicbox-5.2.2 → comicbox-5.3.0}/pyproject.toml +16 -27
  62. {comicbox-5.2.2 → comicbox-5.3.0}/pyproject.toml.orig +16 -27
  63. {comicbox-5.2.2 → comicbox-5.3.0}/tests/calibration/run.py +1 -3
  64. {comicbox-5.2.2 → comicbox-5.3.0}/tests/calibration/test_label_metron.py +2 -1
  65. comicbox-5.3.0/tests/cli/test_cli_doctor.py +205 -0
  66. {comicbox-5.2.2 → comicbox-5.3.0}/tests/cli/test_cli_exit_code.py +30 -0
  67. {comicbox-5.2.2 → comicbox-5.3.0}/tests/schemas/test_pdf_json.py +3 -3
  68. {comicbox-5.2.2 → comicbox-5.3.0}/tests/schemas/test_pdf_xml.py +3 -3
  69. {comicbox-5.2.2 → comicbox-5.3.0}/tests/test_codex_api.py +2 -2
  70. {comicbox-5.2.2 → comicbox-5.3.0}/tests/test_import_export.py +9 -9
  71. {comicbox-5.2.2 → comicbox-5.3.0}/tests/test_mtime.py +3 -7
  72. comicbox-5.3.0/tests/unit/cover_hash_golden.json +11 -0
  73. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_archiveinfo_mtime.py +4 -4
  74. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_cli_dest_template_drift.py +3 -8
  75. comicbox-5.3.0/tests/unit/test_config_enum_inputs.py +65 -0
  76. comicbox-5.3.0/tests/unit/test_config_errors.py +94 -0
  77. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_cover_hash.py +48 -3
  78. comicbox-5.3.0/tests/unit/test_cover_hash_parity.py +158 -0
  79. comicbox-5.3.0/tests/unit/test_doctor_archives.py +267 -0
  80. comicbox-5.3.0/tests/unit/test_doctor_images.py +75 -0
  81. comicbox-5.3.0/tests/unit/test_doctor_online.py +294 -0
  82. comicbox-5.3.0/tests/unit/test_doctor_online_verify.py +277 -0
  83. comicbox-5.3.0/tests/unit/test_doctor_packages.py +122 -0
  84. comicbox-5.3.0/tests/unit/test_doctor_render.py +102 -0
  85. comicbox-5.3.0/tests/unit/test_doctor_settings.py +212 -0
  86. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_lazy_startup.py +18 -4
  87. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_online_degradation.py +4 -0
  88. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_online_prompt_loops.py +2 -1
  89. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_paced_session.py +2 -2
  90. comicbox-5.3.0/tests/unit/test_pdf_date_field.py +54 -0
  91. comicbox-5.3.0/tests/unit/test_pdf_import_guard.py +87 -0
  92. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_process.py +3 -3
  93. comicbox-5.3.0/tests/unit/test_process_archive_errors.py +51 -0
  94. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_quota_reserved_skip.py +5 -2
  95. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_rar_time_overflow.py +4 -4
  96. comicbox-5.3.0/tests/unit/test_rar_tool_probe.py +148 -0
  97. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_rate_limits.py +2 -2
  98. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_read_events.py +2 -2
  99. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_run_parallel.py +1 -2
  100. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_vacuum.py +4 -3
  101. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_xml_cdata_fields.py +3 -3
  102. comicbox-5.3.0/tests/util/cover_images.py +51 -0
  103. {comicbox-5.2.2 → comicbox-5.3.0}/uv.lock +791 -1561
  104. comicbox-5.2.2/bin/fix-sh.sh +0 -7
  105. comicbox-5.2.2/bin/lint-sh.sh +0 -8
  106. comicbox-5.2.2/bin/sort-ignore.sh +0 -10
  107. {comicbox-5.2.2 → comicbox-5.3.0}/.readthedocs.yaml +0 -0
  108. {comicbox-5.2.2 → comicbox-5.3.0}/.shellcheckrc +0 -0
  109. {comicbox-5.2.2 → comicbox-5.3.0}/Makefile +0 -0
  110. {comicbox-5.2.2 → comicbox-5.3.0}/bin/ci-reuse-dist.sh +0 -0
  111. {comicbox-5.2.2 → comicbox-5.3.0}/bin/clean-pycache.sh +0 -0
  112. {comicbox-5.2.2 → comicbox-5.3.0}/bin/cleanup-pypi-alpha.sh +0 -0
  113. {comicbox-5.2.2 → comicbox-5.3.0}/bin/dev-module.sh +0 -0
  114. {comicbox-5.2.2 → comicbox-5.3.0}/bin/docker-compose-exit.sh +0 -0
  115. {comicbox-5.2.2 → comicbox-5.3.0}/bin/docker-tag-latest.sh +0 -0
  116. {comicbox-5.2.2 → comicbox-5.3.0}/bin/fix-docker.sh +0 -0
  117. {comicbox-5.2.2 → comicbox-5.3.0}/bin/fix-python.sh +0 -0
  118. {comicbox-5.2.2 → comicbox-5.3.0}/bin/fix.sh +0 -0
  119. {comicbox-5.2.2 → comicbox-5.3.0}/bin/hub_prune_stale.py +0 -0
  120. {comicbox-5.2.2 → comicbox-5.3.0}/bin/kill-eslint_d.sh +0 -0
  121. {comicbox-5.2.2 → comicbox-5.3.0}/bin/lint-ci.sh +0 -0
  122. {comicbox-5.2.2 → comicbox-5.3.0}/bin/lint-complexity.sh +0 -0
  123. {comicbox-5.2.2 → comicbox-5.3.0}/bin/lint-darwin.sh +0 -0
  124. {comicbox-5.2.2 → comicbox-5.3.0}/bin/lint-docker.sh +0 -0
  125. {comicbox-5.2.2 → comicbox-5.3.0}/bin/lint-python.sh +0 -0
  126. {comicbox-5.2.2 → comicbox-5.3.0}/bin/lint-vulture.sh +0 -0
  127. {comicbox-5.2.2 → comicbox-5.3.0}/bin/lint.sh +0 -0
  128. {comicbox-5.2.2 → comicbox-5.3.0}/bin/prettier-nginx.sh +0 -0
  129. {comicbox-5.2.2 → comicbox-5.3.0}/bin/publish-pypi.sh +0 -0
  130. {comicbox-5.2.2 → comicbox-5.3.0}/bin/regenerate-pdf-test-pages.py +0 -0
  131. {comicbox-5.2.2 → comicbox-5.3.0}/bin/release-tag.sh +0 -0
  132. {comicbox-5.2.2 → comicbox-5.3.0}/bin/release_info.py +0 -0
  133. {comicbox-5.2.2 → comicbox-5.3.0}/bin/roman.py +0 -0
  134. {comicbox-5.2.2 → comicbox-5.3.0}/bin/test-docker.sh +0 -0
  135. {comicbox-5.2.2 → comicbox-5.3.0}/bin/test-python.sh +0 -0
  136. {comicbox-5.2.2 → comicbox-5.3.0}/bin/type-python.sh +0 -0
  137. {comicbox-5.2.2 → comicbox-5.3.0}/bin/uml.sh +0 -0
  138. {comicbox-5.2.2 → comicbox-5.3.0}/bin/update-deps-node.sh +0 -0
  139. {comicbox-5.2.2 → comicbox-5.3.0}/bin/update-deps-python.sh +0 -0
  140. {comicbox-5.2.2 → comicbox-5.3.0}/bin/version-node.sh +0 -0
  141. {comicbox-5.2.2 → comicbox-5.3.0}/bin/version-python.sh +0 -0
  142. {comicbox-5.2.2 → comicbox-5.3.0}/cfg/ci.mk +0 -0
  143. {comicbox-5.2.2 → comicbox-5.3.0}/cfg/common.mk +0 -0
  144. {comicbox-5.2.2 → comicbox-5.3.0}/cfg/docker.mk +0 -0
  145. {comicbox-5.2.2 → comicbox-5.3.0}/cfg/docs.mk +0 -0
  146. {comicbox-5.2.2 → comicbox-5.3.0}/cfg/gha_std.mk +0 -0
  147. {comicbox-5.2.2 → comicbox-5.3.0}/cfg/help.mk +0 -0
  148. {comicbox-5.2.2 → comicbox-5.3.0}/cfg/node.mk +0 -0
  149. {comicbox-5.2.2 → comicbox-5.3.0}/cfg/node_root.mk +0 -0
  150. {comicbox-5.2.2 → comicbox-5.3.0}/cfg/python.mk +0 -0
  151. {comicbox-5.2.2 → comicbox-5.3.0}/check-jsonschema.sh +0 -0
  152. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/__init__.py +0 -0
  153. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/__init__.py +0 -0
  154. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/archive/__init__.py +0 -0
  155. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/archive/archive.py +0 -0
  156. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/archive/pages.py +0 -0
  157. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/archive/sniff.py +0 -0
  158. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/computed/__init__.py +0 -0
  159. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/computed/date.py +0 -0
  160. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/computed/identifiers.py +0 -0
  161. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/computed/issue.py +0 -0
  162. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/computed/notes.py +0 -0
  163. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/computed/pages.py +0 -0
  164. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/computed/stories_title.py +0 -0
  165. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/computed/url_identifiers.py +0 -0
  166. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/computed/urls.py +0 -0
  167. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/dump.py +0 -0
  168. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/dump_files.py +0 -0
  169. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/load.py +0 -0
  170. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/merge.py +0 -0
  171. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/metadata.py +0 -0
  172. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/normalize.py +0 -0
  173. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/online_covers.py +0 -0
  174. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/online_lookup.py +0 -0
  175. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/pages/__init__.py +0 -0
  176. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/pages/covers.py +0 -0
  177. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/pages/extract.py +0 -0
  178. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/sources.py +0 -0
  179. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/types.py +0 -0
  180. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/validate/__init__.py +0 -0
  181. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/box/validate/guess_format.py +0 -0
  182. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/cli/__main__.py +0 -0
  183. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/config/computed.py +0 -0
  184. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/config/formats.py +0 -0
  185. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/config/online/__init__.py +0 -0
  186. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/config/paths.py +0 -0
  187. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/config_default.yaml +0 -0
  188. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/constants.py +0 -0
  189. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/empty.py +0 -0
  190. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/enums/__init__.py +0 -0
  191. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/enums/comet.py +0 -0
  192. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/enums/comicbookinfo.py +0 -0
  193. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/enums/comicbox.py +0 -0
  194. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/enums/comicinfo.py +0 -0
  195. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/enums/generic/__init__.py +0 -0
  196. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/enums/generic/age_rating.py +0 -0
  197. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/enums/generic/role.py +0 -0
  198. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/enums/maps/__init__.py +0 -0
  199. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/enums/maps/age_rating.py +0 -0
  200. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/enums/maps/formats.py +0 -0
  201. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/enums/maps/identifiers.py +0 -0
  202. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/enums/maps/reading_direction.py +0 -0
  203. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/enums/maps/roles.py +0 -0
  204. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/enums/metroninfo.py +0 -0
  205. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/events.py +0 -0
  206. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/__init__.py +0 -0
  207. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/_base.py +0 -0
  208. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/__init__.py +0 -0
  209. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/fields/__init__.py +0 -0
  210. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/fields/collection_fields.py +0 -0
  211. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/fields/comicbox.py +0 -0
  212. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/fields/comicinfo.py +0 -0
  213. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/fields/enum_fields.py +0 -0
  214. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/fields/fields.py +0 -0
  215. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/fields/metroninfo.py +0 -0
  216. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/fields/number_fields.py +0 -0
  217. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/fields/pdf.py +0 -0
  218. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/fields/pycountry.py +0 -0
  219. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/fields/union.py +0 -0
  220. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/fields/xml_fields.py +0 -0
  221. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/online/__init__.py +0 -0
  222. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/online/auto_engage.py +0 -0
  223. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/online/credentials.py +0 -0
  224. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/online/outcome_stats.py +0 -0
  225. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/online/profile.py +0 -0
  226. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/online/prompt.py +0 -0
  227. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/online/rate_limits.py +0 -0
  228. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/online/retry.py +0 -0
  229. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/online/sanitize.py +0 -0
  230. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/online/selector.py +0 -0
  231. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/online/series_cache.py +0 -0
  232. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/online/series_filter.py +0 -0
  233. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/online/signals.py +0 -0
  234. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/online/sources/__init__.py +0 -0
  235. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/online/transform_helpers.py +0 -0
  236. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/online/vacuum.py +0 -0
  237. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/online/warn_once.py +0 -0
  238. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/schemas/__init__.py +0 -0
  239. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/schemas/base.py +0 -0
  240. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/schemas/cache.py +0 -0
  241. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/schemas/decorators.py +0 -0
  242. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/schemas/error_store.py +0 -0
  243. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/schemas/json_schemas.py +0 -0
  244. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/schemas/xml_schemas.py +0 -0
  245. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/schemas/yaml.py +0 -0
  246. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/transforms/__init__.py +0 -0
  247. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/transforms/base.py +0 -0
  248. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/transforms/identifiers.py +0 -0
  249. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/transforms/price.py +0 -0
  250. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/transforms/publishing_tags.py +0 -0
  251. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/transforms/spec.py +0 -0
  252. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/transforms/xml_credits.py +0 -0
  253. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/base/transforms/xml_reprints.py +0 -0
  254. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comet/__init__.py +0 -0
  255. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comet/schema.py +0 -0
  256. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comet/transform/__init__.py +0 -0
  257. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comet/transform/reprints.py +0 -0
  258. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comic_book_info/__init__.py +0 -0
  259. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comic_book_info/schema.py +0 -0
  260. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comic_book_info/transform/__init__.py +0 -0
  261. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comic_book_info/transform/credits.py +0 -0
  262. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comic_book_info/transform/rating.py +0 -0
  263. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comic_info/__init__.py +0 -0
  264. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comic_info/schema.py +0 -0
  265. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comic_info/transform/__init__.py +0 -0
  266. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comic_info/transform/identifiers.py +0 -0
  267. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comic_info/transform/manga.py +0 -0
  268. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comic_info/transform/pages.py +0 -0
  269. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comic_info/transform/storyarcs.py +0 -0
  270. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comicbox/__init__.py +0 -0
  271. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comicbox/schema/README.md +0 -0
  272. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comicbox/schema/__init__.py +0 -0
  273. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comicbox/schema/cli.py +0 -0
  274. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comicbox/schema/identifiers.py +0 -0
  275. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comicbox/schema/json_schema.py +0 -0
  276. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comicbox/schema/pages.py +0 -0
  277. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comicbox/schema/publishing.py +0 -0
  278. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comicbox/schema/yaml.py +0 -0
  279. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comicbox/transform/__init__.py +0 -0
  280. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comicbox/transform/cli.py +0 -0
  281. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comicbox/transform/credits.py +0 -0
  282. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comicbox/transform/json.py +0 -0
  283. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comicbox/transform/name_objs.py +0 -0
  284. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comicbox/transform/yaml.py +0 -0
  285. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comicvine_api/__init__.py +0 -0
  286. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comicvine_api/schema.py +0 -0
  287. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/comicvine_api/transform.py +0 -0
  288. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/filename/__init__.py +0 -0
  289. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/filename/schema.py +0 -0
  290. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/filename/transform.py +0 -0
  291. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/metron_api/__init__.py +0 -0
  292. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/metron_api/schema.py +0 -0
  293. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/metron_api/transform.py +0 -0
  294. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/metron_info/__init__.py +0 -0
  295. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/metron_info/schema/__init__.py +0 -0
  296. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/metron_info/schema/credits.py +0 -0
  297. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/metron_info/schema/identifiers.py +0 -0
  298. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/metron_info/schema/price.py +0 -0
  299. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/metron_info/schema/publishing.py +0 -0
  300. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/metron_info/schema/rating.py +0 -0
  301. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/metron_info/schema/resource.py +0 -0
  302. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/metron_info/transform/__init__.py +0 -0
  303. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/metron_info/transform/const.py +0 -0
  304. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/metron_info/transform/credits.py +0 -0
  305. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/metron_info/transform/identified_name.py +0 -0
  306. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/metron_info/transform/identifier_attribute.py +0 -0
  307. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/metron_info/transform/identifiers.py +0 -0
  308. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/metron_info/transform/publishing_tags.py +0 -0
  309. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/metron_info/transform/rating.py +0 -0
  310. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/metron_info/transform/reprints.py +0 -0
  311. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/metron_info/transform/resources.py +0 -0
  312. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/pdf/__init__.py +0 -0
  313. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/pdf/schema.py +0 -0
  314. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/pdf/transform/__init__.py +0 -0
  315. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/pdf/transform/credits.py +0 -0
  316. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/formats/sources.py +0 -0
  317. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/identifiers/__init__.py +0 -0
  318. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/identifiers/identifiers.py +0 -0
  319. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/identifiers/other.py +0 -0
  320. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/identifiers/urns.py +0 -0
  321. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/merge/__init__.py +0 -0
  322. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/merge/mergedeep.py +0 -0
  323. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/online_estimate.py +0 -0
  324. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/predict.py +0 -0
  325. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/print.py +0 -0
  326. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/py.typed +0 -0
  327. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/run.py +0 -0
  328. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/CoMet-v1.1.xsd +0 -0
  329. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/ComicInfo-v2.1-Draft.xsd +0 -0
  330. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/MetronInfo-v1.1.xsd +0 -0
  331. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/comic-book-info-v1.0.schema.json +0 -0
  332. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v1.0/comicbox-v1.0.schema.json +0 -0
  333. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v1.0/page.schema.json +0 -0
  334. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v1.0/reprint.schema.json +0 -0
  335. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v1.0/series.schema.json +0 -0
  336. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v1.0/volume.schema.json +0 -0
  337. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v2.0/comicbox-v2.0.schema.json +0 -0
  338. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v2.0/comicbox.example.yaml +0 -0
  339. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v2.0/credit.schema.json +0 -0
  340. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v2.0/date.schema.json +0 -0
  341. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v2.0/identified-object.schema.json +0 -0
  342. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v2.0/identified-objects.schema.json +0 -0
  343. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v2.0/identifiers.schema.json +0 -0
  344. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v2.0/named-identified-object.schema.json +0 -0
  345. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v2.0/page.schema.json +0 -0
  346. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v2.0/reprint.schema.json +0 -0
  347. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v2.0/series.schema.json +0 -0
  348. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v2.0/volume.schema.json +0 -0
  349. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v3.0/alternative-name.schema.json +0 -0
  350. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v3.0/comicbox-v3.0.schema.json +0 -0
  351. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v3.0/comicbox.example.yaml +0 -0
  352. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v3.0/credit.schema.json +0 -0
  353. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v3.0/date.schema.json +0 -0
  354. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v3.0/identified-object.schema.json +0 -0
  355. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v3.0/identified-objects.schema.json +0 -0
  356. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v3.0/identifiers.schema.json +0 -0
  357. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v3.0/named-identified-object.schema.json +0 -0
  358. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v3.0/page.schema.json +0 -0
  359. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v3.0/reprint.schema.json +0 -0
  360. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v3.0/role.schema.json +0 -0
  361. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v3.0/series.schema.json +0 -0
  362. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/schemas/v3.0/volume.schema.json +0 -0
  363. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/validate/__init__.py +0 -0
  364. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/validate/base.py +0 -0
  365. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/validate/json_validator.py +0 -0
  366. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/validate/spec.py +0 -0
  367. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/validate/xml_validator.py +0 -0
  368. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/validate/yaml_validator.py +0 -0
  369. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/version.py +0 -0
  370. {comicbox-5.2.2 → comicbox-5.3.0}/comicbox/write.py +0 -0
  371. {comicbox-5.2.2 → comicbox-5.3.0}/compose.yaml +0 -0
  372. {comicbox-5.2.2 → comicbox-5.3.0}/docs/requirements.txt +0 -0
  373. {comicbox-5.2.2 → comicbox-5.3.0}/docs/style.css +0 -0
  374. {comicbox-5.2.2 → comicbox-5.3.0}/docs/style.mkdocs.css +0 -0
  375. {comicbox-5.2.2 → comicbox-5.3.0}/eslint.config.js +0 -0
  376. {comicbox-5.2.2 → comicbox-5.3.0}/generate-schema/gen-schema-docs.sh +0 -0
  377. {comicbox-5.2.2 → comicbox-5.3.0}/generate-schema/gen-schema.sh +0 -0
  378. {comicbox-5.2.2 → comicbox-5.3.0}/generate-schema/mjs.py +0 -0
  379. {comicbox-5.2.2 → comicbox-5.3.0}/mkdocs.yml +0 -0
  380. {comicbox-5.2.2 → comicbox-5.3.0}/tests/__init__.py +0 -0
  381. {comicbox-5.2.2 → comicbox-5.3.0}/tests/calibration/.gitignore +0 -0
  382. {comicbox-5.2.2 → comicbox-5.3.0}/tests/calibration/README.md +0 -0
  383. {comicbox-5.2.2 → comicbox-5.3.0}/tests/calibration/__init__.py +0 -0
  384. {comicbox-5.2.2 → comicbox-5.3.0}/tests/calibration/_harness_helpers.py +0 -0
  385. {comicbox-5.2.2 → comicbox-5.3.0}/tests/calibration/bootstrap.py +0 -0
  386. {comicbox-5.2.2 → comicbox-5.3.0}/tests/calibration/compare.py +0 -0
  387. {comicbox-5.2.2 → comicbox-5.3.0}/tests/calibration/debug_search.py +0 -0
  388. {comicbox-5.2.2 → comicbox-5.3.0}/tests/calibration/fixtures.example.json +0 -0
  389. {comicbox-5.2.2 → comicbox-5.3.0}/tests/calibration/label_metron.py +0 -0
  390. {comicbox-5.2.2 → comicbox-5.3.0}/tests/calibration/sample.py +0 -0
  391. {comicbox-5.2.2 → comicbox-5.3.0}/tests/calibration/summarize.py +0 -0
  392. {comicbox-5.2.2 → comicbox-5.3.0}/tests/calibration/test_bootstrap.py +0 -0
  393. {comicbox-5.2.2 → comicbox-5.3.0}/tests/calibration/test_compare.py +0 -0
  394. {comicbox-5.2.2 → comicbox-5.3.0}/tests/calibration/test_harness.py +0 -0
  395. {comicbox-5.2.2 → comicbox-5.3.0}/tests/calibration/test_harness_checkpoint.py +0 -0
  396. {comicbox-5.2.2 → comicbox-5.3.0}/tests/calibration/test_harness_diagnostics.py +0 -0
  397. {comicbox-5.2.2 → comicbox-5.3.0}/tests/calibration/test_harness_filter.py +0 -0
  398. {comicbox-5.2.2 → comicbox-5.3.0}/tests/calibration/test_harness_resume.py +0 -0
  399. {comicbox-5.2.2 → comicbox-5.3.0}/tests/calibration/test_sample.py +0 -0
  400. {comicbox-5.2.2 → comicbox-5.3.0}/tests/calibration/test_summarize.py +0 -0
  401. {comicbox-5.2.2 → comicbox-5.3.0}/tests/cli/__init__.py +0 -0
  402. {comicbox-5.2.2 → comicbox-5.3.0}/tests/cli/test_cli_export.py +0 -0
  403. {comicbox-5.2.2 → comicbox-5.3.0}/tests/cli/test_cli_extract.py +0 -0
  404. {comicbox-5.2.2 → comicbox-5.3.0}/tests/cli/test_cli_online.py +0 -0
  405. {comicbox-5.2.2 → comicbox-5.3.0}/tests/cli/test_cli_print.py +0 -0
  406. {comicbox-5.2.2 → comicbox-5.3.0}/tests/cli/test_cli_rename.py +0 -0
  407. {comicbox-5.2.2 → comicbox-5.3.0}/tests/cli/test_cli_write.py +0 -0
  408. {comicbox-5.2.2 → comicbox-5.3.0}/tests/conftest.py +0 -0
  409. {comicbox-5.2.2 → comicbox-5.3.0}/tests/const.py +0 -0
  410. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/Captain Science #001 (1950) The Beginning - multi.cbz +0 -0
  411. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/Captain Science #001 (1950) The Beginning - nothing.cbz +0 -0
  412. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/Captain Science #001-cbi.cbr +0 -0
  413. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/Captain Science #001-cix-cbi.cbr +0 -0
  414. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/Captain Science #001-cix.cbt +0 -0
  415. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/Captain Science #001-cix.cbz +0 -0
  416. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/Captain Science #001-comet.cbz +0 -0
  417. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/Captain Science #001-metron.cbz +0 -0
  418. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/Captain Science #001.cb7 +0 -0
  419. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/Captain Science #001.cbz +0 -0
  420. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/Captain Science 001/CaptainScience#1_01.jpg +0 -0
  421. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/Captain Science 001/CaptainScience#1_02.jpg +0 -0
  422. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/Captain Science 001/CaptainScience#1_03.jpg +0 -0
  423. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/Captain Science 001/CaptainScience#1_04.jpg +0 -0
  424. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/Captain Science 001/CaptainScience#1_05.jpg +0 -0
  425. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/Captain Science 001/CoMet.xml +0 -0
  426. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/Captain Science 001/comic-book-info.json +0 -0
  427. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/Captain Science 001/comicinfo-original.xml +0 -0
  428. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/Captain Science 001/comicinfo.xml +0 -0
  429. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/Captain Science 001/metroninfo-full.xml +0 -0
  430. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/Captain Science 001/metroninfo.xml +0 -0
  431. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/comicbox-cli.cbz +0 -0
  432. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/comicbox.cbz +0 -0
  433. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/create-archive.sh +0 -0
  434. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/create_cs_archives.py +0 -0
  435. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/create_macos_resource_fork.py +0 -0
  436. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/empty.cbz +0 -0
  437. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/examples/comic-book-info-example.json +0 -0
  438. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/examples/metroninfo-v1.1-valid.xml +0 -0
  439. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/export/comet.xml +0 -0
  440. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/export/comic-book-info.json +0 -0
  441. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/export/comicbox-cli.yaml +0 -0
  442. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/export/comicbox.json +0 -0
  443. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/export/comicbox.yaml +0 -0
  444. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/export/comicinfo.xml +0 -0
  445. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/export/create-export-archive.sh +0 -0
  446. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/export/metroninfo.xml +0 -0
  447. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/export/mupdf.json +0 -0
  448. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/export/pdf-metadata.xml +0 -0
  449. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/export.cbz +0 -0
  450. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/list_recurse_output.txt +0 -0
  451. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/macos_resource_fork.cbz +0 -0
  452. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/comet-cover-path-list.xml +0 -0
  453. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/comet-write.xml +0 -0
  454. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/comet.xml +0 -0
  455. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/comic-book-info-example.json +0 -0
  456. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/comic-book-info.json +0 -0
  457. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/comicbox-cli.yaml +0 -0
  458. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/comicbox-filename.txt +0 -0
  459. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/comicbox-write.json +0 -0
  460. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/comicbox-write.yaml +0 -0
  461. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/comicbox.json +0 -0
  462. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/comicbox.xml +0 -0
  463. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/comicbox.yaml +0 -0
  464. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/comicinfo-bad-multiple.xml +0 -0
  465. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/comicinfo-cover-path-list.xml +0 -0
  466. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/comicinfo-ids-from-tags.xml +0 -0
  467. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/comicinfo-metron-origin.xml +0 -0
  468. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/comicinfo-notes-date.xml +0 -0
  469. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/comicinfo-validation.xml +0 -0
  470. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/comicinfo-write.xml +0 -0
  471. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/comicinfo.xml +0 -0
  472. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/create-archives.sh +0 -0
  473. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/metroninfo-no-primary-id.xml +0 -0
  474. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/metroninfo-v1.1-valid.xml +0 -0
  475. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/metroninfo-write.xml +0 -0
  476. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/metroninfo.xml +0 -0
  477. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/mupdf-nested.json +0 -0
  478. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/mupdf.json +0 -0
  479. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/pdf-cix.xml +0 -0
  480. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/pdf-nested.xml +0 -0
  481. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/metadata/pdf.xml +0 -0
  482. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/multi/comet.xml +0 -0
  483. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/multi/comic-book-info.json +0 -0
  484. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/multi/comicbox-filename.txt +0 -0
  485. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/multi/comicbox.json +0 -0
  486. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/multi/comicbox.yaml +0 -0
  487. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/multi/comicinfo.xml +0 -0
  488. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/multi/create-multi-archive.sh +0 -0
  489. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/patchme.cbz +0 -0
  490. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/pdf/0.pdf +0 -0
  491. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/pdf/1.pdf +0 -0
  492. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/pdf/2.pdf +0 -0
  493. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/pdf/3.pdf +0 -0
  494. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/test_cix.pdf +0 -0
  495. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/test_pdf.pdf +0 -0
  496. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/test_pdf_legacy_keywords.pdf +0 -0
  497. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/xml.cbz +0 -0
  498. {comicbox-5.2.2 → comicbox-5.3.0}/tests/files/yaml.cbz +0 -0
  499. {comicbox-5.2.2 → comicbox-5.3.0}/tests/schemas/__init__.py +0 -0
  500. {comicbox-5.2.2 → comicbox-5.3.0}/tests/schemas/test_cbi.py +0 -0
  501. {comicbox-5.2.2 → comicbox-5.3.0}/tests/schemas/test_cix.py +0 -0
  502. {comicbox-5.2.2 → comicbox-5.3.0}/tests/schemas/test_comet.py +0 -0
  503. {comicbox-5.2.2 → comicbox-5.3.0}/tests/schemas/test_filename.py +0 -0
  504. {comicbox-5.2.2 → comicbox-5.3.0}/tests/schemas/test_json.py +0 -0
  505. {comicbox-5.2.2 → comicbox-5.3.0}/tests/schemas/test_json_schema_drift.py +0 -0
  506. {comicbox-5.2.2 → comicbox-5.3.0}/tests/schemas/test_metron.py +0 -0
  507. {comicbox-5.2.2 → comicbox-5.3.0}/tests/schemas/test_multi.py +0 -0
  508. {comicbox-5.2.2 → comicbox-5.3.0}/tests/schemas/test_validation.py +0 -0
  509. {comicbox-5.2.2 → comicbox-5.3.0}/tests/schemas/test_yaml.py +0 -0
  510. {comicbox-5.2.2 → comicbox-5.3.0}/tests/stress/.gitignore +0 -0
  511. {comicbox-5.2.2 → comicbox-5.3.0}/tests/stress/README.md +0 -0
  512. {comicbox-5.2.2 → comicbox-5.3.0}/tests/stress/__init__.py +0 -0
  513. {comicbox-5.2.2 → comicbox-5.3.0}/tests/stress/jobs_accuracy.py +0 -0
  514. {comicbox-5.2.2 → comicbox-5.3.0}/tests/stress/prompt_ux.py +0 -0
  515. {comicbox-5.2.2 → comicbox-5.3.0}/tests/stress/run.py +0 -0
  516. {comicbox-5.2.2 → comicbox-5.3.0}/tests/stress/test_jobs_accuracy.py +0 -0
  517. {comicbox-5.2.2 → comicbox-5.3.0}/tests/stress/test_prompt_ux.py +0 -0
  518. {comicbox-5.2.2 → comicbox-5.3.0}/tests/stress/test_run.py +0 -0
  519. {comicbox-5.2.2 → comicbox-5.3.0}/tests/test_compute.py +0 -0
  520. {comicbox-5.2.2 → comicbox-5.3.0}/tests/test_convert_pdf.py +0 -0
  521. {comicbox-5.2.2 → comicbox-5.3.0}/tests/test_extract.py +0 -0
  522. {comicbox-5.2.2 → comicbox-5.3.0}/tests/test_pages.py +0 -0
  523. {comicbox-5.2.2 → comicbox-5.3.0}/tests/test_stories_title.py +0 -0
  524. {comicbox-5.2.2 → comicbox-5.3.0}/tests/test_validate_testfiles.py +0 -0
  525. {comicbox-5.2.2 → comicbox-5.3.0}/tests/test_writing.py +0 -0
  526. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/__init__.py +0 -0
  527. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_archive_errors.py +0 -0
  528. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_archive_read.py +0 -0
  529. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_auto_engage.py +0 -0
  530. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_box_cache_invalidation.py +0 -0
  531. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_cbi_rating_normalize.py +0 -0
  532. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_cli_choices_enum_drift.py +0 -0
  533. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_cli_dest_folds.py +0 -0
  534. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_comicinfo_alternates.py +0 -0
  535. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_comicinfo_series_groups.py +0 -0
  536. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_comicvine.py +0 -0
  537. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_comicvine_client.py +0 -0
  538. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_comicvine_session_lifecycle.py +0 -0
  539. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_computed_pipeline.py +0 -0
  540. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_computed_reprints.py +0 -0
  541. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_config_container_inputs.py +0 -0
  542. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_config_defaults_drift.py +0 -0
  543. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_config_env_tree.py +0 -0
  544. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_config_file_option.py +0 -0
  545. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_config_layering.py +0 -0
  546. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_config_no_path_guard.py +0 -0
  547. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_config_online_leaf.py +0 -0
  548. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_config_online_sources.py +0 -0
  549. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_credit_primary.py +0 -0
  550. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_defer_prompts.py +0 -0
  551. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_destination_occupied_error.py +0 -0
  552. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_error_store_visibility.py +0 -0
  553. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_exceptions.py +0 -0
  554. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_identifiers.py +0 -0
  555. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_library_logging.py +0 -0
  556. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_list_field_dedupe.py +0 -0
  557. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_list_field_sort_key_types.py +0 -0
  558. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_manga_and_age_rating.py +0 -0
  559. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_manga_volume.py +0 -0
  560. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_merge_mode_config.py +0 -0
  561. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_merge_order.py +0 -0
  562. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_merge_precedence.py +0 -0
  563. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_mergedeep.py +0 -0
  564. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_metron_community_rating.py +0 -0
  565. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_metron_id_attribute_fallback.py +0 -0
  566. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_metron_prefetch.py +0 -0
  567. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_metron_session_lifecycle.py +0 -0
  568. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_metron_source.py +0 -0
  569. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_metron_transform.py +0 -0
  570. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_online.py +0 -0
  571. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_online_abort_propagation.py +0 -0
  572. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_online_estimate.py +0 -0
  573. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_online_events.py +0 -0
  574. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_online_lookup.py +0 -0
  575. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_online_matcher.py +0 -0
  576. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_online_matcher_resolution.py +0 -0
  577. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_online_matcher_scoring.py +0 -0
  578. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_online_prompt.py +0 -0
  579. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_online_result_contract.py +0 -0
  580. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_online_retry.py +0 -0
  581. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_online_selector.py +0 -0
  582. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_online_session.py +0 -0
  583. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_online_session_state.py +0 -0
  584. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_outcome_stats.py +0 -0
  585. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_parse_decimal.py +0 -0
  586. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_parse_issue.py +0 -0
  587. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_pdf_pages_help.py +0 -0
  588. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_prompt_dedup.py +0 -0
  589. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_rate_gate.py +0 -0
  590. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_rate_gate_concurrency.py +0 -0
  591. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_refresh_cache.py +0 -0
  592. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_rename_and_convert_safety.py +0 -0
  593. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_reprints_and_alternative_names.py +0 -0
  594. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_rich_transforms.py +0 -0
  595. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_role_vocabulary.py +0 -0
  596. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_run_recurse.py +0 -0
  597. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_series_cache.py +0 -0
  598. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_series_filter.py +0 -0
  599. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_series_single_flight.py +0 -0
  600. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_session_series_batching.py +0 -0
  601. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_single_valued_tags.py +0 -0
  602. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_sniff.py +0 -0
  603. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_sources.py +0 -0
  604. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_to_metron_age_rating.py +0 -0
  605. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_transform_spec_dest_collisions.py +0 -0
  606. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_transform_spec_missing_keys.py +0 -0
  607. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_transform_spec_scope_phases.py +0 -0
  608. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_urls_and_identifiers.py +0 -0
  609. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_validate.py +0 -0
  610. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_write_api.py +0 -0
  611. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_write_destination_prediction.py +0 -0
  612. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_write_destination_safety.py +0 -0
  613. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_write_order_and_claims.py +0 -0
  614. {comicbox-5.2.2 → comicbox-5.3.0}/tests/unit/test_yes_no_field.py +0 -0
  615. {comicbox-5.2.2 → comicbox-5.3.0}/tests/util/__init__.py +0 -0
  616. {comicbox-5.2.2 → comicbox-5.3.0}/tests/util/compare.py +0 -0
  617. {comicbox-5.2.2 → comicbox-5.3.0}/tests/util/diff.py +0 -0
  618. {comicbox-5.2.2 → comicbox-5.3.0}/tests/util/metadata.py +0 -0
  619. {comicbox-5.2.2 → comicbox-5.3.0}/tests/util/metron_transport.py +0 -0
  620. {comicbox-5.2.2 → comicbox-5.3.0}/tests/util/online_client.py +0 -0
  621. {comicbox-5.2.2 → comicbox-5.3.0}/tests/util/online_matcher.py +0 -0
  622. {comicbox-5.2.2 → comicbox-5.3.0}/tests/util/online_prompt.py +0 -0
  623. {comicbox-5.2.2 → comicbox-5.3.0}/tests/util/parser.py +0 -0
  624. {comicbox-5.2.2 → comicbox-5.3.0}/tests/util/tmp.py +0 -0
  625. {comicbox-5.2.2 → comicbox-5.3.0}/tests/validate_cli.py +0 -0
  626. {comicbox-5.2.2 → comicbox-5.3.0}/validate-schema.sh +0 -0
  627. {comicbox-5.2.2 → comicbox-5.3.0}/vulture_ignorelist.py +0 -0
@@ -1,25 +1,22 @@
1
- __pycache__
2
- .*cache
3
1
  .claude
4
2
  .coverage*
5
- .DS_Store
6
3
  .env*
7
4
  .git
8
- .mypy_cache
9
5
  .picopt_timestamp
10
- .pytest_cache
11
6
  .ropeproject
12
- .ruff_cache
13
7
  .venv*
14
- *.egg-info
15
- *.py[co]
16
- *~
8
+ **/__pycache__
9
+ **/.*cache
10
+ **/.DS_Store
11
+ **/*.egg-info
12
+ **/*.py[co]
13
+ **/*~
14
+ **/node_modules
15
+ **/test-results
17
16
  *Dockerfile
18
17
  docker-compose*
19
18
  MANIFEST
20
19
  monkeytype.sqlite3
21
20
  NEWS
22
- node_modules
23
- test-results
24
21
  TODO.md
25
22
  version.sh
@@ -1,7 +1,5 @@
1
1
  __pycache__
2
- __pycache__/
3
2
  __pypackages__
4
- __pypackages__/
5
3
  __snapshots__
6
4
  .*cache
7
5
  .claude
@@ -10,42 +8,28 @@ __snapshots__
10
8
  .docker-token
11
9
  .DS_Store
12
10
  .eggs
13
- .eggs/
14
11
  .env
15
12
  .env-*
16
- .eslintcache
17
13
  .hypothesis
18
- .hypothesis/
19
14
  .installed.cfg
20
15
  .ipynb_checkpoints
21
- .mypy_cache
22
- .mypy_cache/
23
16
  .nox
24
- .nox/
25
17
  .npm
26
18
  .pypi-token
27
19
  .pypirc
28
20
  .pyre
29
- .pyre/
30
- .pytest_cache
31
- .pytest_cache/
32
21
  .Python
33
22
  .python-version
34
23
  .ropeproject
35
- .ruff_cache
36
- .ruff_cache/
37
24
  .scrapy
38
25
  .spyderproject
39
26
  .spyproject
40
27
  .tox
41
- .tox/
42
28
  .uv-publish-env
43
29
  .venv*
44
- .webassets-cache
45
30
  *.cover
46
31
  *.egg
47
32
  *.egg-info
48
- *.egg-info/
49
33
  *.log
50
34
  *.manifest
51
35
  *.mo
@@ -60,67 +44,42 @@ __snapshots__
60
44
  /*.cbr
61
45
  /*.cbz
62
46
  build
63
- build/
64
47
  celerybeat-schedule
65
48
  celerybeat.pid
66
49
  coverage.xml
67
50
  develop-eggs
68
- develop-eggs/
69
51
  dist
70
- dist/
71
52
  dmypy.json
72
53
  docs/_build
73
- docs/_build/
74
54
  downloads
75
- downloads/
76
55
  eggs
77
- eggs/
78
56
  env
79
57
  ENV
80
58
  env.bak
81
- env.bak/
82
- env/
83
- ENV/
84
59
  generate-schema/generated.schema.json
85
60
  htmlcov
86
- htmlcov/
87
61
  instance
88
- instance/
89
62
  ipython_config.py
90
63
  jspm_packages
91
- jspm_packages/
92
64
  lib
93
- lib/
94
65
  lib64
95
- lib64/
96
66
  local_settings.py
97
67
  MANIFEST
98
68
  monkeytype.sqlite3
99
69
  node_modules
100
- node_modules/
101
70
  nosetests.xml
102
71
  parts
103
- parts/
104
72
  pip-delete-this-directory.txt
105
73
  pip-log.txt
106
74
  pip-wheel-metadata
107
- pip-wheel-metadata/
108
75
  profile_default
109
- profile_default/
110
76
  sdist
111
- sdist/
112
77
  share/python-wheels
113
- share/python-wheels/
114
78
  target
115
- target/
116
79
  tasks/
117
80
  test-results
118
81
  TODO.md
119
82
  var
120
- var/
121
83
  venv
122
84
  venv.bak
123
- venv.bak/
124
- venv/
125
85
  wheels
126
- wheels/
@@ -1,15 +1,12 @@
1
1
  __pycache__
2
2
  .*cache
3
- .*cache/
4
3
  .claude
5
4
  .git
6
- .venv
7
5
  *.sh
8
6
  *Dockerfile
9
7
  bun.lock
10
8
  comicbox/schemas/*Info*.xsd
11
9
  dist
12
- Dockerfile
13
10
  node_modules
14
11
  schemas/*Info*.xsd
15
12
  tasks
@@ -0,0 +1,2 @@
1
+ .*
2
+ node_modules
@@ -1,5 +1,32 @@
1
1
  # 📰 News
2
2
 
3
+ ## v5.3.0
4
+
5
+ - Breaking Changes
6
+ - Requires Python 3.11 or later.
7
+ - Features
8
+ - `comicbox doctor` checks archive tools, the PDF extra, image codecs,
9
+ config, credentials and package versions, with a fix for each problem.
10
+ `--online all` also tests each credential with one API request.
11
+ - Fixes
12
+ - CBR support is detected by test-extracting a file; a missing or broken RAR
13
+ tool is reported instead of crashing reads.
14
+ - A broken PDF install disables PDFs with a warning instead of breaking
15
+ comicbox, and `is_pdf_supported()` agrees.
16
+ - A malformed user config is skipped with a warning, and config errors print
17
+ one line instead of a traceback.
18
+ - Per-source online tuning values are validated; unknown sources warn.
19
+ - A broken 7z or RAR library no longer aborts batch reads.
20
+ - Short-form PDF dates, like those without a timezone, are no longer
21
+ dropped.
22
+ - Filenames with long digit runs no longer stall parsing.
23
+ - Config mappings accept enum members like `MatchMode.EAGER` as well as
24
+ their string values.
25
+ - Error messages keep bracketed text like `[digital]`.
26
+ - Dependencies
27
+ - Requires comicfn2dict 1.0, comicbox-pdffile 1.0, simyan 4.2, mokkari 4.9
28
+ and packaging. No longer requires imagehash, numpy, scipy or PyWavelets.
29
+
3
30
  ## v5.2.2
4
31
 
5
32
  - Fixes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: comicbox
3
- Version: 5.2.2
3
+ Version: 5.3.0
4
4
  Summary: Comic book archive multi format metadata read/write/transform tool and image extractor.
5
5
  Keywords: cb7,cbr,cbt,cbz,comet,comic,comicbookinfo,comicinfo,metroninfo,pdf
6
6
  Author: AJ Slater
@@ -13,18 +13,18 @@ Classifier: Operating System :: OS Independent
13
13
  Classifier: Programming Language :: Python :: 3
14
14
  Requires-Dist: bidict~=0.23
15
15
  Requires-Dist: case-converter~=1.2
16
- Requires-Dist: comicfn2dict>=0.3.2,<1.0.0
17
- Requires-Dist: confuse~=2.3.0
16
+ Requires-Dist: comicfn2dict~=1.0
17
+ Requires-Dist: confuse~=2.3
18
18
  Requires-Dist: glom~=25.12
19
19
  Requires-Dist: httpx~=0.28
20
- Requires-Dist: imagehash>=4.3.2
21
20
  Requires-Dist: jsonschema[format]~=4.20
22
21
  Requires-Dist: keyring~=25.6
23
22
  Requires-Dist: loguru~=0.7
24
23
  Requires-Dist: marshmallow-union>=0.1.15.post1
25
24
  Requires-Dist: marshmallow~=4.3
26
- Requires-Dist: mokkari>=4.8.0,<5
25
+ Requires-Dist: mokkari~=4.9.0
27
26
  Requires-Dist: nh3>=0.3.5
27
+ Requires-Dist: packaging>=24.0
28
28
  Requires-Dist: pillow>=12.2.0
29
29
  Requires-Dist: platformdirs>=4.9.6
30
30
  Requires-Dist: py7zr~=1.1.0
@@ -37,13 +37,13 @@ Requires-Dist: rich-argparse~=1.7
37
37
  Requires-Dist: rich~=15.0
38
38
  Requires-Dist: ruamel-yaml~=0.18
39
39
  Requires-Dist: simplejson~=4.0
40
- Requires-Dist: simyan>=4.1.0,<5
40
+ Requires-Dist: simyan~=4.2
41
41
  Requires-Dist: typing-extensions~=4.13
42
42
  Requires-Dist: xmlschema~=4.0
43
43
  Requires-Dist: xmltodict~=1.0
44
44
  Requires-Dist: zipremove~=0.1
45
- Requires-Dist: comicbox-pdffile>=0.6.3,<0.7 ; extra == 'pdf'
46
- Requires-Python: >=3.10
45
+ Requires-Dist: comicbox-pdffile~=1.0 ; extra == 'pdf'
46
+ Requires-Python: >=3.11
47
47
  Project-URL: News, https://comicbox.readthedocs.io/NEWS/
48
48
  Project-URL: Documentation, https://comicbox.readthedocs.io
49
49
  Project-URL: Source, https://github.com/ajslater/comicbox
@@ -93,8 +93,8 @@ as a standalone command line tool for organizing a comic library.
93
93
  | CB7 (7z) | ✅ | converts to CBZ |
94
94
  | PDF | ✅ | ✅ embedded metadata |
95
95
 
96
- CBR extraction and conversion require the `unrar` binary on your `PATH`. PDF
97
- support is an [optional extra](#-installation).
96
+ CBR extraction and conversion require RARLAB's `unrar` binary on your `PATH`.
97
+ PDF support is an [optional extra](#-installation).
98
98
 
99
99
  ### 🏷️ Metadata Formats
100
100
 
@@ -201,7 +201,11 @@ pip install comicbox[pdf]
201
201
  ### Dependencies
202
202
 
203
203
  Comicbox needs no binary dependencies for CBZ, CBT, and CB7. Reading or
204
- converting **CBR** archives requires the `unrar` binary on your `PATH`.
204
+ converting **CBR** archives requires RARLAB's `unrar` binary on your `PATH`
205
+ (`brew install rar` on macOS, `unrar` from Debian's non-free). rarfile falls
206
+ back to bsdtar and 7-Zip, but through rarfile 4.5 bsdtar can't extract RAR at
207
+ all, and 7-Zip builds without the RAR codec can't either. `comicbox doctor` says
208
+ whether this host can read CBRs.
205
209
 
206
210
  The optional PDF extra pulls in
207
211
  [pymupdf](https://pymupdf.readthedocs.io/en/latest/installation.html), which
@@ -364,6 +368,34 @@ optional config file, in that order of precedence.
364
368
  LOGLEVEL=ERROR comicbox -p "comic.cbz"
365
369
  ```
366
370
 
371
+ ## 🩺 Troubleshooting
372
+
373
+ `comicbox doctor` checks everything comicbox depends on outside its own code:
374
+ the RAR tool, the PDF extra, the image codecs online cover matching needs, your
375
+ config files and environment variables, your online credentials, and the Python
376
+ packages comicbox pins. Each row says OK, WARN, OFF (optional and not set up),
377
+ MISSING, WRONG VERSION, MISCONFIGURED or ERROR, with a one-line fix for anything
378
+ that isn't OK.
379
+
380
+ ```sh
381
+ comicbox doctor
382
+
383
+ # The config a run with -c would load.
384
+ comicbox doctor -c tagging.yaml
385
+
386
+ # Problems only. Exits non-zero if something comicbox needs is broken, so it
387
+ # works as a Docker or CI health check.
388
+ comicbox doctor -q
389
+
390
+ # Also verify each configured online source's credentials, with one API
391
+ # request per source.
392
+ comicbox doctor --online all
393
+ ```
394
+
395
+ Credentials are reported by where they came from (`--auth`, an env var, a config
396
+ file, or the keyring), never by value, so the report is safe to paste into a bug
397
+ report.
398
+
367
399
  ## 📦 Related Packages
368
400
 
369
401
  Installing comicbox also installs two small sibling libraries, each usable on
@@ -41,8 +41,8 @@ as a standalone command line tool for organizing a comic library.
41
41
  | CB7 (7z) | ✅ | converts to CBZ |
42
42
  | PDF | ✅ | ✅ embedded metadata |
43
43
 
44
- CBR extraction and conversion require the `unrar` binary on your `PATH`. PDF
45
- support is an [optional extra](#-installation).
44
+ CBR extraction and conversion require RARLAB's `unrar` binary on your `PATH`.
45
+ PDF support is an [optional extra](#-installation).
46
46
 
47
47
  ### 🏷️ Metadata Formats
48
48
 
@@ -149,7 +149,11 @@ pip install comicbox[pdf]
149
149
  ### Dependencies
150
150
 
151
151
  Comicbox needs no binary dependencies for CBZ, CBT, and CB7. Reading or
152
- converting **CBR** archives requires the `unrar` binary on your `PATH`.
152
+ converting **CBR** archives requires RARLAB's `unrar` binary on your `PATH`
153
+ (`brew install rar` on macOS, `unrar` from Debian's non-free). rarfile falls
154
+ back to bsdtar and 7-Zip, but through rarfile 4.5 bsdtar can't extract RAR at
155
+ all, and 7-Zip builds without the RAR codec can't either. `comicbox doctor` says
156
+ whether this host can read CBRs.
153
157
 
154
158
  The optional PDF extra pulls in
155
159
  [pymupdf](https://pymupdf.readthedocs.io/en/latest/installation.html), which
@@ -312,6 +316,34 @@ optional config file, in that order of precedence.
312
316
  LOGLEVEL=ERROR comicbox -p "comic.cbz"
313
317
  ```
314
318
 
319
+ ## 🩺 Troubleshooting
320
+
321
+ `comicbox doctor` checks everything comicbox depends on outside its own code:
322
+ the RAR tool, the PDF extra, the image codecs online cover matching needs, your
323
+ config files and environment variables, your online credentials, and the Python
324
+ packages comicbox pins. Each row says OK, WARN, OFF (optional and not set up),
325
+ MISSING, WRONG VERSION, MISCONFIGURED or ERROR, with a one-line fix for anything
326
+ that isn't OK.
327
+
328
+ ```sh
329
+ comicbox doctor
330
+
331
+ # The config a run with -c would load.
332
+ comicbox doctor -c tagging.yaml
333
+
334
+ # Problems only. Exits non-zero if something comicbox needs is broken, so it
335
+ # works as a Docker or CI health check.
336
+ comicbox doctor -q
337
+
338
+ # Also verify each configured online source's credentials, with one API
339
+ # request per source.
340
+ comicbox doctor --online all
341
+ ```
342
+
343
+ Credentials are reported by where they came from (`--auth`, an env var, a config
344
+ file, or the keyring), never by value, so the report is safe to paste into a bug
345
+ report.
346
+
315
347
  ## 📦 Related Packages
316
348
 
317
349
  Installing comicbox also installs two small sibling libraries, each usable on
@@ -0,0 +1,79 @@
1
+ #!/usr/bin/env bash
2
+ # List shell scripts to fix and lint, honoring .shellignore, NUL-delimited
3
+ #
4
+ # Prints every regular *.sh file under the current directory as `find` prints
5
+ # it (./path/to/file.sh), sorted bytewise, each followed by a NUL. Skips what
6
+ # the optional ./.shellignore excludes. A missing file excludes nothing.
7
+ #
8
+ # .shellignore holds one pattern per line:
9
+ # - Blank lines and lines starting with # are ignored.
10
+ # - A leading ! re-includes what an earlier pattern excluded.
11
+ # - A leading ./ or / and a trailing / are stripped.
12
+ # - A pattern with a / is anchored to this directory: a/b matches ./a/b but
13
+ # not ./x/a/b.
14
+ # - A pattern without a / matches a file or directory name at any depth.
15
+ # - * ? and [...] are glob characters. As in find -path, * also matches /.
16
+ #
17
+ # Excluded directories are pruned, never descended. Like gitignore, a file
18
+ # under an excluded directory cannot be re-included, so ! only helps when it
19
+ # names the pruned directory itself: `.*` then `!.github` keeps ./.github
20
+ # and everything in it.
21
+ #
22
+ # Portable to BSD and GNU find: only -mindepth -name -path -prune -type
23
+ # -print0 -o ! and parentheses.
24
+ set -euo pipefail
25
+
26
+ ignore_file=.shellignore
27
+ ignore_tests=()
28
+ keep_tests=()
29
+
30
+ if [[ -f $ignore_file ]]; then
31
+ while read -r line || [[ -n $line ]]; do
32
+ line=${line//$'\r'/}
33
+ case $line in
34
+ '' | '#'*) continue ;;
35
+ esac
36
+
37
+ negated=false
38
+ if [[ $line == '!'* ]]; then
39
+ negated=true
40
+ line=${line#!}
41
+ fi
42
+ line=${line#./}
43
+ line=${line#/}
44
+ line=${line%/}
45
+ if [[ -z $line ]]; then
46
+ continue
47
+ fi
48
+
49
+ if [[ $line == */* ]]; then
50
+ match=(-path "./$line")
51
+ else
52
+ match=(-name "$line")
53
+ fi
54
+
55
+ if [[ $negated == true ]]; then
56
+ if ((${#keep_tests[@]})); then
57
+ keep_tests+=(-o)
58
+ fi
59
+ keep_tests+=("${match[@]}")
60
+ else
61
+ if ((${#ignore_tests[@]})); then
62
+ ignore_tests+=(-o)
63
+ fi
64
+ ignore_tests+=("${match[@]}")
65
+ fi
66
+ done <"$ignore_file"
67
+ fi
68
+
69
+ find_args=(. -mindepth 1)
70
+ if ((${#ignore_tests[@]})); then
71
+ prune=(\( "${ignore_tests[@]}" \))
72
+ if ((${#keep_tests[@]})); then
73
+ prune+=(! \( "${keep_tests[@]}" \))
74
+ fi
75
+ find_args+=(\( "${prune[@]}" \) -prune -o)
76
+ fi
77
+ find_args+=(-type f -name '*.sh' -print0)
78
+
79
+ find "${find_args[@]}" | LC_ALL=C sort -z
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env bash
2
+ # Fix shell script formatting
3
+ set -euxo pipefail
4
+
5
+ mapfile -d '' files < <("$(dirname "${BASH_SOURCE[0]}")/find-sh.sh")
6
+ # A failing finder must fail this script, not look like zero files.
7
+ wait "$!"
8
+ if ((${#files[@]} == 0)); then
9
+ exit 0
10
+ fi
11
+
12
+ shellharden --replace "${files[@]}"
13
+ shfmt --simplify --indent 2 --write "${files[@]}"
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env bash
2
+ # Lint shell scripts
3
+ set -euxo pipefail
4
+
5
+ mapfile -d '' files < <("$(dirname "${BASH_SOURCE[0]}")/find-sh.sh")
6
+ # A failing finder must fail this script, not look like zero files.
7
+ wait "$!"
8
+ if ((${#files[@]} == 0)); then
9
+ exit 0
10
+ fi
11
+
12
+ shellcheck --external-sources "${files[@]}"
13
+ shellharden --check "${files[@]}"
14
+ shfmt --simplify --indent 2 --diff "${files[@]}"
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env bash
2
+ # Sort all ignore files in place and remove duplicates
3
+ # Negations (lines starting with !) go after every other line: git, docker and
4
+ # prettier let the last matching line win, so a negation only works after the
5
+ # patterns it overrides.
6
+ set -euo pipefail
7
+ # Set locale to make output deterministic across shells
8
+ export LC_ALL=en_US.UTF-8
9
+ sorted=$(mktemp)
10
+ trap 'rm -f "$sorted"' EXIT
11
+ for f in .*ignore; do
12
+ if [ -f "$f" ] && [ ! -L "$f" ]; then
13
+ {
14
+ sed '/^!/d' "$f" | sort --unique
15
+ sed -n '/^!/p' "$f" | sort --unique
16
+ } >"$sorted"
17
+ # Write through the file, not over it, to keep its mode.
18
+ cat "$sorted" >"$f"
19
+ echo "$f" sorted
20
+ fi
21
+ done