summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Lord <davidism@gmail.com>2022-03-19 11:00:12 -0700
committerDavid Lord <davidism@gmail.com>2022-03-19 11:00:12 -0700
commit7d3a871eb71694e99438254686c139122bc4be64 (patch)
treee784f20837959b7e9382b2cbbe7e96b63fac254a
parentbf9da4838986af3bc09a1b16974d154c61dcbe3f (diff)
downloadclick-7d3a871eb71694e99438254686c139122bc4be64.tar.gz
group without command passes return value to result callback
-rw-r--r--CHANGES.rst3
-rw-r--r--src/click/core.py8
-rw-r--r--tests/test_chain.py8
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