redis-message-queue 8.2.3__tar.gz → 8.2.4__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 (26) hide show
  1. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/PKG-INFO +2 -2
  2. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/README.md +1 -1
  3. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/pyproject.toml +2 -2
  4. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/redis_message_queue/_config.py +1 -0
  5. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/redis_message_queue/_redis_gateway.py +6 -2
  6. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/redis_message_queue/asyncio/_redis_gateway.py +6 -2
  7. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/redis_message_queue/asyncio/redis_message_queue.py +10 -0
  8. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/redis_message_queue/redis_message_queue.py +7 -0
  9. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/.gitignore +0 -0
  10. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/LICENSE +0 -0
  11. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/redis_message_queue/__init__.py +0 -0
  12. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/redis_message_queue/_abstract_redis_gateway.py +0 -0
  13. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/redis_message_queue/_callable_utils.py +0 -0
  14. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/redis_message_queue/_event.py +0 -0
  15. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/redis_message_queue/_exceptions.py +0 -0
  16. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/redis_message_queue/_payload_limits.py +0 -0
  17. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/redis_message_queue/_queue_key_manager.py +0 -0
  18. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/redis_message_queue/_redis_cluster.py +0 -0
  19. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/redis_message_queue/_stored_message.py +0 -0
  20. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/redis_message_queue/asyncio/__init__.py +0 -0
  21. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/redis_message_queue/asyncio/_abstract_redis_gateway.py +0 -0
  22. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/redis_message_queue/interrupt_handler/__init__.py +0 -0
  23. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/redis_message_queue/interrupt_handler/_event_driven.py +0 -0
  24. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/redis_message_queue/interrupt_handler/_implementation.py +0 -0
  25. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/redis_message_queue/interrupt_handler/_interface.py +0 -0
  26. {redis_message_queue-8.2.3 → redis_message_queue-8.2.4}/redis_message_queue/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: redis-message-queue
3
- Version: 8.2.3
3
+ Version: 8.2.4
4
4
  Summary: Python message queuing with Redis and message deduplication
5
5
  Project-URL: Homepage, https://github.com/Elijas/redis-message-queue
6
6
  Project-URL: Repository, https://github.com/Elijas/redis-message-queue
@@ -34,7 +34,7 @@ Description-Content-Type: text/markdown
34
34
  **Lightweight Python message queuing with Redis and built-in publish-side deduplication.** Deduplicate publishes within a TTL window, with optional crash recovery — across any number of producers and consumers.
35
35
 
36
36
  ```bash
37
- pip install "redis-message-queue>=8.2.3,<9.0.0"
37
+ pip install "redis-message-queue>=8.2.4,<9.0.0"
38
38
  ```
39
39
 
40
40
  Requires Redis server >= 6.2.
@@ -11,7 +11,7 @@
11
11
  **Lightweight Python message queuing with Redis and built-in publish-side deduplication.** Deduplicate publishes within a TTL window, with optional crash recovery — across any number of producers and consumers.
12
12
 
13
13
  ```bash
14
- pip install "redis-message-queue>=8.2.3,<9.0.0"
14
+ pip install "redis-message-queue>=8.2.4,<9.0.0"
15
15
  ```
16
16
 
17
17
  Requires Redis server >= 6.2.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "redis-message-queue"
3
- version = "8.2.3"
3
+ version = "8.2.4"
4
4
  description = "Python message queuing with Redis and message deduplication"
5
5
  authors = [{ name = "Elijas", email = "4084885+Elijas@users.noreply.github.com" }]
6
6
  readme = "README.md"
@@ -48,7 +48,7 @@ default-groups = ["dev", "test"]
48
48
  ##############################
49
49
 
50
50
  [tool.bumpversion]
51
- current_version = "8.2.3"
51
+ current_version = "8.2.4"
52
52
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
53
53
  serialize = ["{major}.{minor}.{patch}"]
54
54
  search = "{current_version}"
@@ -623,6 +623,7 @@ local removed = redis.call('LREM', KEYS[1], 1, ARGV[1])
623
623
  if removed == 1 then
624
624
  redis.call('HDEL', KEYS[3], ARGV[2])
625
625
  redis.call('HDEL', KEYS[4], ARGV[1])
626
+ redis.call('DEL', KEYS[6])
626
627
  else
627
628
  redis.call('LREM', KEYS[2], 1, ARGV[1])
628
629
  end
@@ -706,6 +706,8 @@ class RedisGateway(AbstractRedisGateway):
706
706
  clear=clear_pending_claim_id,
707
707
  )
708
708
  if recovered_claim is not None:
709
+ if self._message_visibility_timeout_seconds is None:
710
+ self._delete_claim_result_key(self._claim_result_key(to_queue, pending_claim_id))
709
711
  self._emit_event("claim_reclaim", "success", claim_id=pending_claim_id)
710
712
  return recovered_claim
711
713
 
@@ -813,6 +815,8 @@ class RedisGateway(AbstractRedisGateway):
813
815
  pending_claim_id_to_share = claim_id
814
816
  raise
815
817
  if recovered_claim is not None:
818
+ if self._message_visibility_timeout_seconds is None:
819
+ self._delete_claim_result_key(self._claim_result_key(to_queue, claim_id))
816
820
  self._emit_event("claim_reclaim", "success", claim_id=claim_id)
