Skip to content

Commit b6a69d1

Browse files
committed
Code refactor and more testing
1 parent cd728c1 commit b6a69d1

File tree

4 files changed

+27
-19
lines changed

4 files changed

+27
-19
lines changed

ellar/core/factory.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from pathlib import Path
44
from uuid import uuid4
55

6-
from starlette.routing import BaseRoute, Host, Mount
6+
from starlette.routing import Host, Mount
77

88
from ellar.constants import MODULE_METADATA, MODULE_WATERMARK
99
from ellar.core import Config
@@ -66,7 +66,7 @@ def _build_modules(
6666
app_module: t.Type[t.Union[ModuleBase, t.Any]],
6767
config: Config,
6868
injector: EllarInjector,
69-
) -> t.List[BaseRoute]:
69+
) -> None:
7070
"""
7171
builds application module and registers them to EllarInjector
7272
:param app_module: Root App Module
@@ -80,7 +80,6 @@ def _build_modules(
8080

8181
app_module_config = ModuleSetup(app_module)
8282
module_dependency = cls.get_all_modules(app_module_config)
83-
routes = []
8483

8584
for module_config in reversed(module_dependency):
8685
if injector.get_module(module_config.module): # pragma: no cover
@@ -92,7 +91,6 @@ def _build_modules(
9291

9392
if not isinstance(module_ref, ModuleSetup):
9493
module_ref.run_module_register_services()
95-
routes.extend(module_ref.routes)
9694

9795
injector.add_module(module_ref)
9896

@@ -106,8 +104,6 @@ def _build_modules(
106104
module_ref.run_module_register_services()
107105

108106
injector.add_module(module_ref)
109-
routes.extend(module_ref.routes)
110-
return routes
111107

112108
@classmethod
113109
def _create_app(
@@ -138,15 +134,14 @@ def _get_config_kwargs() -> t.Dict:
138134
injector.container.register_instance(config, concrete_type=Config)
139135
CoreServiceRegistration(injector, config).register_all()
140136

141-
routes = cls._build_modules(app_module=module, injector=injector, config=config)
137+
cls._build_modules(app_module=module, injector=injector, config=config)
142138

143139
shutdown_event = config.ON_REQUEST_STARTUP
144140
startup_event = config.ON_REQUEST_SHUTDOWN
145141

146142
app = App(
147143
config=config,
148144
injector=injector,
149-
routes=routes,
150145
on_shutdown_event_handlers=shutdown_event if shutdown_event else None,
151146
on_startup_event_handlers=startup_event if startup_event else None,
152147
lifespan=config.DEFAULT_LIFESPAN_HANDLER,

ellar/core/main.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ def __init__(
4040
self,
4141
config: Config,
4242
injector: EllarInjector,
43-
routes: t.List[BaseRoute],
4443
on_startup_event_handlers: t.Optional[t.Sequence[EventHandler]] = None,
4544
on_shutdown_event_handlers: t.Optional[t.Sequence[EventHandler]] = None,
4645
lifespan: t.Optional[t.Callable[["App"], t.AsyncContextManager]] = None,
@@ -83,7 +82,7 @@ def __init__(
8382
lifespan or self.config.DEFAULT_LIFESPAN_HANDLER
8483
)
8584
self.router = ApplicationRouter(
86-
routes=self._get_module_routes(routes),
85+
routes=self._get_module_routes(),
8786
redirect_slashes=self.config.REDIRECT_SLASHES,
8887
on_startup=[self.on_startup.async_run]
8988
if self.config.DEFAULT_LIFESPAN_HANDLER is None
@@ -116,8 +115,8 @@ async def _statics_func_wrapper(
116115

117116
return _statics_func_wrapper
118117

119-
def _get_module_routes(self, routes: t.List[BaseRoute]) -> t.List[BaseRoute]:
120-
_routes: t.List[BaseRoute] = list(routes)
118+
def _get_module_routes(self) -> t.List[BaseRoute]:
119+
_routes: t.List[BaseRoute] = list()
121120
if self.has_static_files:
122121
self._static_app = self.create_static_app()
123122
_routes.append(
@@ -128,9 +127,8 @@ def _get_module_routes(self, routes: t.List[BaseRoute]) -> t.List[BaseRoute]:
128127
)
129128
)
130129

131-
# for _, module_ref in self._injector.get_modules().items():
132-
# _routes.extend(module_ref.routes)
133-
# module_ref.run_module_register_services()
130+
for _, module_ref in self._injector.get_modules().items():
131+
_routes.extend(module_ref.routes)
134132

135133
return _routes
136134

ellar/core/modules/config.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from .ref import ModuleRefBase, create_module_ref_factor
1414

1515
if t.TYPE_CHECKING: # pragma: no cover
16+
from ellar.commands import EllarTyper
1617
from ellar.core import ControllerBase
1718

1819

@@ -28,10 +29,15 @@ class DynamicModule:
2829
controllers: t.Sequence[
2930
t.Union[t.Type["ControllerBase"], t.Type]
3031
] = dataclasses.field(default_factory=lambda: tuple())
32+
3133
routers: t.Sequence[t.Union[BaseRoute]] = dataclasses.field(
3234
default_factory=lambda: tuple()
3335
)
3436

37+
commands: t.Sequence[t.Union[t.Callable, "EllarTyper"]] = dataclasses.field(
38+
default_factory=lambda: tuple()
39+
)
40+
3541
def __post_init__(self) -> None:
3642
if not isinstance(self.module, type) or not issubclass(self.module, ModuleBase):
3743
raise Exception(f"{self.module.__name__} is not a valid Module")
@@ -40,11 +46,13 @@ def __post_init__(self) -> None:
4046
controllers=list(self.controllers),
4147
routers=list(self.routers),
4248
providers=list(self.providers),
49+
commands=list(self.commands),
4350
)
4451
for key in [
4552
MODULE_METADATA.CONTROLLERS,
4653
MODULE_METADATA.ROUTERS,
4754
MODULE_METADATA.PROVIDERS,
55+
MODULE_METADATA.COMMANDS,
4856
]:
4957
value = kwargs[key]
5058
if value:
@@ -55,17 +63,18 @@ def __post_init__(self) -> None:
5563
@dataclasses.dataclass
5664
class ModuleSetup:
5765
"""
58-
ModuleSetup is a way to configure a module after the application has started.
66+
ModuleSetup is a way to configure a module based on its dependencies.
5967
This is necessary for Module that requires some services available to configure them.
6068
For example:
6169
70+
@Module()
6271
class MyModule(ModuleBase, IModuleSetup):
6372
@classmethod
6473
def setup(cls, param1: Any, param2: Any, foo: str) -> DynamicModule:
65-
return DynamicModule(module, provider=[], controllers=[], routers=[])
74+
return DynamicModule(cls, providers=[], controllers=[], routers=[])
6675
6776
68-
def module_a_configuration_factory(module: t.Type[MyModule], config: Config, foo: Foo):
77+
def module_a_configuration_factory(module: Type[MyModule], config: Config, foo: Foo):
6978
return module.setup(param1=config.param1, param2=config.param2, foo=foo.foo)
7079
7180

ellar/di/service_config.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def __init__(
3333
base_type: t.Union[t.Type[T], t.Type],
3434
*,
3535
use_value: T = None,
36-
use_class: t.Union[t.Type[T], t.Any] = None
36+
use_class: t.Union[t.Type[T], t.Any] = None,
3737
):
3838
if use_value and use_class:
3939
raise DIImproperConfiguration(
@@ -55,6 +55,12 @@ def register(self, container: "Container") -> None:
5555
container.register_singleton(
5656
base_type=self.base_type, concrete_type=self.use_value
5757
)
58+
elif not isinstance(self.base_type, type):
59+
raise DIImproperConfiguration(
60+
f"couldn't determine provider setup for {self.base_type}. "
61+
f"Please use `ProviderConfig` or `register_services` function in a "
62+
f"Module to configure the provider"
63+
)
5864
else:
5965
container.register(base_type=self.base_type, scope=scope)
6066

0 commit comments

Comments
 (0)