Skip to content

Commit 8455f3f

Browse files
authored
Merge pull request #43 from python-ellar/ellar_081_upgrade
fixed deprecated reference due to ellar 0.8.1
2 parents 0e236cd + cd97daf commit 8455f3f

File tree

41 files changed

+280
-190
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+280
-190
lines changed

docs/migrations/env.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ but it also introduces a certain level of complexity.
88
from logging.config import fileConfig
99

1010
from alembic import context
11-
from ellar.app import current_injector
12-
from ellar.threading import run_as_async
11+
from ellar.core import current_injector
12+
from ellar.threading import run_as_sync
1313

1414
from ellar_sql.migrations import SingleDatabaseAlembicEnvMigration
1515
from ellar_sql.services import EllarSQLService
@@ -28,7 +28,7 @@ fileConfig(config.config_file_name) # type:ignore[arg-type]
2828
# my_important_option = config.get_main_option("my_important_option")
2929
# ... etc.
3030

31-
@run_as_async
31+
@run_as_sync
3232
async def main() -> None:
3333
db_service: EllarSQLService = current_injector.get(EllarSQLService)
3434

@@ -91,8 +91,8 @@ from logging.config import fileConfig
9191
from alembic import context
9292
from ellar_sql.migrations import AlembicEnvMigrationBase
9393
from ellar_sql.model.database_binds import get_metadata
94-
from ellar.app import current_injector
95-
from ellar.threading import run_as_async
94+
from ellar.core import current_injector
95+
from ellar.threading import run_as_sync
9696
from ellar_sql.services import EllarSQLService
9797

9898
# This is the Alembic Config object, which provides
@@ -156,7 +156,7 @@ class MyCustomMigrationEnv(AlembicEnvMigrationBase):
156156
context.run_migrations()
157157

158158

159-
@run_as_async
159+
@run_as_sync
160160
async def main() -> None:
161161
db_service: EllarSQLService = current_injector.get(EllarSQLService)
162162

docs/models/index.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ class User(model.Model):
176176
We have created a `User` model but the data does not exist. Let's fix that
177177

178178
```python
179-
from ellar.app import current_injector
179+
from ellar.core import current_injector
180180
from ellar_sql import EllarSQLService
181181

182182
db_service = current_injector.get(EllarSQLService)
@@ -285,7 +285,7 @@ Although with `EllarSQLService` you can get the `engine` and `session`. It's the
285285
```python
286286
import sqlalchemy as sa
287287
import sqlalchemy.orm as sa_orm
288-
from ellar.app import current_injector
288+
from ellar.core import current_injector
289289
from ellar_sql import EllarSQLService
290290

291291
db_service = current_injector.get(EllarSQLService)
@@ -303,7 +303,7 @@ assert isinstance(db_service.session_factory(), sa_orm.Session)
303303
```python
304304
import sqlalchemy as sa
305305
import sqlalchemy.orm as sa_orm
306-
from ellar.app import current_injector
306+
from ellar.core import current_injector
307307

308308
# get engine from DI
309309
default_engine = current_injector.get(sa.Engine)
@@ -317,7 +317,7 @@ assert isinstance(session, sa_orm.Session)
317317
For Async Database options
318318
```python
319319
from sqlalchemy.ext.asyncio import AsyncSession, AsyncEngine
320-
from ellar.app import current_injector
320+
from ellar.core import current_injector
321321

322322
# get engine from DI
323323
default_engine = current_injector.get(AsyncEngine)

docs/multiple/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ It also requires the `database` argument to target a specific database.
7575

