• 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/codegen/thrift/scrooge/rules.py
1
# Copyright 2021 Pants project contributors (see CONTRIBUTORS.md).
2
# Licensed under the Apache License, Version 2.0 (see LICENSE).
UNCOV
3
from dataclasses import dataclass
×
4

UNCOV
5
from pants.backend.codegen.thrift.scrooge import additional_fields
×
UNCOV
6
from pants.backend.codegen.thrift.scrooge.additional_fields import ScroogeFinagleBoolField
×
UNCOV
7
from pants.backend.codegen.thrift.scrooge.subsystem import ScroogeSubsystem
×
UNCOV
8
from pants.backend.codegen.thrift.target_types import (
×
9
    ThriftSourceField,
10
    ThriftSourcesGeneratorTarget,
11
    ThriftSourceTarget,
12
)
UNCOV
13
from pants.core.goals.resolves import ExportableTool
×
UNCOV
14
from pants.core.util_rules.source_files import SourceFilesRequest, determine_source_files
×
UNCOV
15
from pants.engine.fs import CreateDigest, Directory, MergeDigests, RemovePrefix, Snapshot
×
UNCOV
16
from pants.engine.internals.graph import resolve_target
×
UNCOV
17
from pants.engine.internals.graph import transitive_targets as transitive_targets_get
×
UNCOV
18
from pants.engine.internals.selectors import concurrently
×
UNCOV
19
from pants.engine.intrinsics import create_digest, digest_to_snapshot, merge_digests
×
UNCOV
20
from pants.engine.process import execute_process_or_raise
×
UNCOV
21
from pants.engine.rules import collect_rules, implicitly, rule
×
UNCOV
22
from pants.engine.target import TransitiveTargetsRequest, WrappedTargetRequest
×
UNCOV
23
from pants.engine.unions import UnionRule
×
UNCOV
24
from pants.jvm.goals import lockfile
×
UNCOV
25
from pants.jvm.jdk_rules import InternalJdk, JvmProcess
×
UNCOV
26
from pants.jvm.resolve.coursier_fetch import ToolClasspathRequest, materialize_classpath_for_tool
×
UNCOV
27
from pants.jvm.resolve.jvm_tool import GenerateJvmLockfileFromTool
×
UNCOV
28
from pants.jvm.target_types import PrefixedJvmJdkField, PrefixedJvmResolveField
×
UNCOV
29
from pants.source.source_root import SourceRootsRequest, get_source_roots
×
UNCOV
30
from pants.util.logging import LogLevel
×
31

32

UNCOV
33
@dataclass(frozen=True)
×
UNCOV
34
class GenerateScroogeThriftSourcesRequest:
×
35
    thrift_source_field: ThriftSourceField
36
    lang_id: str
37
    lang_name: str
38

39

UNCOV
40
@dataclass(frozen=True)
×
UNCOV
41
class GeneratedScroogeThriftSources:
×
42
    snapshot: Snapshot
43

44

UNCOV
45
@rule
×
UNCOV
46
async def generate_scrooge_thrift_sources(
×
47
    request: GenerateScroogeThriftSourcesRequest,
48
    jdk: InternalJdk,
49
    scrooge: ScroogeSubsystem,
50
) -> GeneratedScroogeThriftSources:
51
    output_dir = "_generated_files"
×
52
    toolcp_relpath = "__toolcp"
×
53

54
    lockfile_request = GenerateJvmLockfileFromTool.create(scrooge)
×
55
    (
×
56
        tool_classpath,
57
        transitive_targets,
58
        empty_output_dir_digest,
59
        wrapped_target,
60
    ) = await concurrently(
61
        materialize_classpath_for_tool(ToolClasspathRequest(lockfile=lockfile_request)),
62
        transitive_targets_get(
63
            TransitiveTargetsRequest([request.thrift_source_field.address]), **implicitly()
64
        ),
65
        create_digest(CreateDigest([Directory(output_dir)])),
66
        resolve_target(
67
            WrappedTargetRequest(
68
                request.thrift_source_field.address, description_of_origin="<infallible>"
69
            ),
70
            **implicitly(),
71
        ),
72
    )
73

74
    transitive_sources, target_sources = await concurrently(
×
75
        determine_source_files(
76
            SourceFilesRequest(
77
                tgt[ThriftSourceField]
78
                for tgt in transitive_targets.closure
79
                if tgt.has_field(ThriftSourceField)
80
            )
81
        ),
82
        determine_source_files(SourceFilesRequest([request.thrift_source_field])),
83
    )
84

85
    sources_roots = await get_source_roots(
×
86
        SourceRootsRequest.for_files(transitive_sources.snapshot.files)
87
    )
88
    deduped_source_root_paths = sorted({sr.path for sr in sources_roots.path_to_root.values()})
×
89

90
    input_digest = await merge_digests(
×
91
        MergeDigests(
92
            [
93
                transitive_sources.snapshot.digest,
94
                target_sources.snapshot.digest,
95
                empty_output_dir_digest,
96
            ]
97
        )
98
    )
99

100
    maybe_include_paths = []
×
101
    for path in deduped_source_root_paths:
×
102
        maybe_include_paths.extend(["-i", path])
×
103

104
    maybe_finagle_option = []
×
105
    if wrapped_target.target[ScroogeFinagleBoolField].value:
×
106
        maybe_finagle_option = ["--finagle"]
×
107

108
    extra_immutable_input_digests = {
×
109
        toolcp_relpath: tool_classpath.digest,
110
    }
111

112
    result = await execute_process_or_raise(
×
113
        **implicitly(
114
            JvmProcess(
115
                jdk=jdk,
116
                classpath_entries=tool_classpath.classpath_entries(toolcp_relpath),
117
                argv=[
118
                    "com.twitter.scrooge.Main",
119
                    *maybe_include_paths,
120
                    "--dest",
121
                    output_dir,
122
                    "--language",
123
                    request.lang_id,
124
                    *maybe_finagle_option,
125
                    *target_sources.snapshot.files,
126
                ],
127
                input_digest=input_digest,
128
                extra_jvm_options=scrooge.jvm_options,
129
                extra_immutable_input_digests=extra_immutable_input_digests,
130
                extra_nailgun_keys=extra_immutable_input_digests,
131
                description=f"Generating {request.lang_name} sources from {request.thrift_source_field.address}.",
132
                level=LogLevel.DEBUG,
133
                output_directories=(output_dir,),
134
            )
135
        )
136
    )
137

138
    output_snapshot = await digest_to_snapshot(
×
139
        **implicitly(RemovePrefix(result.output_digest, output_dir))
140
    )
141
    return GeneratedScroogeThriftSources(output_snapshot)
×
142

143

UNCOV
144
def rules():
×
UNCOV
145
    return [
×
146
        *collect_rules(),
147
        *additional_fields.rules(),
148
        *lockfile.rules(),
149
        UnionRule(ExportableTool, ScroogeSubsystem),
150
        ThriftSourceTarget.register_plugin_field(PrefixedJvmJdkField),
151
        ThriftSourcesGeneratorTarget.register_plugin_field(PrefixedJvmJdkField),
152
        ThriftSourceTarget.register_plugin_field(PrefixedJvmResolveField),
153
        ThriftSourcesGeneratorTarget.register_plugin_field(PrefixedJvmResolveField),
154
    ]
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