jararaca 0.3.12a11__tar.gz → 0.3.12a12__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.

Files changed (90) hide show
  1. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/PKG-INFO +1 -1
  2. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/pyproject.toml +1 -1
  3. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/presentation/websocket/redis.py +85 -7
  4. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/LICENSE +0 -0
  5. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/README.md +0 -0
  6. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/docs/CNAME +0 -0
  7. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/docs/architecture.md +0 -0
  8. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/docs/assets/_f04774c9-7e05-4da4-8b17-8be23f6a1475.jpeg +0 -0
  9. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/docs/assets/_f04774c9-7e05-4da4-8b17-8be23f6a1475.webp +0 -0
  10. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/docs/assets/tracing_example.png +0 -0
  11. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/docs/http-rpc.md +0 -0
  12. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/docs/index.md +0 -0
  13. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/docs/interceptors.md +0 -0
  14. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/docs/messagebus.md +0 -0
  15. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/docs/retry.md +0 -0
  16. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/docs/scheduler.md +0 -0
  17. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/docs/stylesheets/custom.css +0 -0
  18. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/docs/websocket.md +0 -0
  19. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/__init__.py +0 -0
  20. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/__main__.py +0 -0
  21. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/broker_backend/__init__.py +0 -0
  22. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/broker_backend/mapper.py +0 -0
  23. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/broker_backend/redis_broker_backend.py +0 -0
  24. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/cli.py +0 -0
  25. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/common/__init__.py +0 -0
  26. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/core/__init__.py +0 -0
  27. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/core/providers.py +0 -0
  28. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/core/uow.py +0 -0
  29. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/di.py +0 -0
  30. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/files/entity.py.mako +0 -0
  31. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/lifecycle.py +0 -0
  32. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/messagebus/__init__.py +0 -0
  33. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/messagebus/bus_message_controller.py +0 -0
  34. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/messagebus/consumers/__init__.py +0 -0
  35. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/messagebus/decorators.py +0 -0
  36. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/messagebus/interceptors/__init__.py +0 -0
  37. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/messagebus/interceptors/aiopika_publisher_interceptor.py +0 -0
  38. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/messagebus/interceptors/publisher_interceptor.py +0 -0
  39. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/messagebus/message.py +0 -0
  40. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/messagebus/publisher.py +0 -0
  41. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/messagebus/worker.py +0 -0
  42. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/microservice.py +0 -0
  43. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/observability/decorators.py +0 -0
  44. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/observability/interceptor.py +0 -0
  45. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/observability/providers/__init__.py +0 -0
  46. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/observability/providers/otel.py +0 -0
  47. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/persistence/base.py +0 -0
  48. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/persistence/exports.py +0 -0
  49. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/persistence/interceptors/__init__.py +0 -0
  50. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/persistence/interceptors/aiosqa_interceptor.py +0 -0
  51. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/persistence/interceptors/constants.py +0 -0
  52. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/persistence/interceptors/decorators.py +0 -0
  53. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/persistence/session.py +0 -0
  54. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/persistence/sort_filter.py +0 -0
  55. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/persistence/utilities.py +0 -0
  56. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/presentation/__init__.py +0 -0
  57. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/presentation/decorators.py +0 -0
  58. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/presentation/hooks.py +0 -0
  59. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/presentation/http_microservice.py +0 -0
  60. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/presentation/server.py +0 -0
  61. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/presentation/websocket/__init__.py +0 -0
  62. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/presentation/websocket/base_types.py +0 -0
  63. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/presentation/websocket/context.py +0 -0
  64. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/presentation/websocket/decorators.py +0 -0
  65. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/presentation/websocket/types.py +0 -0
  66. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/presentation/websocket/websocket_interceptor.py +0 -0
  67. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/py.typed +0 -0
  68. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/reflect/__init__.py +0 -0
  69. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/reflect/controller_inspect.py +0 -0
  70. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/reflect/metadata.py +0 -0
  71. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/rpc/__init__.py +0 -0
  72. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/rpc/http/__init__.py +0 -0
  73. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/rpc/http/backends/__init__.py +0 -0
  74. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/rpc/http/backends/httpx.py +0 -0
  75. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/rpc/http/backends/otel.py +0 -0
  76. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/rpc/http/decorators.py +0 -0
  77. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/rpc/http/httpx.py +0 -0
  78. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/scheduler/__init__.py +0 -0
  79. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/scheduler/beat_worker.py +0 -0
  80. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/scheduler/decorators.py +0 -0
  81. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/scheduler/types.py +0 -0
  82. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/tools/app_config/__init__.py +0 -0
  83. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/tools/app_config/decorators.py +0 -0
  84. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/tools/app_config/interceptor.py +0 -0
  85. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/tools/typescript/__init__.py +0 -0
  86. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/tools/typescript/decorators.py +0 -0
  87. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/tools/typescript/interface_parser.py +0 -0
  88. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/utils/__init__.py +0 -0
  89. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/utils/rabbitmq_utils.py +0 -0
  90. {jararaca-0.3.12a11 → jararaca-0.3.12a12}/src/jararaca/utils/retry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jararaca
3
- Version: 0.3.12a11
3
+ Version: 0.3.12a12
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,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "jararaca"
3
- version = "0.3.12a11"
3
+ version = "0.3.12a12"
4
4
  description = "A simple and fast API framework for Python"
5
5
  authors = ["Lucas S <me@luscasleo.dev>"]
6
6
  readme = "README.md"
@@ -1,4 +1,5 @@
1
1
  import asyncio
2
+ import logging
2
3
  from dataclasses import dataclass
3
4
  from typing import Any
4
5
 
