fastapi-async-sqlalchemy 0.7.0.dev1__py3-none-any.whl → 0.7.0.dev2__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.
@@ -2,4 +2,4 @@ from fastapi_async_sqlalchemy.middleware import SQLAlchemyMiddleware, db
2
2
 
3
3
  __all__ = ["db", "SQLAlchemyMiddleware"]
4
4
 
5
- __version__ = "0.7.0.dev1"
5
+ __version__ = "0.7.0.dev2"
@@ -1,5 +1,4 @@
1
1
  import asyncio
2
- from asyncio import Task
3
2
  from contextvars import ContextVar
4
3
  from typing import Dict, Optional, Union
5
4
 
@@ -22,6 +21,9 @@ def create_middleware_and_session_proxy():
22
21
  _Session: Optional[async_sessionmaker] = None
23
22
  _session: ContextVar[Optional[AsyncSession]] = ContextVar("_session", default=None)
24
23
  _multi_sessions_ctx: ContextVar[bool] = ContextVar("_multi_sessions_context", default=False)
24
+ _task_session_ctx: ContextVar[Optional[AsyncSession]] = ContextVar(
25
+ "_task_session_ctx", default=None
26
+ )
25
27
  _commit_on_exit_ctx: ContextVar[bool] = ContextVar("_commit_on_exit_ctx", default=False)
26
28
  # Usage of context vars inside closures is not recommended, since they are not properly
27
29
  # garbage collected, but in our use case context var is created on program startup and
