Skip to content

Fix: trigger result_callback for single command apps (Issue #445)#1631

Open
dilanmelvin wants to merge 5 commits intofastapi:masterfrom
dilanmelvin:master
Open

Fix: trigger result_callback for single command apps (Issue #445)#1631
dilanmelvin wants to merge 5 commits intofastapi:masterfrom
dilanmelvin:master

Conversation

@dilanmelvin
Copy link

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.

Copilot AI review requested due to automatic review settings March 12, 2026 15:34
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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_callback manually 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.

Comment on lines +1214 to +1217
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)
Copy link

Copilot AI Mar 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Copilot uses AI. Check for mistakes.
@dilanmelvin
Copy link
Author

Maintainers, could you please add the bug label?
This PR fixes Issue #445 where result_callback was ignored for single-command apps.

@svlandeg svlandeg added the bug Something isn't working label Mar 13, 2026
@svlandeg
Copy link
Member

@dilanmelvin: you've asked for a review by copilot, so can you address its review comments?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

result_callback is ignored when only one subcommand exists

3 participants