rabbitkit 0.14.0__tar.gz → 0.15.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 (107) hide show
  1. {rabbitkit-0.14.0/src/rabbitkit.egg-info → rabbitkit-0.15.0}/PKG-INFO +9 -4
  2. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/README.md +8 -3
  3. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/pyproject.toml +1 -1
  4. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/__init__.py +2 -0
  5. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/_version.py +1 -1
  6. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/core/settlement.py +461 -107
  7. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/highload/__init__.py +2 -0
  8. rabbitkit-0.15.0/src/rabbitkit/highload/async_acker.py +345 -0
  9. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/highload/batch.py +62 -5
  10. {rabbitkit-0.14.0 → rabbitkit-0.15.0/src/rabbitkit.egg-info}/PKG-INFO +9 -4
  11. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit.egg-info/SOURCES.txt +1 -0
  12. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/LICENSE +0 -0
  13. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/setup.cfg +0 -0
  14. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/aio/__init__.py +0 -0
  15. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/async_/__init__.py +0 -0
  16. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/async_/batch.py +0 -0
  17. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/async_/broker.py +0 -0
  18. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/async_/connection.py +0 -0
  19. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/async_/pool.py +0 -0
  20. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/async_/transport.py +0 -0
  21. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/asyncapi/__init__.py +0 -0
  22. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/asyncapi/generator.py +0 -0
  23. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/asyncapi/schema.py +0 -0
  24. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/cli/__init__.py +0 -0
  25. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/cli/_utils.py +0 -0
  26. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/cli/commands/__init__.py +0 -0
  27. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/cli/commands/dlq.py +0 -0
  28. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/cli/commands/health.py +0 -0
  29. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/cli/commands/migrate.py +0 -0
  30. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/cli/commands/routes.py +0 -0
  31. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/cli/commands/run.py +0 -0
  32. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/cli/commands/shell.py +0 -0
  33. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/cli/commands/topology.py +0 -0
  34. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/concurrency.py +0 -0
  35. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/core/__init__.py +0 -0
  36. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/core/app.py +0 -0
  37. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/core/bulk.py +0 -0
  38. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/core/bulk_runner.py +0 -0
  39. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/core/config.py +0 -0
  40. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/core/env_config.py +0 -0
  41. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/core/errors.py +0 -0
  42. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/core/logging.py +0 -0
  43. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/core/message.py +0 -0
  44. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/core/path.py +0 -0
  45. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/core/pipeline.py +0 -0
  46. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/core/profiles.py +0 -0
  47. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/core/protocols.py +0 -0
  48. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/core/registry.py +0 -0
  49. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/core/retry_handoff.py +0 -0
  50. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/core/route.py +0 -0
  51. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/core/router.py +0 -0
  52. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/core/sanitizer.py +0 -0
  53. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/core/topology.py +0 -0
  54. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/core/topology_dispatch.py +0 -0
  55. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/core/types.py +0 -0
  56. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/dashboard/__init__.py +0 -0
  57. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/dashboard/app.py +0 -0
  58. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/di/__init__.py +0 -0
  59. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/di/context.py +0 -0
  60. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/di/depends.py +0 -0
  61. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/di/resolver.py +0 -0
  62. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/dlq.py +0 -0
  63. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/experimental/__init__.py +0 -0
  64. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/fastapi.py +0 -0
  65. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/health.py +0 -0
  66. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/highload/backpressure.py +0 -0
  67. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/locking.py +0 -0
  68. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/management.py +0 -0
  69. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/middleware/__init__.py +0 -0
  70. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/middleware/base.py +0 -0
  71. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/middleware/circuit_breaker.py +0 -0
  72. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/middleware/compression.py +0 -0
  73. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/middleware/deduplication.py +0 -0
  74. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/middleware/error_classifier.py +0 -0
  75. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/middleware/exception.py +0 -0
  76. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/middleware/metrics.py +0 -0
  77. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/middleware/otel.py +0 -0
  78. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/middleware/rate_limit.py +0 -0
  79. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/middleware/retry.py +0 -0
  80. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/middleware/signing.py +0 -0
  81. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/middleware/timeout.py +0 -0
  82. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/py.typed +0 -0
  83. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/queue_metrics.py +0 -0
  84. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/results/__init__.py +0 -0
  85. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/results/backend.py +0 -0
  86. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/results/middleware.py +0 -0
  87. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/rpc.py +0 -0
  88. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/serialization/__init__.py +0 -0
  89. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/serialization/base.py +0 -0
  90. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/serialization/json.py +0 -0
  91. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/serialization/msgspec.py +0 -0
  92. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/serialization/pipeline.py +0 -0
  93. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/streams.py +0 -0
  94. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/sync/__init__.py +0 -0
  95. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/sync/batch.py +0 -0
  96. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/sync/broker.py +0 -0
  97. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/sync/connection.py +0 -0
  98. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/sync/pool.py +0 -0
  99. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/sync/transport.py +0 -0
  100. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/testing/__init__.py +0 -0
  101. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/testing/app.py +0 -0
  102. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/testing/broker.py +0 -0
  103. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit/testing/fixtures.py +0 -0
  104. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit.egg-info/dependency_links.txt +0 -0
  105. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit.egg-info/entry_points.txt +0 -0
  106. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit.egg-info/requires.txt +0 -0
  107. {rabbitkit-0.14.0 → rabbitkit-0.15.0}/src/rabbitkit.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rabbitkit
