• 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/resolve.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
×
UNCOV
6
from collections.abc import Iterable
×
UNCOV
7
from dataclasses import dataclass
×
8

UNCOV
9
from pants.backend.javascript import nodejs_project
×
UNCOV
10
from pants.backend.javascript.nodejs_project import AllNodeJSProjects, NodeJSProject
×
UNCOV
11
from pants.backend.javascript.package_json import (
×
12
    FirstPartyNodePackageTargets,
13
    NodePackageNameField,
14
    OwningNodePackageRequest,
15
    PackageJsonSourceField,
16
    find_owning_package,
17
)
UNCOV
18
from pants.backend.javascript.subsystems.nodejs import UserChosenNodeJSResolveAliases
×
UNCOV
19
from pants.build_graph.address import Address
×
UNCOV
20
from pants.engine.fs import PathGlobs
×
UNCOV
21
from pants.engine.internals.graph import resolve_target
×
UNCOV
22
from pants.engine.rules import Rule, collect_rules, implicitly, rule
×
UNCOV
23
from pants.engine.target import Target, WrappedTargetRequest
×
UNCOV
24
from pants.engine.unions import UnionRule
×
UNCOV
25
from pants.util.frozendict import FrozenDict
×
26

27

UNCOV
28
@dataclass(frozen=True)
×
UNCOV
29
class RequestNodeResolve:
×
UNCOV
30
    address: Address
×
31

32

UNCOV
33
@dataclass(frozen=True)
×
UNCOV
34
class ChosenNodeResolve:
×
UNCOV
35
    project: NodeJSProject
×
36

UNCOV
37
    @property
×
UNCOV
38
    def resolve_name(self) -> str:
×
UNCOV
39
        return self.project.default_resolve_name
×
40

UNCOV
41
    @property
×
UNCOV
42
    def file_path(self) -> str:
×
UNCOV
43
        return os.path.join(self.project.root_dir, self.project.lockfile_name)
×
44

UNCOV
45
    def get_lockfile_glob(self) -> PathGlobs:
×
46
        return PathGlobs([self.file_path])
×
47

48

UNCOV
49
async def _get_node_package_json_directory(req: RequestNodeResolve) -> str:
×
50
    wrapped = await resolve_target(
×
51
        WrappedTargetRequest(req.address, description_of_origin="the `ChosenNodeResolve` rule"),
52
        **implicitly(),
53
    )
54
    target: Target | None
55
    if wrapped.target.has_field(PackageJsonSourceField) and wrapped.target.has_field(
×
56
        NodePackageNameField
57
    ):
58
        target = wrapped.target
×
59
    else:
60
        owning_pkg = await find_owning_package(OwningNodePackageRequest(wrapped.target.address))
×
61
        target = owning_pkg.ensure_owner()
×
62
    return os.path.dirname(target[PackageJsonSourceField].file_path)
×
63

64

UNCOV
65
@rule
×
UNCOV
66
async def resolve_for_package(
×
67
    req: RequestNodeResolve, all_projects: AllNodeJSProjects
68
) -> ChosenNodeResolve:
69
    directory = await _get_node_package_json_directory(req)
×
70
    project = all_projects.project_for_directory(directory)
×
71
    return ChosenNodeResolve(project)
×
72

73

UNCOV
74
class NodeJSProjectResolves(FrozenDict[str, NodeJSProject]):
×
UNCOV
75
    pass
×
76

77

UNCOV
78
@rule
×
UNCOV
79
async def resolve_to_projects(
×
80
    all_projects: AllNodeJSProjects, user_chosen_resolves: UserChosenNodeJSResolveAliases
81
) -> NodeJSProjectResolves:
82
    def get_name(project: NodeJSProject) -> str:
×
83
        return user_chosen_resolves.get(
×
84
            os.path.join(project.root_dir, project.lockfile_name), project.default_resolve_name
85
        )
86

87
    return NodeJSProjectResolves((get_name(project), project) for project in all_projects)
×
88

89

UNCOV
90
class FirstPartyNodePackageResolves(FrozenDict[str, Target]):
×
UNCOV
91
    pass
×
92

93

UNCOV
94
@rule
×
UNCOV
95
async def resolve_to_first_party_node_package(
×
96
    resolves: NodeJSProjectResolves, all_first_party: FirstPartyNodePackageTargets
97
) -> FirstPartyNodePackageResolves:
98
    by_dir = {first_party.residence_dir: first_party for first_party in all_first_party}
×
99
    return FirstPartyNodePackageResolves(
×
100
        (resolve, by_dir[project.root_dir]) for resolve, project in resolves.items()
101
    )
102

103

UNCOV
104
def rules() -> Iterable[Rule | UnionRule]:
×
UNCOV
105
    return [*collect_rules(), *nodejs_project.rules()]
×
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