jararaca 0.3.12a15__tar.gz → 0.3.12a16__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.12a15 → jararaca-0.3.12a16}/PKG-INFO +1 -1
  2. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/pyproject.toml +1 -1
  3. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/persistence/interceptors/aiosqa_interceptor.py +70 -27
  4. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/LICENSE +0 -0
  5. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/README.md +0 -0
  6. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/docs/CNAME +0 -0
  7. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/docs/architecture.md +0 -0
  8. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/docs/assets/_f04774c9-7e05-4da4-8b17-8be23f6a1475.jpeg +0 -0
  9. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/docs/assets/_f04774c9-7e05-4da4-8b17-8be23f6a1475.webp +0 -0
  10. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/docs/assets/tracing_example.png +0 -0
  11. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/docs/http-rpc.md +0 -0
  12. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/docs/index.md +0 -0
  13. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/docs/interceptors.md +0 -0
  14. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/docs/messagebus.md +0 -0
  15. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/docs/retry.md +0 -0
  16. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/docs/scheduler.md +0 -0
  17. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/docs/stylesheets/custom.css +0 -0
  18. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/docs/websocket.md +0 -0
  19. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/__init__.py +0 -0
  20. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/__main__.py +0 -0
  21. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/broker_backend/__init__.py +0 -0
  22. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/broker_backend/mapper.py +0 -0
  23. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/broker_backend/redis_broker_backend.py +0 -0
  24. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/cli.py +0 -0
  25. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/common/__init__.py +0 -0
  26. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/core/__init__.py +0 -0
  27. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/core/providers.py +0 -0
  28. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/core/uow.py +0 -0
  29. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/di.py +0 -0
  30. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/files/entity.py.mako +0 -0
  31. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/lifecycle.py +0 -0
  32. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/messagebus/__init__.py +0 -0
  33. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/messagebus/bus_message_controller.py +0 -0
  34. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/messagebus/consumers/__init__.py +0 -0
  35. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/messagebus/decorators.py +0 -0
  36. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/messagebus/interceptors/__init__.py +0 -0
  37. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/messagebus/interceptors/aiopika_publisher_interceptor.py +0 -0
  38. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/messagebus/interceptors/publisher_interceptor.py +0 -0
  39. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/messagebus/message.py +0 -0
  40. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/messagebus/publisher.py +0 -0
  41. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/messagebus/worker.py +0 -0
  42. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/microservice.py +0 -0
  43. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/observability/decorators.py +0 -0
  44. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/observability/interceptor.py +0 -0
  45. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/observability/providers/__init__.py +0 -0
  46. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/observability/providers/otel.py +0 -0
  47. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/persistence/base.py +0 -0
  48. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/persistence/exports.py +0 -0
  49. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/persistence/interceptors/__init__.py +0 -0
  50. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/persistence/interceptors/constants.py +0 -0
  51. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/persistence/interceptors/decorators.py +0 -0
  52. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/persistence/session.py +0 -0
  53. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/persistence/sort_filter.py +0 -0
  54. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/persistence/utilities.py +0 -0
  55. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/presentation/__init__.py +0 -0
  56. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/presentation/decorators.py +0 -0
  57. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/presentation/hooks.py +0 -0
  58. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/presentation/http_microservice.py +0 -0
  59. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/presentation/server.py +0 -0
  60. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/presentation/websocket/__init__.py +0 -0
  61. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/presentation/websocket/base_types.py +0 -0
  62. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/presentation/websocket/context.py +0 -0
  63. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/presentation/websocket/decorators.py +0 -0
  64. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/presentation/websocket/redis.py +0 -0
  65. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/presentation/websocket/types.py +0 -0
  66. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/presentation/websocket/websocket_interceptor.py +0 -0
  67. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/py.typed +0 -0
  68. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/reflect/__init__.py +0 -0
  69. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/reflect/controller_inspect.py +0 -0
  70. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/reflect/metadata.py +0 -0
  71. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/rpc/__init__.py +0 -0
  72. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/rpc/http/__init__.py +0 -0
  73. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/rpc/http/backends/__init__.py +0 -0
  74. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/rpc/http/backends/httpx.py +0 -0
  75. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/rpc/http/backends/otel.py +0 -0
  76. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/rpc/http/decorators.py +0 -0
  77. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/rpc/http/httpx.py +0 -0
  78. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/scheduler/__init__.py +0 -0
  79. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/scheduler/beat_worker.py +0 -0
  80. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/scheduler/decorators.py +0 -0
  81. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/scheduler/types.py +0 -0
  82. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/tools/app_config/__init__.py +0 -0
  83. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/tools/app_config/decorators.py +0 -0
  84. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/tools/app_config/interceptor.py +0 -0
  85. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/tools/typescript/__init__.py +0 -0
  86. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/tools/typescript/decorators.py +0 -0
  87. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/tools/typescript/interface_parser.py +0 -0
  88. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/utils/__init__.py +0 -0
  89. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/src/jararaca/utils/rabbitmq_utils.py +0 -0
  90. {jararaca-0.3.12a15 → jararaca-0.3.12a16}/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.12a15
