• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

localstack / localstack / 18505123992

14 Oct 2025 05:30PM UTC coverage: 86.888% (-0.01%) from 86.899%
18505123992

push

github

web-flow
S3: fix `aws-global` validation in CreateBucket (#13250)

10 of 10 new or added lines in 4 files covered. (100.0%)

831 existing lines in 40 files now uncovered.

68028 of 78294 relevant lines covered (86.89%)

0.87 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

90.16
/localstack-core/localstack/cli/lpm.py
1
import itertools
1✔
2
import logging
1✔
3
from multiprocessing.pool import ThreadPool
1✔
4

5
import click
1✔
6
from rich.console import Console
1✔
7

8
from localstack import config
1✔
9
from localstack.cli.exceptions import CLIError
1✔
10
from localstack.packages import InstallTarget, Package
1✔
11
from localstack.packages.api import NoSuchPackageException, PackagesPluginManager
1✔
12
from localstack.utils.bootstrap import setup_logging
1✔
13

14
LOG = logging.getLogger(__name__)
1✔
15

16
console = Console()
1✔
17

18

19
@click.group()
1✔
20
def cli():
1✔
21
    """
22
    The LocalStack Package Manager (lpm) CLI is a set of commands to install third-party packages used by localstack
23
    service providers.
24

25
    Here are some handy commands:
26

27
    List all packages
28

29
        python -m localstack.cli.lpm list
30

31
    Install DynamoDB Local:
32

33
        python -m localstack.cli.install dynamodb-local
34

35
    Install all community packages, four in parallel:
36

37
        python -m localstack.cli.lpm list | grep "/community" | cut -d'/' -f1 | xargs python -m localstack.cli.lpm install --parallel 4
38
    """
39
    setup_logging()
1✔
40

41

42
def _do_install_package(package: Package, version: str = None, target: InstallTarget = None):
1✔
43
    console.print(f"installing... [bold]{package}[/bold]")
1✔
44
    try:
1✔
45
        package.install(version=version, target=target)
1✔
46
        console.print(f"[green]installed[/green] [bold]{package}[/bold]")
1✔
47
    except Exception as e:
1✔
48
        console.print(f"[red]error[/red] installing {package}: {e}")
1✔
49
        raise e
1✔
50

51

52
@cli.command()
1✔
53
@click.argument("package", nargs=-1, required=True)
1✔
54
@click.option(
1✔
55
    "--parallel",
56
    type=int,
57
    default=1,
58
    required=False,
59
    help="how many installers to run in parallel processes",
60
)
61
@click.option(
1✔
62
    "--version",
63
    type=str,
64
    default=None,
65
    required=False,
66
    help="version to install of a package",
67
)
68
@click.option(
1✔
69
    "--target",
70
    type=click.Choice([target.name.lower() for target in InstallTarget]),
71
    default=None,
72
    required=False,
73
    help="target of the installation",
74
)
75
def install(
1✔
76
    package: list[str],
77
    parallel: int | None = 1,
78
    version: str | None = None,
79
    target: str | None = None,
80
):
81
    """Install one or more packages."""
82
    try:
1✔
83
        if target:
1✔
UNCOV
84
            target = InstallTarget[str.upper(target)]
×
85
        else:
86
            # LPM is meant to be used at build-time, the default target is static_libs
87
            target = InstallTarget.STATIC_LIBS
1✔
88

89
        # collect installers and install in parallel:
90
        console.print(f"resolving packages: {package}")
1✔
91
        package_manager = PackagesPluginManager()
1✔
92
        package_manager.load_all()
1✔
93
        package_instances = package_manager.get_packages(package, version)
1✔
94

95
        if parallel > 1:
1✔
UNCOV
96
            console.print(f"install {parallel} packages in parallel:")
×
97

98
        config.dirs.mkdirs()
1✔
99

100
        with ThreadPool(processes=parallel) as pool:
1✔
101
            pool.starmap(
1✔
102
                _do_install_package,
103
                zip(package_instances, itertools.repeat(version), itertools.repeat(target)),
104
            )
105
    except NoSuchPackageException as e:
1✔
106
        LOG.debug(str(e), exc_info=e)
1✔
107
        raise CLIError(str(e))
1✔
108
    except Exception as e:
1✔
109
        LOG.debug("one or more package installations failed.", exc_info=e)
1✔
110
        raise CLIError("one or more package installations failed.")
1✔
111

112

113
@cli.command(name="list")
1✔
114
@click.option(
1✔
115
    "-v",
116
    "--verbose",
117
    is_flag=True,
118
    default=False,
119
    required=False,
120
    help="Verbose output (show additional info on packages)",
121
)
122
def list_packages(verbose: bool):
1✔
123
    """List available packages of all repositories"""
124
    package_manager = PackagesPluginManager()
1✔
125
    package_manager.load_all()
1✔
126
    packages = package_manager.get_all_packages()
1✔
127
    for package_name, package_scope, package_instance in packages:
1✔
128
        console.print(f"[green]{package_name}[/green]/{package_scope}")
1✔
129
        if verbose:
1✔
UNCOV
130
            for version in package_instance.get_versions():
×
131
                if version == package_instance.default_version:
×
132
                    console.print(f"  - [bold]{version} (default)[/bold]", highlight=False)
×
133
                else:
UNCOV
134
                    console.print(f"  - {version}", highlight=False)
×
135

136

137
if __name__ == "__main__":
138
    cli()
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc