• 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/go/util_rules/binary.py
1
# Copyright 2022 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
from dataclasses import dataclass
×
6

UNCOV
7
from pants.backend.go.target_types import (
×
8
    GoBinaryDependenciesField,
9
    GoBinaryMainPackageField,
10
    GoImportPathField,
11
    GoPackageSourcesField,
12
)
UNCOV
13
from pants.base.specs import DirGlobSpec, RawSpecs
×
UNCOV
14
from pants.build_graph.address import Address, AddressInput, ResolveError
×
UNCOV
15
from pants.engine.engine_aware import EngineAwareParameter
×
UNCOV
16
from pants.engine.internals.build_files import resolve_address
×
UNCOV
17
from pants.engine.internals.graph import resolve_target, resolve_targets
×
UNCOV
18
from pants.engine.rules import collect_rules, implicitly, rule
×
UNCOV
19
from pants.engine.target import (
×
20
    FieldSet,
21
    InferDependenciesRequest,
22
    InferredDependencies,
23
    InvalidFieldException,
24
    WrappedTargetRequest,
25
)
UNCOV
26
from pants.engine.unions import UnionRule
×
UNCOV
27
from pants.util.logging import LogLevel
×
28

29

UNCOV
30
@dataclass(frozen=True)
×
UNCOV
31
class GoBinaryMainPackage:
×
UNCOV
32
    address: Address
×
33

UNCOV
34
    is_third_party: bool
×
UNCOV
35
    import_path: str | None = None
×
36

37

UNCOV
38
@dataclass(frozen=True)
×
UNCOV
39
class GoBinaryMainPackageRequest(EngineAwareParameter):
×
UNCOV
40
    field: GoBinaryMainPackageField
×
41

UNCOV
42
    def debug_hint(self) -> str:
×
43
        return self.field.address.spec
×
44

45

UNCOV
46
@rule(desc="Determine first-party package used by `go_binary` target", level=LogLevel.DEBUG)
×
UNCOV
47
async def determine_main_pkg_for_go_binary(
×
48
    request: GoBinaryMainPackageRequest,
49
) -> GoBinaryMainPackage:
50
    addr = request.field.address
×
51
    if request.field.value:
×
52
        description_of_origin = (
×
53
            f"the `{request.field.alias}` field from the target {request.field.address}"
54
        )
55
        address_input = AddressInput.parse(
×
56
            request.field.value,
57
            relative_to=addr.spec_path,
58
            description_of_origin=description_of_origin,
59
        )
60
        specified_address = await resolve_address(**implicitly({address_input: AddressInput}))
×
61
        wrapped_specified_tgt = await resolve_target(
×
62
            WrappedTargetRequest(specified_address, description_of_origin=description_of_origin),
63
            **implicitly(),
64
        )
65
        if not wrapped_specified_tgt.target.has_field(
×
66
            GoPackageSourcesField
67
        ) and not wrapped_specified_tgt.target.has_field(GoImportPathField):
68
            raise InvalidFieldException(
×
69
                f"The {repr(GoBinaryMainPackageField.alias)} field in target {addr} must point to "
70
                "a `go_package` or `go_third_party_package` target, but was the address for a "
71
                f"`{wrapped_specified_tgt.target.alias}` target.\n\n"
72
                "Hint: unless the package is a `go_third_party_package` target, you should normally "
73
                "not specify this field for local packages so that Pants will find the `go_package` "
74
                "target for you."
75
            )
76

77
        if not wrapped_specified_tgt.target.has_field(GoPackageSourcesField):
×
78
            return GoBinaryMainPackage(
×
79
                wrapped_specified_tgt.target.address,
80
                is_third_party=True,
81
                import_path=wrapped_specified_tgt.target.get(GoImportPathField).value,
82
            )
83
        return GoBinaryMainPackage(wrapped_specified_tgt.target.address, is_third_party=False)
×
84

85
    candidate_targets = await resolve_targets(
×
86
        **implicitly(
87
            RawSpecs(
88
                dir_globs=(DirGlobSpec(addr.spec_path),),
89
                description_of_origin="the `go_binary` dependency inference rule",
90
            )
91
        )
92
    )
93
    relevant_pkg_targets = [
×
94
        tgt
95
        for tgt in candidate_targets
96
        if tgt.has_field(GoPackageSourcesField) and tgt.residence_dir == addr.spec_path
97
    ]
98
    if len(relevant_pkg_targets) == 1:
×
99
        return GoBinaryMainPackage(relevant_pkg_targets[0].address, is_third_party=False)
×
100

101
    if not relevant_pkg_targets:
×
102
        raise ResolveError(
×
103
            f"The target {addr} requires that there is a `go_package` "
104
            f"target defined in its directory {addr.spec_path}, but none were found.\n\n"
105
            "To fix, add a target like `go_package()` or `go_package(name='pkg')` to the BUILD "
106
            f"file in {addr.spec_path}."
107
        )
108
    raise ResolveError(
×
109
        f"There are multiple `go_package` targets for the same directory of the "
110
        f"target {addr}: {addr.spec_path}. It is ambiguous what to use as the `main` "
111
        "package.\n\n"
112
        f"To fix, please either set the `main` field for `{addr} or remove these "
113
        "`go_package` targets so that only one remains: "
114
        f"{sorted(tgt.address.spec for tgt in relevant_pkg_targets)}"
115
    )
116

117

UNCOV
118
@dataclass(frozen=True)
×
UNCOV
119
class GoBinaryMainDependencyInferenceFieldSet(FieldSet):
×
UNCOV
120
    required_fields = (GoBinaryDependenciesField, GoBinaryMainPackageField)
×
121

UNCOV
122
    dependencies: GoBinaryDependenciesField
×
UNCOV
123
    main_package: GoBinaryMainPackageField
×
124

125

UNCOV
126
class InferGoBinaryMainDependencyRequest(InferDependenciesRequest):
×
UNCOV
127
    infer_from = GoBinaryMainDependencyInferenceFieldSet
×
128

129

UNCOV
130
@rule
×
UNCOV
131
async def infer_go_binary_main_dependency(
×
132
    request: InferGoBinaryMainDependencyRequest,
133
) -> InferredDependencies:
134
    main_pkg = await determine_main_pkg_for_go_binary(
×
135
        GoBinaryMainPackageRequest(request.field_set.main_package)
136
    )
137
    return InferredDependencies([main_pkg.address])
×
138

139

UNCOV
140
def rules():
×
UNCOV
141
    return (
×
142
        *collect_rules(),
143
        UnionRule(InferDependenciesRequest, InferGoBinaryMainDependencyRequest),
144
    )
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