Skip to content

Commit

Permalink
JVM Split coordinate and artifact requirement concepts (#13843)
Browse files Browse the repository at this point in the history
This adds (working) support for local JAR and URL coordinates at resolve and at fetch time. Summary of changes:

* Creates new `ArtifactRequirement` concept, which is used to build up download instructions for Coursier. It stores coordinates, (remote) URLs, and JAR source fields
* Adds a new concept called `CoursierResolveInfo`. This contains a list of coordinate (+url) strings and a Digest containing local JAR files
* Adds URL and JAR address fields to `CoursierResolvedLockfile` and the relevant serialized format. This is used to ensure that the correct JARs are used at fetch time
* Updates `coursier_fetch_one_coord` to use `CoursierResolveInfo` internally


Closes #13840
  • Loading branch information
Christopher Neugebauer committed Dec 10, 2021
1 parent 7260785 commit cf636c9
Show file tree
Hide file tree
Showing 9 changed files with 303 additions and 181 deletions.
Expand Up @@ -32,7 +32,7 @@ def _load_javaparser_launcher_source() -> bytes:

def java_parser_artifact_requirements() -> ArtifactRequirements:
# Update in concert with the target definition for `java_parser`.
return ArtifactRequirements(
return ArtifactRequirements.from_coordinates(
[
Coordinate(
group="com.fasterxml.jackson.core", artifact="jackson-databind", version="2.12.4"
Expand Down
2 changes: 1 addition & 1 deletion src/python/pants/backend/scala/compile/scalac.py
Expand Up @@ -116,7 +116,7 @@ async def compile_scala_source(
MaterializedClasspathRequest(
prefix="__toolcp",
artifact_requirements=(
ArtifactRequirements(
ArtifactRequirements.from_coordinates(
[
Coordinate(
group="org.scala-lang",
Expand Down
Expand Up @@ -88,7 +88,7 @@
]
]

SCALA_PARSER_ARTIFACT_REQUIREMENTS = ArtifactRequirements(
SCALA_PARSER_ARTIFACT_REQUIREMENTS = ArtifactRequirements.from_coordinates(
SCALAMETA_DEPENDENCIES + CIRCE_DEPENDENCIES
)

Expand Down Expand Up @@ -323,7 +323,7 @@ async def setup_scala_parser_classfiles(
MaterializedClasspathRequest(
prefix="__toolcp",
artifact_requirements=(
ArtifactRequirements(
ArtifactRequirements.from_coordinates(
[
Coordinate(
group="org.scala-lang",
Expand Down
2 changes: 1 addition & 1 deletion src/python/pants/backend/scala/goals/repl.py
Expand Up @@ -44,7 +44,7 @@ async def create_scala_repl_request(
MaterializedClasspathRequest(
prefix="__toolcp",
artifact_requirements=(
ArtifactRequirements(
ArtifactRequirements.from_coordinates(
[
Coordinate(
group="org.scala-lang",
Expand Down
51 changes: 4 additions & 47 deletions src/python/pants/jvm/goals/coursier.py
Expand Up @@ -21,29 +21,15 @@
)
from pants.engine.goal import Goal, GoalSubsystem
from pants.engine.rules import Get, MultiGet, collect_rules, goal_rule, rule
from pants.engine.target import (
AllTargets,
InvalidTargetException,
Target,
Targets,
TransitiveTargets,
TransitiveTargetsRequest,
)
from pants.engine.target import AllTargets, Targets, TransitiveTargets, TransitiveTargetsRequest
from pants.jvm.resolve.coursier_fetch import (
ArtifactRequirement,
ArtifactRequirements,
Coordinate,
CoursierError,
CoursierResolvedLockfile,
)
from pants.jvm.subsystems import JvmSubsystem
from pants.jvm.target_types import (
JvmArtifactArtifactField,
JvmArtifactFieldSet,
JvmArtifactGroupField,
JvmArtifactUrlField,
JvmArtifactVersionField,
JvmCompatibleResolveNamesField,
)
from pants.jvm.target_types import JvmArtifactFieldSet, JvmCompatibleResolveNamesField


class CoursierResolveSubsystem(GoalSubsystem):
Expand All @@ -66,35 +52,6 @@ class CoursierResolve(Goal):
subsystem_cls = CoursierResolveSubsystem


def coordinate_from_target(tgt: Target) -> Coordinate:
group = tgt[JvmArtifactGroupField].value
if not group:
raise InvalidTargetException(
f"The `group` field of {tgt.alias} target {tgt.address} must be set."
)

artifact = tgt[JvmArtifactArtifactField].value
if not artifact:
raise InvalidTargetException(
f"The `artifact` field of {tgt.alias} target {tgt.address} must be set."
)

version = tgt[JvmArtifactVersionField].value
if not version:
raise InvalidTargetException(
f"The `version` field of {tgt.alias} target {tgt.address} must be set."
)

url = tgt[JvmArtifactUrlField].value

return Coordinate(
group=group,
artifact=artifact,
version=version,
url=url,
)


@dataclass(frozen=True)
class JvmTargetsByResolveName:
targets_by_resolve_name: dict[str, Targets]
Expand Down Expand Up @@ -180,7 +137,7 @@ async def coursier_generate_lockfile(
]

artifact_requirements = ArtifactRequirements(
[coordinate_from_target(tgt) for tgt in resolvable_dependencies]
[ArtifactRequirement.from_jvm_artifact_target(tgt) for tgt in resolvable_dependencies]
)

resolved_lockfile = await Get(
Expand Down

0 comments on commit cf636c9

Please sign in to comment.