From 7d3a871eb71694e99438254686c139122bc4be64 Mon Sep 17 00:00:00 2001 From: David Lord Date: Sat, 19 Mar 2022 11:00:12 -0700 Subject: [PATCH] group without command passes return value to result callback --- CHANGES.rst | 3 +++ src/click/core.py | 8 ++++---- tests/test_chain.py | 8 ++++---- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 866231642..0a9661a3f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -45,6 +45,9 @@ Version 8.1.0 :issue:`2131`. - ``@command`` decorator is annotated as returning the correct type if a ``cls`` argument is used. :issue:`2211` +- A ``Group`` with ``invoke_without_command=True`` and ``chain=False`` + will invoke its result callback with the group function's return + value. :issue:`2124` Version 8.0.4 diff --git a/src/click/core.py b/src/click/core.py index 9ba738ba5..263a5ff06 100644 --- a/src/click/core.py +++ b/src/click/core.py @@ -1626,11 +1626,11 @@ def _process_result(value: t.Any) -> t.Any: if not ctx.protected_args: if self.invoke_without_command: # No subcommand was invoked, so the result callback is - # invoked with None for regular groups, or an empty list - # for chained groups. + # invoked with the group return value for regular + # groups, or an empty list for chained groups. with ctx: - super().invoke(ctx) - return _process_result([] if self.chain else None) + rv = super().invoke(ctx) + return _process_result([] if self.chain else rv) ctx.fail(_("Missing command.")) # Fetch args back out diff --git a/tests/test_chain.py b/tests/test_chain.py index 343100999..6b2eae305 100644 --- a/tests/test_chain.py +++ b/tests/test_chain.py @@ -85,20 +85,20 @@ def bdist(format): assert result.output.splitlines() == ["bdist called 1", "sdist called 2"] -@pytest.mark.parametrize(("chain", "expect"), [(False, "None"), (True, "[]")]) +@pytest.mark.parametrize(("chain", "expect"), [(False, "1"), (True, "[]")]) def test_no_command_result_callback(runner, chain, expect): """When a group has ``invoke_without_command=True``, the result callback is always invoked. A regular group invokes it with - ``None``, a chained group with ``[]``. + its return value, a chained group with ``[]``. """ @click.group(invoke_without_command=True, chain=chain) def cli(): - pass + return 1 @cli.result_callback() def process_result(result): - click.echo(str(result), nl=False) + click.echo(result, nl=False) result = runner.invoke(cli, []) assert result.output == expect