diff --git a/hatch_build/cli.py b/hatch_build/cli.py index d8924fc..b232766 100644 --- a/hatch_build/cli.py +++ b/hatch_build/cli.py @@ -10,8 +10,11 @@ _extras = None -def parse_extra_args(subparser: Optional[ArgumentParser]) -> List[str]: - return subparser.parse_args(_extras) if _extras else {}, [] +def parse_extra_args(subparser: Optional[ArgumentParser] = None) -> List[str]: + if subparser is None: + subparser = ArgumentParser(prog="hatch-build-extras", allow_abbrev=False) + kwargs, extras = subparser.parse_known_args(_extras or []) + return vars(kwargs), extras def _hatchling_internal() -> Tuple[Optional[Callable], Optional[dict], List[str]]: diff --git a/hatch_build/tests/test_cli.py b/hatch_build/tests/test_cli.py index c5a24e8..cdb61cf 100644 --- a/hatch_build/tests/test_cli.py +++ b/hatch_build/tests/test_cli.py @@ -50,7 +50,15 @@ def ok_extra_argv(): @pytest.fixture def get_arg(): tmp_argv = sys.argv - sys.argv = ["hatch-build", "--", "--extra-arg", "--extra-arg-with-value", "value", "--extra-arg-with-value-equals=value2"] + sys.argv = [ + "hatch-build", + "--", + "--extra-arg", + "--extra-arg-with-value", + "value", + "--extra-arg-with-value-equals=value2", + "--extra-arg-not-in-parser", + ] parser = ArgumentParser() parser.add_argument("--extra-arg", action="store_true") parser.add_argument("--extra-arg-with-value") @@ -103,6 +111,13 @@ def test_ok_extras(self, ok_extra_argv): def test_get_arg(self, get_arg): assert hatchling() == 0 args, _ = parse_extra_args(get_arg) - assert args.extra_arg is True - assert args.extra_arg_with_value == "value" - assert args.extra_arg_with_value_equals == "value2" + assert args["extra_arg"] is True + assert args["extra_arg_with_value"] == "value" + assert args["extra_arg_with_value_equals"] == "value2" + + def test_get_arg_no_passthrough(self, get_arg): + assert hatchling() == 0 + _, kwargs = parse_extra_args() + assert "--extra-arg" in kwargs + assert "--extra-arg-with-value" in kwargs + assert kwargs[kwargs.index("--extra-arg-with-value") + 1] == "value"