From c8bb541934f17735a11868d5726f84159c13093a Mon Sep 17 00:00:00 2001 From: Rupayon Haldar <80724680+rupayon123@users.noreply.github.com> Date: Tue, 27 Oct 2026 10:16:36 -0400 Subject: [PATCH 1/2] Honor caller defaults for missing raw options --- src/cleo/io/inputs/argv_input.py | 2 +- tests/io/inputs/test_argv_input.py | 47 ++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/cleo/io/inputs/argv_input.py b/src/cleo/io/inputs/argv_input.py index 54cc1735..e08f363c 100644 --- a/src/cleo/io/inputs/argv_input.py +++ b/src/cleo/io/inputs/argv_input.py @@ -132,7 +132,7 @@ def parameter_option( if token == value or (leading != "" and token.startswith(leading)): return token[len(leading)] - return False + return default def _set_tokens(self, tokens: list[str]) -> None: self._tokens = tokens diff --git a/tests/io/inputs/test_argv_input.py b/tests/io/inputs/test_argv_input.py index f83ae50f..d4d41bbc 100644 --- a/tests/io/inputs/test_argv_input.py +++ b/tests/io/inputs/test_argv_input.py @@ -151,3 +151,50 @@ def test_parse_options( i.bind(Definition(options)) assert i.options == expected_options + + +@pytest.mark.parametrize("args", [[], ["--other=value"]]) +@pytest.mark.parametrize("values", ["--name", ["--name", "-n"]]) +@pytest.mark.parametrize("default", [False, 0, None, "fallback", object()]) +def test_parameter_option_returns_default_when_missing( + args: list[str], values: str | list[str], default: object +) -> None: + i = ArgvInput(["cli.py", *args]) + + assert i.parameter_option(values, default=default) is default + + +@pytest.mark.parametrize( + ["args", "expected"], + [ + (["--name", "alice"], "alice"), + (["-n", "alice"], "alice"), + (["--name"], None), + ], +) +def test_parameter_option_preserves_present_values( + args: list[str], expected: str | None +) -> None: + i = ArgvInput(["cli.py", *args]) + + assert i.parameter_option(["--name", "-n"], default="fallback") == expected + + +@pytest.mark.parametrize("only_params", [False, True]) +def test_parameter_option_default_after_end_of_options(only_params: bool) -> None: + i = ArgvInput(["cli.py", "--", "--name", "alice"]) + default = object() + + result = i.parameter_option("--name", default=default, only_params=only_params) + + if only_params: + assert result is default + else: + assert result == "alice" + + +@pytest.mark.parametrize("args", [[], ["--other=value"]]) +def test_parameter_option_default_is_false(args: list[str]) -> None: + i = ArgvInput(["cli.py", *args]) + + assert i.parameter_option("--name") is False From 6c141fd7850386b617a543eb48ef62896674d546 Mon Sep 17 00:00:00 2001 From: Rupayon Haldar <80724680+rupayon123@users.noreply.github.com> Date: Tue, 27 Oct 2026 10:18:14 -0400 Subject: [PATCH 2/2] Add the PR-numbered raw-option bugfix news entry --- news/549.bugfix.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 news/549.bugfix.md diff --git a/news/549.bugfix.md b/news/549.bugfix.md new file mode 100644 index 00000000..2f47db54 --- /dev/null +++ b/news/549.bugfix.md @@ -0,0 +1 @@ +Fixed raw option lookups ignoring the supplied default when no option matched.