redis-message-queue 8.2.9__tar.gz → 8.2.10__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.9 → redis_message_queue-8.2.10}/PKG-INFO +2 -2
  2. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/README.md +1 -1
  3. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/pyproject.toml +2 -2
  4. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/asyncio/redis_message_queue.py +31 -24
  5. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/redis_message_queue.py +28 -22
  6. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/.gitignore +0 -0
  7. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/LICENSE +0 -0
  8. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/__init__.py +0 -0
  9. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_abstract_redis_gateway.py +0 -0
  10. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_callable_utils.py +0 -0
  11. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_config.py +0 -0
  12. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_event.py +0 -0
  13. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_exceptions.py +0 -0
  14. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_payload_limits.py +0 -0
  15. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_queue_key_manager.py +0 -0
  16. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_redis_cluster.py +0 -0
  17. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_redis_gateway.py +0 -0
  18. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/_stored_message.py +0 -0
  19. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/asyncio/__init__.py +0 -0
  20. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/asyncio/_abstract_redis_gateway.py +0 -0
  21. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/asyncio/_redis_gateway.py +0 -0
  22. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/interrupt_handler/__init__.py +0 -0
  23. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/interrupt_handler/_event_driven.py +0 -0
  24. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/interrupt_handler/_implementation.py +0 -0
  25. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/redis_message_queue/interrupt_handler/_interface.py +0 -0
  26. {redis_message_queue-8.2.9 → redis_message_queue-8.2.10}/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.9
3
+ Version: 8.2.10
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.9,<9.0.0"
37
+ pip install "redis-message-queue>=8.2.10,<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.9,<9.0.0"
14
+ pip install "redis-message-queue>=8.2.10,<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.9"
3
+ version = "8.2.10"
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.9"
51
+ current_version = "8.2.10"
52
52
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
53
53
  serialize = ["{major}.{minor}.{patch}"]
54
54
  search = "{current_version}"
@@ -511,6 +511,29 @@ class _LeaseHeartbeat:
511
511
  stacklevel=1,
512
512
  )
513
513
 
514
+ async def _report_renewal_failure(self, exc: BaseException) -> None:
515
+ if self._stop_event.is_set():
516
+ return
517
+ logger.exception("Failed to renew message lease")
518
+ await self._emit(
519
+ "lease_renew_failed",
520
+ "failure",
521
+ message_id=self._message_id,
522
+ lease_token_hash=self._lease_token_hash,
523
+ exception_type=type(exc).__name__,
524
+ error=exc,
525
+ )
526
+ with warnings.catch_warnings():
527
+ warnings.simplefilter("always", RuntimeWarning)
528
+ warnings.warn(
529
+ "Failed to renew message lease "
530
+ f"({_warning_exception_name(exc)}); message will be reclaimed by another consumer "
531
+ "when the visibility timeout expires",
532
+ RuntimeWarning,
533
+ stacklevel=1,
534
+ )
535
+ await self._invoke_failure_callback()
536
+
514
537
  async def _run(self) -> None:
515
538
  try:
516
539
  while True:
@@ -531,30 +554,14 @@ class _LeaseHeartbeat:
531
554
  f"gateway.renew_message_lease() must return bool, got {type(renewed).__name__}. "
532
555
  "See AbstractRedisGateway.renew_message_lease for the full contract."
533
556
  )
534
- except asyncio.CancelledError:
535
- raise
557
+ except asyncio.CancelledError as exc:
558
+ current_task = asyncio.current_task()
559
+ if self._stop_event.is_set() or (current_task is not None and current_task.cancelling() > 0):
560
+ raise
561
+ await self._report_renewal_failure(exc)
562
+ return
536
563
  except Exception as exc:
