jararaca 0.3.12a15__py3-none-any.whl → 0.3.12a17__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.

@@ -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
@@ -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
  LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
2
2
  README.md,sha256=2qMM__t_MoLKZr4IY9tXjo-Jn6LKjuHMb1qbyXpgL08,3401
3
- pyproject.toml,sha256=RRTvs1_dJ2TyVWLfqwQerXsg3Jteanc-jj5yqqLHnjw,2041
3
+ pyproject.toml,sha256=stDeBAKKaDdBk5oL2gpGAiJLpPeIrDN16gnoXjeZmlE,2041
4
4
  jararaca/__init__.py,sha256=vK3zyIVLckwZgj1FPX6jzSbzaSWmSy3wQ2KMwmpJnmg,22046
5
5
  jararaca/__main__.py,sha256=-O3vsB5lHdqNFjUtoELDF81IYFtR-DSiiFMzRaiSsv4,67
6
6
  jararaca/broker_backend/__init__.py,sha256=GzEIuHR1xzgCJD4FE3harNjoaYzxHMHoEL0_clUaC-k,3528
@@ -32,7 +32,7 @@ jararaca/observability/providers/otel.py,sha256=8N1F32W43t7c8cwmtTh6Yz9b7HyfGFSR
32
32
  jararaca/persistence/base.py,sha256=xnGUbsLNz3gO-9iJt-Sn5NY13Yc9-misP8wLwQuGGoM,1024
33
33
  jararaca/persistence/exports.py,sha256=Ghx4yoFaB4QVTb9WxrFYgmcSATXMNvrOvT8ybPNKXCA,62
34
34
  jararaca/persistence/interceptors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
- jararaca/persistence/interceptors/aiosqa_interceptor.py,sha256=_qhTONCtusGIvQg3FOHVnsxWXGi77gsNi1fH0Cv6kxg,5301
35
+ jararaca/persistence/interceptors/aiosqa_interceptor.py,sha256=kHI1rb71o3Ug3JzkQ0RQ2uqJuENsIRgDF69MX7H65lk,6760
36
36
  jararaca/persistence/interceptors/constants.py,sha256=o8g5RxDX9dSSnM9eXYlTJalGPfWxYm6-CAA8-FooUzE,36
37
37
  jararaca/persistence/interceptors/decorators.py,sha256=p37r9ux5w_bvn8xPNPhScl3fjCc2enqTR0cJYLxMsrI,1627
38
38
  jararaca/persistence/session.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -74,8 +74,8 @@ jararaca/tools/typescript/interface_parser.py,sha256=OMvz4vcsKD0eYPwH1hd3PJpLP2B
74
74
  jararaca/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
75
  jararaca/utils/rabbitmq_utils.py,sha256=ytdAFUyv-OBkaVnxezuJaJoLrmN7giZgtKeet_IsMBs,10918
76
76
  jararaca/utils/retry.py,sha256=DzPX_fXUvTqej6BQ8Mt2dvLo9nNlTBm7Kx2pFZ26P2Q,4668
77
- jararaca-0.3.12a15.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
78
- jararaca-0.3.12a15.dist-info/METADATA,sha256=fFXzLNVezceWJK9blELzoKo7mdzdN0GnxcxsR_1BrMM,4996
79
- jararaca-0.3.12a15.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
80
- jararaca-0.3.12a15.dist-info/entry_points.txt,sha256=WIh3aIvz8LwUJZIDfs4EeH3VoFyCGEk7cWJurW38q0I,45
81
- jararaca-0.3.12a15.dist-info/RECORD,,
77
+ jararaca-0.3.12a17.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
78
+ jararaca-0.3.12a17.dist-info/METADATA,sha256=lwNzy_Aycpsghy1xAsRkSIqz15GWEuCqyu_gNFC39Oc,4996
79
+ jararaca-0.3.12a17.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
80
+ jararaca-0.3.12a17.dist-info/entry_points.txt,sha256=WIh3aIvz8LwUJZIDfs4EeH3VoFyCGEk7cWJurW38q0I,45
81
+ jararaca-0.3.12a17.dist-info/RECORD,,
pyproject.toml CHANGED
@@ -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"