7676
```python
7777
# Create tables for all binds
78-
from ellar.app import current_injector
78+
from ellar.core import current_injector
7979
from ellar_sql import EllarSQLService
8080

8181
db_service = current_injector.get(EllarSQLService)

ellar_sql/cli/commands.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import ellar_cli.click as click
2-
from ellar.app import current_injector
2+
from ellar.core import current_injector
33

44
from ellar_sql.services import EllarSQLService
55

ellar_sql/factory/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import sqlalchemy as sa
44
import sqlalchemy.orm as sa_orm
5-
from ellar.threading import run_as_async
5+
from ellar.threading import run_as_sync
66
from factory.alchemy import (
77
SESSION_PERSISTENCE_COMMIT,
88
SESSION_PERSISTENCE_FLUSH,
@@ -36,7 +36,7 @@ class Meta:
3636
abstract = True
3737

3838
@classmethod
39-
@run_as_async
39+
@run_as_sync
4040
async def _session_execute(
4141
cls, session_func: t.Callable, *args: t.Any, **kwargs: t.Any
4242
) -> t.Union[sa.Result, sa.CursorResult, t.Any]:

ellar_sql/model/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
import sqlalchemy as sa
55
import sqlalchemy.orm as sa_orm
6-
from ellar.app import current_injector
6+
from ellar.core import current_injector
77
from sqlalchemy.ext.asyncio import AsyncSession
88

99
from ellar_sql.constant import DATABASE_BIND_KEY, DATABASE_KEY, DEFAULT_KEY

ellar_sql/model/typeDecorator/file/exceptions.py

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,14 @@
66
from sqlalchemy_file.exceptions import ValidationError
77

88
from ellar.common import IExecutionContext
9-
from ellar.common.exceptions import CallableExceptionHandler
9+
from ellar.core.exceptions import as_exception_handler
1010

1111

12-
def _exception_handlers(ctx: IExecutionContext, exc: ValidationError):
12+
# Register to application config.EXCEPTION_HANDLERS to add exception handler for sqlalchemy-file
13+
@as_exception_handler(ValidationError)
14+
async def FileExceptionHandler(ctx: IExecutionContext, exc: ValidationError):
1315
app_config = ctx.get_app().config
1416
return app_config.DEFAULT_JSON_CLASS(
1517
{"message": exc.msg, "key": exc.key},
1618
status_code=400,
1719
)
18-
19-
20-
# Register to application config.EXCEPTION_HANDLERS to add exception handler for sqlalchemy-file
21-
FileExceptionHandler = CallableExceptionHandler(
22-
exc_class_or_status_code=ValidationError,
23-
callable_exception_handler=_exception_handlers,
24-
)

ellar_sql/model/typeDecorator/file/file.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
import warnings
44
from datetime import datetime
55

6-
from ellar.app import current_injector
76
from ellar.common.compatible import AttributeDictAccessMixin
7+
from ellar.core import current_injector
88
from ellar_storage import StorageService, StoredFile
99
from sqlalchemy_file.file import File as BaseFile
1010
from starlette.datastructures import UploadFile

ellar_sql/model/typeDecorator/file/file_tracker.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import typing as t
22

3-
from ellar.app import current_injector
3+
from ellar.core import current_injector
44
from ellar_storage import StorageService
55
from sqlalchemy import event, orm
66
from sqlalchemy_file.types import FileFieldSessionTracker

ellar_sql/module.py

Lines changed: 47 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22
import typing as t
33

44
import sqlalchemy as sa
5-
from ellar.common import IExecutionContext, IModuleSetup, Module, middleware
5+
from ellar.common import IHostContext, IModuleSetup, Module
66
from ellar.core import Config, DynamicModule, ModuleBase, ModuleSetup
7+
from ellar.core.middleware import as_middleware
8+
from ellar.core.modules import ModuleRefBase
79
from ellar.di import ProviderConfig, request_or_transient_scope
8-
from ellar.events import app_context_teardown
910
from ellar.utils.importer import get_main_directory_by_stack
1011
from sqlalchemy.ext.asyncio import (
1112
AsyncEngine,
@@ -26,32 +27,49 @@ def _raise_exception():
2627
return _raise_exception
2728

2829

29-
@Module(commands=[DBCommands])
30-
class EllarSQLModule(ModuleBase, IModuleSetup):
31-
@middleware()
32-
async def session_middleware(
33-
cls, context: IExecutionContext, call_next: t.Callable[..., t.Coroutine]
34-
):
35-
connection = context.switch_to_http_connection().get_client()
36-
37-
db_session = connection.service_provider.get(EllarSQLService)
38-
session = db_session.session_factory()
30+
@as_middleware
31+
async def session_middleware(
32+
context: IHostContext, call_next: t.Callable[..., t.Coroutine]
33+
):
34+
connection = context.switch_to_http_connection().get_client()
3935

40-
connection.state.session = session
36+
db_service = context.get_service_provider().get(EllarSQLService)
37+
session = db_service.session_factory()
4138

42-
try:
43-
await call_next()
44-
except Exception as ex:
45-
res = session.rollback()
46-
if isinstance(res, t.Coroutine):
47-
await res
48-
raise ex
39+
connection.state.session = session
4940

50-
@classmethod
51-
async def _on_application_tear_down(cls, db_service: EllarSQLService) -> None:
52-
res = db_service.session_factory.remove()
41+
try:
42+
await call_next()
43+
except Exception as ex:
44+
res = session.rollback()
5345
if isinstance(res, t.Coroutine):
5446
await res
47+
raise ex
48+
49+
res = db_service.session_factory.remove()
50+
if isinstance(res, t.Coroutine):
51+
await res
52+
53+
54+
@Module(
55+
commands=[DBCommands],
56+
exports=[
57+
EllarSQLService,
58+
Session,
59+
AsyncSession,
60+
AsyncEngine,
61+
sa.Engine,
62+
MigrationOption,
63+
],
64+
providers=[EllarSQLService],
65+
name="EllarSQL",
66+
)
67+
class EllarSQLModule(ModuleBase, IModuleSetup):
68+
@classmethod
69+
def post_build(cls, module_ref: "ModuleRefBase") -> None:
70+
module_ref.config.MIDDLEWARE = list(module_ref.config.MIDDLEWARE) + [
71+
session_middleware
72+
]
5573

5674
@classmethod
5775
def setup(
@@ -155,8 +173,10 @@ def __setup_module(cls, sql_alchemy_config: SQLAlchemyConfig) -> DynamicModule:
155173
)
156174

157175
providers.append(ProviderConfig(EllarSQLService, use_value=db_service))
158-
app_context_teardown.connect(
159-
functools.partial(cls._on_application_tear_down, db_service=db_service)
176+
providers.append(
177+
ProviderConfig(
178+
MigrationOption, use_value=lambda: db_service.migration_options
179+
)
160180
)
161181

162182
return DynamicModule(
@@ -182,7 +202,7 @@ def register_setup(cls, **override_config: t.Any) -> ModuleSetup:
182202

183203
@staticmethod
184204
def __register_setup_factory(
185-
module: t.Type["EllarSQLModule"],
205+
module_ref: ModuleRefBase,
186206
config: Config,
187207
root_path: str,
188208
override_config: t.Dict[str, t.Any],
@@ -201,6 +221,7 @@ def __register_setup_factory(
201221
stack_level=0,
202222
from_dir=defined_config["root_path"],
203223
)
224+
module = t.cast(t.Type["EllarSQLModule"], module_ref.module)
204225

205226
return module.__setup_module(schema)
206227
raise RuntimeError("Could not find `ELLAR_SQL` in application config.")

0 commit comments

Comments
 (0)