• 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/bsp/util_rules/compile.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
import logging
×
UNCOV
6
import time
×
UNCOV
7
import uuid
×
UNCOV
8
from collections import defaultdict
×
UNCOV
9
from collections.abc import Sequence
×
UNCOV
10
from dataclasses import dataclass
×
UNCOV
11
from typing import TypeVar
×
12

UNCOV
13
from pants.bsp.context import BSPContext
×
UNCOV
14
from pants.bsp.protocol import BSPHandlerMapping
×
UNCOV
15
from pants.bsp.spec.base import StatusCode, TaskId
×
UNCOV
16
from pants.bsp.spec.compile import CompileParams, CompileReport, CompileResult, CompileTask
×
UNCOV
17
from pants.bsp.spec.task import TaskFinishParams, TaskStartParams
×
UNCOV
18
from pants.bsp.util_rules.targets import (
×
19
    BSPBuildTargetInternal,
20
    BSPCompileRequest,
21
    BSPCompileResult,
22
    bsp_compile,
23
    resolve_bsp_build_target_addresses,
24
    resolve_bsp_build_target_identifier,
25
)
UNCOV
26
from pants.engine.fs import Workspace
×
UNCOV
27
from pants.engine.internals.native_engine import EMPTY_DIGEST, MergeDigests
×
UNCOV
28
from pants.engine.internals.selectors import concurrently
×
UNCOV
29
from pants.engine.intrinsics import merge_digests
×
UNCOV
30
from pants.engine.rules import _uncacheable_rule, collect_rules, implicitly, rule
×
UNCOV
31
from pants.engine.target import FieldSet
×
UNCOV
32
from pants.engine.unions import UnionMembership, UnionRule
×
33

UNCOV
34
_logger = logging.getLogger(__name__)
×
35

UNCOV
36
_FS = TypeVar("_FS", bound=FieldSet)
×
37

38

UNCOV
39
class CompileRequestHandlerMapping(BSPHandlerMapping):
×
UNCOV
40
    method_name = "buildTarget/compile"
×
UNCOV
41
    request_type = CompileParams
×
UNCOV
42
    response_type = CompileResult
×
43

44

UNCOV
45
@dataclass(frozen=True)
×
UNCOV
46
class CompileOneBSPTargetRequest:
×
UNCOV
47
    bsp_target: BSPBuildTargetInternal
×
48

49
    # A unique identifier generated by the client to identify this request.
50
    # The server may include this id in triggered notifications or responses.
UNCOV
51
    origin_id: str | None = None
×
52

53
    # Optional arguments to the compilation process.
UNCOV
54
    arguments: tuple[str, ...] | None = ()
×
55

56

UNCOV
57
@rule
×
UNCOV
58
async def compile_bsp_target(
×
59
    request: CompileOneBSPTargetRequest,
60
    bsp_context: BSPContext,
61
    union_membership: UnionMembership,
62
) -> BSPCompileResult:
63
    targets = await resolve_bsp_build_target_addresses(request.bsp_target, **implicitly())
×
64
    compile_request_types: Sequence[type[BSPCompileRequest]] = union_membership.get(
×
65
        BSPCompileRequest
66
    )
67
    field_sets_by_request_type: dict[type[BSPCompileRequest], set[FieldSet]] = defaultdict(set)
×
68
    for target in targets:
×
69
        for compile_request_type in compile_request_types:
×
70
            field_set_type = compile_request_type.field_set_type
×
71
            if field_set_type.is_applicable(target):
×
72
                field_set = field_set_type.create(target)
×
73
                field_sets_by_request_type[compile_request_type].add(field_set)
×
74

75
    task_id = TaskId(
×
76
        id=uuid.uuid4().hex, parents=((request.origin_id,) if request.origin_id else None)
77
    )
78
    message = f"Compilation of {request.bsp_target.bsp_target_id.uri}"
×
79

80
    bsp_context.notify_client(
×
81
        TaskStartParams(
82
            task_id=task_id,
83
            event_time=int(time.time() * 1000),
84
            message=message,
85
            data=CompileTask(target=request.bsp_target.bsp_target_id),
86
        )
87
    )
88

89
    compile_results = await concurrently(
×
90
        bsp_compile(
91
            **implicitly(
92
                {
93
                    compile_request_type(
94
                        bsp_target=request.bsp_target, field_sets=tuple(field_sets), task_id=task_id
95
                    ): BSPCompileRequest
96
                }
97
            )
98
        )
99
        for compile_request_type, field_sets in field_sets_by_request_type.items()
100
    )
101

102
    status = StatusCode.OK
×
103
    if any(r.status != StatusCode.OK for r in compile_results):
×
104
        status = StatusCode.ERROR
×
105

106
    bsp_context.notify_client(
×
107
        TaskFinishParams(
108
            task_id=task_id,
109
            event_time=int(time.time() * 1000),
110
            message=message,
111
            status=status,
112
            data=CompileReport(
113
                target=request.bsp_target.bsp_target_id,
114
                origin_id=request.origin_id,
115
                errors=0,
116
                warnings=0,
117
            ),
118
        )
119
    )
120

121
    output_digest = await merge_digests(MergeDigests([r.output_digest for r in compile_results]))
×
122

123
    return BSPCompileResult(
×
124
        status=status,
125
        output_digest=output_digest,
126
    )
127

128

UNCOV
129
@_uncacheable_rule
×
UNCOV
130
async def bsp_compile_request(
×
131
    request: CompileParams,
132
    workspace: Workspace,
133
) -> CompileResult:
134
    bsp_targets = await concurrently(
×
135
        resolve_bsp_build_target_identifier(bsp_target_id, **implicitly())
136
        for bsp_target_id in request.targets
137
    )
138

139
    compile_results = await concurrently(
×
140
        compile_bsp_target(
141
            CompileOneBSPTargetRequest(
142
                bsp_target=bsp_target,
143
                origin_id=request.origin_id,
144
                arguments=request.arguments,
145
            ),
146
            **implicitly(),
147
        )
148
        for bsp_target in bsp_targets
149
    )
150

151
    output_digest = await merge_digests(MergeDigests([r.output_digest for r in compile_results]))
×
152
    if output_digest != EMPTY_DIGEST:
×
153
        workspace.write_digest(output_digest, path_prefix=".pants.d/bsp")
×
154

155
    status_code = StatusCode.OK
×
156
    if any(r.status != StatusCode.OK for r in compile_results):
×
157
        status_code = StatusCode.ERROR
×
158

159
    return CompileResult(
×
160
        origin_id=request.origin_id,
161
        status_code=status_code.value,
162
    )
163

164

UNCOV
165
def rules():
×
UNCOV
166
    return (
×
167
        *collect_rules(),
168
        UnionRule(BSPHandlerMapping, CompileRequestHandlerMapping),
169
    )
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