diff options
author | David Lord <davidism@gmail.com> | 2022-03-19 11:00:12 -0700 |
---|---|---|
committer | David Lord <davidism@gmail.com> | 2022-03-19 11:00:12 -0700 |
commit | 7d3a871eb71694e99438254686c139122bc4be64 (patch) | |
tree | e784f20837959b7e9382b2cbbe7e96b63fac254a | |
parent | bf9da4838986af3bc09a1b16974d154c61dcbe3f (diff) | |
download | click-7d3a871eb71694e99438254686c139122bc4be64.tar.gz |
group without command passes return value to result callback
-rw-r--r-- | CHANGES.rst | 3 | ||||
-rw-r--r-- | src/click/core.py | 8 | ||||
-rw-r--r-- | tests/test_chain.py | 8 |
3 files changed, 11 insertions, 8 deletions
diff --git a/CHANGES.rst b/CHANGES.rst index 8662316..0a9661a 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 9ba738b..263a5ff 100644 --- a/src/click/core.py +++ b/src/click/core.py @@ -1626,11 +1626,11 @@ class MultiCommand(Command): 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 3431009..6b2eae3 100644 --- a/tests/test_chain.py +++ b/tests/test_chain.py @@ -85,20 +85,20 @@ def test_chaining_with_options(runner): 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 |