817
821
  return recovered_claim
818
822
  self._emit_event(
@@ -1171,7 +1175,6 @@ class RedisGateway(AbstractRedisGateway):
1171
1175
  _raise_if_drain_deadline_expired(deadline_monotonic)
1172
1176
  if cached_claim is None:
1173
1177
  return None
1174
- self._delete_claim_result_key(claim_result_key, deadline_monotonic=deadline_monotonic)
1175
1178
  _raise_if_drain_deadline_expired(deadline_monotonic)
1176
1179
  return cached_claim
1177
1180
 
@@ -1250,12 +1253,13 @@ class RedisGateway(AbstractRedisGateway):
1250
1253
  result = _call_with_drain_deadline(
1251
1254
  lambda: self._eval(
1252
1255
  RETURN_MESSAGE_TO_PENDING_LUA_SCRIPT,
1253
- 5,
1256
+ 6,
1254
1257
  processing_queue,
1255
1258
  pending_queue,
1256
1259
  self._claim_result_ids_key(processing_queue),
1257
1260
  self._claim_result_backrefs_key(processing_queue),
1258
1261
  operation_result_key,
1262
+ self._claim_result_key(processing_queue, claim_id),
1259
1263
  stored_message,
1260
1264
  claim_id,
1261
1265
  self._operation_result_ttl_ms(),
@@ -685,6 +685,8 @@ class RedisGateway(AbstractRedisGateway):
685
685
  clear=clear_pending_claim_id,
686
686
  )
687
687
  if recovered_claim is not None:
688
+ if self._message_visibility_timeout_seconds is None:
689
+ await self._delete_claim_result_key(self._claim_result_key(to_queue, pending_claim_id))
688
690
  await self._emit_event("claim_reclaim", "success", claim_id=pending_claim_id)
689
691
  return recovered_claim
690
692
 
@@ -793,6 +795,8 @@ class RedisGateway(AbstractRedisGateway):
793
795
  pending_claim_id_to_share = claim_id
794
796
  raise
795
797
  if recovered_claim is not None:
798
+ if self._message_visibility_timeout_seconds is None:
799
+ await self._delete_claim_result_key(self._claim_result_key(to_queue, claim_id))
796
800
  await self._emit_event("claim_reclaim", "success", claim_id=claim_id)
797
801
  return recovered_claim
798
802
  await self._emit_event(
@@ -1151,7 +1155,6 @@ class RedisGateway(AbstractRedisGateway):
1151
1155
  _raise_if_drain_deadline_expired(deadline_monotonic)
1152
1156
  if cached_claim is None:
1153
1157
  return None
1154
- await self._delete_claim_result_key(claim_result_key, deadline_monotonic=deadline_monotonic)
1155
1158
  _raise_if_drain_deadline_expired(deadline_monotonic)
1156
1159
  return cached_claim
1157
1160
 
@@ -1231,12 +1234,13 @@ class RedisGateway(AbstractRedisGateway):
1231
1234
  result = await _call_with_drain_deadline(
1232
1235
  lambda: self._eval(
1233
1236
  RETURN_MESSAGE_TO_PENDING_LUA_SCRIPT,
1234
- 5,
1237
+ 6,
1235
1238
  processing_queue,
1236
1239
  pending_queue,
1237
1240
  self._claim_result_ids_key(processing_queue),
1238
1241
  self._claim_result_backrefs_key(processing_queue),
1239
1242
  operation_result_key,
1243
+ self._claim_result_key(processing_queue, claim_id),
1240
1244
  stored_message,
1241
1245
  claim_id,
1242
1246
  self._operation_result_ttl_ms(),
@@ -483,6 +483,16 @@ class _LeaseHeartbeat:
483
483
  result = self._on_heartbeat_failure()
484
484
  if inspect.isawaitable(result):
485
485
  await result
486
+ except asyncio.CancelledError as exc:
487
+ current_task = asyncio.current_task()
488
+ if current_task is not None and current_task.cancelling() > 0:
489
+ raise
490
+ logger.exception("on_heartbeat_failure callback raised an exception")
491
+ warnings.warn(
492
+ f"on_heartbeat_failure callback raised {type(exc).__name__}",
493
+ RuntimeWarning,
494
+ stacklevel=1,
495
+ )
486
496
  except Exception as exc:
487
497
  logger.exception("on_heartbeat_failure callback raised an exception")
488
498
  warnings.warn(
@@ -445,6 +445,13 @@ class _LeaseHeartbeat:
445
445
  "'on_heartbeat_failure' returned an awaitable; "
446
446
  "use the async RedisMessageQueue from redis_message_queue.asyncio instead"
447
447
  )
448
+ except asyncio.CancelledError as exc:
449
+ logger.exception("on_heartbeat_failure callback raised an exception")
450
+ warnings.warn(
451
+ f"on_heartbeat_failure callback raised {type(exc).__name__}",
452
+ RuntimeWarning,
453
+ stacklevel=1,
454
+ )
448
455
  except Exception as exc:
449
456
  logger.exception("on_heartbeat_failure callback raised an exception")
450
457
  warnings.warn(