• 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/jvm/resolve/common.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 dataclasses
×
UNCOV
7
from collections.abc import Iterable
×
UNCOV
8
from dataclasses import dataclass
×
UNCOV
9
from urllib.parse import quote_plus as url_quote_plus
×
10

UNCOV
11
from pants.engine.collection import DeduplicatedCollection
×
UNCOV
12
from pants.engine.target import Target
×
UNCOV
13
from pants.jvm.resolve.coordinate import Coordinate
×
UNCOV
14
from pants.jvm.target_types import (
×
15
    JvmArtifactArtifactField,
16
    JvmArtifactExclusionsField,
17
    JvmArtifactFieldSet,
18
    JvmArtifactForceVersionField,
19
    JvmArtifactGroupField,
20
    JvmArtifactJarSourceField,
21
    JvmArtifactUrlField,
22
    JvmArtifactVersionField,
23
)
UNCOV
24
from pants.util.ordered_set import FrozenOrderedSet
×
25

26

UNCOV
27
@dataclass(frozen=True)
×
UNCOV
28
class ArtifactRequirement:
×
29
    """A single Maven-style coordinate for a JVM dependency, along with information of how to fetch
30
    the dependency if it is not to be fetched from a Maven repository."""
31

UNCOV
32
    coordinate: Coordinate
×
33

UNCOV
34
    url: str | None = None
×
UNCOV
35
    jar: JvmArtifactJarSourceField | None = None
×
UNCOV
36
    excludes: frozenset[str] | None = None
×
UNCOV
37
    force_version: bool = False
×
38

UNCOV
39
    @classmethod
×
UNCOV
40
    def from_jvm_artifact_target(cls, target: Target) -> ArtifactRequirement:
×
41
        if not JvmArtifactFieldSet.is_applicable(target):
×
42
            raise AssertionError(
×
43
                "`ArtifactRequirement.from_jvm_artifact_target()` only works on targets with "
44
                "`JvmArtifactFieldSet` fields present."
45
            )
46

47
        exclusions = target[JvmArtifactExclusionsField].value or ()
×
48
        return ArtifactRequirement(
×
49
            coordinate=Coordinate(
50
                group=target[JvmArtifactGroupField].value,
51
                artifact=target[JvmArtifactArtifactField].value,
52
                version=target[JvmArtifactVersionField].value,
53
            ),
54
            url=target[JvmArtifactUrlField].value,
55
            jar=(
56
                target[JvmArtifactJarSourceField]
57
                if target[JvmArtifactJarSourceField].value
58
                else None
59
            ),
60
            excludes=frozenset([*(exclusion.to_coord_str() for exclusion in exclusions)]) or None,
61
            force_version=target[JvmArtifactForceVersionField].value,
62
        )
63

UNCOV
64
    def with_extra_excludes(self, *excludes: str) -> ArtifactRequirement:
×
65
        """Creates a copy of this `ArtifactRequirement` with `excludes` provided.
66

67
        Mostly useful for testing (`Coordinate(...).as_requirement().with_extra_excludes(...)`).
68
        """
69

70
        return dataclasses.replace(
×
71
            self, excludes=self.excludes.union(excludes) if self.excludes else frozenset(excludes)
72
        )
73

UNCOV
74
    def to_coord_arg_str(self) -> str:
×
75
        return self.coordinate.to_coord_arg_str(
×
76
            {"url": url_quote_plus(self.url)} if self.url else {}
77
        )
78

UNCOV
79
    def to_metadata_str(self) -> str:
×
UNCOV
80
        attrs = {
×
81
            "url": self.url or "not_provided",
82
            "jar": self.jar.address.spec if self.jar else "not_provided",
83
        }
UNCOV
84
        if self.excludes:
×
85
            attrs["excludes"] = ",".join(sorted(self.excludes))
×
86

UNCOV
87
        return self.coordinate.to_coord_arg_str(attrs)
×
88

89

90
# TODO: Consider whether to carry classpath scope in some fashion via ArtifactRequirements.
UNCOV
91
class ArtifactRequirements(DeduplicatedCollection[ArtifactRequirement]):
×
92
    """An ordered list of Coordinates used as requirements."""
93

UNCOV
94
    @classmethod
×
UNCOV
95
    def from_coordinates(cls, coordinates: Iterable[Coordinate]) -> ArtifactRequirements:
×
UNCOV
96
        return ArtifactRequirements(ArtifactRequirement(coord) for coord in coordinates)
×
97

98

UNCOV
99
@dataclass(frozen=True)
×
UNCOV
100
class GatherJvmCoordinatesRequest:
×
101
    """A request to turn strings of coordinates (`group:artifact:version`) and/or addresses to
102
    `jvm_artifact` targets into `ArtifactRequirements`."""
103

UNCOV
104
    artifact_inputs: FrozenOrderedSet[str]
×
UNCOV
105
    option_name: str
×
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