Skip to content

Commit

Permalink
Merge branch 'master' of github.com:pantsbuild/pants into actual-setu…
Browse files Browse the repository at this point in the history
…p-py

# Conflicts:
#	src/python/pants/backend/python/goals/setup_py_test.py
  • Loading branch information
Eric-Arellano committed Oct 19, 2020
2 parents 1fa0e48 + 9edbd82 commit 9af929a
Show file tree
Hide file tree
Showing 62 changed files with 413 additions and 723 deletions.
6 changes: 3 additions & 3 deletions src/python/pants/backend/awslambda/python/rules_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,15 @@ def rule_runner() -> RuleRunner:
)


def create_python_awslambda(rule_runner: RuleRunner, addr: str) -> Tuple[str, bytes]:
def create_python_awslambda(rule_runner: RuleRunner, addr: Address) -> Tuple[str, bytes]:
rule_runner.set_options(
[
"--backend-packages=pants.backend.awslambda.python",
"--source-root-patterns=src/python",
"--pants-distdir-legacy-paths=false",
]
)
target = rule_runner.get_target(Address.parse(addr))
target = rule_runner.get_target(addr)
created_awslambda = rule_runner.request(
CreatedAWSLambda, [PythonAwsLambdaFieldSet.create(target)]
)
Expand Down Expand Up @@ -88,7 +88,7 @@ def handler(event, context):
)

zip_file_relpath, content = create_python_awslambda(
rule_runner, "src/python/foo/bar:hello_world_lambda"
rule_runner, Address("src/python/foo/bar", target_name="hello_world_lambda")
)
assert "src.python.foo.bar/hello_world_lambda.zip" == zip_file_relpath
zipfile = ZipFile(BytesIO(content))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,13 @@
)
def test_to_interpreter_version(runtime, expected_major, expected_minor):
assert (expected_major, expected_minor) == PythonAwsLambdaRuntime(
raw_value=runtime, address=Address.parse("foo/bar:baz")
raw_value=runtime, address=Address("foo/bar", target_name="baz")
).to_interpreter_version()


@pytest.mark.parametrize(["invalid_runtime"], (["python88.99"], ["fooobar"]))
def test_runtime_validation(invalid_runtime):
with pytest.raises(InvalidFieldException):
PythonAwsLambdaRuntime(raw_value=invalid_runtime, address=Address.parse("foo/bar:baz"))
PythonAwsLambdaRuntime(
raw_value=invalid_runtime, address=Address("foo/bar", target_name="baz")
)
62 changes: 2 additions & 60 deletions src/python/pants/backend/project_info/filter_targets.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,8 @@
# Licensed under the Apache License, Version 2.0 (see LICENSE).

import re
from functools import partial
from typing import Callable, Pattern

from pants.base.deprecated import resolve_conflicting_options
from pants.engine.console import Console
from pants.engine.goal import Goal, GoalSubsystem, LineOriented
from pants.engine.rules import collect_rules, goal_rule
Expand All @@ -18,15 +16,6 @@
)
from pants.util.filtering import and_filters, create_filters

TARGET_REMOVAL_MSG = (
"`--filter-target` was removed because it is similar to `--filter-address-regex`. If you still "
"need this feature, please message us on Slack (https://www.pantsbuild.org/docs/community)."
)
ANCESTOR_REMOVAL_MSG = (
"`--filter-ancestor` was removed because it is not trivial to implement. If you still need "
"this feature, please message us on Slack (https://www.pantsbuild.org/docs/community)."
)