@@ -90,28 +92,26 @@ def create_middleware_and_session_proxy():
90
92
  ```
91
93
  """
92
94
  commit_on_exit = _commit_on_exit_ctx.get()
93
- task: Task = asyncio.current_task() # type: ignore
94
- if not hasattr(task, "_db_session"):
95
- task._db_session = _Session() # type: ignore
96
-
97
- def cleanup(future):
98
- session = getattr(task, "_db_session", None)
99
- if session:
100
-
101
- async def do_cleanup():
102
- try:
103
- if future.exception():
104
- await session.rollback()
105
- else:
106
- if commit_on_exit:
107
- await session.commit()
108
- finally:
109
- await session.close()
110
-
111
- asyncio.create_task(do_cleanup())
112
-
113
- task.add_done_callback(cleanup)
114
- return task._db_session # type: ignore
95
+ session = _task_session_ctx.get()
96
+ if session is None:
97
+ session = _Session()
98
+ _task_session_ctx.set(session)
99
+
100
+ async def cleanup():
101
+ try:
102
+ if commit_on_exit:
103
+ await session.commit()
104
+ except Exception:
105
+ await session.rollback()
106
+ raise
107
+ finally:
108
+ await session.close()
109
+ _task_session_ctx.set(None)
110
+
111
+ task = asyncio.current_task()
112
+ if task is not None:
113
+ task.add_done_callback(lambda t: asyncio.create_task(cleanup()))
114
+ return session
115
115
  else:
116
116
  session = _session.get()
117
117
  if session is None:
@@ -139,23 +139,24 @@ def create_middleware_and_session_proxy():
139
139
  if self.multi_sessions:
140
140
  self.multi_sessions_token = _multi_sessions_ctx.set(True)
141
141
  self.commit_on_exit_token = _commit_on_exit_ctx.set(self.commit_on_exit)
142
-
143
- self.token = _session.set(_Session(**self.session_args))
142
+ else:
143
+ self.token = _session.set(_Session(**self.session_args))
144
144
  return type(self)
145
145
 
146
146
  async def __aexit__(self, exc_type, exc_value, traceback):
147
- session = _session.get()
148
- try:
149
- if exc_type is not None:
150
- await session.rollback()
151
- elif self.commit_on_exit:
152
- await session.commit()
153
- finally:
154
- await session.close()
155
- _session.reset(self.token)
156
- if self.multi_sessions_token is not None:
157
- _multi_sessions_ctx.reset(self.multi_sessions_token)
158
- _commit_on_exit_ctx.reset(self.commit_on_exit_token)
147
+ if self.multi_sessions:
148
+ _multi_sessions_ctx.reset(self.multi_sessions_token)
149
+ _commit_on_exit_ctx.reset(self.commit_on_exit_token)
150
+ else:
151
+ session = _session.get()
152
+ try:
153
+ if exc_type is not None:
154
+ await session.rollback()
155
+ elif self.commit_on_exit:
156
+ await session.commit()
157
+ finally:
158
+ await session.close()
159
+ _session.reset(self.token)
159
160
 
160
161
  return SQLAlchemyMiddleware, DBSession
161
162
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastapi-async-sqlalchemy
3
- Version: 0.7.0.dev1
3
+ Version: 0.7.0.dev2
4
4
  Summary: SQLAlchemy middleware for FastAPI
5
5
  Home-page: https://github.com/h0rn3t/fastapi-async-sqlalchemy.git
6
6
  Author: Eugene Shershen
@@ -0,0 +1,9 @@
1
+ fastapi_async_sqlalchemy/__init__.py,sha256=uBiMzBBYVuNC52ekhbIasBTLsIhSvVyXY2KXD8nOWuQ,143
2
+ fastapi_async_sqlalchemy/exceptions.py,sha256=dH3xjPE7B6kgq8L3LvxK-MsGZ_ZnW2WH2drLkK2oD-4,887
3
+ fastapi_async_sqlalchemy/middleware.py,sha256=z3lPmnIihKyRfy34qE2z-38KuxFSXnVVcy_rg_S6IwM,6900
4
+ fastapi_async_sqlalchemy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ fastapi_async_sqlalchemy-0.7.0.dev2.dist-info/LICENSE,sha256=OhSfEMY0WqZhq41M6mLmkuFloAG7ZJYKfryF2jyxkfY,1108
6
+ fastapi_async_sqlalchemy-0.7.0.dev2.dist-info/METADATA,sha256=ANbR70mznxKwilOJ4OmYPVQ0OjmntfTdXr-SFcbL2eU,6831
7
+ fastapi_async_sqlalchemy-0.7.0.dev2.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
8
+ fastapi_async_sqlalchemy-0.7.0.dev2.dist-info/top_level.txt,sha256=po-P5Tif35GmAaUR0mgZr5uBwN91iAgszaKI_r4ZTZA,25
9
+ fastapi_async_sqlalchemy-0.7.0.dev2.dist-info/RECORD,,
@@ -1,9 +0,0 @@
1
- fastapi_async_sqlalchemy/__init__.py,sha256=SssNn_DOQkhXabDQJJdvgRKMvL12CXPZiSqFxl1n1lg,143
2
- fastapi_async_sqlalchemy/exceptions.py,sha256=dH3xjPE7B6kgq8L3LvxK-MsGZ_ZnW2WH2drLkK2oD-4,887
3
- fastapi_async_sqlalchemy/middleware.py,sha256=Fk5aAkgqjLH_HWTa-ELlYL3vFlaSlIMyG2xpG7AarDw,6916
4
- fastapi_async_sqlalchemy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- fastapi_async_sqlalchemy-0.7.0.dev1.dist-info/LICENSE,sha256=OhSfEMY0WqZhq41M6mLmkuFloAG7ZJYKfryF2jyxkfY,1108
6
- fastapi_async_sqlalchemy-0.7.0.dev1.dist-info/METADATA,sha256=COfeGoIlIPXulpANj8vL4Mtn9rtUerNGQ2G3bD2PanM,6831
7
- fastapi_async_sqlalchemy-0.7.0.dev1.dist-info/WHEEL,sha256=OVMc5UfuAQiSplgO0_WdW7vXVGAt9Hdd6qtN4HotdyA,91
8
- fastapi_async_sqlalchemy-0.7.0.dev1.dist-info/top_level.txt,sha256=po-P5Tif35GmAaUR0mgZr5uBwN91iAgszaKI_r4ZTZA,25
9
- fastapi_async_sqlalchemy-0.7.0.dev1.dist-info/RECORD,,