redqueue 0.13.0__tar.gz → 0.13.1__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 (57) hide show
  1. {redqueue-0.13.0 → redqueue-0.13.1}/CHANGELOG.md +39 -22
  2. {redqueue-0.13.0 → redqueue-0.13.1}/PKG-INFO +2 -2
  3. {redqueue-0.13.0 → redqueue-0.13.1}/README-zh-CN.md +51 -51
  4. {redqueue-0.13.0 → redqueue-0.13.1}/README.md +51 -51
  5. {redqueue-0.13.0 → redqueue-0.13.1}/docs/API.md +51 -51
  6. {redqueue-0.13.0 → redqueue-0.13.1}/pyproject.toml +1 -1
  7. {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/__init__.py +4 -4
  8. {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/_version.py +1 -1
  9. {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/async_client.py +26 -21
  10. {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/backends/async_delay.py +372 -372
  11. {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/backends/async_list.py +12 -12
  12. {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/backends/async_stream.py +601 -601
  13. {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/backends/base.py +160 -160
  14. {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/backends/delay.py +380 -380
  15. {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/backends/list.py +12 -12
  16. {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/backends/stream.py +575 -575
  17. {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/cli.py +19 -19
  18. {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/client.py +25 -20
  19. {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/message.py +174 -169
  20. {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/monitoring.py +189 -189
  21. {redqueue-0.13.0 → redqueue-0.13.1}/tests/test_availability.py +255 -255
  22. {redqueue-0.13.0 → redqueue-0.13.1}/tests/test_cli.py +61 -61
  23. {redqueue-0.13.0 → redqueue-0.13.1}/tests/test_project_skeleton.py +230 -166
  24. {redqueue-0.13.0 → redqueue-0.13.1}/tests/test_real_redis_availability.py +124 -124
  25. {redqueue-0.13.0 → redqueue-0.13.1}/.github/workflows/ci.yml +0 -0
  26. {redqueue-0.13.0 → redqueue-0.13.1}/.gitignore +0 -0
  27. {redqueue-0.13.0 → redqueue-0.13.1}/CODE_OF_CONDUCT.md +0 -0
  28. {redqueue-0.13.0 → redqueue-0.13.1}/CONTRIBUTING.md +0 -0
  29. {redqueue-0.13.0 → redqueue-0.13.1}/LICENSE +0 -0
  30. {redqueue-0.13.0 → redqueue-0.13.1}/NOTICE +0 -0
  31. {redqueue-0.13.0 → redqueue-0.13.1}/docs/RELEASE.md +0 -0
  32. {redqueue-0.13.0 → redqueue-0.13.1}/examples/README.md +0 -0
  33. {redqueue-0.13.0 → redqueue-0.13.1}/examples/__init__.py +0 -0
  34. {redqueue-0.13.0 → redqueue-0.13.1}/examples/async_list_queue.py +0 -0
  35. {redqueue-0.13.0 → redqueue-0.13.1}/examples/common.py +0 -0
  36. {redqueue-0.13.0 → redqueue-0.13.1}/examples/compatibility_check.py +0 -0
  37. {redqueue-0.13.0 → redqueue-0.13.1}/examples/custom_serializer.py +0 -0
  38. {redqueue-0.13.0 → redqueue-0.13.1}/examples/delayed_tasks.py +0 -0
  39. {redqueue-0.13.0 → redqueue-0.13.1}/examples/monitoring_hooks.py +0 -0
  40. {redqueue-0.13.0 → redqueue-0.13.1}/examples/stream_queue.py +0 -0
  41. {redqueue-0.13.0 → redqueue-0.13.1}/examples/sync_list_queue.py +0 -0
  42. {redqueue-0.13.0 → redqueue-0.13.1}/requirements.txt +0 -0
  43. {redqueue-0.13.0 → redqueue-0.13.1}/scripts/check.py +0 -0
  44. {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/__main__.py +0 -0
  45. {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/backends/__init__.py +0 -0
  46. {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/compat.py +0 -0
  47. {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/config.py +0 -0
  48. {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/connection.py +0 -0
  49. {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/exceptions.py +0 -0
  50. {redqueue-0.13.0 → redqueue-0.13.1}/src/redqueue/serialization.py +0 -0
  51. {redqueue-0.13.0 → redqueue-0.13.1}/tests/README.md +0 -0
  52. {redqueue-0.13.0 → redqueue-0.13.1}/tests/__init__.py +0 -0
  53. {redqueue-0.13.0 → redqueue-0.13.1}/tests/fakes.py +0 -0
  54. {redqueue-0.13.0 → redqueue-0.13.1}/tests/test_backend_contracts.py +0 -0
  55. {redqueue-0.13.0 → redqueue-0.13.1}/tests/test_integration_redis.py +0 -0
  56. {redqueue-0.13.0 → redqueue-0.13.1}/tests/test_performance.py +0 -0
  57. {redqueue-0.13.0 → redqueue-0.13.1}/tests/test_real_redis_performance.py +0 -0
@@ -7,36 +7,53 @@ All notable public release changes are documented here.
7
7
  Development versions are tracked separately from formal release versions.
8
8
  开发版本与正式版本分开管理。
9
9
 
10
- ## [0.13.0] - 2026-06-27
10
+ ## [0.13.1] - 2026-06-27
11
11
 
12
- ### Added
12
+ ### Fixed
13
13
 
14
- - Added first-class `trace_id` support to `Message`, sync and async
15
- `publish()`, sync and async `delay()`, List, Streams, and delayed task
16
- backends.
17
- - Added trace propagation through message envelopes, retry, dead-letter,
18
- delayed release, and requeue flows while remaining compatible with existing
19
- `headers["trace_id"]` messages.
20
- - Added `trace_id` to monitoring events and CLI message output for lifecycle
21
- correlation.
22
- - Added CLI `--trace-id` support for `publish` and `delay`.
23
- - Added `new_trace_id()` helper for callers that want RedQueue-generated trace
24
- identifiers.
14
+ - Fixed a compatibility regression where legacy messages with blank
15
+ `headers["trace_id"]` values could fail to construct or consume after
16
+ upgrading to `0.13.0`.
17
+ - Fixed sync and async `publish(..., delay=..., message_id=...)` so delayed
18
+ publishing preserves caller-provided message ids.
25
19
 
26
- ### 新增
20
+ ### 修复
27
21
 
28
- - `Message`、同步和异步 `publish()`、同步和异步 `delay()`、List、Streams
29
- 和延迟任务后端新增一等 `trace_id` 支持。
30
- - trace 会穿过消息 envelope、重试、死信、延迟释放和重放流程,并兼容已有的
31
- `headers["trace_id"]` 消息。
32
- - 监控事件和 CLI 消息输出新增 `trace_id`,方便按链路聚合生命周期事件。
33
- - CLI 的 `publish` 和 `delay` 命令新增 `--trace-id`。
34
- - 新增 `new_trace_id()` helper,方便调用方生成 RedQueue trace 标识。
22
+ - 修复升级到 `0.13.0` 后,历史消息中空白 `headers["trace_id"]` 可能导致
23
+ 消息构造或消费失败的兼容性回归。
24
+ - 修复同步和异步 `publish(..., delay=..., message_id=...)`,现在延迟发布会
25
+ 保留调用方传入的消息 ID。
35
26
 
36
- ## [0.12.0] - 2026-06-23
27
+ ## [0.13.0] - 2026-06-27
37
28
 
38
29
  ### Added
39
30
 
31
+ - Added first-class `trace_id` support to `Message`, sync and async
32
+ `publish()`, sync and async `delay()`, List, Streams, and delayed task
33
+ backends.
34
+ - Added trace propagation through message envelopes, retry, dead-letter,
35
+ delayed release, and requeue flows while remaining compatible with existing
36
+ `headers["trace_id"]` messages.
37
+ - Added `trace_id` to monitoring events and CLI message output for lifecycle
38
+ correlation.
39
+ - Added CLI `--trace-id` support for `publish` and `delay`.
40
+ - Added `new_trace_id()` helper for callers that want RedQueue-generated trace
41
+ identifiers.
42
+
43
+ ### 新增
44
+
45
+ - `Message`、同步和异步 `publish()`、同步和异步 `delay()`、List、Streams
46
+ 和延迟任务后端新增一等 `trace_id` 支持。
47
+ - trace 会穿过消息 envelope、重试、死信、延迟释放和重放流程,并兼容已有的
48
+ `headers["trace_id"]` 消息。
49
+ - 监控事件和 CLI 消息输出新增 `trace_id`,方便按链路聚合生命周期事件。
50
+ - CLI 的 `publish` 和 `delay` 命令新增 `--trace-id`。
51
+ - 新增 `new_trace_id()` helper,方便调用方生成 RedQueue trace 标识。
52
+
53
+ ## [0.12.0] - 2026-06-23
54
+
55
+ ### Added
56
+
40
57
  - Added the `redqueue` CLI and `python -m redqueue` module entry point for
41
58
  developer debugging.
42
59
  - Added CLI commands for Redis compatibility checks, queue statistics, message
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: redqueue
3
- Version: 0.13.0
3
+ Version: 0.13.1
4
4
  Summary: Redis-backed Python message queue library with List, Streams, delayed tasks, and monitoring.
5
5
  Project-URL: Homepage, https://github.com/SpringMirror-pear/redqueue
6
6
  Project-URL: Repository, https://github.com/SpringMirror-pear/redqueue.git
@@ -367,7 +367,7 @@ REDQUEUE_REDIS_URL=redis://127.0.0.1:6379/0 PYTHONPATH=src python -m pytest -m "
367
367
 
368
368
  Latest local run on Python `3.14.5`:
369
369
 
370
- - Full test suite without `REDQUEUE_REDIS_URL`: `77 passed, 8 skipped`.
370
+ - Full test suite without `REDQUEUE_REDIS_URL`: `102 passed, 8 skipped`.
371
371
  - Real Redis availability suite: `3 passed` with
372
372
  `redis://127.0.0.1:6379/0`.
373
373
  - Real Redis server: Redis for Windows `5.0.14.1`.
@@ -14,11 +14,11 @@ https://github.com/SpringMirror-pear/redqueue.git
14
14
  `BRPOPLPUSH`。
15
15
  - 基于 Redis Streams 的消费组后端,Streams 要求 Redis `>=5.0`。
16
16
  - 基于 Redis Sorted Set 的延迟任务。
17
- - 同步客户端 `QueueClient` 与异步客户端 `AsyncQueueClient`。
18
- - 支持同步和异步 Redis 连接池管理器,方便多个客户端共享连接池。
19
- - 提供 `redqueue` CLI,用于本地调试和运行时检查。
20
- - 一等 `trace_id` 链路追踪能力,贯穿消息生命周期。
21
- - 带结构化上下文的统一异常体系。
17
+ - 同步客户端 `QueueClient` 与异步客户端 `AsyncQueueClient`。
18
+ - 支持同步和异步 Redis 连接池管理器,方便多个客户端共享连接池。
19
+ - 提供 `redqueue` CLI,用于本地调试和运行时检查。
20
+ - 一等 `trace_id` 链路追踪能力,贯穿消息生命周期。
21
+ - 带结构化上下文的统一异常体系。
22
22
  - 针对发布、消费、确认、拒绝、重试、死信、延迟和后端错误的监控事件。
23
23
  - 通过 `INFO server` 探测 Redis 能力。
24
24
  - Apache License 2.0。
@@ -72,16 +72,16 @@ redqueue stats --url redis://127.0.0.1:6379/0 --queue emails
72
72
 
73
73
  发布和消费消息:
74
74
 
75
- ```bash
76
- redqueue publish --queue emails --payload '{"to":"user@example.com"}'
77
- redqueue consume --queue emails --timeout 1 --ack
78
- ```
79
-
80
- 发布时指定 trace:
81
-
82
- ```bash
83
- redqueue publish --queue emails --payload '{"to":"user@example.com"}' --trace-id trace-123
84
- ```
75
+ ```bash
76
+ redqueue publish --queue emails --payload '{"to":"user@example.com"}'
77
+ redqueue consume --queue emails --timeout 1 --ack
78
+ ```
79
+
80
+ 发布时指定 trace:
81
+
82
+ ```bash
83
+ redqueue publish --queue emails --payload '{"to":"user@example.com"}' --trace-id trace-123
84
+ ```
85
85
 
86
86
  调试延迟任务:
87
87
 
@@ -102,8 +102,8 @@ redqueue dead-letters --queue emails --limit 20
102
102
 
103
103
  同步 List 队列:
104
104
 
105
- ```python
106
- from redqueue import QueueClient, new_trace_id
105
+ ```python
106
+ from redqueue import QueueClient, new_trace_id
107
107
 
108
108
  client = QueueClient.from_url(
109
109
  "redis://127.0.0.1:6379/0",
@@ -111,15 +111,15 @@ client = QueueClient.from_url(
111
111
  backend="list",
112
112
  )
113
113
 
114
- trace_id = new_trace_id()
115
- message_id = client.publish({"to": "user@example.com"}, trace_id=trace_id)
116
- message = client.consume(timeout=1)
117
-
118
- if message is not None:
119
- try:
120
- print(message.trace_id)
121
- print(message.payload)
122
- client.ack(message)
114
+ trace_id = new_trace_id()
115
+ message_id = client.publish({"to": "user@example.com"}, trace_id=trace_id)
116
+ message = client.consume(timeout=1)
117
+
118
+ if message is not None:
119
+ try:
120
+ print(message.trace_id)
121
+ print(message.payload)
122
+ client.ack(message)
123
123
  except Exception:
124
124
  client.retry(message, reason="handler failed")
125
125
  ```
@@ -170,30 +170,30 @@ asyncio.run(main())
170
170
  ```python
171
171
  from redqueue import QueueClient
172
172
 
173
- client = QueueClient.from_url("redis://127.0.0.1:6379/0", queue="emails")
174
- client.delay({"to": "later@example.com"}, delay_seconds=60, trace_id="trace-123")
175
- released = client.schedule_due(limit=100)
176
- ```
177
-
178
- 链路追踪:
179
-
180
- ```python
181
- from redqueue import InMemoryMonitoringHook, QueueClient, new_trace_id
182
-
183
- hook = InMemoryMonitoringHook()
184
- client = QueueClient.from_url(
185
- "redis://127.0.0.1:6379/0",
186
- queue="emails",
187
- monitoring=hook,
188
- )
189
-
190
- trace_id = new_trace_id()
191
- client.publish({"to": "user@example.com"}, trace_id=trace_id)
192
- message = client.consume(timeout=1)
193
-
194
- assert message.trace_id == trace_id
195
- assert hook.events[-1].trace_id == trace_id
196
- ```
173
+ client = QueueClient.from_url("redis://127.0.0.1:6379/0", queue="emails")
174
+ client.delay({"to": "later@example.com"}, delay_seconds=60, trace_id="trace-123")
175
+ released = client.schedule_due(limit=100)
176
+ ```
177
+
178
+ 链路追踪:
179
+
180
+ ```python
181
+ from redqueue import InMemoryMonitoringHook, QueueClient, new_trace_id
182
+
183
+ hook = InMemoryMonitoringHook()
184
+ client = QueueClient.from_url(
185
+ "redis://127.0.0.1:6379/0",
186
+ queue="emails",
187
+ monitoring=hook,
188
+ )
189
+
190
+ trace_id = new_trace_id()
191
+ client.publish({"to": "user@example.com"}, trace_id=trace_id)
192
+ message = client.consume(timeout=1)
193
+
194
+ assert message.trace_id == trace_id
195
+ assert hook.events[-1].trace_id == trace_id
196
+ ```
197
197
 
198
198
  连接池管理:
199
199
 
@@ -329,7 +329,7 @@ REDQUEUE_REDIS_URL=redis://127.0.0.1:6379/0 PYTHONPATH=src python -m pytest -m "
329
329
 
330
330
  Python `3.14.5` 最新本地运行结果:
331
331
 
332
- - 未设置 `REDQUEUE_REDIS_URL` 时的完整测试套件:`77 passed, 8 skipped`。
332
+ - 未设置 `REDQUEUE_REDIS_URL` 时的完整测试套件:`102 passed, 8 skipped`。
333
333
  - 真实 Redis 可用性套件:使用 `redis://127.0.0.1:6379/0` 时 `3 passed`。
334
334
  - 真实 Redis 服务端:Redis for Windows `5.0.14.1`。
335
335
  - 可用性套件覆盖:List processing 恢复、List 死信重放、Streams Redis
@@ -15,11 +15,11 @@ https://github.com/SpringMirror-pear/redqueue.git
15
15
  fallback on older compatible Redis versions.
16
16
  - Redis Streams backend with consumer groups. Streams require Redis `>=5.0`.
17
17
  - Delayed tasks based on Redis Sorted Set.
18
- - Sync client `QueueClient` and async client `AsyncQueueClient`.
19
- - Redis connection pool managers for shared sync and async resources.
20
- - `redqueue` CLI for local debugging and operational checks.
21
- - First-class `trace_id` propagation for lifecycle tracing.
22
- - Unified exception hierarchy with structured context.
18
+ - Sync client `QueueClient` and async client `AsyncQueueClient`.
19
+ - Redis connection pool managers for shared sync and async resources.
20
+ - `redqueue` CLI for local debugging and operational checks.
21
+ - First-class `trace_id` propagation for lifecycle tracing.
22
+ - Unified exception hierarchy with structured context.
23
23
  - Monitoring events for publish, consume, ack, nack, retry, dead letter, delay,
24
24
  and backend errors.
25
25
  - Redis capability detection from `INFO server`.
@@ -74,16 +74,16 @@ redqueue stats --url redis://127.0.0.1:6379/0 --queue emails
74
74
 
75
75
  Publish and consume messages:
76
76
 
77
- ```bash
78
- redqueue publish --queue emails --payload '{"to":"user@example.com"}'
79
- redqueue consume --queue emails --timeout 1 --ack
80
- ```
81
-
82
- Publish with trace correlation:
83
-
84
- ```bash
85
- redqueue publish --queue emails --payload '{"to":"user@example.com"}' --trace-id trace-123
86
- ```
77
+ ```bash
78
+ redqueue publish --queue emails --payload '{"to":"user@example.com"}'
79
+ redqueue consume --queue emails --timeout 1 --ack
80
+ ```
81
+
82
+ Publish with trace correlation:
83
+
84
+ ```bash
85
+ redqueue publish --queue emails --payload '{"to":"user@example.com"}' --trace-id trace-123
86
+ ```
87
87
 
88
88
  Delayed task debugging:
89
89
 
@@ -104,8 +104,8 @@ All command output is JSON so it can be piped into scripts or log processors.
104
104
 
105
105
  Synchronous List queue:
106
106
 
107
- ```python
108
- from redqueue import QueueClient, new_trace_id
107
+ ```python
108
+ from redqueue import QueueClient, new_trace_id
109
109
 
110
110
  client = QueueClient.from_url(
111
111
  "redis://127.0.0.1:6379/0",
@@ -113,15 +113,15 @@ client = QueueClient.from_url(
113
113
  backend="list",
114
114
  )
115
115
 
116
- trace_id = new_trace_id()
117
- message_id = client.publish({"to": "user@example.com"}, trace_id=trace_id)
118
- message = client.consume(timeout=1)
119
-
120
- if message is not None:
121
- try:
122
- print(message.trace_id)
123
- print(message.payload)
124
- client.ack(message)
116
+ trace_id = new_trace_id()
117
+ message_id = client.publish({"to": "user@example.com"}, trace_id=trace_id)
118
+ message = client.consume(timeout=1)
119
+
120
+ if message is not None:
121
+ try:
122
+ print(message.trace_id)
123
+ print(message.payload)
124
+ client.ack(message)
125
125
  except Exception:
126
126
  client.retry(message, reason="handler failed")
127
127
  ```
@@ -172,30 +172,30 @@ Delayed task:
172
172
  ```python
173
173
  from redqueue import QueueClient
174
174
 
175
- client = QueueClient.from_url("redis://127.0.0.1:6379/0", queue="emails")
176
- client.delay({"to": "later@example.com"}, delay_seconds=60, trace_id="trace-123")
177
- released = client.schedule_due(limit=100)
178
- ```
179
-
180
- Trace IDs:
181
-
182
- ```python
183
- from redqueue import InMemoryMonitoringHook, QueueClient, new_trace_id
184
-
185
- hook = InMemoryMonitoringHook()
186
- client = QueueClient.from_url(
187
- "redis://127.0.0.1:6379/0",
188
- queue="emails",
189
- monitoring=hook,
190
- )
191
-
192
- trace_id = new_trace_id()
193
- client.publish({"to": "user@example.com"}, trace_id=trace_id)
194
- message = client.consume(timeout=1)
195
-
196
- assert message.trace_id == trace_id
197
- assert hook.events[-1].trace_id == trace_id
198
- ```
175
+ client = QueueClient.from_url("redis://127.0.0.1:6379/0", queue="emails")
176
+ client.delay({"to": "later@example.com"}, delay_seconds=60, trace_id="trace-123")
177
+ released = client.schedule_due(limit=100)
178
+ ```
179
+
180
+ Trace IDs:
181
+
182
+ ```python
183
+ from redqueue import InMemoryMonitoringHook, QueueClient, new_trace_id
184
+
185
+ hook = InMemoryMonitoringHook()
186
+ client = QueueClient.from_url(
187
+ "redis://127.0.0.1:6379/0",
188
+ queue="emails",
189
+ monitoring=hook,
190
+ )
191
+
192
+ trace_id = new_trace_id()
193
+ client.publish({"to": "user@example.com"}, trace_id=trace_id)
194
+ message = client.consume(timeout=1)
195
+
196
+ assert message.trace_id == trace_id
197
+ assert hook.events[-1].trace_id == trace_id
198
+ ```
199
199
 
200
200
  Connection pool management:
201
201
 
@@ -334,7 +334,7 @@ REDQUEUE_REDIS_URL=redis://127.0.0.1:6379/0 PYTHONPATH=src python -m pytest -m "
334
334
 
335
335
  Latest local run on Python `3.14.5`:
336
336
 
337
- - Full test suite without `REDQUEUE_REDIS_URL`: `77 passed, 8 skipped`.
337
+ - Full test suite without `REDQUEUE_REDIS_URL`: `102 passed, 8 skipped`.
338
338
  - Real Redis availability suite: `3 passed` with
339
339
  `redis://127.0.0.1:6379/0`.
340
340
  - Real Redis server: Redis for Windows `5.0.14.1`.
@@ -1,8 +1,8 @@
1
1
  # RedQueue API / RedQueue API 文档
2
2
 
3
- This document describes the public API available in RedQueue `0.13.0`.
3
+ This document describes the public API available in RedQueue `0.13.1`.
4
4
 
5
- 本文档描述 RedQueue `0.13.0` 的公开 API。
5
+ 本文档描述 RedQueue `0.13.1` 的公开 API。
6
6
 
7
7
  ## Clients / 客户端
8
8
 
@@ -27,12 +27,12 @@ Methods / 方法:
27
27
  - `from_url(url, *, queue, backend="list", connection_manager=None, **options) -> QueueClient`
28
28
  - Advanced options include `pool_options`, injected `redis`, injected
29
29
  `capabilities`, and `owns_redis`.
30
- - `publish(payload, *, delay=None, headers=None, message_id=None, trace_id=None) -> str`
30
+ - `publish(payload, *, delay=None, headers=None, message_id=None, trace_id=None) -> str`
31
31
  - `consume(*, timeout=None, batch_size=1) -> Message | list[Message] | None`
32
32
  - `ack(message) -> None`
33
33
  - `nack(message, *, requeue=True) -> None`
34
34
  - `retry(message, *, delay=None, reason=None) -> None`
35
- - `delay(payload, *, delay_seconds=None, run_at=None, headers=None, trace_id=None) -> str`
35
+ - `delay(payload, *, delay_seconds=None, run_at=None, headers=None, message_id=None, trace_id=None) -> str`
36
36
  - `schedule_due(*, limit=100, now=None) -> int`
37
37
  - `recover_stale(*, min_idle_ms=None, limit=100) -> int`
38
38
  - `dead_letters(*, limit=100) -> list[Message]`
@@ -61,12 +61,12 @@ Methods / 方法:
61
61
  - `await from_url(url, *, queue, backend="list", connection_manager=None, **options) -> AsyncQueueClient`
62
62
  - Advanced options include `pool_options`, injected `redis`, injected
63
63
  `capabilities`, and `owns_redis`.
64
- - `await publish(payload, *, delay=None, headers=None, message_id=None, trace_id=None) -> str`
64
+ - `await publish(payload, *, delay=None, headers=None, message_id=None, trace_id=None) -> str`
65
65
  - `await consume(*, timeout=None, batch_size=1) -> Message | list[Message] | None`
66
66
  - `await ack(message) -> None`
67
67
  - `await nack(message, *, requeue=True) -> None`
68
68
  - `await retry(message, *, delay=None, reason=None) -> None`
69
- - `await delay(payload, *, delay_seconds=None, run_at=None, headers=None, trace_id=None) -> str`
69
+ - `await delay(payload, *, delay_seconds=None, run_at=None, headers=None, message_id=None, trace_id=None) -> str`
70
70
  - `await schedule_due(*, limit=100, now=None) -> int`
71
71
  - `await recover_stale(*, min_idle_ms=None, limit=100) -> int`
72
72
  - `await dead_letters(*, limit=100) -> list[Message]`
@@ -188,10 +188,10 @@ Fields / 字段:
188
188
 
189
189
  - `id: str`
190
190
  - `queue: str`
191
- - `payload: Any`
192
- - `headers: dict[str, Any]`
193
- - `trace_id: str | None`
194
- - `attempts: int`
191
+ - `payload: Any`
192
+ - `headers: dict[str, Any]`
193
+ - `trace_id: str | None`
194
+ - `attempts: int`
195
195
  - `created_at: float`
196
196
  - `available_at: float | None`
197
197
  - `backend: str | None`
@@ -200,32 +200,32 @@ Fields / 字段:
200
200
 
201
201
  Helpers / 辅助方法:
202
202
 
203
- - `with_attempt() -> Message`
204
- - `with_backend(backend, *, raw_id=None, raw_payload=None) -> Message`
205
- - `new_message_id() -> str`
206
- - `new_trace_id() -> str`
207
-
208
- ## Trace IDs / 链路追踪
209
-
210
- `trace_id` is an optional lifecycle correlation id. It can be supplied to
211
- `publish()` or `delay()`, is mirrored into `Message.headers["trace_id"]`, and is
212
- preserved through consume, ack, nack, retry, delayed release, dead-letter, and
213
- requeue flows.
214
-
215
- `trace_id` 是可选的生命周期关联 ID。可以在 `publish()` 或 `delay()` 中传入,
216
- 会同步写入 `Message.headers["trace_id"]`,并在消费、ack、nack、retry、
217
- 延迟释放、死信和重放流程中保持传递。
218
-
219
- ```python
220
- from redqueue import QueueClient, new_trace_id
221
-
222
- client = QueueClient.from_url("redis://127.0.0.1:6379/0", queue="emails")
223
- trace_id = new_trace_id()
224
- client.publish({"to": "user@example.com"}, trace_id=trace_id)
225
- message = client.consume(timeout=1)
226
-
227
- assert message.trace_id == trace_id
228
- ```
203
+ - `with_attempt() -> Message`
204
+ - `with_backend(backend, *, raw_id=None, raw_payload=None) -> Message`
205
+ - `new_message_id() -> str`
206
+ - `new_trace_id() -> str`
207
+
208
+ ## Trace IDs / 链路追踪
209
+
210
+ `trace_id` is an optional lifecycle correlation id. It can be supplied to
211
+ `publish()` or `delay()`, is mirrored into `Message.headers["trace_id"]`, and is
212
+ preserved through consume, ack, nack, retry, delayed release, dead-letter, and
213
+ requeue flows.
214
+
215
+ `trace_id` 是可选的生命周期关联 ID。可以在 `publish()` 或 `delay()` 中传入,
216
+ 会同步写入 `Message.headers["trace_id"]`,并在消费、ack、nack、retry、
217
+ 延迟释放、死信和重放流程中保持传递。
218
+
219
+ ```python
220
+ from redqueue import QueueClient, new_trace_id
221
+
222
+ client = QueueClient.from_url("redis://127.0.0.1:6379/0", queue="emails")
223
+ trace_id = new_trace_id()
224
+ client.publish({"to": "user@example.com"}, trace_id=trace_id)
225
+ message = client.consume(timeout=1)
226
+
227
+ assert message.trace_id == trace_id
228
+ ```
229
229
 
230
230
  ## Backends / 后端
231
231
 
@@ -323,13 +323,13 @@ All RedQueue custom exceptions inherit from `RedQueueError`.
323
323
  - `CompositeMonitoringHook`
324
324
  - `SafeMonitoringHook`
325
325
 
326
- Monitoring events do not include business payload by default.
327
-
328
- 监控事件默认不包含业务 payload。
329
-
330
- Monitoring events include `trace_id` when a message operation has one.
331
-
332
- 消息操作存在 `trace_id` 时,监控事件会包含该字段。
326
+ Monitoring events do not include business payload by default.
327
+
328
+ 监控事件默认不包含业务 payload。
329
+
330
+ Monitoring events include `trace_id` when a message operation has one.
331
+
332
+ 消息操作存在 `trace_id` 时,监控事件会包含该字段。
333
333
 
334
334
  ## Redis Capability Detection / Redis 能力探测
335
335
 
@@ -345,19 +345,19 @@ Streams are rejected with `RedisCompatibilityError` when Redis is below `5.0`.
345
345
 
346
346
  ## CLI / 命令行工具
347
347
 
348
- RedQueue `0.13.0` provides a `redqueue` console command and a
348
+ RedQueue `0.13.1` provides a `redqueue` console command and a
349
349
  `python -m redqueue` module entry point for developer diagnostics.
350
350
 
351
- RedQueue `0.13.0` 提供 `redqueue` 控制台命令和 `python -m redqueue`
352
- 模块入口,用于开发者调试。
351
+ RedQueue `0.13.1` 提供 `redqueue` 控制台命令和 `python -m redqueue`
352
+ 模块入口,用于开发者调试。
353
353
 
354
354
  Commands / 命令:
355
355
 
356
356
  - `redqueue check --url redis://127.0.0.1:6379/0`
357
357
  - `redqueue stats --queue emails [--backend list|stream]`
358
- - `redqueue publish --queue emails --payload '{"to":"user@example.com"}' [--trace-id trace-123]`
358
+ - `redqueue publish --queue emails --payload '{"to":"user@example.com"}' [--trace-id trace-123]`
359
359
  - `redqueue consume --queue emails [--ack|--nack|--retry]`
360
- - `redqueue delay --queue emails --payload '{"to":"later@example.com"}' --delay-seconds 60 [--trace-id trace-123]`
360
+ - `redqueue delay --queue emails --payload '{"to":"later@example.com"}' --delay-seconds 60 [--trace-id trace-123]`
361
361
  - `redqueue schedule-due --queue emails --limit 100`
362
362
  - `redqueue dead-letters --queue emails --limit 20`
363
363
 
@@ -367,9 +367,9 @@ Common options / 通用选项:
367
367
  - `--queue`: RedQueue queue name.
368
368
  - `--backend`: `list` or `stream`.
369
369
  - `--namespace`: Redis key namespace. Defaults to `rq`.
370
- - `--consumer-group`: Streams consumer group. Defaults to `redqueue`.
371
- - `--consumer-name`: Optional Streams consumer name.
372
- - `--trace-id`: Optional trace id for `publish` and `delay`.
370
+ - `--consumer-group`: Streams consumer group. Defaults to `redqueue`.
371
+ - `--consumer-name`: Optional Streams consumer name.
372
+ - `--trace-id`: Optional trace id for `publish` and `delay`.
373
373
 
374
374
  Payload and headers are JSON strings. Command responses are stable JSON objects.
375
375
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "redqueue"
7
- version = "0.13.0"
7
+ version = "0.13.1"
8
8
  description = "Redis-backed Python message queue library with List, Streams, delayed tasks, and monitoring."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.9"
@@ -26,7 +26,7 @@ from redqueue.exceptions import (
26
26
  RedQueueError,
27
27
  RetryExceededError,
28
28
  )
29
- from redqueue.message import Message, new_message_id, new_trace_id
29
+ from redqueue.message import Message, new_message_id, new_trace_id
30
30
  from redqueue.monitoring import (
31
31
  CompositeMonitoringHook,
32
32
  InMemoryMonitoringHook,
@@ -71,6 +71,6 @@ __all__ = [
71
71
  "detect_capabilities",
72
72
  "detect_capabilities_async",
73
73
  "extract_redis_version",
74
- "new_message_id",
75
- "new_trace_id",
76
- ]
74
+ "new_message_id",
75
+ "new_trace_id",
76
+ ]
@@ -3,4 +3,4 @@
3
3
 
4
4
  """Package version."""
5
5
 
6
- __version__ = "0.13.0"
6
+ __version__ = "0.13.1"