tina4-python 3.13.96__tar.gz → 3.13.97__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 (175) hide show
  1. {tina4_python-3.13.96 → tina4_python-3.13.97}/PKG-INFO +1 -1
  2. {tina4_python-3.13.96 → tina4_python-3.13.97}/pyproject.toml +1 -1
  3. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/__init__.py +1 -1
  4. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/queue/kafka_backend.py +31 -2
  5. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/queue/rabbitmq_backend.py +30 -4
  6. {tina4_python-3.13.96 → tina4_python-3.13.97}/.gitignore +0 -0
  7. {tina4_python-3.13.96 → tina4_python-3.13.97}/README.md +0 -0
  8. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/CLAUDE.md +0 -0
  9. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/HtmlElement.py +0 -0
  10. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/Testing.py +0 -0
  11. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/ai/__init__.py +0 -0
  12. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/api/__init__.py +0 -0
  13. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/auth/__init__.py +0 -0
  14. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/cache/__init__.py +0 -0
  15. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/cli/__init__.py +0 -0
  16. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/container/__init__.py +0 -0
  17. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/context/__init__.py +0 -0
  18. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/context/chunker.py +0 -0
  19. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/core/__init__.py +0 -0
  20. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/core/cache.py +0 -0
  21. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/core/constants.py +0 -0
  22. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/core/events.py +0 -0
  23. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/core/middleware.py +0 -0
  24. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/core/rate_limiter.py +0 -0
  25. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/core/request.py +0 -0
  26. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/core/response.py +0 -0
  27. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/core/router.py +0 -0
  28. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/core/server.py +0 -0
  29. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/crud/__init__.py +0 -0
  30. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/database/__init__.py +0 -0
  31. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/database/adapter.py +0 -0
  32. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/database/connection.py +0 -0
  33. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/database/database_url.py +0 -0
  34. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/database/firebird.py +0 -0
  35. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/database/mongodb.py +0 -0
  36. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/database/mssql.py +0 -0
  37. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/database/mysql.py +0 -0
  38. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/database/odbc.py +0 -0
  39. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/database/postgres.py +0 -0
  40. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/database/sql_translator.py +0 -0
  41. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/database/sqlite.py +0 -0
  42. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/debug/__init__.py +0 -0
  43. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/debug/error_overlay.py +0 -0
  44. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/dev_admin/__init__.py +0 -0
  45. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/dev_admin/metrics.py +0 -0
  46. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/dev_admin/plan.py +0 -0
  47. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/dev_admin/project_index.py +0 -0
  48. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/docs.py +0 -0
  49. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/docstore/__init__.py +0 -0
  50. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/dotenv/__init__.py +0 -0
  51. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/env.py +0 -0
  52. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/frond/FROND.md +0 -0
  53. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/frond/__init__.py +0 -0
  54. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/frond/compiler.py +0 -0
  55. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/frond/engine.py +0 -0
  56. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/frond/parser.py +0 -0
  57. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/gallery/auth/meta.json +0 -0
  58. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/gallery/auth/src/routes/api/gallery_auth.py +0 -0
  59. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/gallery/database/meta.json +0 -0
  60. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/gallery/database/src/routes/api/gallery_db.py +0 -0
  61. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/gallery/error-overlay/meta.json +0 -0
  62. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/gallery/error-overlay/src/routes/api/gallery_crash.py +0 -0
  63. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/gallery/orm/meta.json +0 -0
  64. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/gallery/orm/src/orm/Product.py +0 -0
  65. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/gallery/orm/src/routes/api/gallery_products.py +0 -0
  66. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/gallery/queue/meta.json +0 -0
  67. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/gallery/queue/src/routes/api/gallery_queue.py +0 -0
  68. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/gallery/rest-api/meta.json +0 -0
  69. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/gallery/rest-api/src/routes/api/gallery_hello.py +0 -0
  70. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/gallery/templates/meta.json +0 -0
  71. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/gallery/templates/src/routes/gallery_page.py +0 -0
  72. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/gallery/templates/src/templates/gallery_page.twig +0 -0
  73. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/graphql/__init__.py +0 -0
  74. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/i18n/__init__.py +0 -0
  75. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/mcp/__init__.py +0 -0
  76. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/mcp/protocol.py +0 -0
  77. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/mcp/tools.py +0 -0
  78. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/messenger/__init__.py +0 -0
  79. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/migration/__init__.py +0 -0
  80. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/migration/runner.py +0 -0
  81. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/mqtt/__init__.py +0 -0
  82. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/mqtt/message.py +0 -0
  83. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/orm/__init__.py +0 -0
  84. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/orm/fields.py +0 -0
  85. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/orm/model.py +0 -0
  86. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/public/__feedback/widget.js +0 -0
  87. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/public/css/tina4.css +0 -0
  88. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/public/css/tina4.min.css +0 -0
  89. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/public/favicon.ico +0 -0
  90. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/public/images/logo.svg +0 -0
  91. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/public/images/tina4-logo-icon.webp +0 -0
  92. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/public/js/frond.js +0 -0
  93. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/public/js/frond.min.js +0 -0
  94. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/public/js/tina4-dev-admin.min.js +0 -0
  95. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/public/js/tina4.min.js +0 -0
  96. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/public/js/tina4js.min.js +0 -0
  97. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/public/swagger/index.html +0 -0
  98. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/public/swagger/oauth2-redirect.html +0 -0
  99. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/query_builder/__init__.py +0 -0
  100. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/queue/__init__.py +0 -0
  101. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/queue/amqp_url.py +0 -0
  102. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/queue/job.py +0 -0
  103. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/queue/lite_backend.py +0 -0
  104. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/queue/mongo_backend.py +0 -0
  105. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/queue_backends/__init__.py +0 -0
  106. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/queue_backends/kafka_backend.py +0 -0
  107. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/queue_backends/mongo_backend.py +0 -0
  108. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/queue_backends/rabbitmq_backend.py +0 -0
  109. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/realtime/__init__.py +0 -0
  110. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/realtime/models/Attachment.py +0 -0
  111. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/realtime/models/Channel.py +0 -0
  112. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/realtime/models/ChannelMember.py +0 -0
  113. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/realtime/models/Message.py +0 -0
  114. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/realtime/models/Workspace.py +0 -0
  115. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/realtime/models/__init__.py +0 -0
  116. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/realtime/storage.py +0 -0
  117. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/scss/tina4css/_alerts.scss +0 -0
  118. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/scss/tina4css/_badges.scss +0 -0
  119. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/scss/tina4css/_buttons.scss +0 -0
  120. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/scss/tina4css/_cards.scss +0 -0
  121. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/scss/tina4css/_forms.scss +0 -0
  122. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/scss/tina4css/_grid.scss +0 -0
  123. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/scss/tina4css/_modals.scss +0 -0
  124. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/scss/tina4css/_nav.scss +0 -0
  125. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/scss/tina4css/_pagination.scss +0 -0
  126. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/scss/tina4css/_reset.scss +0 -0
  127. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/scss/tina4css/_tables.scss +0 -0
  128. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/scss/tina4css/_typography.scss +0 -0
  129. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/scss/tina4css/_utilities.scss +0 -0
  130. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/scss/tina4css/_variables.scss +0 -0
  131. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/scss/tina4css/base.scss +0 -0
  132. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/scss/tina4css/colors.scss +0 -0
  133. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/scss/tina4css/tina4.scss +0 -0
  134. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/seeder/__init__.py +0 -0
  135. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/service/__init__.py +0 -0
  136. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/session/__init__.py +0 -0
  137. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/session_handlers/__init__.py +0 -0
  138. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/session_handlers/memcached_handler.py +0 -0
  139. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/session_handlers/mongodb_handler.py +0 -0
  140. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/session_handlers/redis_handler.py +0 -0
  141. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/session_handlers/valkey_handler.py +0 -0
  142. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/swagger/__init__.py +0 -0
  143. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/templates/components/crud.twig +0 -0
  144. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/templates/docker/distroless/Dockerfile +0 -0
  145. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/templates/docker/poetry/Dockerfile +0 -0
  146. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/templates/docker/python/Dockerfile +0 -0
  147. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/templates/docker/uv/Dockerfile +0 -0
  148. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/templates/errors/302.twig +0 -0
  149. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/templates/errors/401.twig +0 -0
  150. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/templates/errors/403.twig +0 -0
  151. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/templates/errors/404.twig +0 -0
  152. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/templates/errors/500.twig +0 -0
  153. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/templates/errors/502.twig +0 -0
  154. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/templates/errors/503.twig +0 -0
  155. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/templates/errors/base.twig +0 -0
  156. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/templates/frontend/README.md +0 -0
  157. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/templates/readme.md +0 -0
  158. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/test/__init__.py +0 -0
  159. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/test_client/__init__.py +0 -0
  160. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/translations/af/LC_MESSAGES/messages.mo +0 -0
  161. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/translations/af/LC_MESSAGES/messages.po +0 -0
  162. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/translations/en/LC_MESSAGES/messages.mo +0 -0
  163. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/translations/en/LC_MESSAGES/messages.po +0 -0
  164. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/translations/es/LC_MESSAGES/messages.mo +0 -0
  165. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/translations/es/LC_MESSAGES/messages.po +0 -0
  166. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/translations/fr/LC_MESSAGES/messages.mo +0 -0
  167. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/translations/fr/LC_MESSAGES/messages.po +0 -0
  168. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/translations/ja/LC_MESSAGES/messages.mo +0 -0
  169. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/translations/ja/LC_MESSAGES/messages.po +0 -0
  170. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/translations/zh/LC_MESSAGES/messages.mo +0 -0
  171. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/translations/zh/LC_MESSAGES/messages.po +0 -0
  172. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/validator/__init__.py +0 -0
  173. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/websocket/__init__.py +0 -0
  174. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/websocket/backplane.py +0 -0
  175. {tina4_python-3.13.96 → tina4_python-3.13.97}/tina4_python/wsdl/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tina4-python