@@ -10,6 +11,8 @@ from jararaca.presentation.websocket.websocket_interceptor import (
10
11
  WebSocketConnectionBackend,
11
12
  )
12
13
 
14
+ logger = logging.getLogger(__name__)
15
+
13
16
 
14
17
  @dataclass
15
18
  class BroadcastMessage:
@@ -66,6 +69,34 @@ class RedisWebSocketConnectionBackend(WebSocketConnectionBackend):
66
69
 
67
70
  self.consume_broadcast_timeout = consume_broadcast_timeout
68
71
  self.consume_send_timeout = consume_send_timeout
72
+ self.__shutdown_event: asyncio.Event | None = None
73
+
74
+ self.__send_func: SendFunc | None = None
75
+ self.__broadcast_func: BroadcastFunc | None = None
76
+
77
+ @property
78
+ def shutdown_event(self) -> asyncio.Event:
79
+ if self.__shutdown_event is None:
80
+ raise RuntimeError(
81
+ "Shutdown event is not set. Please configure the backend before using it."
82
+ )
83
+ return self.__shutdown_event
84
+
85
+ @property
86
+ def send_func(self) -> SendFunc:
87
+ if self.__send_func is None:
88
+ raise RuntimeError(
89
+ "Send function is not set. Please configure the backend before using it."
90
+ )
91
+ return self.__send_func
92
+
93
+ @property
94
+ def broadcast_func(self) -> BroadcastFunc:
95
+ if self.__broadcast_func is None:
96
+ raise RuntimeError(
97
+ "Broadcast function is not set. Please configure the backend before using it."
98
+ )
99
+ return self.__broadcast_func
69
100
 
70
101
  async def broadcast(self, message: bytes) -> None:
71
102
  await self.redis.publish(
@@ -82,22 +113,69 @@ class RedisWebSocketConnectionBackend(WebSocketConnectionBackend):
82
113
  def configure(
83
114
  self, broadcast: BroadcastFunc, send: SendFunc, shutdown_event: asyncio.Event
84
115
  ) -> None:
116
+ if self.__shutdown_event is not None:
117
+ raise RuntimeError("Backend is already configured.")
118
+ self.__shutdown_event = shutdown_event
119
+ self.__send_func = send
120
+ self.__broadcast_func = broadcast
121
+ self.setup_send_consumer()
122
+ self.setup_broadcast_consumer()
85
123
 
86
- broadcast_task = asyncio.get_event_loop().create_task(
87
- self.consume_broadcast(broadcast, shutdown_event)
88
- )
124
+ def setup_send_consumer(self) -> None:
89
125
 
90
126
  send_task = asyncio.get_event_loop().create_task(
91
- self.consume_send(send, shutdown_event)
127
+ self.consume_send(self.send_func, self.shutdown_event)
92
128
  )
93
129
 
94
- self.tasks.add(broadcast_task)
95
130
  self.tasks.add(send_task)
131
+ send_task.add_done_callback(self.handle_send_task_done)
132
+
133
+ def setup_broadcast_consumer(self) -> None:
134
+
135
+ broadcast_task = asyncio.get_event_loop().create_task(
136
+ self.consume_broadcast(self.broadcast_func, self.shutdown_event)
137
+ )
138
+
139
+ self.tasks.add(broadcast_task)
140
+
141
+ broadcast_task.add_done_callback(self.handle_broadcast_task_done)
142
+
143
+ def handle_broadcast_task_done(self, task: asyncio.Task[Any]) -> None:
144
+ if task.cancelled():
145
+ logger.warning("Broadcast task was cancelled.")
146
+ elif task.exception() is not None:
147
+ logger.exception(
148
+ f"Broadcast task raised an exception:", exc_info=task.exception()
149
+ )
150
+ else:
151
+ logger.warning("Broadcast task somehow completed successfully.")
152
+
153
+ if not self.shutdown_event.is_set():
154
+ logger.warning(
155
+ "Broadcast task completed, but shutdown event is not set. This is unexpected."
156
+ )
157
+ self.setup_broadcast_consumer()
158
+
159
+ def handle_send_task_done(self, task: asyncio.Task[Any]) -> None:
160
+ if task.cancelled():
161
+ logger.warning("Send task was cancelled.")
162
+ elif task.exception() is not None:
163
+ logger.exception(
164
+ f"Send task raised an exception:", exc_info=task.exception()
165
+ )
166
+ else:
167
+ logger.warning("Send task somehow completed successfully.")
168
+
169
+ if not self.shutdown_event.is_set():
170
+ logger.warning(
171
+ "Send task completed, but shutdown event is not set. This is unexpected."
172
+ )
173
+ self.setup_send_consumer()
96
174
 
97
175
  async def consume_broadcast(
98
176
  self, broadcast: BroadcastFunc, shutdown_event: asyncio.Event
99
177
  ) -> None:
100
-
178
+ logger.info("Starting broadcast consumer...")
101
179
  async with self.redis.pubsub() as pubsub:
102
180
  await pubsub.subscribe(self.broadcast_pubsub_channel)
103
181
 
@@ -122,7 +200,7 @@ class RedisWebSocketConnectionBackend(WebSocketConnectionBackend):
122
200
  task.add_done_callback(self.tasks.discard)
123
201
 
124
202
  async def consume_send(self, send: SendFunc, shutdown_event: asyncio.Event) -> None:
125
-
203
+ logger.info("Starting send consumer...")
126
204
  async with self.redis.pubsub() as pubsub:
127
205
  await pubsub.subscribe(self.send_pubsub_channel)
128
206
 
File without changes
File without changes
File without changes
File without changes
File without changes