Skip to content

Commit

Permalink
Allow package names with env markers with pip binary options
Browse files Browse the repository at this point in the history
  • Loading branch information
q0w committed Jan 11, 2023
1 parent b8e47ce commit 1f7a7a8
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 12 deletions.
1 change: 1 addition & 0 deletions docs/changelog/2814.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Allow using package names with env markers for pip's ``--no-binary`` and ``--only-binary`` options - by :user:`q0w`.
27 changes: 25 additions & 2 deletions src/tox/tox_env/python/pip/req/args.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
from argparse import Action, ArgumentParser, ArgumentTypeError, Namespace
from typing import IO, Any, NoReturn, Sequence

from tox.tox_env.python.pip.req.util import handle_binary_option


class _OurArgumentParser(ArgumentParser):
def print_usage(self, file: IO[str] | None = None) -> None: # noqa: U100
Expand Down Expand Up @@ -33,8 +35,8 @@ def _global_options(parser: ArgumentParser) -> None:
parser.add_argument("-r", "--requirement", action=AddUniqueAction, dest="requirements")
parser.add_argument("-e", "--editable", action=AddUniqueAction, dest="editables")
parser.add_argument("-f", "--find-links", action=AddUniqueAction)
parser.add_argument("--no-binary")
parser.add_argument("--only-binary")
parser.add_argument("--no-binary", action=BinaryAction, nargs="+")
parser.add_argument("--only-binary", action=BinaryAction, nargs="+")
parser.add_argument("--prefer-binary", action="store_true", default=False)
parser.add_argument("--require-hashes", action="store_true", default=False)
parser.add_argument("--pre", action="store_true", default=False)
Expand Down Expand Up @@ -90,3 +92,24 @@ def __call__(
current = getattr(namespace, self.dest)
if values not in current:
current.append(values)


class BinaryAction(Action):
def __call__(
self,
parser: ArgumentParser, # noqa: U100
namespace: Namespace,
values: str | Sequence[Any],
option_string: str | None = None, # noqa: U100
) -> None:
if getattr(namespace, "no_binary", None) is None:
namespace.no_binary = set()
if getattr(namespace, "only_binary", None) is None:
namespace.only_binary = set()

args = (
(namespace.no_binary, namespace.only_binary)
if self.dest == "no_binary"
else (namespace.only_binary, namespace.no_binary)
)
handle_binary_option(values[0], *args)
13 changes: 3 additions & 10 deletions src/tox/tox_env/python/pip/req/file.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
from packaging.requirements import InvalidRequirement, Requirement

from .args import build_parser
from .util import VCS, get_url_scheme, handle_binary_option, is_url, url_to_path
from .util import VCS, get_url_scheme, is_url, url_to_path

# Matches environment variable-style values in '${MY_VARIABLE_1}' with the variable name consisting of only uppercase
# letters, digits or the '_' (underscore). This follows the POSIX standard defined in IEEE Std 1003.1, 2013 Edition.
Expand Down Expand Up @@ -341,17 +341,10 @@ def _merge_option_line(self, base_opt: Namespace, opt: Namespace, filename: str)
base_opt.trusted_hosts = []
if host not in base_opt.trusted_hosts:
base_opt.trusted_hosts.append(host)

no_binary = base_opt.no_binary if hasattr(base_opt, "no_binary") else set()
only_binary = base_opt.only_binary if hasattr(base_opt, "only_binary") else set()
if opt.no_binary:
handle_binary_option(opt.no_binary, no_binary, only_binary)
base_opt.no_binary = opt.no_binary
if opt.only_binary:
handle_binary_option(opt.only_binary, only_binary, no_binary)
if no_binary:
base_opt.no_binary = no_binary
if only_binary:
base_opt.only_binary = only_binary
base_opt.only_binary = opt.only_binary

@staticmethod
def _break_args_options(line: str) -> tuple[str, str]:
Expand Down
7 changes: 7 additions & 0 deletions tests/tox_env/python/pip/req/test_file.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,13 @@
["--no-binary", {"foo"}],
id="no-binary-none-first",
),
pytest.param(
"--only-binary foo; sys_platform == 'aix'",
{"only_binary": {"foo;"}},
[],
["--only-binary", {"foo;"}],
id="only-binary-and-env-marker",
),
pytest.param("####### example-requirements.txt #######", {}, [], [], id="comment"),
pytest.param("\t##### Requirements without Version Specifiers ######", {}, [], [], id="tab and comment"),
pytest.param(" # start", {}, [], [], id="space and comment"),
Expand Down

0 comments on commit 1f7a7a8

Please sign in to comment.