3
- Version: 0.14.0
3
+ Version: 0.15.0
4
4
  Summary: Production-grade RabbitMQ toolkit — sync/async, decorator routing, retry, compression, full configurability
5
5
  Author-email: Talaat Magdy <talaatmagdy75@gmail.com>
6
6
  License-Expression: MIT
@@ -423,9 +423,14 @@ management_client=...)`) verify confirms/mandatory/persistence, a 256 KiB body
423
423
  cap, quorum queues and a quorum retry chain — and report anything they cannot
424
424
  verify as *unverified*, never green. Retry/DLQ triage headers are sanitized by
425
425
  default, and a failing delay-queue handoff backs off instead of hot-looping.
426
- `CoalescingAcker` is the only place a cumulative `basic.ack(multiple=True)`
427
- may originate: it knows every delivery on the channel and coalesces only
428
- through a completed prefix, so a still-running sibling is never acked early.
426
+ `CoalescingAcker` (and `AsyncCoalescingAcker`) is the only place a cumulative
427
+ `basic.ack(multiple=True)` may originate: it knows every delivery on the
428
+ channel and coalesces only through a completed prefix, so a still-running
429
+ sibling is never acked early. Settlement follows a **plan / emit / commit**
430
+ protocol — the ledger advances only for frames the broker actually accepted,
431
+ and emission stops at the first failure, because a cumulative ack that
432
+ follows a nack which never landed would acknowledge the very delivery meant
433
+ to be requeued.
429
434
  Every bulk path emits bounded-label metrics
430
435
  (`rabbitkit_bulk_publish_items_total{status,reason}`,
431
436
  `rabbitkit_settlement_items_total{action,status}`,
@@ -342,9 +342,14 @@ management_client=...)`) verify confirms/mandatory/persistence, a 256 KiB body
342
342
  cap, quorum queues and a quorum retry chain — and report anything they cannot
343
343
  verify as *unverified*, never green. Retry/DLQ triage headers are sanitized by
344
344
  default, and a failing delay-queue handoff backs off instead of hot-looping.
345
- `CoalescingAcker` is the only place a cumulative `basic.ack(multiple=True)`
346
- may originate: it knows every delivery on the channel and coalesces only
347
- through a completed prefix, so a still-running sibling is never acked early.
345
+ `CoalescingAcker` (and `AsyncCoalescingAcker`) is the only place a cumulative
346
+ `basic.ack(multiple=True)` may originate: it knows every delivery on the
347
+ channel and coalesces only through a completed prefix, so a still-running
348
+ sibling is never acked early. Settlement follows a **plan / emit / commit**
349
+ protocol — the ledger advances only for frames the broker actually accepted,
350
+ and emission stops at the first failure, because a cumulative ack that
351
+ follows a nack which never landed would acknowledge the very delivery meant
352
+ to be requeued.
348
353
  Every bulk path emits bounded-label metrics
349
354
  (`rabbitkit_bulk_publish_items_total{status,reason}`,
350
355
  `rabbitkit_settlement_items_total{action,status}`,
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "rabbitkit"
3
- version = "0.14.0"
3
+ version = "0.15.0"
4
4
  description = "Production-grade RabbitMQ toolkit — sync/async, decorator routing, retry, compression, full configurability"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -115,6 +115,7 @@ from rabbitkit.health import (
115
115
  broker_readiness,
116
116
  broker_readiness_async,
117
117
  )
118
+ from rabbitkit.highload.async_acker import AsyncCoalescingAcker
118
119
  from rabbitkit.highload.backpressure import FlowController
119
120
  from rabbitkit.highload.batch import (
120
121
  BatchAcker,
@@ -163,6 +164,7 @@ __all__ = [
163
164
  "AsyncAPIGeneratorConfig",
164
165
  "AsyncBatchPublisher",
165
166
  "AsyncBroker",
167
+ "AsyncCoalescingAcker",
166
168
  "AsyncHealthWatcher",
167
169
  "AsyncWorkerPool",
168
170
  "BackpressureConfig",
@@ -1,3 +1,3 @@
1
1
  """rabbitkit version — single source of truth."""
2
2
 
3
- __version__ = "0.14.0"
3
+ __version__ = "0.15.0"