• 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/python/util_rules/partition.py
1
# Copyright 2022 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
import itertools
×
UNCOV
7
from collections import defaultdict
×
UNCOV
8
from collections.abc import Iterable, Mapping, Sequence
×
UNCOV
9
from typing import TypeVar
×
10

UNCOV
11
from pants.backend.python.subsystems.setup import PythonSetup
×
UNCOV
12
from pants.backend.python.target_types import InterpreterConstraintsField, PythonResolveField
×
UNCOV
13
from pants.backend.python.util_rules.interpreter_constraints import (
×
14
    FieldSetWithInterpreterConstraints,
15
    InterpreterConstraints,
16
)
UNCOV
17
from pants.engine.internals.graph import find_all_targets
×
UNCOV
18
from pants.engine.rules import implicitly
×
UNCOV
19
from pants.engine.target import FieldSet
×
UNCOV
20
from pants.util.ordered_set import OrderedSet
×
21

UNCOV
22
ResolveName = str
×
23

24

UNCOV
25
_FS = TypeVar("_FS", bound=FieldSetWithInterpreterConstraints)
×
26

27

UNCOV
28
def _partition_by_interpreter_constraints_and_resolve(
×
29
    field_sets: Sequence[_FS],
30
    python_setup: PythonSetup,
31
) -> Mapping[tuple[ResolveName, InterpreterConstraints], OrderedSet[_FS]]:
32
    resolve_and_interpreter_constraints_to_field_sets: Mapping[
×
33
        tuple[str, InterpreterConstraints], OrderedSet[_FS]
34
    ] = defaultdict(lambda: OrderedSet())
35
    for field_set in field_sets:
×
36
        resolve = field_set.resolve.normalized_value(python_setup)
×
37
        interpreter_constraints = InterpreterConstraints.create_from_field_sets(
×
38
            [field_set], python_setup
39
        )
40
        resolve_and_interpreter_constraints_to_field_sets[(resolve, interpreter_constraints)].add(
×
41
            field_set
42
        )
43

44
    return resolve_and_interpreter_constraints_to_field_sets
×
45

46

UNCOV
47
async def _find_all_unique_interpreter_constraints(
×
48
    python_setup: PythonSetup,
49
    field_set_type: type[FieldSet],
50
    *,
51
    extra_constraints_per_tgt: Iterable[InterpreterConstraintsField] = (),
52
) -> InterpreterConstraints:
53
    """Find all unique interpreter constraints used by given field set.
54

55
    This will find the constraints for each individual matching field set, and then OR across all
56
    unique constraints. Usually, Pants partitions when necessary so that conflicting interpreter
57
    constraints can be handled gracefully. But in some cases, like the `generate-lockfiles` goal,
58
    we need to combine those targets into a single value. This ORs, so that if you have a
59
    ==2.7 partition and ==3.6 partition, for example, we return ==2.7 OR ==3.6.
60

61
    Returns the global interpreter constraints if no relevant targets were matched.
62
    """
63
    all_tgts = await find_all_targets(**implicitly())
×
64
    extra_constraints_blank_resolves = [
×
65
        (ics_field, None) for ics_field in extra_constraints_per_tgt
66
    ]
67
    unique_constraints = {
×
68
        InterpreterConstraints.create_from_compatibility_fields(
69
            [
70
                (
71
                    tgt[InterpreterConstraintsField],
72
                    tgt[PythonResolveField] if tgt.has_field(PythonResolveField) else None,
73
                ),
74
                *extra_constraints_blank_resolves,
75
            ],
76
            python_setup,
77
        )
78
        for tgt in all_tgts
79
        if tgt.has_field(InterpreterConstraintsField) and field_set_type.is_applicable(tgt)
80
    }
81
    if not unique_constraints and extra_constraints_per_tgt:
×
82
        unique_constraints.add(
×
83
            InterpreterConstraints.create_from_compatibility_fields(
84
                extra_constraints_blank_resolves,
85
                python_setup,
86
            )
87
        )
88
    constraints = InterpreterConstraints(
×
89
        itertools.chain.from_iterable(ic for ic in unique_constraints if ic)
90
    )
91
    return constraints or InterpreterConstraints(python_setup.interpreter_constraints)
×
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