• 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/nfpm/target_types_rules.py
1
# Copyright 2023 Pants project contributors (see CONTRIBUTORS.md).
2
# Licensed under the Apache License, Version 2.0 (see LICENSE).
3

UNCOV
4
from __future__ import annotations
×
5

UNCOV
6
from pants.backend.nfpm.fields.contents import (
×
7
    NfpmContentDirDstField,
8
    NfpmContentDirsField,
9
    NfpmContentDstField,
10
    NfpmContentFilesField,
11
    NfpmContentFileSourceField,
12
    NfpmContentSrcField,
13
    NfpmContentSymlinkDstField,
14
    NfpmContentSymlinksField,
15
    NfpmContentSymlinkSrcField,
16
)
UNCOV
17
from pants.backend.nfpm.target_types import (
×
18
    NfpmContentDir,
19
    NfpmContentDirs,
20
    NfpmContentFile,
21
    NfpmContentFiles,
22
    NfpmContentSymlink,
23
    NfpmContentSymlinks,
24
)
UNCOV
25
from pants.engine.rules import collect_rules, rule
×
UNCOV
26
from pants.engine.target import GeneratedTargets, GenerateTargetsRequest, InvalidFieldException
×
UNCOV
27
from pants.engine.unions import UnionMembership, UnionRule
×
UNCOV
28
from pants.util.logging import LogLevel
×
UNCOV
29
from pants.util.strutil import softwrap
×
30

31

UNCOV
32
class GenerateTargetsFromNfpmContentFilesRequest(GenerateTargetsRequest):
×
UNCOV
33
    generate_from = NfpmContentFiles
×
34

35

UNCOV
36
@rule(
×
37
    desc="Generate `nfpm_content_file` targets from `nfpm_content_files` target",
38
    level=LogLevel.DEBUG,
39
)
UNCOV
40
async def generate_targets_from_nfpm_content_files(
×
41
    request: GenerateTargetsFromNfpmContentFilesRequest,
42
    union_membership: UnionMembership,
43
) -> GeneratedTargets:
44
    generator: NfpmContentFiles = request.generator
×
45
    # This is not a dict because the same src can be copied to more than one dst.
46
    # Also, the field guarantees that there are no dst duplicates in this field.
47
    src_dst_map: tuple[tuple[str, str], ...] = generator[NfpmContentFilesField].value or ()
×
48

49
    overrides = request.require_unparametrized_overrides()
×
50

51
    def generate_tgt(src: str, dst: str) -> NfpmContentFile:
×
52
        tgt_overrides = overrides.pop(dst, {})
×
53
        return NfpmContentFile(
×
54
            {
55
                **request.template,
56
                NfpmContentFileSourceField.alias: None,
57
                NfpmContentSrcField.alias: src,
58
                NfpmContentDstField.alias: dst,
59
                **tgt_overrides,
60
            },
61
            # We use 'dst' as 'src' is not always unique.
62
            # This results in an address like: path/to:nfpm_content#/dst/install/path
63
            request.template_address.create_generated(dst),
64
            union_membership,
65
        )
66

67
    generated_targets: list[NfpmContentFile] = [generate_tgt(src, dst) for src, dst in src_dst_map]
×
68

69
    if overrides:
×
70
        raise InvalidFieldException(
×
71
            softwrap(
72
                f"""
73
                Unused key in the `overrides` field for {request.template_address}:
74
                {sorted(overrides)}
75
                """
76
            )
77
        )
78

79
    return GeneratedTargets(generator, generated_targets)
×
80

81

UNCOV
82
class GenerateTargetsFromNfpmContentSymlinksRequest(GenerateTargetsRequest):
×
UNCOV
83
    generate_from = NfpmContentSymlinks
×
84

85

UNCOV
86
@rule(
×
87
    desc="Generate `nfpm_content_symlink` targets from `nfpm_content_symlinks` target",
88
    level=LogLevel.DEBUG,
89
)
UNCOV
90
async def generate_targets_from_nfpm_content_symlinks(
×
91
    request: GenerateTargetsFromNfpmContentSymlinksRequest,
92
    union_membership: UnionMembership,
93
) -> GeneratedTargets:
94
    generator: NfpmContentSymlinks = request.generator
