Skip to content

Commit d1fd7ef

Browse files
committed
Dropped control_type on module routers and EllarControllerMount. Fixed reflect to take objects and generate unique id to track them.
1 parent 394b199 commit d1fd7ef

Some content is hidden

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

52 files changed

+369
-338
lines changed

ellar/app/factory.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,17 @@
1414
ModuleBase,
1515
ModuleSetup,
1616
)
17-
from ellar.core.execution_context import with_injector_context
17+
from ellar.core.execution_context import injector_context
1818
from ellar.core.module import get_core_module
1919
from ellar.core.modules import ModuleRefBase, ModuleTemplateRef
2020
from ellar.di import EllarInjector, ProviderConfig
2121
from ellar.di.injector.tree_manager import ModuleTreeManager
2222
from ellar.reflect import reflect
23-
from ellar.threading.sync_worker import execute_async_context_manager
23+
from ellar.threading.sync_worker import execute_async_context_manager, execute_coroutine
2424
from ellar.utils import get_name, get_unique_type
2525
from starlette.routing import Host, Mount
2626

27+
from ..events.build import build_with_context_event
2728
from .main import App
2829

2930
if t.TYPE_CHECKING: # pragma: no cover
@@ -116,20 +117,24 @@ def _get_config_kwargs() -> t.Dict:
116117
parent_container=injector.container if injector else None,
117118
config=config,
118119
)
119-
core_module_ref.initiate_module_build()
120-
121-
# service = EllarAppService(injector, config)
122-
# service.register_core_services()
123-
124120
with execute_async_context_manager(
125-
with_injector_context(core_module_ref.container.injector)
121+
injector_context(core_module_ref.container.injector)
126122
) as context:
123+
core_module_ref.initiate_module_build()
124+
127125
tree_manager: ModuleTreeManager = core_module_ref.get(ModuleTreeManager)
128126
cls.read_all_module(core_module_ref, tree_manager)
127+
128+
# service = EllarAppService(injector, config)
129+
# service.register_core_services()
130+
129131
# Build application first level. This will trigger ApplicationModule to be built
130132
core_module_ref.build_dependencies(step=1)
131133
app_module_ref = tree_manager.get_app_module()
132134