class FilterSubsystem(LineOriented, GoalSubsystem):
"""Filter the input targets based on various criteria.
Expand Down Expand Up @@ -63,38 +52,6 @@ def register_options(cls, register):
metavar="[+-]regex1,regex2,...",
help="Filter on targets with tags matching these regexes.",
)
register(
"--type",
type=list,
metavar="[+-]type1,type2,...",
help="Filter on these target types, e.g. `resources` or `python_library`.",
removal_version="2.1.0.dev0",
removal_hint="Use `--target-type` instead of `--type`.",
)
register(
"--regex",
type=list,
metavar="[+-]regex1,regex2,...",
help="Filter on target addresses matching these regexes.",
removal_version="2.1.0.dev0",
removal_hint="Use `--address-regex` instead of `--regex`.",
)
register(
"--target",
type=list,
metavar="[+-]spec1,spec2,...",
help="Filter on these target addresses.",
removal_version="2.1.0.dev0",
removal_hint=TARGET_REMOVAL_MSG,
)
register(
"--ancestor",
type=list,
metavar="[+-]spec1,spec2,...",
help="Filter on targets that these targets depend on.",
removal_version="2.1.0.dev0",
removal_hint=ANCESTOR_REMOVAL_MSG,
)


class FilterGoal(Goal):
Expand All @@ -118,11 +75,6 @@ def filter_targets(
console: Console,
registered_target_types: RegisteredTargetTypes,
) -> FilterGoal:
if not filter_subsystem.options.is_default("target"):
raise ValueError(TARGET_REMOVAL_MSG)
if not filter_subsystem.options.is_default("ancestor"):
raise ValueError(ANCESTOR_REMOVAL_MSG)

def filter_target_type(target_type: str) -> TargetFilter:
if target_type not in registered_target_types.aliases:
raise UnrecognizedTargetTypeException(target_type, registered_target_types)
Expand All @@ -136,20 +88,10 @@ def filter_tag_regex(tag_regex: str) -> TargetFilter:
regex = compile_regex(tag_regex)
return lambda tgt: any(bool(regex.search(tag)) for tag in tgt.get(Tags).value or ())

resolve_option = partial(
resolve_conflicting_options,
old_scope="filter",
new_scope="filter",
old_container=filter_subsystem.options,
new_container=filter_subsystem.options,
)
target_type = resolve_option(old_option="type", new_option="target_type")
address_regex = resolve_option(old_option="regex", new_option="address_regex")

anded_filter: TargetFilter = and_filters(
[
*(create_filters(target_type, filter_target_type)),
*(create_filters(address_regex, filter_address_regex)),
*(create_filters(filter_subsystem.options.target_type, filter_target_type)),
*(create_filters(filter_subsystem.options.address_regex, filter_address_regex)),
*(create_filters(filter_subsystem.options.tag_regex, filter_tag_regex)),
]
)
Expand Down
24 changes: 15 additions & 9 deletions src/python/pants/backend/project_info/filter_targets_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ def run_goal(

def test_no_filters_provided() -> None:
# `filter` behaves like `list` when there are no specified filters.
targets = [MockTarget({}, address=Address.parse(addr)) for addr in (":t3", ":t2", ":t1")]
targets = [MockTarget({}, address=Address("", target_name=name)) for name in ("t3", "t2", "t1")]
assert run_goal(targets) == dedent(
"""\
//:t1
Expand All @@ -79,8 +79,10 @@ class Smalltalk(Target):
alias = "smalltalk"
core_fields = ()

fortran_targets = [Fortran({}, address=Address.parse(addr)) for addr in (":f1", ":f2")]
smalltalk_targets = [Smalltalk({}, address=Address.parse(addr)) for addr in (":s1", ":s2")]
fortran_targets = [Fortran({}, address=Address("", target_name=name)) for name in ("f1", "f2")]
smalltalk_targets = [
Smalltalk({}, address=Address("", target_name=name)) for name in ("s1", "s2")
]
targets = [*fortran_targets, *smalltalk_targets]

assert run_goal(targets, target_type=["fortran"]).strip() == "//:f1\n//:f2"
Expand All @@ -105,8 +107,12 @@ class Smalltalk(Target):

def test_filter_by_address_regex() -> None:
targets = [
MockTarget({}, address=Address.parse(addr))
for addr in ("dir1:lib", "dir2:lib", "common:tests")
MockTarget({}, address=addr)
for addr in (
Address("dir1", target_name="lib"),
Address("dir2", target_name="lib"),
Address("common", target_name="tests"),
)
]
assert run_goal(targets, address_regex=[r"^dir"]).strip() == "dir1:lib\ndir2:lib"
assert run_goal(targets, address_regex=[r"+dir1:lib$"]).strip() == "dir1:lib"
Expand All @@ -123,10 +129,10 @@ def test_filter_by_address_regex() -> None:

def test_filter_by_tag_regex() -> None:
targets = [
MockTarget({"tags": ["tag1"]}, address=Address.parse(":t1")),
MockTarget({"tags": ["tag2"]}, address=Address.parse(":t2")),
MockTarget({"tags": ["tag1", "tag2"]}, address=Address.parse(":both")),
MockTarget({}, address=Address.parse(":no_tags")),
MockTarget({"tags": ["tag1"]}, address=Address("", target_name="t1")),
MockTarget({"tags": ["tag2"]}, address=Address("", target_name="t2")),
MockTarget({"tags": ["tag1", "tag2"]}, address=Address("", target_name="both")),
MockTarget({}, address=Address("", target_name="no_tags")),
]
assert run_goal(targets, tag_regex=[r"t.?g2$"]).strip() == "//:both\n//:t2"
assert run_goal(targets, tag_regex=["+tag1"]).strip() == "//:both\n//:t1"
Expand Down
16 changes: 10 additions & 6 deletions src/python/pants/backend/project_info/list_targets_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,10 @@ def run_goal(

def test_list_normal() -> None:
# Note that these are unsorted.
addresses = (":t3", ":t2", ":t1")
stdout, _ = run_goal([MockTarget({}, address=Address.parse(addr)) for addr in addresses])
target_names = ("t3", "t2", "t1")
stdout, _ = run_goal(
[MockTarget({}, address=Address("", target_name=name)) for name in target_names]
)
assert stdout == dedent(
"""\
//:t1
Expand All @@ -73,9 +75,9 @@ def test_list_documented() -> None:
[
MockTarget(
{DescriptionField.alias: "Description of a target.\n\tThis target is the best."},
address=Address.parse(":described"),
address=Address("", target_name="described"),
),
MockTarget({}, address=Address.parse(":not_described")),
MockTarget({}, address=Address("", target_name="not_described")),
],
show_documented=True,
)
Expand All @@ -91,8 +93,10 @@ def test_list_documented() -> None:
def test_list_provides() -> None:
sample_artifact = PythonArtifact(name="project.demo")
targets = [
MockTarget({ProvidesField.alias: sample_artifact}, address=Address.parse(":provided")),
MockTarget({}, address=Address.parse(":not_provided")),
MockTarget(
{ProvidesField.alias: sample_artifact}, address=Address("", target_name="provided")
),
MockTarget({}, address=Address("", target_name="not_provided")),
]
stdout, _ = run_goal(targets, show_provides=True)
assert stdout.strip() == f"//:provided {sample_artifact}"
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@ def test_first_party_modules_mapping() -> None:


def test_third_party_modules_mapping() -> None:
colors_addr = Address.parse("//:ansicolors")
pants_addr = Address.parse("//:pantsbuild")
colors_addr = Address("", target_name="ansicolors")
pants_addr = Address("", target_name="pantsbuild")
mapping = ThirdPartyModuleToAddressMapping(
FrozenDict({"colors": colors_addr, "pants": pants_addr})
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ def run_dep_inference(address: Address) -> InferredDependencies:
[InferInitDependencies(target[PythonSources])],
)

assert run_dep_inference(Address.parse("src/python/root/mid/leaf")) == InferredDependencies(
assert run_dep_inference(Address("src/python/root/mid/leaf")) == InferredDependencies(
[
Address("src/python/root", relative_file_path="__init__.py", target_name="root"),
Address("src/python/root/mid", relative_file_path="__init__.py", target_name="mid"),
Expand Down Expand Up @@ -200,7 +200,7 @@ def run_dep_inference(address: Address) -> InferredDependencies:
[InferConftestDependencies(target[PythonSources])],
)

assert run_dep_inference(Address.parse("src/python/root/mid/leaf")) == InferredDependencies(
assert run_dep_inference(Address("src/python/root/mid/leaf")) == InferredDependencies(
[
Address("src/python/root", relative_file_path="conftest.py", target_name="root"),
Address("src/python/root/mid", relative_file_path="conftest.py", target_name="mid"),
Expand Down

0 comments on commit 9af929a

Please sign in to comment.