537
- if self._stop_event.is_set():
538
- return
539
- logger.exception("Failed to renew message lease")
540
- await self._emit(
541
- "lease_renew_failed",
542
- "failure",
543
- message_id=self._message_id,
544
- lease_token_hash=self._lease_token_hash,
545
- exception_type=type(exc).__name__,
546
- error=exc,
547
- )
548
- with warnings.catch_warnings():
549
- warnings.simplefilter("always", RuntimeWarning)
550
- warnings.warn(
551
- "Failed to renew message lease "
552
- f"({_warning_exception_name(exc)}); message will be reclaimed by another consumer "
553
- "when the visibility timeout expires",
554
- RuntimeWarning,
555
- stacklevel=1,
556
- )
557
- await self._invoke_failure_callback()
564
+ await self._report_renewal_failure(exc)
558
565
  return
559
566
  if not renewed:
560
567
  await self._emit(
@@ -1179,7 +1186,7 @@ class RedisMessageQueue:
1179
1186
  "visibility timeouts are in use."
1180
1187
  )
1181
1188
  logger.warning(no_lease_token_warning)
1182
- warnings.warn(no_lease_token_warning, RuntimeWarning, stacklevel=2)
1189
+ _warn_runtime_warning(no_lease_token_warning, stacklevel=2)
1183
1190
 
1184
1191
  if lease_token is None and self._requires_claimed_message:
1185
1192
  raise GatewayContractError(
@@ -482,6 +482,29 @@ class _LeaseHeartbeat:
482
482
  stacklevel=1,
483
483
  )
484
484
 
485
+ def _report_renewal_failure(self, exc: BaseException) -> None:
486
+ if self._stop_event.is_set():
487
+ return
488
+ logger.exception("Failed to renew message lease")
489
+ self._emit(
490
+ "lease_renew_failed",
491
+ "failure",
492
+ message_id=self._message_id,
493
+ lease_token_hash=self._lease_token_hash,
494
+ exception_type=type(exc).__name__,
495
+ error=exc,
496
+ )
497
+ with warnings.catch_warnings():
498
+ warnings.simplefilter("always", RuntimeWarning)
499
+ warnings.warn(
500
+ "Failed to renew message lease "
501
+ f"({_warning_exception_name(exc)}); message will be reclaimed by another consumer "
502
+ "when the visibility timeout expires",
503
+ RuntimeWarning,
504
+ stacklevel=1,
505
+ )
506
+ self._invoke_failure_callback()
507
+
485
508
  def _run(self) -> None:
486
509
  # No explicit _is_interrupted() check here. Heartbeat lifetime is owned
487
510
  # by process_message, which sets _stop_event in its finally block on any
@@ -498,28 +521,11 @@ class _LeaseHeartbeat:
498
521
  f"gateway.renew_message_lease() must return bool, got {type(renewed).__name__}. "
499
522
  "See AbstractRedisGateway.renew_message_lease for the full contract."
500
523
  )
524
+ except asyncio.CancelledError as exc:
525
+ self._report_renewal_failure(exc)
526
+ return
501
527
  except Exception as exc:
502
- if self._stop_event.is_set():
503
- return
504
- logger.exception("Failed to renew message lease")
505
- self._emit(
506
- "lease_renew_failed",
507
- "failure",
508
- message_id=self._message_id,
509
- lease_token_hash=self._lease_token_hash,
510
- exception_type=type(exc).__name__,
511
- error=exc,
512
- )
513
- with warnings.catch_warnings():
514
- warnings.simplefilter("always", RuntimeWarning)
515
- warnings.warn(
516
- "Failed to renew message lease "
517
- f"({_warning_exception_name(exc)}); message will be reclaimed by another consumer "
518
- "when the visibility timeout expires",
519
- RuntimeWarning,
520
- stacklevel=1,
521
- )
522
- self._invoke_failure_callback()
528
+ self._report_renewal_failure(exc)
523
529
  return
524
530
  if not renewed:
525
531
  self._emit(
@@ -1150,7 +1156,7 @@ class RedisMessageQueue:
1150
1156
  "visibility timeouts are in use."
1151
1157
  )
1152
1158
  logger.warning(no_lease_token_warning)
1153
- warnings.warn(no_lease_token_warning, RuntimeWarning, stacklevel=2)
1159
+ _warn_runtime_warning(no_lease_token_warning, stacklevel=2)
1154
1160
 
1155
1161
  if lease_token is None and self._requires_claimed_message:
1156
1162
  raise GatewayContractError(