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.
- localqueue-0.5.0/CHANGELOG.md +195 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/PKG-INFO +42 -7
- {localqueue-0.4.0 → localqueue-0.5.0}/README.md +41 -6
- localqueue-0.5.0/docs/api.md +722 -0
- localqueue-0.5.0/docs/examples/pull-compose.md +63 -0
- localqueue-0.5.0/docs/examples/push-compose.md +49 -0
- localqueue-0.5.0/docs/examples/websocket-compose.md +58 -0
- localqueue-0.5.0/docs/examples.md +14 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/docs/index.md +15 -5
- localqueue-0.5.0/docs/plans/notification-policy-pr.md +258 -0
- localqueue-0.5.0/docs/plans/pubsub-physical-fanout-pr.md +178 -0
- localqueue-0.5.0/docs/plans/queue-architecture-roadmap.md +261 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/docs/queues.md +551 -4
- {localqueue-0.4.0 → localqueue-0.5.0}/docs/retries.md +21 -8
- {localqueue-0.4.0 → localqueue-0.5.0}/docs/stability.md +29 -0
- localqueue-0.5.0/docs/use-cases/local-outbox.md +75 -0
- localqueue-0.5.0/docs/use-cases/operator-recovery.md +78 -0
- localqueue-0.5.0/docs/use-cases/persistent-retries.md +72 -0
- localqueue-0.5.0/docs/use-cases.md +54 -0
- localqueue-0.5.0/examples/docker-compose/README.md +11 -0
- localqueue-0.5.0/examples/docker-compose/pull/README.md +28 -0
- localqueue-0.5.0/examples/docker-compose/pull/compose.yaml +40 -0
- localqueue-0.5.0/examples/docker-compose/pull/producer.py +33 -0
- localqueue-0.5.0/examples/docker-compose/pull/worker.py +15 -0
- localqueue-0.5.0/examples/docker-compose/push/README.md +19 -0
- localqueue-0.5.0/examples/docker-compose/push/compose.yaml +16 -0
- localqueue-0.5.0/examples/docker-compose/push/push_app.py +63 -0
- localqueue-0.5.0/examples/docker-compose/websocket/Dockerfile +13 -0
- localqueue-0.5.0/examples/docker-compose/websocket/README.md +24 -0
- localqueue-0.5.0/examples/docker-compose/websocket/compose.yaml +32 -0
- localqueue-0.5.0/examples/docker-compose/websocket/websocket_app.py +71 -0
- localqueue-0.5.0/examples/docker-compose/websocket/websocket_client.py +27 -0
- localqueue-0.5.0/localqueue/__init__.py +239 -0
- localqueue-0.5.0/localqueue/adapters/__init__.py +15 -0
- localqueue-0.5.0/localqueue/adapters/dispatch.py +40 -0
- localqueue-0.5.0/localqueue/adapters/notification.py +211 -0
- localqueue-0.4.0/localqueue/cli.py → localqueue-0.5.0/localqueue/cli/__init__.py +8 -8
- localqueue-0.4.0/localqueue/cli_commands.py → localqueue-0.5.0/localqueue/cli/commands.py +3 -3
- localqueue-0.4.0/localqueue/cli_support.py → localqueue-0.5.0/localqueue/cli/support.py +3 -3
- localqueue-0.4.0/localqueue/cli_worker_commands.py → localqueue-0.5.0/localqueue/cli/worker.py +3 -3
- localqueue-0.5.0/localqueue/cli_commands.py +1 -0
- localqueue-0.5.0/localqueue/cli_support.py +1 -0
- localqueue-0.5.0/localqueue/cli_worker_commands.py +1 -0
- localqueue-0.5.0/localqueue/idempotency/__init__.py +17 -0
- localqueue-0.5.0/localqueue/idempotency/stores/__init__.py +13 -0
- localqueue-0.5.0/localqueue/idempotency/stores/_shared.py +22 -0
- localqueue-0.5.0/localqueue/idempotency/stores/base.py +45 -0
- localqueue-0.5.0/localqueue/idempotency/stores/lmdb.py +88 -0
- localqueue-0.5.0/localqueue/idempotency/stores/memory.py +55 -0
- localqueue-0.5.0/localqueue/idempotency/stores/sqlite.py +154 -0
- localqueue-0.5.0/localqueue/policies/__init__.py +181 -0
- localqueue-0.5.0/localqueue/policies/_types.py +18 -0
- localqueue-0.5.0/localqueue/policies/acknowledgement.py +32 -0
- localqueue-0.5.0/localqueue/policies/backpressure.py +68 -0
- localqueue-0.5.0/localqueue/policies/commit.py +109 -0
- localqueue-0.5.0/localqueue/policies/consumption.py +48 -0
- localqueue-0.5.0/localqueue/policies/dead_letter.py +32 -0
- localqueue-0.5.0/localqueue/policies/deduplication.py +42 -0
- localqueue-0.5.0/localqueue/policies/delivery.py +86 -0
- localqueue-0.5.0/localqueue/policies/dispatch.py +49 -0
- localqueue-0.5.0/localqueue/policies/lease.py +41 -0
- localqueue-0.5.0/localqueue/policies/locality.py +48 -0
- localqueue-0.5.0/localqueue/policies/notification.py +57 -0
- localqueue-0.5.0/localqueue/policies/ordering.py +66 -0
- localqueue-0.5.0/localqueue/policies/policy_set.py +212 -0
- localqueue-0.5.0/localqueue/policies/results.py +56 -0
- localqueue-0.5.0/localqueue/policies/routing.py +48 -0
- localqueue-0.5.0/localqueue/policies/semantics.py +37 -0
- localqueue-0.5.0/localqueue/policies/subscriptions.py +69 -0
- localqueue-0.5.0/localqueue/queue.py +35 -0
- localqueue-0.5.0/localqueue/queues/__init__.py +26 -0
- localqueue-0.5.0/localqueue/queues/core.py +632 -0
- localqueue-0.5.0/localqueue/queues/policies.py +129 -0
- localqueue-0.5.0/localqueue/queues/timing.py +23 -0
- localqueue-0.5.0/localqueue/queues/validation.py +114 -0
- localqueue-0.5.0/localqueue/results/__init__.py +15 -0
- localqueue-0.5.0/localqueue/results/stores/__init__.py +12 -0
- localqueue-0.5.0/localqueue/results/stores/_shared.py +22 -0
- localqueue-0.5.0/localqueue/results/stores/base.py +24 -0
- localqueue-0.5.0/localqueue/results/stores/lmdb.py +52 -0
- localqueue-0.5.0/localqueue/results/stores/memory.py +29 -0
- localqueue-0.5.0/localqueue/results/stores/sqlite.py +93 -0
- localqueue-0.5.0/localqueue/services/queue_worker.py +34 -0
- localqueue-0.5.0/localqueue/spec.py +169 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/stores/_shared.py +22 -4
- {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/stores/base.py +2 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/stores/lmdb.py +17 -5
- {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/stores/memory.py +17 -5
- {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/stores/sqlite.py +28 -10
- localqueue-0.5.0/localqueue/worker.py +26 -0
- localqueue-0.5.0/localqueue/workers/__init__.py +51 -0
- localqueue-0.4.0/localqueue/services/queue_worker.py → localqueue-0.5.0/localqueue/workers/queue.py +1 -1
- localqueue-0.4.0/localqueue/worker.py → localqueue-0.5.0/localqueue/workers/runtime.py +277 -6
- {localqueue-0.4.0 → localqueue-0.5.0}/pyproject.toml +1 -1
- localqueue-0.5.0/tests/test_queue.py +5826 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/uv.lock +1 -1
- localqueue-0.4.0/CHANGELOG.md +0 -102
- localqueue-0.4.0/docs/api.md +0 -389
- localqueue-0.4.0/docs/use-cases.md +0 -174
- localqueue-0.4.0/localqueue/__init__.py +0 -69
- localqueue-0.4.0/localqueue/queue.py +0 -313
- localqueue-0.4.0/tests/test_queue.py +0 -2905
- {localqueue-0.4.0 → localqueue-0.5.0}/.gitignore +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/LICENSE +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/docs/compare.md +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/docs/develop.md +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/docs/operational-maturity.md +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/docs/release.md +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/examples/email_worker.py +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/examples/enqueue_email.py +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/examples/process_webhook.sh +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/examples/retry_demo.py +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/examples/sqlite_concurrency_benchmark.py +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/examples/sqlite_process_harness.py +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/failure.py +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/paths.py +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/retry/__init__.py +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/retry/stores/__init__.py +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/retry/stores/_shared.py +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/retry/stores/base.py +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/retry/stores/lmdb.py +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/retry/stores/memory.py +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/retry/stores/sqlite.py +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/retry/tenacity.py +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/services/__init__.py +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/localqueue/stores/__init__.py +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/tests/test_cli.py +0 -0
- {localqueue-0.4.0 → localqueue-0.5.0}/tests/test_process_harness.py +0 -0
- {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.
|
|
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
|
[](https://pypi.org/project/localqueue/)
|
|
41
41
|

|
|
42
42
|
|
|
43
|
-
`localqueue` is a small durable queue for one machine. It stores work on the
|
|
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
|
|
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
|
-
|
|
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
|
[](https://pypi.org/project/localqueue/)
|
|
6
6
|

|
|
7
7
|
|
|
8
|
-
`localqueue` is a small durable queue for one machine. It stores work on the
|
|
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
|
|
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
|
-
|
|
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
|