-
-
Notifications
You must be signed in to change notification settings - Fork 4
/
install.py
62 lines (53 loc) · 2.06 KB
/
install.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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
from __future__ import annotations
from concurrent.futures import Future
from concurrent.futures import ThreadPoolExecutor as Pool
from typing import Any
import rich_click as click
from monas.commands.common import concurrency_option, filter_options, filter_packages
from monas.config import Config, pass_config
from monas.project import PyPackage
from monas.utils import err_console as console
from monas.utils import info, pip_install, sh_join
@click.command()
@concurrency_option
@click.option(
"--root",
is_flag=True,
default=False,
help="Install all packages into the root project",
)
@filter_options
@pass_config
def install(config: Config, *, concurrency: int, root: bool, **kwargs: Any) -> None:
"""Link the packages and install the remaining dependencies."""
packages = list(filter_packages(config, **kwargs))
package_count = len(packages)
if not packages:
info("[notice]No package is found[/]")
return
if root:
with console.status(
f"Installing [primary]{package_count}[/] package(s) to the root project",
spinner="point",
):
requirements = (sh_join(["-e", pkg.path.as_posix()]) for pkg in packages)
pip_install(config.root_venv, requirements)
info("[succ]Installation done[/]")
return
errors: list[BaseException] = []
def _on_complete(project: PyPackage, future: Future) -> None:
if future.exception():
console.print(
f" [red bold]FAIL[/] {project.name} {future.exception()}"
)
errors.append(future.exception())
else:
console.print(f" [succ]SUCC[/] {project.name}")
with console.status(
f"Installing [primary]{package_count}[/] package(s)", spinner="point"
):
with Pool(concurrency) as executor:
for pkg in packages:
future = executor.submit(pkg.install)
future.add_done_callback(lambda f, pkg=pkg: _on_complete(pkg, f))
info("[danger]Some packages failed[/]" if errors else "[succ]All succeeded[/]")