jararaca 0.3.12a15__tar.gz → 0.3.12a17__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.12a17}/PKG-INFO +1 -1
  2. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/pyproject.toml +1 -1
  3. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/persistence/interceptors/aiosqa_interceptor.py +72 -27
  4. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/LICENSE +0 -0
  5. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/README.md +0 -0
  6. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/docs/CNAME +0 -0
  7. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/docs/architecture.md +0 -0
  8. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/docs/assets/_f04774c9-7e05-4da4-8b17-8be23f6a1475.jpeg +0 -0
  9. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/docs/assets/_f04774c9-7e05-4da4-8b17-8be23f6a1475.webp +0 -0
  10. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/docs/assets/tracing_example.png +0 -0
  11. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/docs/http-rpc.md +0 -0
  12. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/docs/index.md +0 -0
  13. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/docs/interceptors.md +0 -0
  14. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/docs/messagebus.md +0 -0
  15. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/docs/retry.md +0 -0
  16. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/docs/scheduler.md +0 -0
  17. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/docs/stylesheets/custom.css +0 -0
  18. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/docs/websocket.md +0 -0
  19. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/__init__.py +0 -0
  20. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/__main__.py +0 -0
  21. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/broker_backend/__init__.py +0 -0
  22. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/broker_backend/mapper.py +0 -0
  23. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/broker_backend/redis_broker_backend.py +0 -0
  24. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/cli.py +0 -0
  25. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/common/__init__.py +0 -0
  26. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/core/__init__.py +0 -0
  27. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/core/providers.py +0 -0
  28. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/core/uow.py +0 -0
  29. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/di.py +0 -0
  30. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/files/entity.py.mako +0 -0
  31. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/lifecycle.py +0 -0
  32. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/messagebus/__init__.py +0 -0
  33. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/messagebus/bus_message_controller.py +0 -0
  34. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/messagebus/consumers/__init__.py +0 -0
  35. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/messagebus/decorators.py +0 -0
  36. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/messagebus/interceptors/__init__.py +0 -0
  37. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/messagebus/interceptors/aiopika_publisher_interceptor.py +0 -0
  38. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/messagebus/interceptors/publisher_interceptor.py +0 -0
  39. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/messagebus/message.py +0 -0
  40. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/messagebus/publisher.py +0 -0
  41. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/messagebus/worker.py +0 -0
  42. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/microservice.py +0 -0
  43. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/observability/decorators.py +0 -0
  44. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/observability/interceptor.py +0 -0
  45. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/observability/providers/__init__.py +0 -0
  46. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/observability/providers/otel.py +0 -0
  47. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/persistence/base.py +0 -0
  48. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/persistence/exports.py +0 -0
  49. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/persistence/interceptors/__init__.py +0 -0
  50. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/persistence/interceptors/constants.py +0 -0
  51. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/persistence/interceptors/decorators.py +0 -0
  52. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/persistence/session.py +0 -0
  53. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/persistence/sort_filter.py +0 -0
  54. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/persistence/utilities.py +0 -0
  55. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/presentation/__init__.py +0 -0
  56. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/presentation/decorators.py +0 -0
  57. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/presentation/hooks.py +0 -0
  58. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/presentation/http_microservice.py +0 -0
  59. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/presentation/server.py +0 -0
  60. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/presentation/websocket/__init__.py +0 -0
  61. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/presentation/websocket/base_types.py +0 -0
  62. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/presentation/websocket/context.py +0 -0
  63. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/presentation/websocket/decorators.py +0 -0
  64. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/presentation/websocket/redis.py +0 -0
  65. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/presentation/websocket/types.py +0 -0
  66. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/presentation/websocket/websocket_interceptor.py +0 -0
  67. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/py.typed +0 -0
  68. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/reflect/__init__.py +0 -0
  69. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/reflect/controller_inspect.py +0 -0
  70. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/reflect/metadata.py +0 -0
  71. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/rpc/__init__.py +0 -0
  72. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/rpc/http/__init__.py +0 -0
  73. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/rpc/http/backends/__init__.py +0 -0
  74. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/rpc/http/backends/httpx.py +0 -0
  75. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/rpc/http/backends/otel.py +0 -0
  76. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/rpc/http/decorators.py +0 -0
  77. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/rpc/http/httpx.py +0 -0
  78. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/scheduler/__init__.py +0 -0
  79. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/scheduler/beat_worker.py +0 -0
  80. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/scheduler/decorators.py +0 -0
  81. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/scheduler/types.py +0 -0
  82. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/tools/app_config/__init__.py +0 -0
  83. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/tools/app_config/decorators.py +0 -0
  84. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/tools/app_config/interceptor.py +0 -0
  85. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/tools/typescript/__init__.py +0 -0
  86. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/tools/typescript/decorators.py +0 -0
  87. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/tools/typescript/interface_parser.py +0 -0
  88. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/utils/__init__.py +0 -0
  89. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/src/jararaca/utils/rabbitmq_utils.py +0 -0
  90. {jararaca-0.3.12a15 → jararaca-0.3.12a17}/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.12a17
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.12a17"
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,13 +107,16 @@ 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,
78
115
  ) as new_session, new_session.begin() as new_tx:
79
116
  with providing_session(new_session, new_tx, connection_name):
80
117
  yield new_session
118
+ if new_tx.is_active:
119
+ await new_tx.commit()
81
120
 
82
121
 
83
122
  def use_session(connection_name: str | None = None) -> AsyncSession:
@@ -131,7 +170,7 @@ class AIOSQAConfig:
131
170
  self.inject_default = inject_default
132
171
 
133
172
 
134
- class AIOSqlAlchemySessionInterceptor(AppInterceptor):
173
+ class AIOSqlAlchemySessionInterceptor(AppInterceptor, SessionManager):
135
174
 
136
175
  def __init__(self, config: AIOSQAConfig):
137
176
  self.config = config
@@ -148,27 +187,33 @@ class AIOSqlAlchemySessionInterceptor(AppInterceptor):
148
187
  self, app_context: AppTransactionContext
149
188
  ) -> AsyncGenerator[None, None]:
150
189
 
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)
190
+ with providing_session_manager(self):
191
+ uses_connection_metadata = get_metadata_value(
192
+ INJECT_PERSISTENCE_SESSION_METADATA_TEMPLATE.format(
193
+ connection_name=self.config.connection_name
194
+ ),
195
+ self.config.inject_default,
196
+ )
197
+
198
+ if not uses_connection_metadata:
199
+ yield
200
+ return
201
+
202
+ async with self.sessionmaker() as session, session.begin() as tx:
203
+ token = ctx_default_connection_name.set(self.config.connection_name)
204
+ with providing_session(session, tx, self.config.connection_name):
205
+ try:
206
+ yield
207
+ if tx.is_active:
208
+ await tx.commit()
209
+ except Exception as e:
210
+ await tx.rollback()
211
+ raise e
212
+ finally:
213
+ with suppress(ValueError):
214
+ ctx_default_connection_name.reset(token)
215
+
216
+ def spawn_session(self, connection_name: str | None = None) -> AsyncSession:
217
+ connection_name = ensure_name(connection_name)
218
+ session = self.sessionmaker()
219
+ return session
File without changes
File without changes
File without changes
File without changes
File without changes