135+
execute_coroutine(build_with_context_event.run())
136+
build_with_context_event.disconnect_all()
137+
133138
app = App(
134139
routes=[],
135140
config=config,

ellar/app/main.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
from ellar.common.types import ASGIApp, TReceive, TScope, TSend
2424
from ellar.core import HttpRequestConnectionContext, Request
2525
from ellar.core.conf import Config
26-
from ellar.core.execution_context import with_injector_context
26+
from ellar.core.execution_context import injector_context
2727
from ellar.core.middleware import (
2828
Middleware as EllarMiddleware,
2929
)
@@ -205,7 +205,7 @@ async def __call__(self, scope: TScope, receive: TReceive, send: TSend) -> None:
205205
lifespan = scope["type"] == "lifespan"
206206
scope["app"] = self
207207

208-
async with with_injector_context(self.injector):
208+
async with injector_context(self.injector):
209209
if self.middleware_stack is None:
210210
self.middleware_stack = self.build_middleware_stack()
211211

@@ -334,7 +334,6 @@ def url_for(context: t.Dict, name: str, **path_params: t.Any) -> URL:
334334
jinja_env.policies["json.dumps_function"] = json.dumps
335335

336336
# jinja_env.policies["get_messages"] = get_messages
337-
338337
jinja_env.globals.update(self._config.get(TEMPLATE_GLOBAL_KEY, {}))
339338
jinja_env.filters.update(self._config.get(TEMPLATE_FILTER_KEY, {}))
340339

ellar/common/constants.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
TEMPLATE_CONTEXT_PROCESSOR_KEY = "TEMPLATE_CONTEXT_PROCESSOR_KEY"
3737
TEMPLATE_FILTER_KEY = "TEMPLATE_FILTERS"
3838
NESTED_ROUTERS_KEY = "NESTED_ROUTERS_KEY"
39+
ROUTER_PRE_BUILD_ROUTES = "PRE_BUILD_ROUTES"
3940

4041
MIDDLEWARE_HANDLERS_KEY = "MIDDLEWARE"
4142
APP_MIDDLEWARE_HANDLERS_KEY = "APP_MIDDLEWARE"

ellar/common/decorators/base.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
from functools import partial
33

44
from ellar.common.constants import NOT_SET
5-
from ellar.common.operations.router import ModuleRouter
6-
from ellar.reflect import ensure_target, reflect
5+
from ellar.reflect import reflect
76

87

98
def set_metadata(
@@ -14,10 +13,6 @@ def set_metadata(
1413
return partial(set_metadata, meta_key)
1514

1615
def _decorator(target: t.Union[t.Callable, t.Any]) -> t.Callable:
17-
target = ensure_target(target)
18-
if isinstance(target, ModuleRouter):
19-
target = target.get_controller_type()
20-
2116
reflect.define_metadata(meta_key, meta_value, target)
2217
return target
2318

ellar/common/decorators/file.py

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

55
from ellar.common.constants import NOT_SET, RESPONSE_OVERRIDE_KEY
66
from ellar.common.interfaces import IResponseModel
7-
from ellar.common.shortcuts import fail_silently
7+
from ellar.reflect import fail_silently
88

99
from ..responses.models import FileResponseModel, StreamingResponseModel
1010
from .base import set_metadata as set_meta

ellar/common/decorators/html.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
)
1414
from ellar.common.exceptions import ImproperConfiguration
1515
from ellar.common.responses.models import HTMLResponseModel
16-
from ellar.common.shortcuts import fail_silently
1716
from ellar.common.templating import TemplateFunctionData
1817
from ellar.common.types import TemplateFilterCallable, TemplateGlobalCallable
18+
from ellar.reflect import fail_silently
1919
from ellar.utils import class_base_function_regex, get_name
2020

2121
from .base import set_metadata as set_meta

ellar/common/operations/router.py

Lines changed: 17 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,9 @@
11
import typing as t
22

3-
from ellar.common.constants import (
4-
GUARDS_KEY,
5-
NESTED_ROUTERS_KEY,
6-
VERSIONING_KEY,
7-
)
3+
from ellar.common import constants
84
from ellar.common.models import GuardCanActivate
95
from ellar.common.models.controller import NestedRouterInfo
10-
from ellar.di import injectable
116
from ellar.reflect import reflect
12-
from ellar.utils import get_unique_type
137
from starlette.middleware import Middleware
148

159
from .base import OperationDefinitions
@@ -31,21 +25,17 @@ def __init__(
3125
include_in_schema: bool = True,
3226
middleware: t.Optional[t.Sequence[Middleware]] = None,
3327
) -> None:
34-
self._control_type: t.Type[t.Any] = injectable(get_unique_type()) # type:ignore[assignment]
28+
# self._control_type: t.Type[t.Any] = injectable(get_unique_type()) # type:ignore[assignment]
3529
self.path = path
3630
self.name = name
3731
self.include_in_schema = include_in_schema
3832
self.middleware = list(middleware) if middleware else []
3933

40-
self._pre_build_routes: t.List[t.Union[RouteParameters, WsRouteParameters]] = []
34+
reflect.define_metadata(constants.GUARDS_KEY, guards or [], self)
35+
reflect.define_metadata(constants.VERSIONING_KEY, set(version or []), self)
4136

42-
reflect.define_metadata(GUARDS_KEY, guards or [], self.get_controller_type())
43-
reflect.define_metadata(
44-
VERSIONING_KEY, set(version or []), self.get_controller_type()
45-
)
46-
47-
def get_controller_type(self) -> t.Type[t.Any]:
48-
return self._control_type
37+
def __repr__(self) -> str:
38+
return f"<ModuleRouter path={self.path} name={self.name}>"
4939

5040
def add_router(
5141
self,
@@ -54,45 +44,27 @@ def add_router(
5444
) -> None:
5545
if prefix:
5646
assert prefix.startswith("/"), "'prefix' must start with '/'"
47+
5748
reflect.define_metadata(
58-
NESTED_ROUTERS_KEY,
49+
constants.NESTED_ROUTERS_KEY,
5950
[NestedRouterInfo(prefix=prefix, router=router)],
60-
self.get_controller_type(),
51+
self,
6152
)
6253

63-
def get_mount_init(self) -> t.Dict[str, t.Any]:
64-
return {
65-
"path": self.path,
66-
"name": self.name,
67-
"include_in_schema": self.include_in_schema,
68-
"control_type": self.get_controller_type(),
69-
"middleware": self.middleware,
70-
}
71-
72-
def get_pre_build_routes(
73-
self,
74-
) -> t.List[t.Union[RouteParameters, WsRouteParameters]]:
75-
return self._pre_build_routes
76-
77-
def clear_pre_build_routes(self) -> None:
78-
self._pre_build_routes.clear()
79-
8054
def _get_operation(self, route_parameter: RouteParameters) -> t.Callable:
8155
endpoint = super()._get_operation(route_parameter)
82-
self._pre_build_routes.append(route_parameter)
56+
reflect.define_metadata(
57+
constants.ROUTER_PRE_BUILD_ROUTES, [route_parameter], self
58+
)
8359
# self._set_other_router_attributes(ensure_function(endpoint))
60+
reflect.define_metadata("ROUTER_REFLECT_KEY", self, endpoint)
8461
return endpoint
8562

8663
def _get_ws_operation(self, ws_route_parameters: WsRouteParameters) -> t.Callable:
8764
endpoint = super()._get_ws_operation(ws_route_parameters)
88-
self._pre_build_routes.append(ws_route_parameters)
65+
reflect.define_metadata(
66+
constants.ROUTER_PRE_BUILD_ROUTES, [ws_route_parameters], self
67+
)
8968
# self._set_other_router_attributes(ensure_function(endpoint))
69+
reflect.define_metadata("ROUTER_REFLECT_KEY", self, endpoint)
9070
return endpoint
91-
92-
# def _set_other_router_attributes(self, operation_handler: t.Callable) -> None:
93-
# if not reflect.has_metadata(CONTROLLER_CLASS_KEY, operation_handler):
94-
# # this is needed to happen before adding operation to router else we lose ability to
95-
# # get extra information about operation that is set on the router.
96-
# reflect.define_metadata(
97-
# CONTROLLER_CLASS_KEY, self.get_controller_type(), operation_handler
98-
# )

ellar/common/shortcuts.py

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,3 @@
1-
from typing import Any, Callable, Optional, no_type_check
2-
3-
from .logging import logger
4-
5-
6-
@no_type_check
7-
def fail_silently(func: Callable, *args: Any, **kwargs: Any) -> Optional[Any]:
8-
try:
9-
return func(*args, **kwargs)
10-
except Exception as ex:
11-
logger.debug(f"{func}, call failed. \nMessage: {ex}")
12-
return None
13-
14-
151
def normalize_path(path: str) -> str:
162
while "//" in path:
173
path = path.replace("//", "/")

ellar/core/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
config,
1010
current_connection,
1111
current_injector,
12-
with_injector_context,
12+
injector_context,
1313
)
1414
from .guards import GuardConsumer
1515
from .interceptors import EllarInterceptorConsumer
@@ -50,7 +50,7 @@
5050
"TemplateRenderingService",
5151
"HttpRequestConnectionContext",
5252
"current_connection",
53-
"with_injector_context",
53+
"injector_context",
5454
]
5555

5656

ellar/core/conf/app_settings_models.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,22 +31,24 @@
3131

3232

3333
_TemplateValidator = AllowTypeOfSource(
34-
validator=lambda s, v: callable(v),
35-
error_message=lambda v: f"Expected a callable, got {type(v)}",
34+
validator=lambda source, value: callable(value),
35+
error_message=lambda source, value: f"Expected a callable, got {type(value)}",
3636
)
3737

3838
_VersioningValidator = AllowTypeOfSource(
39-
error_message=lambda s, v: f"Expected BaseAPIVersioning, received: {type(v)}"
39+
error_message=lambda source,
40+
value: f"Expected BaseAPIVersioning, received: {type(value)}"
4041
)
4142

4243
_MiddlewareValidator = AllowTypeOfSource(
43-
validator=lambda s, v: isinstance(v, (s, Middleware)),
44-
error_message=lambda s,
45-
v: f"Expected EllarMiddleware or Starlette Middleware object, received: {type(v)}",
44+
validator=lambda source, value: isinstance(value, (source, Middleware)),
45+
error_message=lambda source,
46+
value: f"Expected EllarMiddleware or Starlette Middleware object, received: {type(value)}",
4647
)
4748

4849
_ExceptionHandlerValidator = AllowTypeOfSource(
49-
error_message=lambda s, v: f"Expected IExceptionHandler object, received: {type(v)}"
50+
error_message=lambda source,
51+
value: f"Expected IExceptionHandler object, received: {type(value)}"
5052
)
5153

5254

0 commit comments

Comments
 (0)