3
+ Version: 0.3.12a16
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.12a15"
3
+ version = "0.3.12a16"
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,7 +1,7 @@
1
1
  from contextlib import asynccontextmanager, contextmanager, suppress
2
2
  from contextvars import ContextVar
3
3
  from dataclasses import dataclass
4
- from typing import Any, AsyncGenerator, Generator
4
+ from typing import Any, AsyncGenerator, Generator, Protocol
5
5
 
6
6
  from sqlalchemy.ext.asyncio import (
7
7
  AsyncSession,
@@ -18,6 +18,42 @@ from jararaca.persistence.interceptors.decorators import (
18
18
  )
19
19
  from jararaca.reflect.metadata import get_metadata_value
20
20
 
21
+
22
+ class SessionManager(Protocol):
23
+ def spawn_session(self, connection_name: str | None = None) -> AsyncSession: ...
24
+
25
+
26
+ ctx_session_manager: ContextVar[SessionManager | None] = ContextVar(
27
+ "ctx_session_manager", default=None
28
+ )
29
+
30
+
31
+ @contextmanager
32
+ def providing_session_manager(
33
+ session_manager: SessionManager,
34
+ ) -> Generator[None, Any, None]:
35
+ """
36
+ Context manager to provide a session manager for the current context.
37
+ """
38
+ token = ctx_session_manager.set(session_manager)
39
+ try:
40
+ yield
41
+ finally:
42
+ with suppress(ValueError):
43
+ ctx_session_manager.reset(token)
44
+
45
+
46
+ def use_session_manager() -> SessionManager:
47
+ """
48
+ Retrieve the current session manager from the context variable.
49
+ Raises ValueError if no session manager is set.
50
+ """
51
+ session_manager = ctx_session_manager.get()
52
+ if session_manager is None:
53
+ raise ValueError("No session manager set in the context.")
54
+ return session_manager
55
+
56
+
21
57
  ctx_default_connection_name: ContextVar[str] = ContextVar(
22
58
  "ctx_default_connection_name", default=DEFAULT_CONNECTION_NAME
23
59
  )
@@ -71,7 +107,8 @@ async def providing_new_session(
71
107
  connection_name: str | None = None,
72
108
  ) -> AsyncGenerator[AsyncSession, None]:
73
109
 
74
- current_session = use_session(connection_name)
110
+ session_manager = use_session_manager()
111
+ current_session = session_manager.spawn_session(connection_name)
75
112
 
76
113
  async with AsyncSession(
77
114
  current_session.bind,
@@ -131,7 +168,7 @@ class AIOSQAConfig:
131
168
  self.inject_default = inject_default
132
169
 
133
170
 
134
- class AIOSqlAlchemySessionInterceptor(AppInterceptor):
171
+ class AIOSqlAlchemySessionInterceptor(AppInterceptor, SessionManager):
135
172
 
136
173
  def __init__(self, config: AIOSQAConfig):
137
174
  self.config = config
@@ -148,27 +185,33 @@ class AIOSqlAlchemySessionInterceptor(AppInterceptor):
148
185
  self, app_context: AppTransactionContext
149
186
  ) -> AsyncGenerator[None, None]:
150
187
 
151
- uses_connection_metadata = get_metadata_value(
152
- INJECT_PERSISTENCE_SESSION_METADATA_TEMPLATE.format(
153
- connection_name=self.config.connection_name
154
- ),
155
- self.config.inject_default,
156
- )
157
-
158
- if not uses_connection_metadata:
159
- yield
160
- return
161
-
162
- async with self.sessionmaker() as session, session.begin() as tx:
163
- token = ctx_default_connection_name.set(self.config.connection_name)
164
- with providing_session(session, tx, self.config.connection_name):
165
- try:
166
- yield
167
- if tx.is_active:
168
- await tx.commit()
169
- except Exception as e:
170
- await tx.rollback()
171
- raise e
172
- finally:
173
- with suppress(ValueError):
174
- ctx_default_connection_name.reset(token)
188
+ with providing_session_manager(self):
189
+ uses_connection_metadata = get_metadata_value(
190
+ INJECT_PERSISTENCE_SESSION_METADATA_TEMPLATE.format(
191
+ connection_name=self.config.connection_name
192
+ ),
193
+ self.config.inject_default,
194
+ )
195
+
196
+ if not uses_connection_metadata:
197
+ yield
198
+ return
199
+
200
+ async with self.sessionmaker() as session, session.begin() as tx:
201
+ token = ctx_default_connection_name.set(self.config.connection_name)
202
+ with providing_session(session, tx, self.config.connection_name):
203
+ try:
204
+ yield
205
+ if tx.is_active:
206
+ await tx.commit()
207
+ except Exception as e:
208
+ await tx.rollback()
209
+ raise e
210
+ finally:
211
+ with suppress(ValueError):
212
+ ctx_default_connection_name.reset(token)
213
+
214
+ def spawn_session(self, connection_name: str | None = None) -> AsyncSession:
215
+ connection_name = ensure_name(connection_name)
216
+ session = self.sessionmaker()
217
+ return session
File without changes
File without changes
File without changes
File without changes
File without changes