localqueue 0.4.0__tar.gz → 0.5.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 (129) hide show
  1. localqueue-0.5.0/CHANGELOG.md +195 -0
  2. {localqueue-0.4.0 → localqueue-0.5.0}/PKG-INFO +42 -7
  3. {localqueue-0.4.0 → localqueue-0.5.0}/README.md +41 -6
  4. localqueue-0.5.0/docs/api.md +722 -0
  5. localqueue-0.5.0/docs/examples/pull-compose.md +63 -0
  6. localqueue-0.5.0/docs/examples/push-compose.md +49 -0
  7. localqueue-0.5.0/docs/examples/websocket-compose.md +58 -0
  8. localqueue-0.5.0/docs/examples.md +14 -0
  9. {localqueue-0.4.0 → localqueue-0.5.0}/docs/index.md +15 -5
  10. localqueue-0.5.0/docs/plans/notification-policy-pr.md +258 -0
  11. localqueue-0.5.0/docs/plans/pubsub-physical-fanout-pr.md +178 -0
  12. localqueue-0.5.0/docs/plans/queue-architecture-roadmap.md +261 -0
  13. {localqueue-0.4.0 → localqueue-0.5.0}/docs/queues.md +551 -4
  14. {localqueue-0.4.0 → localqueue-0.5.0}/docs/retries.md +21 -8
  15. {localqueue-0.4.0 → localqueue-0.5.0}/docs/stability.md +29 -0
  16. localqueue-0.5.0/docs/use-cases/local-outbox.md +75 -0
  17. localqueue-0.5.0/docs/use-cases/operator-recovery.md +78 -0
  18. localqueue-0.5.0/docs/use-cases/persistent-retries.md +72 -0
  19. localqueue-0.5.0/docs/use-cases.md +54 -0
  20. localqueue-0.5.0/examples/docker-compose/README.md +11 -0
  21. localqueue-0.5.0/examples/docker-compose/pull/README.md +28 -0
  22. localqueue-0.5.0/examples/docker-compose/pull/compose.yaml +40 -0
  23. localqueue-0.5.0/examples/docker-compose/pull/producer.py +33 -0
  24. localqueue-0.5.0/examples/docker-compose/pull/worker.py +15 -0
  25. localqueue-0.5.0/examples/docker-compose/push/README.md +19 -0
  26. localqueue-0.5.0/examples/docker-compose/push/compose.yaml +16 -0
  27. localqueue-0.5.0/examples/docker-compose/push/push_app.py +63 -0
  28. localqueue-0.5.0/examples/docker-compose/websocket/Dockerfile +13 -0
  29. localqueue-0.5.0/examples/docker-compose/websocket/README.md +24 -0
  30. localqueue-0.5.0/examples/docker-compose/websocket/compose.yaml +32 -0
  31. localqueue-0.5.0/examples/docker-compose/websocket/websocket_app.py +71 -0
  32. localqueue-0.5.0/examples/docker-compose/websocket/websocket_client.py +27 -0
  33. localqueue-0.5.0/localqueue/__init__.py +239 -0
  34. localqueue-0.5.0/localqueue/adapters/__init__.py +15 -0
  35. localqueue-0.5.0/localqueue/adapters/dispatch.py +40 -0
  36. localqueue-0.5.0/localqueue/adapters/notification.py +211 -0
  37. localqueue-0.4.0/localqueue/cli.py → localqueue-0.5.0/localqueue/cli/__init__.py +8 -8
  38. localqueue-0.4.0/localqueue/cli_commands.py → localqueue-0.5.0/localqueue/cli/commands.py +3 -3
  39. localqueue-0.4.0/localqueue/cli_support.py → localqueue-0.5.0/localqueue/cli/support.py +3 -3
  40. localqueue-0.4.0/localqueue/cli_worker_commands.py → localqueue-0.5.0/localqueue/cli/worker.py +3 -3
  41. localqueue-0.5.0/localqueue/cli_commands.py +1 -0
  42. localqueue-0.5.0/localqueue/cli_support.py +1 -0
  43. localqueue-0.5.0/localqueue/cli_worker_commands.py +1 -0
  44. localqueue-0.5.0/localqueue/idempotency/__init__.py +17 -0
  45. localqueue-0.5.0/localqueue/idempotency/stores/__init__.py +13 -0
  46. localqueue-0.5.0/localqueue/idempotency/stores/_shared.py +22 -0
  47. localqueue-0.5.0/localqueue/idempotency/stores/base.py +45 -0
  48. localqueue-0.5.0/localqueue/idempotency/stores/lmdb.py +88 -0
  49. localqueue-0.5.0/localqueue/idempotency/stores/memory.py +55 -0
  50. localqueue-0.5.0/localqueue/idempotency/stores/sqlite.py +154 -0
  51. localqueue-0.5.0/localqueue/policies/__init__.py +181 -0
  52. localqueue-0.5.0/localqueue/policies/_types.py +18 -0
  53. localqueue-0.5.0/localqueue/policies/acknowledgement.py +32 -0
  54. localqueue-0.5.0/localqueue/policies/backpressure.py +68 -0
  55. localqueue-0.5.0/localqueue/policies/commit.py +109 -0
  56. localqueue-0.5.0/localqueue/policies/consumption.py +48 -0
  57. localqueue-0.5.0/localqueue/policies/dead_letter.py +32 -0
  58. localqueue-0.5.0/localqueue/policies/deduplication.py +42 -0
  59. localqueue-0.5.0/localqueue/policies/delivery.py +86 -0
  60. localqueue-0.5.0/localqueue/policies/dispatch.py +49 -0
  61. localqueue-0.5.0/localqueue/policies/lease.py +41 -0
  62. localqueue-0.5.0/localqueue/policies/locality.py +48 -0
  63. localqueue-0.5.0/localqueue/policies/notification.py +57 -0
  64. localqueue-0.5.0/localqueue/policies/ordering.py +66 -0
  65. localqueue-0.5.0/localqueue/policies/policy_set.py +212 -0
  66. localqueue-0.5.0/localqueue/policies/results.py +56 -0
  67. localqueue-0.5.0/localqueue/policies/routing.py +48 -0
  68. localqueue-0.5.0/localqueue/policies/semantics.py +37 -0
  69. localqueue-0.5.0/localqueue/policies/subscriptions.py +69 -0
  70. localqueue-0.5.0/localqueue/queue.py +35 -0
  71. localqueue-0.5.0/localqueue/queues/__init__.py +26 -0
  72. localqueue-0.5.0/localqueue/queues/core.py +632 -0
  73. localqueue-0.5.0/localqueue/queues/policies.py +129 -0
  74. localqueue-0.5.0/localqueue/queues/timing.py +23 -0
  75. localqueue-0.5.0/localqueue/queues/validation.py +114 -0
  76. localqueue-0.5.0/localqueue/results/__init__.py +15 -0
  77. localqueue-0.5.0/localqueue/results/stores/__init__.py +12 -0
  78. localqueue-0.5.0/localqueue/results/stores/_shared.py +22 -0
  79. localqueue-0.5.0/localqueue/results/stores/base.py +24 -0
  80. localqueue-0.5.0/localqueue/results/stores/lmdb.py +52 -0
  81. localqueue-0.5.0/localqueue/results/stores/memory.py +29 -0
  82. localqueue-0.5.0/localqueue/results/stores/sqlite.py +93 -0
  83. localqueue-0.5.0/localqueue/services/queue_worker.py +34 -0
  84. localqueue-0.5.0/localqueue/spec.py +169 -0
  85. {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/stores/_shared.py +22 -4
  86. {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/stores/base.py +2 -0
  87. {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/stores/lmdb.py +17 -5
  88. {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/stores/memory.py +17 -5
  89. {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/stores/sqlite.py +28 -10
  90. localqueue-0.5.0/localqueue/worker.py +26 -0
  91. localqueue-0.5.0/localqueue/workers/__init__.py +51 -0
  92. localqueue-0.4.0/localqueue/services/queue_worker.py → localqueue-0.5.0/localqueue/workers/queue.py +1 -1
  93. localqueue-0.4.0/localqueue/worker.py → localqueue-0.5.0/localqueue/workers/runtime.py +277 -6
  94. {localqueue-0.4.0 → localqueue-0.5.0}/pyproject.toml +1 -1
  95. localqueue-0.5.0/tests/test_queue.py +5826 -0
  96. {localqueue-0.4.0 → localqueue-0.5.0}/uv.lock +1 -1
  97. localqueue-0.4.0/CHANGELOG.md +0 -102
  98. localqueue-0.4.0/docs/api.md +0 -389
  99. localqueue-0.4.0/docs/use-cases.md +0 -174
  100. localqueue-0.4.0/localqueue/__init__.py +0 -69
  101. localqueue-0.4.0/localqueue/queue.py +0 -313
  102. localqueue-0.4.0/tests/test_queue.py +0 -2905
  103. {localqueue-0.4.0 → localqueue-0.5.0}/.gitignore +0 -0
  104. {localqueue-0.4.0 → localqueue-0.5.0}/LICENSE +0 -0
  105. {localqueue-0.4.0 → localqueue-0.5.0}/docs/compare.md +0 -0
  106. {localqueue-0.4.0 → localqueue-0.5.0}/docs/develop.md +0 -0
  107. {localqueue-0.4.0 → localqueue-0.5.0}/docs/operational-maturity.md +0 -0
  108. {localqueue-0.4.0 → localqueue-0.5.0}/docs/release.md +0 -0
  109. {localqueue-0.4.0 → localqueue-0.5.0}/examples/email_worker.py +0 -0
  110. {localqueue-0.4.0 → localqueue-0.5.0}/examples/enqueue_email.py +0 -0
  111. {localqueue-0.4.0 → localqueue-0.5.0}/examples/process_webhook.sh +0 -0
  112. {localqueue-0.4.0 → localqueue-0.5.0}/examples/retry_demo.py +0 -0
  113. {localqueue-0.4.0 → localqueue-0.5.0}/examples/sqlite_concurrency_benchmark.py +0 -0
  114. {localqueue-0.4.0 → localqueue-0.5.0}/examples/sqlite_process_harness.py +0 -0
  115. {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/failure.py +0 -0
  116. {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/paths.py +0 -0
  117. {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/retry/__init__.py +0 -0
  118. {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/retry/stores/__init__.py +0 -0
  119. {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/retry/stores/_shared.py +0 -0
  120. {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/retry/stores/base.py +0 -0
  121. {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/retry/stores/lmdb.py +0 -0
  122. {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/retry/stores/memory.py +0 -0
  123. {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/retry/stores/sqlite.py +0 -0
  124. {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/retry/tenacity.py +0 -0
  125. {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/services/__init__.py +0 -0
  126. {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/stores/__init__.py +0 -0
  127. {localqueue-0.4.0 → localqueue-0.5.0}/tests/test_cli.py +0 -0
  128. {localqueue-0.4.0 → localqueue-0.5.0}/tests/test_process_harness.py +0 -0
  129. {localqueue-0.4.0 → localqueue-0.5.0}/tests/test_retry.py +0 -0
@@ -0,0 +1,195 @@
1
+ # Changelog
2
+
3
+ ## [0.5.0](https://github.com/brunoportis/localqueue/compare/v0.4.1...v0.5.0) (2026-04-27)
4
+
5
+
6
+ ### Features
7
+
8
+ * **notification:** add in-process notification adapter ([8ae7625](https://github.com/brunoportis/localqueue/commit/8ae762555e196424a1977d10d485d8f20d54f5d9))
9
+ * **notifications:** add async push and websocket support ([11b02f4](https://github.com/brunoportis/localqueue/commit/11b02f4808a0d182b18a78750344f3903e377d8f))
10
+ * **pubsub:** implement physical fanout for static subscriptions ([63e1589](https://github.com/brunoportis/localqueue/commit/63e158936bbcd818f6d78c094912c0da39b036e6))
11
+ * **pubsub:** implement physical fanout for static subscriptions ([a1e8664](https://github.com/brunoportis/localqueue/commit/a1e8664c90cd0ebe473d07403aba279343e48c58))
12
+ * **queue:** add at-most-once delivery ([ac277cf](https://github.com/brunoportis/localqueue/commit/ac277cf708c1ddeac225eddf07ddf2b64db28c74))
13
+ * **queue:** add backpressure overflow policies ([aec6a47](https://github.com/brunoportis/localqueue/commit/aec6a47c9babb612da00804408097e1340e12154))
14
+ * **queue:** add backpressure overflow policies ([c29dbd8](https://github.com/brunoportis/localqueue/commit/c29dbd8f7406d27be7f2c17222a9fda732cd54af))
15
+ * **queue:** add best effort ordering ([0a9a4d4](https://github.com/brunoportis/localqueue/commit/0a9a4d47edab47f0f02f46b796dee52e75e888b9))
16
+ * **queue:** add best effort ordering ([ebc08ee](https://github.com/brunoportis/localqueue/commit/ebc08ee6631c2c50f8675489a5fa680ed4f1df37))
17
+ * **queue:** add commit policies ([0e6ecd9](https://github.com/brunoportis/localqueue/commit/0e6ecd9781fcc438909fb8abd90fe4327db8236f))
18
+ * **queue:** add commit policies ([46da89b](https://github.com/brunoportis/localqueue/commit/46da89b6bcdb633227a48a8216c178e289ee99ec))
19
+ * **queue:** add consumption policy ([19d4341](https://github.com/brunoportis/localqueue/commit/19d4341fe91b16e23b28cce40974140e3b96e699))
20
+ * **queue:** add deduplication policies ([5317af0](https://github.com/brunoportis/localqueue/commit/5317af065e36f7e89a2153ded356cd01b49253b2))
21
+ * **queue:** add deduplication policies ([c0af4b6](https://github.com/brunoportis/localqueue/commit/c0af4b6f7ea613d189477fd674385e3c45a5c3ef))
22
+ * **queue:** add delivery policy ([6af3c44](https://github.com/brunoportis/localqueue/commit/6af3c44f9c1410f29fd165a14419af2b07e24839))
23
+ * **queue:** add dispatch policies ([ece9348](https://github.com/brunoportis/localqueue/commit/ece934870809641e5a22bd9bebc9160c6ac09f94))
24
+ * **queue:** add dispatch policies ([3e060c5](https://github.com/brunoportis/localqueue/commit/3e060c5a1dcbc90018a9edf14d5ffa782795ef39))
25
+ * **queue:** add effectively-once delivery ([41ca19f](https://github.com/brunoportis/localqueue/commit/41ca19f89a6bc507cec2f60d508ff854929cf12e))
26
+ * **queue:** add effectively-once ledger state ([fc2b4f8](https://github.com/brunoportis/localqueue/commit/fc2b4f85fc22335f472236de756c2357c9064227))
27
+ * **queue:** add effectively-once ledger state ([181816a](https://github.com/brunoportis/localqueue/commit/181816a7bb92a72af818357f4d4823cd0d3b5a61))
28
+ * **queue:** add effectively-once result policy ([26b140a](https://github.com/brunoportis/localqueue/commit/26b140ac50a3078c730fdf994351c0fd5194672b))
29
+ * **queue:** add effectively-once result policy ([e6035dd](https://github.com/brunoportis/localqueue/commit/e6035dd05e7fd01b8d20cff0f529d030fda1eaf1))
30
+ * **queue:** add explicit policy primitives ([942bbaa](https://github.com/brunoportis/localqueue/commit/942bbaa8af44f300cea9f8072526770798c7287f))
31
+ * **queue:** add idempotency stores ([4ab060c](https://github.com/brunoportis/localqueue/commit/4ab060c79a4d0086e3755bc4cde7bb082d0ab839))
32
+ * **queue:** add idempotency stores ([8f5bb98](https://github.com/brunoportis/localqueue/commit/8f5bb987d7641ecca0fdaaa294404481c2c7d39a))
33
+ * **queue:** add lease policies ([8444d8b](https://github.com/brunoportis/localqueue/commit/8444d8b061f1f5e741ba30eb3d943b2898b9871c))
34
+ * **queue:** add lease policies ([a51fe32](https://github.com/brunoportis/localqueue/commit/a51fe32916f3b1575a52c131c26556e9ce394703))
35
+ * **queue:** add lifecycle policies ([152bfe2](https://github.com/brunoportis/localqueue/commit/152bfe255eb6c36e76468a6c0a2902ff8cb19d4b))
36
+ * **queue:** add lifecycle policies ([3a51aa8](https://github.com/brunoportis/localqueue/commit/3a51aa83987c27451c50765e16914c8828e24337))
37
+ * **queue:** add locality policies ([b744058](https://github.com/brunoportis/localqueue/commit/b744058a4e2bc463242ad210b20980636733088e))
38
+ * **queue:** add locality policies ([f749c41](https://github.com/brunoportis/localqueue/commit/f749c41c847ae135f7db14437d583d815f7beaa0))
39
+ * **queue:** add notification policies ([19a11bb](https://github.com/brunoportis/localqueue/commit/19a11bb1d24ff6bd2ed95f298c99003f622ef4fa))
40
+ * **queue:** add notification policies ([7627165](https://github.com/brunoportis/localqueue/commit/762716513702264689535c9c05828b383a10bcf1))
41
+ * **queue:** add ordering policy ([dfbd88d](https://github.com/brunoportis/localqueue/commit/dfbd88de1cfd7ff2296a56880ca7c05d7b2d9406))
42
+ * **queue:** add policy set presets ([9acb8ee](https://github.com/brunoportis/localqueue/commit/9acb8eed3e7b2bf62d8035c63aef78ebf3f6feb8))
43
+ * **queue:** add policy set presets ([fa95020](https://github.com/brunoportis/localqueue/commit/fa950206b877fac9345d2971e39344cc8d511c35))
44
+ * **queue:** add priority ordering ([cbf5294](https://github.com/brunoportis/localqueue/commit/cbf5294cf00c00ff0489d9cbab48a4eb7ea49c12))
45
+ * **queue:** add publish subscribe routing ([1b54ea3](https://github.com/brunoportis/localqueue/commit/1b54ea3115b70fc6b71ad12b20fbc3defca5f152))
46
+ * **queue:** add publish subscribe routing ([5d38e16](https://github.com/brunoportis/localqueue/commit/5d38e167e7d05b45ece7f83ae14b9f032409f37e))
47
+ * **queue:** add push consumption policy ([67474fb](https://github.com/brunoportis/localqueue/commit/67474fb16426f3dd9d2e33c87ad703f1d8533c2f))
48
+ * **queue:** add push consumption policy ([f76032c](https://github.com/brunoportis/localqueue/commit/f76032c60336ab95b140d253c5ed18e56419636a))
49
+ * **queue:** add queue policy sets ([3d10b54](https://github.com/brunoportis/localqueue/commit/3d10b54caf19484e9050f67400920504ca58ad18))
50
+ * **queue:** add queue policy sets ([cdd0d27](https://github.com/brunoportis/localqueue/commit/cdd0d2743b24ab2662e6e1661294ba9bc76a7892))
51
+ * **queue:** add result stores ([68e853e](https://github.com/brunoportis/localqueue/commit/68e853e930b766d023c67817c11555fd8e69ec97))
52
+ * **queue:** add result stores ([37d1498](https://github.com/brunoportis/localqueue/commit/37d1498cc6f4778c54f49630f1b77fd5dcede661))
53
+ * **queue:** add routing policy ([981d71d](https://github.com/brunoportis/localqueue/commit/981d71dfd19e70f9a1db186626a86d40116a1386))
54
+ * **queue:** add saga commit ([159a477](https://github.com/brunoportis/localqueue/commit/159a47767832a2733b7189a27f8013905a301ab8))
55
+ * **queue:** add saga commit ([d936226](https://github.com/brunoportis/localqueue/commit/d9362263e0750c1c68d6127cf862f7e446a8b1d4))
56
+ * **queue:** add subscription policies ([97afb69](https://github.com/brunoportis/localqueue/commit/97afb69c6fa73c74905ee2649868bcb567c16abe))
57
+ * **queue:** add subscription policies ([fc746a0](https://github.com/brunoportis/localqueue/commit/fc746a02f556f8d59c8abcc8bbfa7f57a6267fc4))
58
+ * **queue:** add transactional outbox commit ([3389951](https://github.com/brunoportis/localqueue/commit/33899518aeca21258c7d46784dface62d3602565))
59
+ * **queue:** add transactional outbox commit ([e00aac0](https://github.com/brunoportis/localqueue/commit/e00aac060608b64eac034f223b6d5eafc1909817))
60
+ * **queue:** add two-phase commit ([5623909](https://github.com/brunoportis/localqueue/commit/56239098a91bc8da474e9dafcfc302b705eb0f26))
61
+ * **queue:** add two-phase commit ([e565704](https://github.com/brunoportis/localqueue/commit/e565704a99431953e442090cf82bc43d9ea5bb0a))
62
+
63
+
64
+ ### Bug Fixes
65
+
66
+ * run docker compose examples with writable volumes ([6721861](https://github.com/brunoportis/localqueue/commit/6721861caa9438703c86686bac847a7185f5a78e))
67
+ * **workflow:** publish releases only on tag push ([3707b77](https://github.com/brunoportis/localqueue/commit/3707b771424bc09531e2c25ccaef7caf89309417))
68
+ * **workflow:** publish releases only on tag push ([fc49104](https://github.com/brunoportis/localqueue/commit/fc491045901715c67c02cf3116dbd8130367bca3))
69
+
70
+
71
+ ### Documentation
72
+
73
+ * add docker compose queue examples ([7930675](https://github.com/brunoportis/localqueue/commit/79306755d687d8e45c81c3dd2e3cdf9a758bfaa4))
74
+ * add docker compose queue examples ([2b73f3b](https://github.com/brunoportis/localqueue/commit/2b73f3b2e04a5b642692b659d5c1175302634b88))
75
+ * add reproducible docker compose examples ([7921592](https://github.com/brunoportis/localqueue/commit/7921592c1ef57afbe31b120a7c2e4ef148de439b))
76
+ * fix use cases nav hierarchy ([45a1230](https://github.com/brunoportis/localqueue/commit/45a12309dc597b4d89edde083e836a29dacca16c))
77
+ * **pubsub:** add physical fanout implementation plan ([17d0668](https://github.com/brunoportis/localqueue/commit/17d0668c8969781e56a627ffd6f7cb6c69c4414d))
78
+ * **pubsub:** add subscriber queue usage examples ([d5b4c64](https://github.com/brunoportis/localqueue/commit/d5b4c642597e3fa290c75a1911bd5d157a412ff1))
79
+ * **queue:** add architecture planning notes ([d034ace](https://github.com/brunoportis/localqueue/commit/d034ace8effab721214b550926444a5d6ef7bedc))
80
+ * **queue:** add architecture planning notes ([a46cce5](https://github.com/brunoportis/localqueue/commit/a46cce573a59b1551ff8d80c4be60b5a3e1697a3))
81
+ * **queue:** add long term roadmap scope ([8aad4a3](https://github.com/brunoportis/localqueue/commit/8aad4a3fae79f0b56ca667dde80175097d220a3a))
82
+ * **queue:** expand architecture roadmap ([bb2964a](https://github.com/brunoportis/localqueue/commit/bb2964a3a11f49f094312c5f8eb0aae227d544ac))
83
+ * refine use case navigation and examples ([f5bd751](https://github.com/brunoportis/localqueue/commit/f5bd751c32f2f65d65cee4fb9fa493e4f52f8864))
84
+ * simplify use case pages and nav ([3b2b99f](https://github.com/brunoportis/localqueue/commit/3b2b99f9ad6056f8c1ed740bb15ccbcf6213c33c))
85
+
86
+ ## [0.4.1](https://github.com/brunoportis/localqueue/compare/v0.4.0...v0.4.1) (2026-04-25)
87
+
88
+
89
+ ### Documentation
90
+
91
+ * reposition use cases and guides ([8e98379](https://github.com/brunoportis/localqueue/commit/8e98379c29091b414ad437facbdb4d7a7c45db4c))
92
+ * reposition use cases and guides ([280288b](https://github.com/brunoportis/localqueue/commit/280288b02f877d78d2df067df67ce14a800cbfe2))
93
+ * simplify queue examples ([ed488b2](https://github.com/brunoportis/localqueue/commit/ed488b2ab210369331fbcda3568760f0da24618b))
94
+ * split use cases into dedicated pages ([5496826](https://github.com/brunoportis/localqueue/commit/54968266b0733b009147c56761ce9fe29889d5e9))
95
+
96
+ ## [0.4.0](https://github.com/brunoportis/localqueue/compare/v0.3.4...v0.4.0) (2026-04-24)
97
+
98
+
99
+ ### Features
100
+
101
+ * add release-please automation and CLI --version option ([f8db976](https://github.com/brunoportis/localqueue/commit/f8db9767f45fc1eb5055ef0e7eb946aae3af3129))
102
+
103
+
104
+ ### Bug Fixes
105
+
106
+ * **release:** target uv.lock version explicitly ([3e71f44](https://github.com/brunoportis/localqueue/commit/3e71f4450e50de69488b18c04b018a6af00bf962))
107
+ * **release:** target uv.lock version explicitly ([31b45ce](https://github.com/brunoportis/localqueue/commit/31b45ce2ba3deea070d8d49c8bebebadcbc9fb37))
108
+ * **release:** track uv.lock in release-please ([897b86a](https://github.com/brunoportis/localqueue/commit/897b86aa33d9b38cba82da7b0e2623473488b94d))
109
+ * **release:** track uv.lock in release-please ([637ef7f](https://github.com/brunoportis/localqueue/commit/637ef7fca945f1153b643f27b0d6df6ccc39f778))
110
+ * **workflow:** configure git identity for release sync ([9872e7a](https://github.com/brunoportis/localqueue/commit/9872e7a85d1382a968f344444009e721da926e50))
111
+ * **workflow:** configure git identity for release sync ([2ef15fd](https://github.com/brunoportis/localqueue/commit/2ef15fdd3b5a877569b46980ef795442c1f3089c))
112
+ * **workflow:** sync uv.lock in release-please ([f26b1fa](https://github.com/brunoportis/localqueue/commit/f26b1fac2603f5ae0016ce994f5065291b6a6ad0))
113
+ * **workflow:** sync uv.lock in release-please ([193b4c6](https://github.com/brunoportis/localqueue/commit/193b4c6d5dba208ec43d7ea6ada402c5c4f1c2a5))
114
+
115
+
116
+ ### Documentation
117
+
118
+ * **use-cases:** simplify CLI examples ([84b92f2](https://github.com/brunoportis/localqueue/commit/84b92f2a420ddeb46dc8db2e6c1493fc45430bff))
119
+
120
+ ## 0.3.4
121
+
122
+ - Keep `queue exec` and `queue process` alive in `--forever --block` mode when the queue starts empty.
123
+ - Preserve the batch empty-queue exit behavior for non-forever workers.
124
+
125
+ ## 0.3.3
126
+
127
+ - Split queue and retry store implementations into dedicated modules.
128
+ - Refactor the CLI worker option wiring and centralize worker helpers.
129
+ - Add a SonarCloud workflow and stabilize the SQLite concurrency queue test.
130
+
131
+ ## 0.3.2
132
+
133
+ - Add a CLI Docker image and publish it to GHCR on version tags.
134
+ - Raise the coverage gate to 100% and align the README badge.
135
+
136
+ ## 0.3.1
137
+
138
+ - Use XDG data directories for default SQLite queue and retry store files.
139
+ - Move the exploratory retry demo from `main.py` to `examples/retry_demo.py`.
140
+ - Make `PersistentQueue` unfinished-message tracking O(1) by message id.
141
+ - Add an end-to-end SQLite worker test covering queue ack and retry cleanup.
142
+ - Make `store_path=` for persistent retries open a SQLite attempt store.
143
+ - Tighten permanent-failure classification to avoid dead-lettering common
144
+ transient application errors such as `ValueError` and `KeyError`.
145
+ - Optimize SQLite queue stats and dead-letter retention queries with
146
+ materialized columns and schema migration support.
147
+ - Add indexed SQLite retry-store retention for exhausted records.
148
+
149
+ ## 0.3.0
150
+
151
+ - Add a concurrent SQLite stress test for multiple producers and consumers.
152
+ - Add `examples/sqlite_concurrency_benchmark.py` for measuring local queue throughput.
153
+ - Make the SQLite benchmark reset its store and retry transient lock contention.
154
+ - Add `examples/sqlite_process_harness.py` for process-level throughput and crash-recovery checks.
155
+ - Add process-based stress tests for SQLite producer and consumer coordination.
156
+ - Add dead-letter filters and summaries for `queue dead`.
157
+ - Add enqueue deduplication with `--dedupe-key` and `dedupe_key=`.
158
+ - Add queue-level retry defaults that workers can inherit from `PersistentQueue`.
159
+ - Add worker rate limiting and circuit-breaker controls.
160
+ - Add usage docs for rate limiting, circuit breaker, and queue positioning.
161
+ - Add a short-term maturity note focused on performance and guarantees.
162
+
163
+ ## 0.2.0
164
+
165
+ - Add `queue stats --watch` for monitoring queue counts while workers run.
166
+ - Add `queue dead --watch` for repeatedly listing dead letters.
167
+ - Add `queue requeue-dead --all` for bulk recovery after a fix.
168
+ - Add structured `command not found` handling for `queue exec`.
169
+ - Add `examples/process_webhook.sh` as a shell/curl worker example.
170
+
171
+ ## 0.1.1
172
+
173
+ - Add project URLs for PyPI metadata.
174
+ - Document `queue exec` command-failure fields stored in `last_error`.
175
+
176
+ ## 0.1.0
177
+
178
+ - Add persistent retry wrappers for sync and async Tenacity retryers.
179
+ - Add SQLite-backed durable local queues with leases, delayed delivery,
180
+ acknowledgements, release, dead-letter records, and requeue from dead-letter
181
+ storage. LMDB remains available as an optional backend.
182
+ - Add CLI commands for config, queue add/pop/ack/release/dead-letter/stats,
183
+ inspect, dead-letter listing, dead-letter requeue, and continuous processing.
184
+ - Add `queue exec` for processing messages with external commands that receive
185
+ the message value as JSON on stdin.
186
+ - Add worker identity metadata with `--worker-id` and `leased_by` for inflight
187
+ message inspection.
188
+ - Document local-worker operational boundaries, at-least-once delivery, and
189
+ idempotency guidance.
190
+ - Add focused examples for enqueueing and processing email jobs locally.
191
+ - Add MIT license metadata for package distribution.
192
+ - Add `dead_letter_on_failure` as the preferred worker failure policy option,
193
+ keeping `dead_letter_on_exhaustion` as a compatibility alias.
194
+ - Enable SQLite WAL journal mode and normal synchronous mode for improved
195
+ concurrency in `SQLiteAttemptStore`.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: localqueue
3
- Version: 0.4.0
3
+ Version: 0.5.0
4
4
  Summary: Durable local queues for Python, with persistent retry state powered by Tenacity.
5
5
  Project-URL: Homepage, https://brunoportis.github.io/localqueue/
6
6
  Project-URL: Documentation, https://brunoportis.github.io/localqueue/
@@ -40,27 +40,62 @@ Description-Content-Type: text/markdown
40
40
  [![PyPI version](https://img.shields.io/pypi/v/localqueue.svg)](https://pypi.org/project/localqueue/)
41
41
  ![Coverage](https://img.shields.io/badge/coverage-100%25-brightgreen)
42
42
 
43
- `localqueue` is a small durable queue for one machine. It stores work on the local filesystem by default and keeps retry state with Tenacity.
43
+ `localqueue` is a small durable queue for one machine. It stores work on the
44
+ local filesystem by default and keeps retry state with Tenacity.
44
45
 
45
- Use it for scripts, CLI tools, cron jobs, and small Python workers that share one local store. Use `localqueue.retry` when another system already delivers work and you only need retry state that survives restarts.
46
+ Use it when the work can stay local and you want one of these outcomes:
47
+
48
+ - accept work now and perform the side effect later on the same machine
49
+ - inspect failed jobs and replay them from the terminal
50
+ - keep retry budgets across process restarts without adding a broker
51
+
52
+ It fits scripts, CLI tools, cron jobs, and small Python workers that share one
53
+ local store.
46
54
 
47
55
  ```bash
48
56
  localqueue queue exec emails -- python scripts/send_email.py
49
57
  ```
50
58
 
51
59
  ```python
52
- from localqueue import PersistentQueue, persistent_worker
53
-
54
- queue = PersistentQueue("emails")
60
+ from localqueue import PersistentQueue, QoS, QueueSpec, persistent_worker
61
+
62
+ spec = (
63
+ QueueSpec("emails")
64
+ .with_qos(QoS.AT_LEAST_ONCE)
65
+ .with_retry(max_retries=3)
66
+ .with_dead_letter_on_failure(False)
67
+ .with_release_delay(30.0)
68
+ .with_circuit_breaker(threshold=3, cooldown=30.0)
69
+ .with_dead_letter_queue()
70
+ )
71
+
72
+ queue = PersistentQueue(spec=spec)
73
+ worker_config = queue.build_worker_config()
55
74
  queue.put({"to": "user@example.com"})
56
75
 
57
- @persistent_worker(queue)
76
+ @persistent_worker(queue, config=worker_config)
58
77
  def send_email(job: dict[str, str]) -> None:
59
78
  deliver(job["to"])
60
79
  ```
61
80
 
81
+ Reuse same config for multiple queue names with `with_name(...)`, or override the
82
+ spec name directly in the constructor:
83
+
84
+ ```python
85
+ base = QueueSpec("orders.base").with_qos(QoS.AT_LEAST_ONCE)
86
+
87
+ payments = PersistentQueue(spec=base.with_name("orders.payment"))
88
+ refunds = PersistentQueue("orders.refund", spec=base)
89
+ ```
90
+
62
91
  Full docs live at [brunoportis.github.io/localqueue](https://brunoportis.github.io/localqueue/). The source docs are in [`docs/`](docs/).
63
92
 
93
+ Container examples live in [`examples/docker-compose/`](examples/docker-compose/README.md).
94
+ Step-by-step reproducible docs for them live in [`docs/examples.md`](docs/examples.md).
95
+
96
+ Start with [`docs/use-cases.md`](docs/use-cases.md) if you want the shortest
97
+ path to deciding whether the project fits your workflow.
98
+
64
99
  For development and release workflow details, see [`docs/develop.md`](docs/develop.md).
65
100
 
66
101
  ## Install
@@ -5,27 +5,62 @@
5
5
  [![PyPI version](https://img.shields.io/pypi/v/localqueue.svg)](https://pypi.org/project/localqueue/)
6
6
  ![Coverage](https://img.shields.io/badge/coverage-100%25-brightgreen)
7
7
 
8
- `localqueue` is a small durable queue for one machine. It stores work on the local filesystem by default and keeps retry state with Tenacity.
8
+ `localqueue` is a small durable queue for one machine. It stores work on the
9
+ local filesystem by default and keeps retry state with Tenacity.
9
10
 
10
- Use it for scripts, CLI tools, cron jobs, and small Python workers that share one local store. Use `localqueue.retry` when another system already delivers work and you only need retry state that survives restarts.
11
+ Use it when the work can stay local and you want one of these outcomes:
12
+
13
+ - accept work now and perform the side effect later on the same machine
14
+ - inspect failed jobs and replay them from the terminal
15
+ - keep retry budgets across process restarts without adding a broker
16
+
17
+ It fits scripts, CLI tools, cron jobs, and small Python workers that share one
18
+ local store.
11
19
 
12
20
  ```bash
13
21
  localqueue queue exec emails -- python scripts/send_email.py
14
22
  ```
15
23
 
16
24
  ```python
17
- from localqueue import PersistentQueue, persistent_worker
18
-
19
- queue = PersistentQueue("emails")
25
+ from localqueue import PersistentQueue, QoS, QueueSpec, persistent_worker
26
+
27
+ spec = (
28
+ QueueSpec("emails")
29
+ .with_qos(QoS.AT_LEAST_ONCE)
30
+ .with_retry(max_retries=3)
31
+ .with_dead_letter_on_failure(False)
32
+ .with_release_delay(30.0)
33
+ .with_circuit_breaker(threshold=3, cooldown=30.0)
34
+ .with_dead_letter_queue()
35
+ )
36
+
37
+ queue = PersistentQueue(spec=spec)
38
+ worker_config = queue.build_worker_config()
20
39
  queue.put({"to": "user@example.com"})
21
40
 
22
- @persistent_worker(queue)
41
+ @persistent_worker(queue, config=worker_config)
23
42
  def send_email(job: dict[str, str]) -> None:
24
43
  deliver(job["to"])
25
44
  ```
26
45
 
46
+ Reuse same config for multiple queue names with `with_name(...)`, or override the
47
+ spec name directly in the constructor:
48
+
49
+ ```python
50
+ base = QueueSpec("orders.base").with_qos(QoS.AT_LEAST_ONCE)
51
+
52
+ payments = PersistentQueue(spec=base.with_name("orders.payment"))
53
+ refunds = PersistentQueue("orders.refund", spec=base)
54
+ ```
55
+
27
56
  Full docs live at [brunoportis.github.io/localqueue](https://brunoportis.github.io/localqueue/). The source docs are in [`docs/`](docs/).
28
57
 
58
+ Container examples live in [`examples/docker-compose/`](examples/docker-compose/README.md).
59
+ Step-by-step reproducible docs for them live in [`docs/examples.md`](docs/examples.md).
60
+
61
+ Start with [`docs/use-cases.md`](docs/use-cases.md) if you want the shortest
62
+ path to deciding whether the project fits your workflow.
63
+
29
64
  For development and release workflow details, see [`docs/develop.md`](docs/develop.md).
30
65
 
31
66
  ## Install