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

pantsbuild / pants / 19015773527

02 Nov 2025 05:33PM UTC coverage: 17.872% (-62.4%) from 80.3%
19015773527

Pull #22816

github

web-flow
Merge a12d75757 into 6c024e162
Pull Request #22816: Update Pants internal Python to 3.14

4 of 5 new or added lines in 3 files covered. (80.0%)

28452 existing lines in 683 files now uncovered.

9831 of 55007 relevant lines covered (17.87%)

0.18 hits per line

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

0.0
/src/python/pants/backend/javascript/goals/lockfile.py
1
# Copyright 2023 Pants project contributors (see CONTRIBUTORS.md).
2
# Licensed under the Apache License, Version 2.0 (see LICENSE).
UNCOV
3
from __future__ import annotations
×
4

UNCOV
5
import os.path
×
UNCOV
6
from collections.abc import Iterable
×
UNCOV
7
from dataclasses import dataclass
×
8

UNCOV
9
from pants.backend.javascript import nodejs_project_environment
×
UNCOV
10
from pants.backend.javascript.nodejs_project import AllNodeJSProjects, NodeJSProject
×
UNCOV
11
from pants.backend.javascript.nodejs_project_environment import (
×
12
    NodeJsProjectEnvironment,
13
    NodeJsProjectEnvironmentProcess,
14
)
UNCOV
15
from pants.backend.javascript.package_json import PackageJsonTarget
×
UNCOV
16
from pants.backend.javascript.resolve import NodeJSProjectResolves
×
UNCOV
17
from pants.backend.javascript.subsystems.nodejs import UserChosenNodeJSResolveAliases
×
UNCOV
18
from pants.core.goals.generate_lockfiles import (
×
19
    GenerateLockfile,
20
    GenerateLockfileResult,
21
    KnownUserResolveNames,
22
    KnownUserResolveNamesRequest,
23
    RequestedUserResolveNames,
24
    UserGenerateLockfiles,
25
)
UNCOV
26
from pants.core.goals.tailor import TailorGoal
×
UNCOV
27
from pants.engine.internals.native_engine import AddPrefix
×
UNCOV
28
from pants.engine.intrinsics import add_prefix
×
UNCOV
29
from pants.engine.process import fallible_to_exec_result_or_raise
×
UNCOV
30
from pants.engine.rules import Rule, collect_rules, implicitly, rule
×
UNCOV
31
from pants.engine.unions import UnionRule
×
UNCOV
32
from pants.util.docutil import bin_name
×
UNCOV
33
from pants.util.ordered_set import FrozenOrderedSet
×
UNCOV
34
from pants.util.strutil import pluralize, softwrap
×
35

36

UNCOV
37
@dataclass(frozen=True)
×
UNCOV
38
class GeneratePackageLockJsonFile(GenerateLockfile):
×
UNCOV
39
    project: NodeJSProject
×
40

41

UNCOV
42
class KnownPackageJsonUserResolveNamesRequest(KnownUserResolveNamesRequest):
×
UNCOV
43
    pass
×
44

45

UNCOV
46
class RequestedPackageJsonUserResolveNames(RequestedUserResolveNames):
×
UNCOV
47
    pass
×
48

49

UNCOV
50
@rule
×
UNCOV
51
async def determine_package_json_user_resolves(
×
52
    _: KnownPackageJsonUserResolveNamesRequest,
53
    all_projects: AllNodeJSProjects,
54
    user_chosen_resolves: UserChosenNodeJSResolveAliases,
55
) -> KnownUserResolveNames:
56
    names = FrozenOrderedSet(
×
57
        user_chosen_resolves.get(
58
            os.path.join(project.root_dir, project.lockfile_name), project.default_resolve_name
59
        )
60
        for project in all_projects
61
    )
62
    unmatched_aliases = set(user_chosen_resolves.values()).difference(names)
×
63
    if unmatched_aliases:
×
64
        projects = pluralize(len(unmatched_aliases), "project", include_count=False)
×
65
        lockfiles = ", ".join(
×
66
            lockfile
67
            for lockfile, alias in user_chosen_resolves.items()
68
            if alias in unmatched_aliases
69
        )
70
        paths = pluralize(len(unmatched_aliases), "path", include_count=False)
×
71
        raise ValueError(
×
72
            softwrap(
73
                f"""
74
                No nodejs {projects} could be found for {lockfiles}, but
75
                some are configured under [nodejs].resolves.
76

77
                Ensure that a package.json file you intend to manage with pants has
78
                a corresponding BUILD file containing a `{PackageJsonTarget.alias}` target
79
                by running `{bin_name()} {TailorGoal.name} ::`.
80

81
                Also confirm that {lockfiles} would be generated by your
82
                chosen nodejs package manager at the specified {paths}.
83
                """
84
            )
85
        )
86

87
    return KnownUserResolveNames(
×
88
        names=tuple(names),
89
        option_name="[nodejs].resolves",
90
        requested_resolve_names_cls=RequestedPackageJsonUserResolveNames,
91
    )
92

93

UNCOV
94
@rule
×
UNCOV
95
async def setup_user_lockfile_requests(
×
96
    resolves: NodeJSProjectResolves,
97
    requested: RequestedPackageJsonUserResolveNames,
98
) -> UserGenerateLockfiles:
99
    return UserGenerateLockfiles(
×
100
        GeneratePackageLockJsonFile(
101
            resolve_name=name,
102
            lockfile_dest=os.path.join(resolves[name].root_dir, resolves[name].lockfile_name),
103
            diff=False,
104
            project=resolves[name],
105
        )
106
        for name in requested
107
    )
108

109

UNCOV
110
@rule
×
UNCOV
111
async def generate_lockfile_from_package_jsons(
×
112
    request: GeneratePackageLockJsonFile,
113
) -> GenerateLockfileResult:
114
    result = await fallible_to_exec_result_or_raise(
×
115
        **implicitly(
116
            NodeJsProjectEnvironmentProcess(
117
                env=NodeJsProjectEnvironment.from_root(request.project),
118
                args=request.project.generate_lockfile_args,
119
                description=f"generate {request.project.lockfile_name} for '{request.resolve_name}'.",
120
                output_files=(request.project.lockfile_name,),
121
            )
122
        )
123
    )
124
    output_digest = await add_prefix(AddPrefix(result.output_digest, request.project.root_dir))
×
125
    return GenerateLockfileResult(output_digest, request.resolve_name, request.lockfile_dest)
×
126

127

UNCOV
128
def rules() -> Iterable[Rule | UnionRule]:
×
UNCOV
129
    return (
×
130
        *collect_rules(),
131
        *nodejs_project_environment.rules(),
132
        UnionRule(GenerateLockfile, GeneratePackageLockJsonFile),
133
        UnionRule(KnownUserResolveNamesRequest, KnownPackageJsonUserResolveNamesRequest),
134
        UnionRule(RequestedUserResolveNames, RequestedPackageJsonUserResolveNames),
135
    )
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

© 2025 Coveralls, Inc