|
1 | 1 | import dataclasses
|
2 | 2 | import typing as t
|
3 |
| -from abc import abstractmethod |
4 | 3 |
|
5 | 4 | from starlette.routing import BaseRoute
|
6 | 5 |
|
@@ -56,20 +55,21 @@ def __post_init__(self) -> None:
|
56 | 55 | @dataclasses.dataclass
|
57 | 56 | class ModuleSetup:
|
58 | 57 | """
|
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. |
60 | 59 | This is necessary for Module that requires some services available to configure them.
|
61 | 60 | For example:
|
62 | 61 |
|
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=[]) |
67 | 66 |
|
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) |
70 | 67 |
|
| 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) |
71 | 70 |
|
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), ]) |
73 | 73 | Class ApplicationModule(ModuleBase):
|
74 | 74 | pass
|
75 | 75 | """
|
@@ -154,10 +154,51 @@ def __hash__(self) -> int: # pragma: no cover
|
154 | 154 |
|
155 | 155 |
|
156 | 156 | 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""" |
158 | 158 |
|
159 | 159 | @classmethod
|
160 |
| - @abstractmethod |
161 | 160 | @t.no_type_check
|
162 | 161 | 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