Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clarify when we are subsetting the lockfile for 3rdparty dependencies #12435

Merged
merged 3 commits into from
Jul 28, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 39 additions & 26 deletions src/python/pants/backend/python/util_rules/pex.py
Original file line number Diff line number Diff line change
Expand Up @@ -310,12 +310,7 @@ async def build_pex(
pex_runtime_env: PexRuntimeEnvironment,
) -> BuildPexResult:
"""Returns a PEX with the given settings."""

argv = [
"--output-file",
request.output_filename,
*request.additional_args,
]
argv = ["--output-file", request.output_filename, *request.additional_args]

if request.repository_pex:
argv.extend(["--pex-repository", request.repository_pex.name])
Expand Down Expand Up @@ -433,32 +428,13 @@ async def build_pex(
),
)

description = request.description
if description is None:
if request.requirements.req_strings:
description = (
f"Building {request.output_filename} with "
f"{pluralize(len(request.requirements.req_strings), 'requirement')}: "
f"{', '.join(request.requirements.req_strings)}"
)
elif request.requirements.file_path:
description = (
f"Building {request.output_filename} from {request.requirements.file_path}"
)
elif request.requirements.file_content:
description = (
f"Building {request.output_filename} from {request.requirements.file_content.path}"
)
else:
description = f"Building {request.output_filename}"

process = await Get(
Process,
PexCliProcess(
python=python,
argv=argv,
additional_input_digest=merged_digest,
description=description,
description=_build_pex_description(request),
output_files=[request.output_filename],
),
)
Expand Down Expand Up @@ -486,6 +462,43 @@ async def build_pex(
)


def _build_pex_description(request: PexRequest) -> str:
if request.description:
return request.description
if not request.requirements:
return f"Building {request.output_filename}"

if request.repository_pex:
repo_pex = request.repository_pex.name
if request.requirements.req_strings:
return (
f"Extracting {pluralize(len(request.requirements.req_strings), 'requirement')} "
f"to build {request.output_filename} from {repo_pex}: "
f"{', '.join(request.requirements.req_strings)}"
)
reqs_file = (
request.requirements.file_content.path
if request.requirements.file_content
else request.requirements.file_path
)
assert reqs_file is not None
return (
f"Extracting all requirements in {reqs_file} from {repo_pex} to build "
f"{request.output_filename}"
)

if request.requirements.file_path:
desc_suffix = f"from {request.requirements.file_path}"
elif request.requirements.file_content:
desc_suffix = f"from {request.requirements.file_content.path}"
else:
desc_suffix = (
f"with {pluralize(len(request.requirements.req_strings), 'requirement')}: "
f"{', '.join(request.requirements.req_strings)}"
)
return f"Building {request.output_filename} {desc_suffix}"


@rule
async def create_pex(request: PexRequest) -> Pex:
result = await Get(BuildPexResult, PexRequest, request)
Expand Down
69 changes: 68 additions & 1 deletion src/python/pants/backend/python/util_rules/pex_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,11 @@
PexResolveInfo,
VenvPex,
VenvPexProcess,
_build_pex_description,
)
from pants.backend.python.util_rules.pex import rules as pex_rules
from pants.backend.python.util_rules.pex_cli import PexPEX
from pants.engine.fs import CreateDigest, Digest, Directory, FileContent
from pants.engine.fs import EMPTY_DIGEST, CreateDigest, Digest, Directory, FileContent
from pants.engine.process import Process, ProcessResult
from pants.testutil.rule_runner import QueryRule, RuleRunner

Expand Down Expand Up @@ -468,3 +469,69 @@ def test_venv_pex_resolve_info(rule_runner: RuleRunner, pex_type: type[Pex | Ven
assert dists[3].version == Version("2.23.0")
assert Requirement.parse('PySocks!=1.5.7,>=1.5.6; extra == "socks"') in dists[3].requires_dists
assert dists[4].project_name == "urllib3"


def test_build_pex_description() -> None:
def assert_description(
requirements: PexRequirements,
*,
use_repo_pex: bool = False,
description: str | None = None,
expected: str,
) -> None:
repo_pex = Pex(EMPTY_DIGEST, "repo.pex", None) if use_repo_pex else None
request = PexRequest(
output_filename="new.pex",
internal_only=True,
requirements=requirements,
description=description,
repository_pex=repo_pex,
)
assert _build_pex_description(request) == expected

assert_description(PexRequirements(), description="Custom!", expected="Custom!")
assert_description(
PexRequirements(), description="Custom!", use_repo_pex=True, expected="Custom!"
)

assert_description(PexRequirements(), expected="Building new.pex")
assert_description(PexRequirements(), use_repo_pex=True, expected="Building new.pex")

assert_description(
PexRequirements(["req"]), expected="Building new.pex with 1 requirement: req"
)
assert_description(
PexRequirements(["req"]),
use_repo_pex=True,
expected="Extracting 1 requirement to build new.pex from repo.pex: req",
)

assert_description(
PexRequirements(["req1", "req2"]),
expected="Building new.pex with 2 requirements: req1, req2",
)
assert_description(
PexRequirements(["req1", "req2"]),
use_repo_pex=True,
expected="Extracting 2 requirements to build new.pex from repo.pex: req1, req2",
)

assert_description(
PexRequirements(file_content=FileContent("lock.txt", b"")),
expected="Building new.pex from lock.txt",
)
assert_description(
PexRequirements(file_content=FileContent("lock.txt", b"")),
use_repo_pex=True,
expected="Extracting all requirements in lock.txt from repo.pex to build new.pex",
)

assert_description(
PexRequirements(file_path="lock.txt", file_path_description_of_origin="foo"),
expected="Building new.pex from lock.txt",
)
assert_description(
PexRequirements(file_path="lock.txt", file_path_description_of_origin="foo"),
use_repo_pex=True,
expected="Extracting all requirements in lock.txt from repo.pex to build new.pex",
)