-
Notifications
You must be signed in to change notification settings - Fork 55
/
Copy pathcli_factory.py
32 lines (24 loc) · 1.02 KB
/
cli_factory.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import asyncio
import click
from nest.core.pynest_container import PyNestContainer
from nest.core.pynest_factory import PyNestFactory, ModuleType
class CLIAppFactory(PyNestFactory):
def __init__(self):
super().__init__()
def create(self, app_module: ModuleType, **kwargs):
container = PyNestContainer()
container.add_module(app_module)
cli_app = click.Group("main")
for module in container.modules.values():
for controller in module.controllers.values():
for command in controller._cli_group.commands.values():
original_callback = command.callback
if asyncio.iscoroutinefunction(original_callback):
command.callback = self._run_async(original_callback)
cli_app.add_command(controller._cli_group)
return cli_app
@staticmethod
def _run_async(coro):
def wrapper(*args, **kwargs):
return asyncio.run(coro(*args, **kwargs))
return wrapper