Skip to content

Commit d7d1805

Browse files
committed
Added register_setup to IModuleSetup for module setup through app config
1 parent 6cdd4a5 commit d7d1805

File tree

1 file changed

+53
-12
lines changed

1 file changed

+53
-12
lines changed

ellar/core/modules/config.py

Lines changed: 53 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import dataclasses
22
import typing as t
3-
from abc import abstractmethod
43

54
from starlette.routing import BaseRoute
65

@@ -56,20 +55,21 @@ def __post_init__(self) -> None:
5655
@dataclasses.dataclass
5756
class ModuleSetup:
5857
"""
59-
ModuleConfigure is a way to configure a module late after the application has started.
58+
ModuleSetup is a way to configure a module after the application has started.
6059
This is necessary for Module that requires some services available to configure them.
6160
For example:
6261
63-
@Module()
64-
Class ModuleA(ModuleBase):
65-
def module_configure(cls, setting1: t.Any, setting2: t.Any, setting3: t.Any):
66-
return ModuleConfigure(module=cls, provider=[])
62+
class MyModule(ModuleBase, IModuleSetup):
63+
@classmethod
64+
def setup(cls, param1: Any, param2: Any, foo: str) -> DynamicModule:
65+
return DynamicModule(module, provider=[], controllers=[], routers=[])
6766
68-
def module_a_configuration_factory(module: ModuleA, config: Config, foo: Foo):
69-
return module.module_configure(setting1=config.setting1, setting2=config.setting2, setting3=foo.foo)
7067
68+
def module_a_configuration_factory(module: t.Type[MyModule], config: Config, foo: Foo):
69+
return module.setup(param1=config.param1, param2=config.param2, foo=foo.foo)
7170
72-
@Module(modules=[ModuleAConfigure(ModuleA, inject=[Config, Foo], factory=module_a_configuration_factory), ])
71+
72+
@Module(modules=[ModuleSetup(MyModule, inject=[Config, Foo], factory=module_a_configuration_factory), ])
7373
Class ApplicationModule(ModuleBase):
7474
pass
7575
"""
@@ -154,10 +154,51 @@ def __hash__(self) -> int: # pragma: no cover
154154

155155

156156
class IModuleSetup:
157-
"""Modules that must have a custom setup should inherit from IModuleConfigure"""
157+
"""Modules that must have a custom setup should inherit from IModuleSetup"""
158158

159159
@classmethod
160-
@abstractmethod
161160
@t.no_type_check
162161
def setup(cls, *args: t.Any, **kwargs: t.Any) -> DynamicModule:
163-
"""Module Dynamic Setup"""
162+
"""
163+
Provides Dynamic set up for a module.
164+
165+
Usage:
166+
167+
class MyModule(ModuleBase, IModuleSetup):
168+
@classmethod
169+
def setup(cls, param1: Any, param2: Any) -> DynamicModule:
170+
:return DynamicModule(module, provider=[], controllers=[], routers=[])
171+
172+
173+
@Module(modules=[MyModule.setup(param1='xyz', param2='abc')])
174+
class ApplicationModule(ModuleBase):
175+
pass
176+
"""
177+
178+
@classmethod
179+
@t.no_type_check
180+
def register_setup(cls, *args: t.Any, **kwargs: t.Any) -> ModuleSetup:
181+
"""
182+
The module defines all the dependencies its needs for its setup.
183+
Allowing parameters needed for setting up the module to come from app Config.
184+
185+
Usage:
186+
187+
class MyModule(ModuleBase, IModuleSetup):
188+
@classmethod
189+
def register_setup(cls) -> ModuleSetup:
190+
:return ModuleSetup(cls, inject=[Config, OtherServices], factory=cls.setup_module_factory)
191+
192+
@staticmethod
193+
def setup_module_factory(module: t.Type['MyModule'], config: Config, others: OtherServices) -> DynamicModule:
194+
param1 = config.param1
195+
param2 = config.param2
196+
197+
:return DynamicModule(module, provider=[], controllers=[], routers=[])
198+
199+
200+
@Module(modules=[MyModule.register_setup()])
201+
class ApplicationModule(ModuleBase):
202+
pass
203+
204+
"""

0 commit comments

Comments
 (0)