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

pantsbuild / pants / 25259185675

02 May 2026 06:47PM UTC coverage: 92.141% (-0.8%) from 92.955%
25259185675

push

github

web-flow
Fix the dynamic UI. (#23306)

In #23114 we upgraded to indicatif 0.18.4,
which included a fix to respect TERM, and 
display nothing if it's unset.

Since we did not pass TERM through pantsd, the
dynamic ui is now not shown. 

This change fixes that, and also pass NO_COLOR
through, since indicatif inspects it too.

88773 of 96345 relevant lines covered (92.14%)

3.83 hits per line

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

97.62
/src/python/pants/backend/javascript/package_manager.py
1
# Copyright 2024 Pants project contributors (see CONTRIBUTORS.md).
2
# Licensed under the Apache License, Version 2.0 (see LICENSE).
3
from __future__ import annotations
10✔
4

5
from dataclasses import dataclass
10✔
6

7
import nodesemver
10✔
8

9
from pants.util.frozendict import FrozenDict
10✔
10

11

12
@dataclass(frozen=True)
10✔
13
class PackageManager:
10✔
14
    name: str
10✔
15
    version: str | None
10✔
16
    lockfile_name: str
10✔
17
    generate_lockfile_args: tuple[str, ...]
10✔
18
    immutable_install_args: tuple[str, ...]
10✔
19
    workspace_specifier_arg: str
10✔
20
    run_arg_separator: tuple[str, ...]
10✔
21
    download_and_execute_args_template: tuple[str, ...]
10✔
22
    execute_args: tuple[str, ...]
10✔
23
    current_directory_args: tuple[str, ...]
10✔
24
    extra_env: FrozenDict[str, str]
10✔
25
    pack_archive_format: str
10✔
26
    extra_caches: FrozenDict[str, str]
10✔
27

28
    @classmethod
10✔
29
    def from_string(cls, string: str) -> PackageManager:
10✔
30
        package_manager_command, *maybe_version = string.split("@")
10✔
31
        package_manager_version = maybe_version[0] if maybe_version else None
10✔
32
        if package_manager_command == "npm":
10✔
33
            return cls.npm(package_manager_version)
9✔
34
        if package_manager_command == "yarn":
5✔
35
            return cls.yarn(package_manager_version)
5✔
36
        if package_manager_command == "pnpm":
4✔
37
            return cls.pnpm(package_manager_version)
4✔
38
        raise ValueError(f"Unsupported package manager: {package_manager_command}.")
×
39

40
    def make_download_and_execute_args(
10✔
41
        self, package: str, binary_name: str, args: tuple[str, ...]
42
    ) -> tuple[str, ...]:
43
        filled = tuple(
5✔
44
            part.format(package=package, executable=binary_name)
45
            for part in self.download_and_execute_args_template
46
        )
47
        return filled + args
5✔
48

49
    @classmethod
10✔
50
    def pnpm(cls, version: str | None) -> PackageManager:
10✔
51
        return PackageManager(
4✔
52
            name="pnpm",
53
            version=version,
54
            lockfile_name="pnpm-lock.yaml",
55
            generate_lockfile_args=("install", "--lockfile-only"),
56
            immutable_install_args=("install", "--frozen-lockfile"),
57
            workspace_specifier_arg="--filter",
58
            run_arg_separator=(
59
                () if version is None or nodesemver.satisfies(version, ">=7") else ("--",)
60
            ),
61
            download_and_execute_args_template=("--package", "{package}", "dlx", "{executable}"),
62
            execute_args=("exec",),
63
            current_directory_args=("--prefix",),
64
            extra_env=FrozenDict({"PNPM_HOME": "{chroot}/._pnpm_home"}),
65
            pack_archive_format="{}-{}.tgz",
66
            extra_caches=FrozenDict({"pnpm_home": "._pnpm_home"}),
67
        )
68

69
    @classmethod
10✔
70
    def yarn(cls, version: str | None) -> PackageManager:
10✔
71
        return PackageManager(
5✔
72
            name="yarn",
73
            version=version,
74
            lockfile_name="yarn.lock",
75
            generate_lockfile_args=("install",),
76
            immutable_install_args=(
77
                ("install", "--frozen-lockfile")
78
                if version is None or nodesemver.satisfies(version, "1.x")
79
                else ("install", "--immutable")
80
            ),
81
            workspace_specifier_arg="workspace",
82
            run_arg_separator=("--",),
83
            download_and_execute_args_template=(
84
                "dlx",
85
                "--quiet",
86
                "--package",
87
                "{package}",
88
                "{executable}",
89
            ),
90
            execute_args=("--silent", "exec", "--"),
91
            current_directory_args=("--cwd",),
92
            extra_env=FrozenDict({"YARN_CACHE_FOLDER": "{chroot}/._yarn_cache"}),
93
            pack_archive_format="{}-v{}.tgz",
94
            extra_caches=FrozenDict({"yarn_cache": "._yarn_cache"}),
95
        )
96

97
    @classmethod
10✔
98
    def npm(cls, version: str | None) -> PackageManager:
10✔
99
        return PackageManager(
9✔
100
            name="npm",
101
            version=version,
102
            lockfile_name="package-lock.json",
103
            generate_lockfile_args=("install", "--package-lock-only"),
104
            immutable_install_args=("clean-install",),
105
            workspace_specifier_arg="--workspace",
106
            run_arg_separator=("--",),
107
            download_and_execute_args_template=(
108
                "exec",
109
                "--yes",
110
                "--package",
111
                "{package}",
112
                "--",
113
                "{executable}",
114
            ),
115
            execute_args=("exec", "--no", "--"),
116
            current_directory_args=("--prefix",),
117
            extra_env=FrozenDict(),
118
            pack_archive_format="{}-{}.tgz",
119
            extra_caches=FrozenDict(),
120
        )
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