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

pantsbuild / pants / 21552830208

31 Jan 2026 11:40PM UTC coverage: 80.277% (-0.05%) from 80.324%
21552830208

Pull #23062

github

web-flow
Merge 808a9786c into 2c4dcf9cf
Pull Request #23062: Remove support for Get

18 of 25 new or added lines in 4 files covered. (72.0%)

17119 existing lines in 541 files now uncovered.

78278 of 97510 relevant lines covered (80.28%)

3.36 hits per line

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

68.63
/src/python/pants/backend/python/macros/uv_requirements.py
1
# Copyright 2024 Pants project contributors (see CONTRIBUTORS.md).
2
# Licensed under the Apache License, Version 2.0 (see LICENSE).
3

UNCOV
4
import logging
4✔
UNCOV
5
from collections.abc import Iterator
4✔
UNCOV
6
from functools import partial
4✔
UNCOV
7
from pathlib import PurePath
4✔
8

UNCOV
9
from pants.backend.python.macros.common_fields import (
4✔
10
    ModuleMappingField,
11
    RequirementsOverrideField,
12
    TypeStubsModuleMappingField,
13
)
UNCOV
14
from pants.backend.python.macros.common_requirements_rule import _generate_requirements
4✔
UNCOV
15
from pants.backend.python.macros.poetry_requirements import PyProjectToml
4✔
UNCOV
16
from pants.backend.python.subsystems.setup import PythonSetup
4✔
UNCOV
17
from pants.backend.python.target_types import PythonRequirementResolveField, PythonRequirementTarget
4✔
UNCOV
18
from pants.base.build_root import BuildRoot
4✔
UNCOV
19
from pants.engine.rules import collect_rules, rule
4✔
UNCOV
20
from pants.engine.target import (
4✔
21
    COMMON_TARGET_FIELDS,
22
    GeneratedTargets,
23
    GenerateTargetsRequest,
24
    SingleSourceField,
25
    TargetGenerator,
26
)
UNCOV
27
from pants.engine.unions import UnionMembership, UnionRule
4✔
UNCOV
28
from pants.util.logging import LogLevel
4✔
UNCOV
29
from pants.util.pip_requirement import PipRequirement
4✔
UNCOV
30
from pants.util.strutil import softwrap
4✔
31

UNCOV
32
logger = logging.getLogger(__name__)
4✔
33

34

UNCOV
35
def parse_pyproject_toml(pyproject_toml: PyProjectToml) -> Iterator[PipRequirement]:
4✔
36
    parsed = pyproject_toml.parse()
×
37
    try:
×
38
        uv_vals = parsed["tool"]["uv"]
×
39
    except KeyError:
×
40
        raise KeyError(
×
41
            softwrap(
42
                f"""
43
                No section `tool.uv` found in {pyproject_toml.toml_relpath}, which
44
                is loaded by Pants from a `uv_requirements` macro.
45

46
                Did you mean to set up uv?
47
                """
48
            )
49
        )
50

51
    # See https://docs.astral.sh/uv/concepts/dependencies/#development-dependencies
52
    # This should be a list of PEP 508 compliant strings.
53
    dev_dependencies = uv_vals.get("dev-dependencies", [])
×
54
    if not dev_dependencies:
×
55
        logger.warning(
×
56
            softwrap(
57
                f"""
58
                No requirements defined in `tool.uv.dev-dependencies` in {pyproject_toml.toml_relpath},
59
                which is loaded by Pants from a uv_requirements macro. Did you mean to populate
60
                this section with requirements?.
61
                """
62
            )
63
        )
64

65
    for dep in dev_dependencies:
×
66
        dep = dep.strip()
×
67
        if not dep or dep.startswith("#"):
×
68
            continue
×
69
        yield PipRequirement.parse(dep, description_of_origin=str(pyproject_toml.toml_relpath))
×
70

71

UNCOV
72
def parse_uv_requirements(
4✔
73
    build_root: BuildRoot, file_contents: bytes, file_path: str
74
) -> set[PipRequirement]:
75
    return set(
×
76
        parse_pyproject_toml(
77
            PyProjectToml(
78
                build_root=PurePath(build_root.path),
79
                toml_relpath=PurePath(file_path),
80
                toml_contents=file_contents.decode(),
81
            )
82
        )
83
    )
84

85

86
# ---------------------------------------------------------------------------------
87
# Target generator
88
# ---------------------------------------------------------------------------------
89

90

UNCOV
91
class UvRequirementsSourceField(SingleSourceField):
4✔
UNCOV
92
    default = "pyproject.toml"
4✔
UNCOV
93
    required = False
4✔
94

95

UNCOV
96
class UvRequirementsTargetGenerator(TargetGenerator):
4✔
UNCOV
97
    alias = "uv_requirements"
4✔
UNCOV
98
    help = "Generate a `python_requirement` for each entry in `pyproject.toml` under the `[tool.uv]` section."
4✔
UNCOV
99
    generated_target_cls = PythonRequirementTarget
4✔
100
    # Note that this does not have a `dependencies` field.
UNCOV
101
    core_fields = (
4✔
102
        *COMMON_TARGET_FIELDS,
103
        ModuleMappingField,
104
        TypeStubsModuleMappingField,
105
        UvRequirementsSourceField,
106
        RequirementsOverrideField,
107
    )
UNCOV
108
    copied_fields = COMMON_TARGET_FIELDS
4✔
UNCOV
109
    moved_fields = (PythonRequirementResolveField,)
4✔
110

111

UNCOV
112
class GenerateFromUvRequirementsRequest(GenerateTargetsRequest):
4✔
UNCOV
113
    generate_from = UvRequirementsTargetGenerator
4✔
114

115

UNCOV
116
@rule(desc="Generate `python_requirement` targets from uv pyproject.toml", level=LogLevel.DEBUG)
4✔
UNCOV
117
async def generate_from_uv_requirement(
4✔
118
    request: GenerateFromUvRequirementsRequest,
119
    build_root: BuildRoot,
120
    union_membership: UnionMembership,
121
    python_setup: PythonSetup,
122
) -> GeneratedTargets:
123
    result = await _generate_requirements(
×
124
        request,
125
        union_membership,
126
        python_setup,
127
        parse_requirements_callback=partial(parse_uv_requirements, build_root),
128
    )
129
    return GeneratedTargets(request.generator, result)
×
130

131

UNCOV
132
def rules():
4✔
UNCOV
133
    return (
4✔
134
        *collect_rules(),
135
        UnionRule(GenerateTargetsRequest, GenerateFromUvRequirementsRequest),
136
    )
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