jararaca 0.3.9__py3-none-any.whl → 0.3.11__py3-none-any.whl

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.

Potentially problematic release.


This version of jararaca might be problematic. Click here for more details.

Files changed (35) hide show
  1. jararaca/__init__.py +76 -5
  2. jararaca/cli.py +460 -116
  3. jararaca/core/uow.py +17 -12
  4. jararaca/messagebus/decorators.py +33 -30
  5. jararaca/messagebus/interceptors/aiopika_publisher_interceptor.py +30 -2
  6. jararaca/messagebus/interceptors/publisher_interceptor.py +7 -3
  7. jararaca/messagebus/publisher.py +14 -6
  8. jararaca/messagebus/worker.py +1102 -88
  9. jararaca/microservice.py +137 -34
  10. jararaca/observability/decorators.py +7 -3
  11. jararaca/observability/interceptor.py +4 -2
  12. jararaca/observability/providers/otel.py +14 -10
  13. jararaca/persistence/base.py +2 -1
  14. jararaca/persistence/interceptors/aiosqa_interceptor.py +167 -16
  15. jararaca/persistence/utilities.py +32 -20
  16. jararaca/presentation/decorators.py +96 -10
  17. jararaca/presentation/server.py +31 -4
  18. jararaca/presentation/websocket/context.py +30 -4
  19. jararaca/presentation/websocket/types.py +2 -2
  20. jararaca/presentation/websocket/websocket_interceptor.py +28 -4
  21. jararaca/reflect/__init__.py +0 -0
  22. jararaca/reflect/controller_inspect.py +75 -0
  23. jararaca/{tools → reflect}/metadata.py +25 -5
  24. jararaca/scheduler/{scheduler_v2.py → beat_worker.py} +49 -53
  25. jararaca/scheduler/decorators.py +55 -20
  26. jararaca/tools/app_config/interceptor.py +4 -2
  27. jararaca/utils/rabbitmq_utils.py +259 -5
  28. jararaca/utils/retry.py +141 -0
  29. {jararaca-0.3.9.dist-info → jararaca-0.3.11.dist-info}/METADATA +2 -1
  30. {jararaca-0.3.9.dist-info → jararaca-0.3.11.dist-info}/RECORD +33 -32
  31. {jararaca-0.3.9.dist-info → jararaca-0.3.11.dist-info}/WHEEL +1 -1
  32. jararaca/messagebus/worker_v2.py +0 -617
  33. jararaca/scheduler/scheduler.py +0 -161
  34. {jararaca-0.3.9.dist-info → jararaca-0.3.11.dist-info}/LICENSE +0 -0
  35. {jararaca-0.3.9.dist-info → jararaca-0.3.11.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,141 @@
1
+ import asyncio
2
+ import logging
3
+ import random
4
+ from functools import wraps
5
+ from typing import Awaitable, Callable, Optional, ParamSpec, TypeVar
6
+
7
+ logger = logging.getLogger(__name__)
8
+
9
+ P = ParamSpec("P")
10
+ T = TypeVar("T")
11
+
12
+
13
+ class RetryConfig:
14
+ """Configuration for the retry mechanism."""
15
+
16
+ def __init__(
17
+ self,
18
+ max_retries: int = 5,
19
+ initial_delay: float = 1.0,
20
+ max_delay: float = 60.0,
21
+ backoff_factor: float = 2.0,
22
+ jitter: bool = True,
23
+ ):
24
+ """
25
+ Initialize retry configuration.
26
+
27
+ Args:
28
+ max_retries: Maximum number of retry attempts (default: 5)
29
+ initial_delay: Initial delay in seconds between retries (default: 1.0)
30
+ max_delay: Maximum delay in seconds between retries (default: 60.0)
31
+ backoff_factor: Multiplier for the delay after each retry (default: 2.0)
32
+ jitter: Whether to add randomness to the delay to prevent thundering herd (default: True)
33
+ """
34
+ self.max_retries = max_retries
35
+ self.initial_delay = initial_delay
36
+ self.max_delay = max_delay
37
+ self.backoff_factor = backoff_factor
38
+ self.jitter = jitter
39
+
40
+
41
+ E = TypeVar("E", bound=Exception)
42
+
43
+
44
+ async def retry_with_backoff(
45
+ fn: Callable[[], Awaitable[T]],
46
+ # args: P.args,
47
+ # kwargs: P.kwargs,
48
+ retry_config: Optional[RetryConfig] = None,
49
+ on_retry_callback: Optional[Callable[[int, E, float], None]] = None,
50
+ retry_exceptions: tuple[type[E], ...] = (),
51
+ ) -> T:
52
+ """
53
+ Execute a function with exponential backoff retry mechanism.
54
+
55
+ Args:
56
+ fn: The async function to execute with retry
57
+ *args: Arguments to pass to the function
58
+ retry_config: Configuration for the retry mechanism
59
+ on_retry_callback: Optional callback function called on each retry with retry count, exception, and next delay
60
+ retry_exceptions: Tuple of exception types that should trigger a retry
61
+ **kwargs: Keyword arguments to pass to the function
62
+
63
+ Returns:
64
+ The result of the function if successful
65
+
66
+ Raises:
67
+ The last exception encountered if all retries fail
68
+ """
69
+ if retry_config is None:
70
+ retry_config = RetryConfig()
71
+
72
+ last_exception = None
73
+ delay = retry_config.initial_delay
74
+
75
+ for retry_count in range(retry_config.max_retries + 1):
76
+ try:
77
+ return await fn()
78
+ except retry_exceptions as e:
79
+ last_exception = e
80
+
81
+ if retry_count >= retry_config.max_retries:
82
+ logger.error(
83
+ f"Max retries ({retry_config.max_retries}) exceeded: {str(e)}"
84
+ )
85
+ raise
86
+
87
+ # Calculate next delay with exponential backoff
88
+ if retry_count > 0: # Don't increase delay on the first failure
89
+ delay = min(delay * retry_config.backoff_factor, retry_config.max_delay)
90
+
91
+ # Apply jitter if configured (±25% randomness)
92
+ if retry_config.jitter:
93
+ jitter_amount = delay * 0.25
94
+ delay = delay + random.uniform(-jitter_amount, jitter_amount)
95
+ # Ensure delay doesn't go negative due to jitter
96
+ delay = max(delay, 0.1)
97
+
98
+ logger.warning(
99
+ f"Retry {retry_count+1}/{retry_config.max_retries} after error: {str(e)}. "
100
+ f"Retrying in {delay:.2f}s"
101
+ )
102
+
103
+ # Call the optional retry callback if provided
104
+ if on_retry_callback:
105
+ on_retry_callback(retry_count, e, delay)
106
+
107
+ await asyncio.sleep(delay)
108
+
109
+ # This should never be reached with the current implementation
110
+ if last_exception:
111
+ raise last_exception
112
+ raise RuntimeError("Unexpected error in retry logic")
113
+
114
+
115
+ def with_retry(
116
+ retry_config: Optional[RetryConfig] = None,
117
+ retry_exceptions: tuple[type[Exception], ...] = (Exception,),
118
+ ) -> Callable[[Callable[P, Awaitable[T]]], Callable[P, Awaitable[T]]]:
119
+ """
120
+ Decorator to wrap an async function with retry logic.
121
+
122
+ Args:
123
+ retry_config: Configuration for the retry mechanism
124
+ retry_exceptions: Tuple of exception types that should trigger a retry
125
+
126
+ Returns:
127
+ Decorated function with retry mechanism
128
+ """
129
+
130
+ def decorator(fn: Callable[P, Awaitable[T]]) -> Callable[P, Awaitable[T]]:
131
+ @wraps(fn)
132
+ async def wrapper(*args: P.args, **kwargs: P.kwargs) -> T:
133
+ return await retry_with_backoff(
134
+ lambda: fn(*args, **kwargs),
135
+ retry_config=retry_config,
136
+ retry_exceptions=retry_exceptions,
137
+ )
138
+
139
+ return wrapper
140
+
141
+ return decorator
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: jararaca
3
- Version: 0.3.9
3
+ Version: 0.3.11
4
4
  Summary: A simple and fast API framework for Python
5
5
  Author: Lucas S
6
6
  Author-email: me@luscasleo.dev
@@ -16,6 +16,7 @@ Provides-Extra: watch
16
16
  Requires-Dist: aio-pika (>=9.4.3,<10.0.0)
17
17
  Requires-Dist: croniter (>=3.0.3,<4.0.0)
18
18
  Requires-Dist: fastapi (>=0.113.0,<0.114.0)
19
+ Requires-Dist: frozendict (>=2.4.6,<3.0.0)
19
20
  Requires-Dist: mako (>=1.3.5,<2.0.0)
20
21
  Requires-Dist: opentelemetry-api (>=1.27.0,<2.0.0) ; extra == "opentelemetry"
21
22
  Requires-Dist: opentelemetry-distro (>=0.49b2,<0.50) ; extra == "opentelemetry"
@@ -1,52 +1,54 @@
1
- jararaca/__init__.py,sha256=4WO-Th3vY1_0SKdLyviZN2rftiX7R5yPVNPGJ9Mf5Y0,15633
1
+ jararaca/__init__.py,sha256=EdOPigKYraoG7I-Hl9V3XteqrbhdBS3xy1rUakh58lc,17949
2
2
  jararaca/__main__.py,sha256=-O3vsB5lHdqNFjUtoELDF81IYFtR-DSiiFMzRaiSsv4,67
3
3
  jararaca/broker_backend/__init__.py,sha256=GzEIuHR1xzgCJD4FE3harNjoaYzxHMHoEL0_clUaC-k,3528
4
4
  jararaca/broker_backend/mapper.py,sha256=vTsi7sWpNvlga1PWPFg0rCJ5joJ0cdzykkIc2Tuvenc,696
5
5
  jararaca/broker_backend/redis_broker_backend.py,sha256=a7DHchy3NAiD71Ix8SwmQOUnniu7uup-Woa4ON_4J7I,5786
6
- jararaca/cli.py,sha256=sbWqviMH0JF65763fBzwUTQWHsuPmTWkup87kqTtZWo,12164
6
+ jararaca/cli.py,sha256=zkWRcqllY_C0sIR7h_crlptq2cA6sxRM4nvMMLBaANs,25946
7
7
  jararaca/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  jararaca/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  jararaca/core/providers.py,sha256=wktH84FK7c1s2wNq-fudf1uMfi3CQBR0neU2czJ_L0U,434
10
- jararaca/core/uow.py,sha256=WrA50VWzfJIyZHeUhSs8IOpSA4T-D8VV6YPLlFTF5V4,2026
10
+ jararaca/core/uow.py,sha256=jKlhU_YsssiN0hC1s056JcNerNagXPcXdZJ5kJYG68c,2252
11
11
  jararaca/di.py,sha256=h3IsXdYZjJj8PJfnEDn0ZAwdd4EBfh8jU-wWO8ko_t4,76
12
12
  jararaca/files/entity.py.mako,sha256=tjQ-1udAMvVqgRokhsrR4uy3P_OVnbk3XZ8X69ixWhE,3098
13
13
  jararaca/lifecycle.py,sha256=qKlzLQQioS8QkxNJ_FC_5WbmT77cNbc_S7OcQeOoHkI,1895
14
14
  jararaca/messagebus/__init__.py,sha256=5jAqPqdcEMYBfQyfZDWPnplYdrfMyJLMcacf3qLyUhk,56
15
15
  jararaca/messagebus/bus_message_controller.py,sha256=Xd_qwnX5jUvgBTCarHR36fvtol9lPTsYp2IIGKyQQaE,1487
16
16
  jararaca/messagebus/consumers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- jararaca/messagebus/decorators.py,sha256=y-w4dWbP9ZW3ZJ4mE9iIaxw01ZC5snEbOuBY5NC-Bn0,5626
17
+ jararaca/messagebus/decorators.py,sha256=jkVkN-NNIefKjMGq0JcAjEprdoo04jZtHm7YMsja1to,5896
18
18
  jararaca/messagebus/interceptors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- jararaca/messagebus/interceptors/aiopika_publisher_interceptor.py,sha256=Aex87wopB34sMNzXBgi4KucVHjL2wYog3-IH75DAfDk,5387
20
- jararaca/messagebus/interceptors/publisher_interceptor.py,sha256=fQFFW9hH6ZU3UOyR7kMPrNp9wA71qEy5XlgrBQdBMS4,1230
19
+ jararaca/messagebus/interceptors/aiopika_publisher_interceptor.py,sha256=_DEHwIH9LYsA26Hu1mo9oHzLZuATgjilU9E3o-ecDjs,6520
20
+ jararaca/messagebus/interceptors/publisher_interceptor.py,sha256=ojy1bRhqMgrkQljcGGS8cd8-8pUjL8ZHjIUkdmaAnNM,1325
21
21
  jararaca/messagebus/message.py,sha256=U6cyd2XknX8mtm0333slz5fanky2PFLWCmokAO56vvU,819
22
- jararaca/messagebus/publisher.py,sha256=K7WsOMVTyLmdms3ZKEshqrQc_DhNreiFK-HnmOT9Ce0,1965
23
- jararaca/messagebus/worker.py,sha256=2jReCepgMQktdLh4A3OqmOmx6KNgqUGpXIOXoBUtXSg,13778
24
- jararaca/messagebus/worker_v2.py,sha256=Ey9HPgVSuIYJUggJGPKmgymZHz7-2TUSYgDB52u9T10,20683
25
- jararaca/microservice.py,sha256=C_Txqm3xSmdHIghJigKk6TOycL5eTJv9PF6XP7TA8j4,6638
26
- jararaca/observability/decorators.py,sha256=XffBinFXdiNkY6eo8_1nkr_GapM0RUGBg0aicBIelag,2220
27
- jararaca/observability/interceptor.py,sha256=GHkuGKFWftN7MDjvYeGFGEPnuJETNhtxRK6yuPrCrpU,1462
22
+ jararaca/messagebus/publisher.py,sha256=JTkxdKbvxvDWT8nK8PVEyyX061vYYbKQMxRHXrZtcEY,2173
23
+ jararaca/messagebus/worker.py,sha256=CrSIejWMGII4_JK0aH4jxdj0oBJX4hSXY0SmVa6KURA,54187
24
+ jararaca/microservice.py,sha256=rRIimfeP2-wf289PKoUbk9wrSdA0ga_qWz5JNgQ5IE0,9667
25
+ jararaca/observability/decorators.py,sha256=MOIr2PttPYYvRwEdfQZEwD5RxKHOTv8UEy9n1YQVoKw,2281
26
+ jararaca/observability/interceptor.py,sha256=U4ZLM0f8j6Q7gMUKKnA85bnvD-Qa0ii79Qa_X8KsXAQ,1498
28
27
  jararaca/observability/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
- jararaca/observability/providers/otel.py,sha256=LgfoITdoQTCxKebfLcEfwMiG992wlWY_0AUTd2fo8hY,6065
30
- jararaca/persistence/base.py,sha256=Xfnpvj3yeLdpVBifH5W6AwPCLwL2ot0dpLzbPg1zwkQ,966
28
+ jararaca/observability/providers/otel.py,sha256=8N1F32W43t7c8cwmtTh6Yz9b7HyfGFSRVrkMLf3NDXc,6157
29
+ jararaca/persistence/base.py,sha256=xnGUbsLNz3gO-9iJt-Sn5NY13Yc9-misP8wLwQuGGoM,1024
31
30
  jararaca/persistence/exports.py,sha256=Ghx4yoFaB4QVTb9WxrFYgmcSATXMNvrOvT8ybPNKXCA,62
32
31
  jararaca/persistence/interceptors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- jararaca/persistence/interceptors/aiosqa_interceptor.py,sha256=H6ZjOdosYGCZUzKjugiXQwJkAbnsL4HnkZLOEQhULEc,1986
32
+ jararaca/persistence/interceptors/aiosqa_interceptor.py,sha256=LYuKNHYa1CSqJGh-n9iXHT0y73anAbb_DMhyEsjP7bI,6597
34
33
  jararaca/persistence/session.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
34
  jararaca/persistence/sort_filter.py,sha256=agggpN0YvNjUr6wJjy69NkaqxoDDW13ys9B3r85OujA,9226
36
- jararaca/persistence/utilities.py,sha256=0v1YrK-toTCgtw8aROtrDMNfjo3qWWNAb5qQcCOdSUU,13681
35
+ jararaca/persistence/utilities.py,sha256=imcV4Oi5kXNk6m9QF2-OsnFpcTRY4w5mBYLdEx5XTSQ,14296
37
36
  jararaca/presentation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
- jararaca/presentation/decorators.py,sha256=EErRZtLZDoZZj1ZVlDkGQbvqpoQkBaoU70KAUwWIufs,9146
37
+ jararaca/presentation/decorators.py,sha256=dNcK1xYWhdHVBeWDa8dhqh4z8yQcPkJZTQkfgLXz6RI,11655
39
38
  jararaca/presentation/hooks.py,sha256=WBbU5DG3-MAm2Ro2YraQyYG_HENfizYfyShL2ktHi6k,1980
40
39
  jararaca/presentation/http_microservice.py,sha256=g771JosV6jTY3hQtG-HkLOo-T0e-r3b3rp1ddt99Qf0,533
41
- jararaca/presentation/server.py,sha256=JuEatLFhD_NFnszwXDSgtcCXNOwvQYyxoxxQ33hnAEc,3731
40
+ jararaca/presentation/server.py,sha256=5joE17nnSiwR497Nerr-vcthKL4NRBzyf1KWM8DFgwQ,4682
42
41
  jararaca/presentation/websocket/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
42
  jararaca/presentation/websocket/base_types.py,sha256=AvUeeZ1TFhSiRMcYqZU1HaQNqSrcgTkC5R0ArP5dGmA,146
44
- jararaca/presentation/websocket/context.py,sha256=090vJmO4bWt0Hr7MI-ZtRlVHTD2JW5JvZRJTFI9XGKs,1180
43
+ jararaca/presentation/websocket/context.py,sha256=A6K5W3kqo9Hgeh1m6JiI7Cdz5SfbXcaICSVX7u1ARZo,1903
45
44
  jararaca/presentation/websocket/decorators.py,sha256=ZNd5aoA9UkyfHOt1C8D2Ffy2gQUNDEsusVnQuTgExgs,2157
46
45
  jararaca/presentation/websocket/redis.py,sha256=6wD4zGHftJXNDW3VfS65WJt2cnOgTI0zmQOfjZ_CEXE,4726
47
- jararaca/presentation/websocket/types.py,sha256=Crz88c1670YLtIhDvbeuyBV1SN-z9RtEGZxaonGvapY,294
48
- jararaca/presentation/websocket/websocket_interceptor.py,sha256=R_DfIMhi1ngFfCGy33b6yv_6LxCM-Dipkr12z6evfyk,8297
46
+ jararaca/presentation/websocket/types.py,sha256=M8snAMSdaQlKrwEM2qOgF2qrefo5Meio_oOw620Joc8,308
47
+ jararaca/presentation/websocket/websocket_interceptor.py,sha256=JWn_G8Q2WO0-1kmN7-Gv0HkIM6nZ_yjCdGRuXUS8F7A,9191
49
48
  jararaca/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
+ jararaca/reflect/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
+ jararaca/reflect/controller_inspect.py,sha256=UtV4pRIOqCoK4ogBTXQE0dyopEQ5LDFhwm-1iJvrkJc,2326
51
+ jararaca/reflect/metadata.py,sha256=oTi0zIjCYkeBhs12PNTLc8GmzR6qWHdl3drlmamXLJo,1897
50
52
  jararaca/rpc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
53
  jararaca/rpc/http/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
52
54
  jararaca/rpc/http/backends/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -55,19 +57,18 @@ jararaca/rpc/http/backends/otel.py,sha256=Uc6CjHSCZ5hvnK1fNFv3ota5xzUFnvIl1JOpG3
55
57
  jararaca/rpc/http/decorators.py,sha256=oUSzgMGI8w6SoKiz3GltDbd3BWAuyY60F23cdRRNeiw,11897
56
58
  jararaca/rpc/http/httpx.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
59
  jararaca/scheduler/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
- jararaca/scheduler/decorators.py,sha256=cRwnQHtlo9iC-2c30t7GGTEURFmdtDPkkVrr5cRVblM,3645
59
- jararaca/scheduler/scheduler.py,sha256=ll3ifOZ9QZcyCX1jfuNagHMVAbhRoE9VAl0ox3MWnwo,5295
60
- jararaca/scheduler/scheduler_v2.py,sha256=5-_O6EzG95y_3aIw5SA4W_ppbPIIszBrCYM7cFvXgBo,11166
60
+ jararaca/scheduler/beat_worker.py,sha256=JZXjkEMmZkvSwjfqgY4ClJE9Fwi6O-u2G_lHnjptVys,11605
61
+ jararaca/scheduler/decorators.py,sha256=iyWFvPLCRh9c0YReQRemI2mLuaUv7r929So-xuKIWUs,4605
61
62
  jararaca/scheduler/types.py,sha256=4HEQOmVIDp-BYLSzqmqSFIio1bd51WFmgFPIzPpVu04,135
62
63
  jararaca/tools/app_config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
64
  jararaca/tools/app_config/decorators.py,sha256=-ckkMZ1dswOmECdo1rFrZ15UAku--txaNXMp8fd1Ndk,941
64
- jararaca/tools/app_config/interceptor.py,sha256=nfFZiS80hrbnL7-XEYrwmp2rwaVYBqxvqu3Y-6o_ov4,2575
65
- jararaca/tools/metadata.py,sha256=7nlCDYgItNybentPSSCc2MLqN7IpBd0VyQzfjfQycVI,1402
65
+ jararaca/tools/app_config/interceptor.py,sha256=HV8h4AxqUc_ACs5do4BSVlyxlRXzx7HqJtoVO9tfRnQ,2611
66
66
  jararaca/tools/typescript/interface_parser.py,sha256=35xbOrZDQDyTXdMrVZQ8nnFw79f28lJuLYNHAspIqi8,30492
67
67
  jararaca/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
- jararaca/utils/rabbitmq_utils.py,sha256=FPDP8ZVgvitZXV-oK73D7EIANsqUzXTW7HdpEKsIsyI,2811
69
- jararaca-0.3.9.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
70
- jararaca-0.3.9.dist-info/METADATA,sha256=QUd0KvFdDWQNVvIzaVfGRWXzttqzP_AqAo7HbjzZ0pc,4951
71
- jararaca-0.3.9.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
72
- jararaca-0.3.9.dist-info/entry_points.txt,sha256=WIh3aIvz8LwUJZIDfs4EeH3VoFyCGEk7cWJurW38q0I,45
73
- jararaca-0.3.9.dist-info/RECORD,,
68
+ jararaca/utils/rabbitmq_utils.py,sha256=ytdAFUyv-OBkaVnxezuJaJoLrmN7giZgtKeet_IsMBs,10918
69
+ jararaca/utils/retry.py,sha256=DzPX_fXUvTqej6BQ8Mt2dvLo9nNlTBm7Kx2pFZ26P2Q,4668
70
+ jararaca-0.3.11.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
71
+ jararaca-0.3.11.dist-info/METADATA,sha256=t2u4-1jc_bl83_1vt0iThg37po9m1QBKXUoAkvqnZnM,4995
72
+ jararaca-0.3.11.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
73
+ jararaca-0.3.11.dist-info/entry_points.txt,sha256=WIh3aIvz8LwUJZIDfs4EeH3VoFyCGEk7cWJurW38q0I,45
74
+ jararaca-0.3.11.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.1.2
2
+ Generator: poetry-core 2.1.3
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any