• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

pantsbuild / pants / 18991319442

01 Nov 2025 04:20AM UTC coverage: 43.232% (-37.1%) from 80.299%
18991319442

Pull #22800

github

web-flow
Merge a7e9f2ecb into da3fb359e
Pull Request #22800: Bump the gha-deps group across 1 directory with 14 updates

25854 of 59803 relevant lines covered (43.23%)

0.86 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/python/pants/backend/plugin_development/pants_requirements.py
1
# Copyright 2021 Pants project contributors (see CONTRIBUTORS.md).
2
# Licensed under the Apache License, Version 2.0 (see LICENSE).
3

4
from pants.backend.python.target_types import (
×
5
    PythonRequirementFindLinksField,
6
    PythonRequirementModulesField,
7
    PythonRequirementResolveField,
8
    PythonRequirementsField,
9
    PythonRequirementTarget,
10
)
11
from pants.engine.rules import collect_rules, rule
×
12
from pants.engine.target import (
×
13
    COMMON_TARGET_FIELDS,
14
    BoolField,
15
    GeneratedTargets,
16
    GenerateTargetsRequest,
17
    StringField,
18
    TargetGenerator,
19
)
20
from pants.engine.unions import UnionMembership, UnionRule
×
21
from pants.util.strutil import help_text
×
22
from pants.version import PANTS_SEMVER
×
23

24

25
class PantsRequirementsTestutilField(BoolField):
×
26
    alias = "testutil"
×
27
    default = True
×
28
    help = "If true, include `pantsbuild.pants.testutil` to write tests for your plugin."
×
29

30

31
class PantsRequirementsVersionSpecField(StringField):
×
32
    alias = "version_spec"
×
33
    default = f"== {PANTS_SEMVER.public}"
×
34
    help = help_text(
×
35
        """
36
        The PEP 440 version specifier version of Pants to target.
37
        E.g. `== 2.15.*`, or `>= 2.16.0, < 2.17.0`
38
        """
39
    )
40

41

42
class PantsRequirementsTargetGenerator(TargetGenerator):
×
43
    alias = "pants_requirements"
×
44
    help = help_text(
×
45
        """
46
        Generate `python_requirement` targets for Pants itself to use with Pants plugins.
47

48
        This is useful when writing plugins so that you can build and test your
49
        plugin using Pants.
50

51
        The generated targets will have the correct version based on the exact `version` in your
52
        `pants.toml`, and they will work with dependency inference. They're pulled directly from
53
        our GitHub releases, using the relevant platform markers.
54

55
        (If this versioning scheme does not work for you, you can directly create
56
        `python_requirement` targets for `pantsbuild.pants` and `pantsbuild.pants.testutil`. We
57
        also invite you to share your ideas at
58
        https://github.com/pantsbuild/pants/issues/new/choose)
59
        """
60
    )
61
    generated_target_cls = PythonRequirementTarget
×
62
    core_fields = (
×
63
        *COMMON_TARGET_FIELDS,
64
        PantsRequirementsVersionSpecField,
65
        PantsRequirementsTestutilField,
66
        PythonRequirementFindLinksField,
67
    )
68
    copied_fields = COMMON_TARGET_FIELDS
×
69
    moved_fields = (PythonRequirementResolveField,)
×
70

71

72
class GenerateFromPantsRequirementsRequest(GenerateTargetsRequest):
×
73
    generate_from = PantsRequirementsTargetGenerator
×
74

75

76
@rule
×
77
async def generate_from_pants_requirements(
×
78
    request: GenerateFromPantsRequirementsRequest, union_membership: UnionMembership
79
) -> GeneratedTargets:
80
    generator = request.generator
×
81
    version_spec = generator[PantsRequirementsVersionSpecField].value
×
82

83
    def create_tgt(dist: str, module: str) -> PythonRequirementTarget:
×
84
        return PythonRequirementTarget(
×
85
            {
86
                PythonRequirementsField.alias: (f"{dist} {version_spec}",),
87
                PythonRequirementFindLinksField.alias: ("https://wheels.pantsbuild.org/simple",),
88
                PythonRequirementModulesField.alias: (module,),
89
                **request.template,
90
            },
91
            request.template_address.create_generated(dist),
92
            union_membership,
93
        )
94

95
    result = [create_tgt("pantsbuild.pants", "pants")]
×
96
    if generator[PantsRequirementsTestutilField].value:
×
97
        result.append(create_tgt("pantsbuild.pants.testutil", "pants.testutil"))
×
98
    return GeneratedTargets(generator, result)
×
99

100

101
def rules():
×
102
    return (
×
103
        *collect_rules(),
104
        UnionRule(GenerateTargetsRequest, GenerateFromPantsRequirementsRequest),
105
    )
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