×
95
    # This is not a dict because the same src can be linked to more than one dst.
96
    # Also, the field guarantees that there are no dst duplicates in this field.
97
    src_dst_map: tuple[tuple[str, str], ...] = generator[NfpmContentSymlinksField].value or ()
×
98

99
    overrides = request.require_unparametrized_overrides()
×
100

101
    def generate_tgt(src: str, dst: str) -> NfpmContentSymlink:
×
102
        tgt_overrides = overrides.pop(dst, {})
×
103
        return NfpmContentSymlink(
×
104
            {
105
                **request.template,
106
                NfpmContentSymlinkSrcField.alias: src,
107
                NfpmContentSymlinkDstField.alias: dst,
108
                **tgt_overrides,
109
            },
110
            # We use 'dst' as 'src' is not always unique.
111
            # This results in an address like: path/to:nfpm_content#/dst/install/path
112
            request.template_address.create_generated(dst),
113
            union_membership,
114
        )
115

116
    generated_targets: list[NfpmContentSymlink] = [
×
117
        generate_tgt(src, dst) for src, dst in src_dst_map
118
    ]
119

120
    if overrides:
×
121
        raise InvalidFieldException(
×
122
            softwrap(
123
                f"""
124
                Unused key in the `overrides` field for {request.template_address}:
125
                {sorted(overrides)}
126
                """
127
            )
128
        )
129

130
    return GeneratedTargets(generator, generated_targets)
×
131

132

UNCOV
133
class GenerateTargetsFromNfpmContentDirsRequest(GenerateTargetsRequest):
×
UNCOV
134
    generate_from = NfpmContentDirs
×
135

136

UNCOV
137
@rule(
×
138
    desc="Generate `nfpm_content_dir` targets from `nfpm_content_dirs` target",
139
    level=LogLevel.DEBUG,
140
)
UNCOV
141
async def generate_targets_from_nfpm_content_dirs(
×
142
    request: GenerateTargetsFromNfpmContentDirsRequest,
143
    union_membership: UnionMembership,
144
) -> GeneratedTargets:
145
    generator: NfpmContentDirs = request.generator
×
146
    # This is not a dict because the same src can be linked to more than one dst.
147
    # Also, the field guarantees that there are no dst duplicates in this field.
148
    dirs: tuple[str, ...] = generator[NfpmContentDirsField].value or ()
×
149

150
    overrides = request.require_unparametrized_overrides()
×
151

152
    def generate_tgt(dst: str) -> NfpmContentDir:
×
153
        tgt_overrides = overrides.pop(dst, {})
×
154
        return NfpmContentDir(
×
155
            {
156
                **request.template,
157
                NfpmContentDirDstField.alias: dst,
158
                **tgt_overrides,
159
            },
160
            # We use 'dst' as 'src' is not always unique.
161
            # This results in an address like: path/to:nfpm_content#/dst/install/path
162
            request.template_address.create_generated(dst),
163
            union_membership,
164
        )
165

166
    generated_targets: list[NfpmContentDir] = [generate_tgt(dst) for dst in dirs]
×
167

168
    if overrides:
×
169
        raise InvalidFieldException(
×
170
            softwrap(
171
                f"""
172
                Unused key in the `overrides` field for {request.template_address}:
173
                {sorted(overrides)}
174
                """
175
            )
176
        )
177

178
    return GeneratedTargets(generator, generated_targets)
×
179

180

UNCOV
181
def rules():
×
UNCOV
182
    return (
×
183
        *collect_rules(),
184
        UnionRule(GenerateTargetsRequest, GenerateTargetsFromNfpmContentFilesRequest),
185
        UnionRule(GenerateTargetsRequest, GenerateTargetsFromNfpmContentSymlinksRequest),
186
        UnionRule(GenerateTargetsRequest, GenerateTargetsFromNfpmContentDirsRequest),
187
    )
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