Fix: trigger result_callback for single command apps (Issue #445)#1631
Fix: trigger result_callback for single command apps (Issue #445)#1631dilanmelvin wants to merge 5 commits intofastapi:masterfrom
Conversation
There was a problem hiding this comment.
Pull request overview
Fixes Typer’s single-command “fast path” so result_callback is executed when an app has exactly one command and is invoked without specifying the command name (Issue #445).
Changes:
- Wrap the generated Click command callback for single-command apps to capture the command result.
- Invoke the app-level
result_callbackmanually after the command finishes, mirroring Click group behavior.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
You can also share your feedback on Copilot code review. Take the survey.
| def callback_wrapper(*args: Any, **kwargs: Any) -> Any: | ||
| result = click_callback(*args, **kwargs) | ||
| ctx = click.get_current_context() | ||
| return ctx.invoke(use_result_callback, result) |
There was a problem hiding this comment.
A regression test should be added for this new single-command result_callback execution path (Issue #445). The repo has extensive CLI tests using CliRunner, but there doesn’t appear to be any existing coverage for result_callback; without a test it’s easy to reintroduce this optimization bug later.
|
Maintainers, could you please add the bug label? |
|
@dilanmelvin: you've asked for a review by copilot, so can you address its review comments? |
Summary
Fixes #445
This PR ensures that result_callback is triggered correctly even when the Typer application consists of a single command.
Problem
Currently, Typer optimizes single-command apps by executing them directly. In this specific execution path, the logic to invoke result_callback was missing, causing the callback to be silently ignored.
Solution
Modified get_command in typer/main.py to wrap the command callback. The wrapper executes the original command, captures the result, and then manually invokes the result_callback if one is defined.
Testing
I tested this locally with a script that returns a value from a single command:
Created a Typer app with one command returning a string.
Attached a result_callback to print the result.
Verified that the callback executes correctly after the command finishes.