jararaca 0.2.36__tar.gz → 0.2.37a0__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.
Potentially problematic release.
This version of jararaca might be problematic. Click here for more details.
- {jararaca-0.2.36 → jararaca-0.2.37a0}/PKG-INFO +1 -1
- {jararaca-0.2.36 → jararaca-0.2.37a0}/pyproject.toml +1 -1
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/__init__.py +25 -1
- jararaca-0.2.37a0/src/jararaca/messagebus/bus_message_controller.py +67 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/messagebus/worker.py +28 -2
- {jararaca-0.2.36 → jararaca-0.2.37a0}/LICENSE +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/README.md +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/docs/Architecture/Message Bus/Decorators.md +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/docs/Architecture/Message Bus/Interceptors.md +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/docs/Architecture/Observability/Decorators.md +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/docs/Architecture/Observability/Interceptors.md +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/docs/Architecture/Presentation/Decorators.md +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/docs/Architecture/RPC/RestClients/Decorators.md +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/docs/Architecture/RPC/RestClients/Middlewared.md +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/docs/Architecture/Schedule/Decorators.md +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/docs/Architecture/Websocket/Decorators.md +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/docs/Architecture/Websocket/Interceptors.md +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/docs/Concept/Adapters.md +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/docs/Concept/Hexagonal Architecture.md +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/docs/Concept/Ports.md +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/docs/assets/_f04774c9-7e05-4da4-8b17-8be23f6a1475.jpeg +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/docs/assets/_f04774c9-7e05-4da4-8b17-8be23f6a1475.webp +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/docs/assets/tracing_example.png +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/docs/index.md +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/__main__.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/cli.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/common/__init__.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/core/__init__.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/core/providers.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/core/uow.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/di.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/files/entity.py.mako +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/lifecycle.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/messagebus/__init__.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/messagebus/decorators.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/messagebus/interceptors/__init__.py +0 -0
- /jararaca-0.2.36/src/jararaca/messagebus/interceptors/publisher_interceptor.py → /jararaca-0.2.37a0/src/jararaca/messagebus/interceptors/aiopika_publisher_interceptor.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/messagebus/publisher.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/messagebus/types.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/microservice.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/observability/decorators.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/observability/interceptor.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/observability/providers/__init__.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/observability/providers/otel.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/persistence/base.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/persistence/exports.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/persistence/interceptors/__init__.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/persistence/interceptors/aiosqa_interceptor.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/persistence/session.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/persistence/sort_filter.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/persistence/utilities.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/presentation/__init__.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/presentation/decorators.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/presentation/hooks.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/presentation/http_microservice.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/presentation/server.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/presentation/websocket/__init__.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/presentation/websocket/base_types.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/presentation/websocket/context.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/presentation/websocket/decorators.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/presentation/websocket/redis.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/presentation/websocket/types.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/presentation/websocket/websocket_interceptor.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/py.typed +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/rpc/__init__.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/rpc/http/__init__.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/rpc/http/backends/__init__.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/rpc/http/backends/httpx.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/rpc/http/backends/otel.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/rpc/http/decorators.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/rpc/http/httpx.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/scheduler/__init__.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/scheduler/decorators.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/scheduler/scheduler.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/tools/app_config/__init__.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/tools/app_config/decorators.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/tools/app_config/interceptor.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/tools/metadata.py +0 -0
- {jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/tools/typescript/interface_parser.py +0 -0
|
@@ -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.
|
|
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
|
-
|
|
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")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{jararaca-0.2.36 → jararaca-0.2.37a0}/docs/assets/_f04774c9-7e05-4da4-8b17-8be23f6a1475.jpeg
RENAMED
|
File without changes
|
{jararaca-0.2.36 → jararaca-0.2.37a0}/docs/assets/_f04774c9-7e05-4da4-8b17-8be23f6a1475.webp
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/persistence/interceptors/aiosqa_interceptor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{jararaca-0.2.36 → jararaca-0.2.37a0}/src/jararaca/presentation/websocket/websocket_interceptor.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|