3
- Version: 3.13.96
3
+ Version: 3.13.97
4
4
  Summary: Tina4 Python v3 — Zero-dependency, lightweight web framework
5
5
  Author-email: Andre van Zuydam <andrevanzuydam@gmail.com>
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tina4-python"
3
- version = "3.13.96"
3
+ version = "3.13.97"
4
4
  description = "Tina4 Python v3 — Zero-dependency, lightweight web framework"
5
5
  authors = [
6
6
  {name = "Andre van Zuydam", email = "andrevanzuydam@gmail.com"}
@@ -51,7 +51,7 @@ def _resolve_version() -> str:
51
51
  #
52
52
  # test_version_constant.py now asserts this literal equals the pyproject
53
53
  # version, so the release bump cannot leave it behind again.
54
- return "3.13.95"
54
+ return "3.13.97"
55
55
 
56
56
 
57
57
  __version__ = _resolve_version()
@@ -67,7 +67,22 @@ class KafkaBackend:
67
67
  return self._backend.size(self._topic)
68
68
 
69
69
  def purge(self, status: str = "completed"):
70
- pass # Kafka does not support purging
70
+ """Not performable on Kafka raises naming the backend and the operation.
71
+
72
+ purge(status) removes jobs SELECTED BY STATUS. A Kafka log has no notion
73
+ of job status and cannot delete records on demand: a partition is read
74
+ in offset order and records leave only by retention. This used to be a
75
+ bare ``pass``, so a caller who ran purge() believed jobs were removed
76
+ when nothing happened (ADR-0022 invariant 6: a backend that cannot
77
+ perform an operation refuses by name, it never silently no-ops).
78
+ """
79
+ raise NotImplementedError(
80
+ "The kafka queue backend cannot perform purge(): Kafka has no notion "
81
+ "of job status to purge by — a log is read in offset order and "
82
+ "records leave only by retention. Returning without doing anything "
83
+ "would claim jobs were purged when none were. Configure topic "
84
+ "retention, or use the file or mongodb backend."
85
+ )
71
86
 
72
87
  def retry_failed(self, max_retries: int = None) -> int:
73
88
  """Not performable on Kafka — raises naming the backend and the operation.
@@ -159,7 +174,21 @@ class KafkaBackend:
159
174
  return True
160
175
 
161
176
  def clear(self) -> int:
162
- return 0 # Kafka does not support topic purging without admin API
177
+ """Not performable on Kafka raises naming the backend and the operation.
178
+
179
+ clear() empties the queue. A Kafka log cannot delete records on demand:
180
+ a partition is read in offset order and records leave only by retention.
181
+ This used to ``return 0``, which claimed the queue was emptied when it
182
+ was untouched — the silent no-op ADR-0022 invariant 6 forbids. Refusing
183
+ by name is the honest answer.
184
+ """
185
+ raise NotImplementedError(
186
+ "The kafka queue backend cannot perform clear(): Kafka has no notion "
187
+ "of job status and cannot delete records on demand — a log is read "
188
+ "in offset order and records leave only by retention. Returning 0 "
189
+ "would claim the queue was emptied when it was not. Configure topic "
190
+ "retention, or use the file or mongodb backend."
191
+ )
163
192
 
164
193
  def complete(self, job: Job):
165
194
  self._backend.acknowledge(self._topic, str(job.id))
@@ -75,8 +75,22 @@ class RabbitMQBackend:
75
75
  return self._backend.size(self._topic)
76
76
 
77
77
  def purge(self, status: str = "completed"):
78
- if status == "pending":
79
- self._backend.clear(self._topic)
78
+ """Not performable on RabbitMQ — raises naming the backend and the operation.
79
+
80
+ purge(status) removes jobs SELECTED BY STATUS. RabbitMQ cannot address
81
+ messages by status: ``basic.get`` pops the head of the queue and the
82
+ only bulk operation is ``queue.purge``, which empties the WHOLE live
83
+ queue regardless of status. This used to drain that queue on
84
+ ``purge("pending")``, destroying every pending job — the destructive
85
+ no-op ADR-0022 invariant 6 forbids. Refusing by name is the honest
86
+ answer.
87
+ """
88
+ raise NotImplementedError(
89
+ "The rabbitmq queue backend cannot perform purge(): RabbitMQ cannot "
90
+ "address messages by status (basic.get pops the head of the queue), "
91
+ "so a status-addressed purge would have to drain the entire live "
92
+ "queue and destroy pending work. Use the file or mongodb backend."
93
+ )
80
94
 
81
95
  def retry_failed(self, max_retries: int = None) -> int:
82
96
  """Not performable on RabbitMQ — raises naming the backend and the operation.
@@ -169,8 +183,20 @@ class RabbitMQBackend:
169
183
  return True
170
184
 
171
185
  def clear(self) -> int:
172
- self._backend.clear(self._topic)
173
- return 0
186
+ """Not performable on RabbitMQ — raises naming the backend and the operation.
187
+
188
+ clear() empties the queue. RabbitMQ cannot address messages by status,
189
+ so the only thing it could do is ``queue.purge`` the WHOLE live queue.
190
+ This used to do exactly that and ``return 0``, silently destroying every
191
+ pending job. Draining a live broker on a status-addressed clear is data
192
+ loss (ADR-0022 invariant 6), so it refuses by name instead.
193
+ """
194
+ raise NotImplementedError(
195
+ "The rabbitmq queue backend cannot perform clear(): RabbitMQ cannot "
196
+ "address messages by status (basic.get pops the head of the queue), "
197
+ "so a status-addressed clear would have to drain the entire live "
198
+ "queue and destroy pending work. Use the file or mongodb backend."
199
+ )
174
200
 
175
201
  def complete(self, job: Job):
176
202
  self._backend.acknowledge(self._topic, str(job.id))
File without changes