Skip to content

Commit

Permalink
plugins: add deps_group plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexTereshenkov committed Jul 17, 2023
1 parent 6e7057c commit b88d7a4
Show file tree
Hide file tree
Showing 9 changed files with 161 additions and 1 deletion.
10 changes: 10 additions & 0 deletions BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,13 @@ python_distribution(
sdist=False,
generate_setup=False,
)

deps_group(
name="deps-group-1",
source="deps-grouping.json",
)

deps_group(
name="deps-group-2",
source="deps-grouping.json",
)
6 changes: 5 additions & 1 deletion cheeseshop/BUILD
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
python_sources()
python_sources(
overrides={
"version.py": {"dependencies": ["//:deps-group-1"]},
}
)

resource(
name="project-version",
Expand Down
4 changes: 4 additions & 0 deletions deps-grouping.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"deps-group-1": ["click", "loguru"],
"deps-group-2": ["requests"]
}
4 changes: 4 additions & 0 deletions pants-plugins/internal_plugins/deps_grouping/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
python_sources(
name="pants-plugins",
resolve="pants-plugins",
)
Empty file.
16 changes: 16 additions & 0 deletions pants-plugins/internal_plugins/deps_grouping/register.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from typing import Iterable

from pants.engine.target import Target

import internal_plugins.deps_grouping.rules as deps_grouping_rules
from internal_plugins.deps_grouping.target_types import DepsGroupTarget


def target_types() -> Iterable[type[Target]]:
return [DepsGroupTarget]


def rules():
return [
*deps_grouping_rules.rules(),
]
108 changes: 108 additions & 0 deletions pants-plugins/internal_plugins/deps_grouping/rules.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
import json
from dataclasses import dataclass

import logging

from pants.backend.python.dependency_inference.rules import InferPythonImportDependencies, \
PythonImportDependenciesInferenceFieldSet
from pants.backend.python.target_types import PythonDependenciesField
from pants.engine.addresses import Addresses, UnparsedAddressInputs
from pants.util.ordered_set import FrozenOrderedSet

logger = logging.getLogger(__name__)

from pants.build_graph.address import Address
from pants.engine.fs import DigestContents
from pants.engine.internals.native_engine import Digest
from pants.engine.internals.selectors import Get, MultiGet
from pants.engine.rules import collect_rules, rule
from pants.engine.target import (
FieldSet,
HydratedSources,
HydrateSourcesRequest,
InferDependenciesRequest,
InferredDependencies, Targets, DependenciesRequest, Dependencies,
)
from pants.engine.unions import UnionRule

from internal_plugins.deps_grouping.target_types import (
DepsGroupSourceField,
)


@dataclass(frozen=True)
class DepsGroupsFileView:
path: str
contents: str


@dataclass(frozen=True)
class DepsGroupDependencyInferenceFieldSet(FieldSet):
required_fields = (DepsGroupSourceField,)

source: DepsGroupSourceField


class InferDepsGroupDependenciesRequest(InferDependenciesRequest):
infer_from = DepsGroupDependencyInferenceFieldSet


@rule
async def extend_dependencies(
request: InferDepsGroupDependenciesRequest,
) -> InferredDependencies:
sources = await Get(
HydratedSources, HydrateSourcesRequest(request.field_set.source)
)
digest_contents = await Get(DigestContents, Digest, sources.snapshot.digest)
file_content = digest_contents[0]
requirements = json.loads(file_content.content.decode("utf-8").strip())

addresses = []
for req in requirements[request.field_set.address.target_name]:
addresses.append(
Address("requirements", target_name="requirements", generated_name=req),
)

return InferredDependencies(addresses)


class MyDependencies(Dependencies):
pass


@dataclass(frozen=True)
class MyFieldSet(FieldSet):
required_fields = (
PythonDependenciesField,
)
dependencies: PythonDependenciesField


class MyInferDependenciesRequest(InferDependenciesRequest):
infer_from = MyFieldSet


@rule
async def get_dependencies_python_sources(
request: MyInferDependenciesRequest,
) -> InferredDependencies:
# logger.info(request.field_set.dependencies)
for dep_string in request.field_set.dependencies.value:
targets = await Get(Targets, UnparsedAddressInputs([dep_string], owning_address=None, description_of_origin="me"))
for target in targets:
logger.info(target)
logger.info(type(target))
# this doesn't work - the matching rule can't be found
deps = await Get(Addresses, InferDepsGroupDependenciesRequest(target.get(Dependencies)))
# logger.info(deps)

return InferredDependencies([])


def rules():
return (
*collect_rules(),
UnionRule(InferDependenciesRequest, InferDepsGroupDependenciesRequest),
UnionRule(InferDependenciesRequest, MyInferDependenciesRequest),
)
13 changes: 13 additions & 0 deletions pants-plugins/internal_plugins/deps_grouping/target_types.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from pants.engine.target import COMMON_TARGET_FIELDS, SingleSourceField, Target


class DepsGroupSourceField(SingleSourceField):
alias = "source"
help = "Path to the file with the dependency groups."
required = True


class DepsGroupTarget(Target):
alias = "deps_group"
core_fields = (*COMMON_TARGET_FIELDS, DepsGroupSourceField)
help = "A dependency group target with access to dependency groups stored in a given file."
1 change: 1 addition & 0 deletions pants.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ backend_packages = [
# plugins
"pants.backend.plugin_development",
"internal_plugins.project_version",
"internal_plugins.deps_grouping",
]

plugins = ["packaging==21.3"]
Expand Down

0 comments on commit b88d7a4

Please sign in to comment.