diff --git a/tests/assets/completion_argument.py b/tests/assets/completion_argument.py new file mode 100644 index 0000000000..f91e2b7cfb --- /dev/null +++ b/tests/assets/completion_argument.py @@ -0,0 +1,22 @@ +import click +import typer + +app = typer.Typer() + + +def shell_complete(ctx: click.Context, param: click.Parameter, incomplete: str): + typer.echo(f"ctx: {ctx.info_name}", err=True) + typer.echo(f"arg is: {param.name}", err=True) + typer.echo(f"incomplete is: {incomplete}", err=True) + return ["Emma"] + + +@app.command(context_settings={"auto_envvar_prefix": "TEST"}) +def main(name: str = typer.Argument(shell_complete=shell_complete)): + """ + Say hello. + """ + + +if __name__ == "__main__": + app() diff --git a/tests/test_others.py b/tests/test_others.py index 8c78520029..a577369b16 100644 --- a/tests/test_others.py +++ b/tests/test_others.py @@ -141,6 +141,25 @@ def main(name: str = typer.Option(..., callback=name_callback)): assert "value is: Camila" in result.stdout +def test_completion_argument(): + file_path = Path(__file__).parent / "assets/completion_argument.py" + result = subprocess.run( + [sys.executable, "-m", "coverage", "run", str(file_path), "E"], + capture_output=True, + encoding="utf-8", + env={ + **os.environ, + "_COMPLETION_ARGUMENT.PY_COMPLETE": "complete_zsh", + "_TYPER_COMPLETE_ARGS": "completion_argument.py E", + "_TYPER_COMPLETE_TESTING": "True", + }, + ) + assert "Emma" in result.stdout or "_files" in result.stdout + assert "ctx: completion_argument" in result.stderr + assert "arg is: name" in result.stderr + assert "incomplete is: E" in result.stderr + + def test_completion_untyped_parameters(): file_path = Path(__file__).parent / "assets/completion_no_types.py" result = subprocess.run( diff --git a/typer/main.py b/typer/main.py index 9db26975ca..c853f1e740 100644 --- a/typer/main.py +++ b/typer/main.py @@ -947,6 +947,7 @@ def get_click_param( expose_value=parameter_info.expose_value, is_eager=parameter_info.is_eager, envvar=parameter_info.envvar, + shell_complete=parameter_info.shell_complete, autocompletion=get_param_completion(parameter_info.autocompletion), # Rich settings rich_help_panel=parameter_info.rich_help_panel,