jararaca 0.2.36__py3-none-any.whl → 0.2.37a0__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.

jararaca/__init__.py CHANGED
@@ -2,6 +2,14 @@ from importlib import import_module
2
2
  from typing import TYPE_CHECKING
3
3
 
4
4
  if TYPE_CHECKING:
5
+ from jararaca.messagebus.bus_message_controller import (
6
+ ack,
7
+ nack,
8
+ reject,
9
+ retry,
10
+ retry_later,
11
+ use_bus_message_controller,
12
+ )
5
13
  from jararaca.microservice import AppContext, AppInterceptor
6
14
  from jararaca.observability.interceptor import ObservabilityInterceptor
7
15
  from jararaca.observability.providers.otel import OtelObservabilityProvider
@@ -47,7 +55,7 @@ if TYPE_CHECKING:
47
55
  from .core.providers import ProviderSpec, Token
48
56
  from .di import Container
49
57
  from .messagebus.decorators import MessageBusController, MessageHandler
50
- from .messagebus.interceptors.publisher_interceptor import (
58
+ from .messagebus.interceptors.aiopika_publisher_interceptor import (
51
59
  AIOPikaConnectionFactory,
52
60
  MessageBusPublisherInterceptor,
53
61
  )
@@ -104,6 +112,12 @@ if TYPE_CHECKING:
104
112
  from .tools.app_config.interceptor import AppConfigurationInterceptor
105
113
 
106
114
  __all__ = [
115
+ "use_bus_message_controller",
116
+ "ack",
117
+ "nack",
118
+ "reject",
119
+ "retry",
120
+ "retry_later",
107
121
  "RPCRequestNetworkError",
108
122
  "FILTER_SORT_ENTITY_ATTR_MAP",
109
123
  "FilterModel",
@@ -196,6 +210,16 @@ if TYPE_CHECKING:
196
210
  __SPEC_PARENT__: str = __spec__.parent # type: ignore
197
211
  # A mapping of {<member name>: (package, <module name>)} defining dynamic imports
198
212
  _dynamic_imports: "dict[str, tuple[str, str, str | None]]" = {
213
+ "use_bus_message_controller": (
214
+ __SPEC_PARENT__,
215
+ "messagebus.bus_message_controller",
216
+ None,
217
+ ),
218
+ "ack": (__SPEC_PARENT__, "messagebus.bus_message_controller", None),
219
+ "nack": (__SPEC_PARENT__, "messagebus.bus_message_controller", None),
220
+ "reject": (__SPEC_PARENT__, "messagebus.bus_message_controller", None),
221
+ "retry": (__SPEC_PARENT__, "messagebus.bus_message_controller", None),
222
+ "retry_later": (__SPEC_PARENT__, "messagebus.bus_message_controller", None),
199
223
  "RPCRequestNetworkError": (__SPEC_PARENT__, "rpc.http.decorators", None),
200
224
  "FILTER_SORT_ENTITY_ATTR_MAP": (__SPEC_PARENT__, "persistence.sort_filter", None),
201
225
  "FilterModel": (__SPEC_PARENT__, "persistence.sort_filter", None),
@@ -0,0 +1,67 @@
1
+ from contextlib import contextmanager, suppress
2
+ from contextvars import ContextVar
3
+ from typing import Any, Generator, Protocol
4
+
5
+
6
+ class BusMessageController(Protocol):
7
+
8
+ async def ack(self) -> None:
9
+ pass
10
+
11
+ async def nack(self) -> None:
12
+ pass
13
+
14
+ async def reject(self) -> None:
15
+ pass
16
+
17
+ async def retry(self) -> None:
18
+ pass
19
+
20
+ async def retry_later(self, delay: int) -> None:
21
+ pass
22
+
23
+
24
+ bus_message_controller_ctxvar = ContextVar[BusMessageController](
25
+ "bus_message_controller"
26
+ )
27
+
28
+
29
+ @contextmanager
30
+ def provide_bus_message_controller(
31
+ controller: BusMessageController,
32
+ ) -> Generator[None, Any, None]:
33
+ token = bus_message_controller_ctxvar.set(controller)
34
+ try:
35
+ yield
36
+ finally:
37
+ with suppress(LookupError):
38
+ bus_message_controller_ctxvar.reset(token)
39
+
40
+
41
+ def use_bus_message_controller() -> BusMessageController:
42
+ return bus_message_controller_ctxvar.get()
43
+
44
+
45
+ async def ack() -> None:
46
+ controller = use_bus_message_controller()
47
+ await controller.ack()
48
+
49
+
50
+ async def nack() -> None:
51
+ controller = use_bus_message_controller()
52
+ await controller.nack()
53
+
54
+
55
+ async def reject() -> None:
56
+ controller = use_bus_message_controller()
57
+ await controller.reject()
58
+
59
+
60
+ async def retry() -> None:
61
+ controller = use_bus_message_controller()
62
+ await controller.retry()
63
+
64
+
65
+ async def retry_later(delay: int) -> None:
66
+ controller = use_bus_message_controller()
67
+ await controller.retry_later(delay)
@@ -14,6 +14,10 @@ from pydantic import BaseModel
14
14
  from jararaca.core.uow import UnitOfWorkContextProvider
15
15
  from jararaca.di import Container
16
16
  from jararaca.lifecycle import AppLifecycle
17
+ from jararaca.messagebus.bus_message_controller import (
18
+ BusMessageController,
19
+ provide_bus_message_controller,
20
+ )
17
21
  from jararaca.messagebus.decorators import (
18
22
  MESSAGE_HANDLER_DATA_SET,
19
23
  MessageBusController,
@@ -170,7 +174,6 @@ class MessageHandlerCallback:
170
174
  async with self.consumer.lock:
171
175
  task = asyncio.create_task(self.handle_message(aio_pika_message))
172
176
  self.consumer.tasks.add(task)
173
- # task.add_done_callback(self.tasks.discard)
174
177
  task.add_done_callback(self.handle_message_consume_done)
175
178
 
176
179
  def handle_message_consume_done(self, task: asyncio.Task[Any]) -> None:
@@ -273,7 +276,10 @@ class MessageHandlerCallback:
273
276
  ctx = none_context()
274
277
  async with ctx:
275
278
  try:
276
- await handler(builded_message)
279
+ with provide_bus_message_controller(
280
+ AioPikaMessageBusController(aio_pika_message)
281
+ ):
282
+ await handler(builded_message)
277
283
  if not incoming_message_spec.auto_ack:
278
284
  await aio_pika_message.ack()
279
285
  except BaseException as base_exc:
@@ -374,3 +380,23 @@ class MessageBusWorker:
374
380
  signal.SIGINT, on_shutdown, runner.get_loop()
375
381
  )
376
382
  runner.run(self.start_async())
383
+
384
+
385
+ class AioPikaMessageBusController(BusMessageController):
386
+ def __init__(self, aio_pika_message: aio_pika.abc.AbstractIncomingMessage):
387
+ self.aio_pika_message = aio_pika_message
388
+
389
+ async def ack(self) -> None:
390
+ await self.aio_pika_message.ack()
391
+
392
+ async def nack(self) -> None:
393
+ await self.aio_pika_message.nack()
394
+
395
+ async def reject(self) -> None:
396
+ await self.aio_pika_message.reject()
397
+
398
+ async def retry(self) -> None:
399
+ await self.aio_pika_message.reject(requeue=True)
400
+
401
+ async def retry_later(self, delay: int) -> None:
402
+ raise NotImplementedError("Not implemented")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jararaca
3
- Version: 0.2.36
3
+ Version: 0.2.37a0
4
4
  Summary: A simple and fast API framework for Python
5
5
  Home-page: https://github.com/LuscasLeo/jararaca
6
6
  Author: Lucas S
@@ -1,7 +1,7 @@
1
1
  LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
2
2
  README.md,sha256=mte30I-ZEJJp-Oax-OganNgl6G9GaCZPL6JVFAvZGz4,7034
3
- pyproject.toml,sha256=J8jl9rhTU5wrfQYdGUqML72igUL3qR8in2aLGmaSRwY,1837
4
- jararaca/__init__.py,sha256=MbSXT_kddJ4hUNI43u3stzFzjG3ctkJewriZ6_NvaII,14019
3
+ pyproject.toml,sha256=eCYmaQ1KvrC-AjVxBZKuaneOlX0K4k8xixQojXEJt2Q,1839
4
+ jararaca/__init__.py,sha256=1Tv-cJ5C_4VL73ceISjoqZQe7DBAPN2G14VWnzlDxuY,14842
5
5
  jararaca/__main__.py,sha256=-O3vsB5lHdqNFjUtoELDF81IYFtR-DSiiFMzRaiSsv4,67
6
6
  jararaca/cli.py,sha256=JKk4xrRbtX2fM8yYw794lbxvJFH73bWw3GGIvrpAkeE,5706
7
7
  jararaca/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -12,12 +12,13 @@ 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=Zdl74HcS9K0FW6XUt7bVvaHEyxL8pWsqqakeRENIn0w,54
15
+ jararaca/messagebus/bus_message_controller.py,sha256=Xd_qwnX5jUvgBTCarHR36fvtol9lPTsYp2IIGKyQQaE,1487
15
16
  jararaca/messagebus/decorators.py,sha256=GHlaXRuHtrz6R0HgcG2gJybpGYtdts9meDVSRPwN74I,4245
16
17
  jararaca/messagebus/interceptors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
- jararaca/messagebus/interceptors/publisher_interceptor.py,sha256=rqAX644-VHarg6kPPsXGTmxYd79PpJXiJ1N1gIooJTo,2470
18
+ jararaca/messagebus/interceptors/aiopika_publisher_interceptor.py,sha256=rqAX644-VHarg6kPPsXGTmxYd79PpJXiJ1N1gIooJTo,2470
18
19
  jararaca/messagebus/publisher.py,sha256=5ay9Znwybqt981OOykdWkFisSvGiTeTpPXDFLMnaiqg,1109
19
20
  jararaca/messagebus/types.py,sha256=iYLyLxWqOHkDadxyMqQPWy3itLNQfvD6oQe8jcq9nzo,887
20
- jararaca/messagebus/worker.py,sha256=aNp9tO9DinwcpdYPAA-e9lm3Y9dzH-dxx_4QYZUt9H8,12688
21
+ jararaca/messagebus/worker.py,sha256=_K71_95XYv5FKiL84Us4uVTYfWNTk4mqVS6JnxxumbE,13530
21
22
  jararaca/microservice.py,sha256=1TvDKVMMREH27Ly8eTEheMmSfro4_Az_JKM_NdDvrgc,6636
22
23
  jararaca/observability/decorators.py,sha256=XffBinFXdiNkY6eo8_1nkr_GapM0RUGBg0aicBIelag,2220
23
24
  jararaca/observability/interceptor.py,sha256=GHkuGKFWftN7MDjvYeGFGEPnuJETNhtxRK6yuPrCrpU,1462
@@ -58,8 +59,8 @@ jararaca/tools/app_config/decorators.py,sha256=-ckkMZ1dswOmECdo1rFrZ15UAku--txaN
58
59
  jararaca/tools/app_config/interceptor.py,sha256=nfFZiS80hrbnL7-XEYrwmp2rwaVYBqxvqu3Y-6o_ov4,2575
59
60
  jararaca/tools/metadata.py,sha256=7nlCDYgItNybentPSSCc2MLqN7IpBd0VyQzfjfQycVI,1402
60
61
  jararaca/tools/typescript/interface_parser.py,sha256=l-QyPVntATcbL4JYm48xq2gNWfV1y2iArvOuIueFi8w,28829
61
- jararaca-0.2.36.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
62
- jararaca-0.2.36.dist-info/METADATA,sha256=9vNEuIG1GmXeLV95m5_7VSLDcSlZBoXjy-uHNQtGb6A,8552
63
- jararaca-0.2.36.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
64
- jararaca-0.2.36.dist-info/entry_points.txt,sha256=WIh3aIvz8LwUJZIDfs4EeH3VoFyCGEk7cWJurW38q0I,45
65
- jararaca-0.2.36.dist-info/RECORD,,
62
+ jararaca-0.2.37a0.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
63
+ jararaca-0.2.37a0.dist-info/METADATA,sha256=LOL1VDz7acD53uTKUnVmodyCSKxiaZs_IBvCaUFJhDA,8554
64
+ jararaca-0.2.37a0.dist-info/WHEEL,sha256=Nq82e9rUAnEjt98J6MlVmMCZb-t9cYE2Ir1kpBmnWfs,88
65
+ jararaca-0.2.37a0.dist-info/entry_points.txt,sha256=WIh3aIvz8LwUJZIDfs4EeH3VoFyCGEk7cWJurW38q0I,45
66
+ jararaca-0.2.37a0.dist-info/RECORD,,
pyproject.toml CHANGED
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "jararaca"
3
- version = "0.2.36"
3
+ version = "0.2.37a0"
4
4
  description = "A simple and fast API framework for Python"
5
5
  authors = ["Lucas S <me@luscasleo.dev>"]
6
6
  readme = "README.md"