From 192590e5af71a5c6cb5388197efd2b87dee97b96 Mon Sep 17 00:00:00 2001 From: Patrick Surry Date: Tue, 22 Feb 2022 19:35:57 -0500 Subject: [PATCH 1/5] Fixes powershell completion with incomplete word --- typer/_completion_click7.py | 5 ++++- typer/_completion_click8.py | 5 ++++- typer/_completion_shared.py | 2 ++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/typer/_completion_click7.py b/typer/_completion_click7.py index 9f4ad73f30..58275be5f2 100644 --- a/typer/_completion_click7.py +++ b/typer/_completion_click7.py @@ -96,8 +96,11 @@ def do_fish_complete(cli: click.Command, prog_name: str) -> bool: def do_powershell_complete(cli: click.Command, prog_name: str) -> bool: completion_args = os.getenv("_TYPER_COMPLETE_ARGS", "") incomplete = os.getenv("_TYPER_COMPLETE_WORD_TO_COMPLETE", "") + cursor = os.getenv("_TYPER_CURSOR_POSITION") + if cursor: + completion_args = completion_args[:int(cursor)] cwords = click.parser.split_arg_string(completion_args) - args = cwords[1:] + args = cwords[1:-1] if incomplete else cwords[1:] for item, help in click._bashcomplete.get_choices(cli, prog_name, args, incomplete): click.echo(f"{item}:::{help or ' '}") diff --git a/typer/_completion_click8.py b/typer/_completion_click8.py index 54e2b03d6f..cb766ca621 100644 --- a/typer/_completion_click8.py +++ b/typer/_completion_click8.py @@ -174,8 +174,11 @@ def source_vars(self) -> Dict[str, Any]: def get_completion_args(self) -> Tuple[List[str], str]: completion_args = os.getenv("_TYPER_COMPLETE_ARGS", "") incomplete = os.getenv("_TYPER_COMPLETE_WORD_TO_COMPLETE", "") + cursor = os.getenv("_TYPER_CURSOR_POSITION") + if cursor: + completion_args = completion_args[:int(cursor)] cwords = click.parser.split_arg_string(completion_args) - args = cwords[1:] + args = cwords[1:-1] if incomplete else cwords[1:] return args, incomplete def format_completion(self, item: click.shell_completion.CompletionItem) -> str: diff --git a/typer/_completion_shared.py b/typer/_completion_shared.py index 7cbaf98d75..0d7e1cbae1 100644 --- a/typer/_completion_shared.py +++ b/typer/_completion_shared.py @@ -57,6 +57,7 @@ class Shells(str, Enum): $Env:%(autocomplete_var)s = "complete_powershell" $Env:_TYPER_COMPLETE_ARGS = $commandAst.ToString() $Env:_TYPER_COMPLETE_WORD_TO_COMPLETE = $wordToComplete + $Env:_TYPER_CURSOR_POSITION = $cursorPosition %(prog_name)s | ForEach-Object { $commandArray = $_ -Split ":::" $command = $commandArray[0] @@ -67,6 +68,7 @@ class Shells(str, Enum): $Env:%(autocomplete_var)s = "" $Env:_TYPER_COMPLETE_ARGS = "" $Env:_TYPER_COMPLETE_WORD_TO_COMPLETE = "" + $Env:_TYPER_CURSOR_POSITION = "" } Register-ArgumentCompleter -Native -CommandName %(prog_name)s -ScriptBlock $scriptblock """ From 148e1b28a45e19c68d66e5542c548b3cdfb410aa Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 16 Dec 2022 20:49:47 +0000 Subject: [PATCH 2/5] =?UTF-8?q?=F0=9F=8E=A8=20[pre-commit.ci]=20Auto=20for?= =?UTF-8?q?mat=20from=20pre-commit.com=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typer/_completion_click7.py | 4 ++-- typer/_completion_click8.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/typer/_completion_click7.py b/typer/_completion_click7.py index 58275be5f2..4963149804 100644 --- a/typer/_completion_click7.py +++ b/typer/_completion_click7.py @@ -98,9 +98,9 @@ def do_powershell_complete(cli: click.Command, prog_name: str) -> bool: incomplete = os.getenv("_TYPER_COMPLETE_WORD_TO_COMPLETE", "") cursor = os.getenv("_TYPER_CURSOR_POSITION") if cursor: - completion_args = completion_args[:int(cursor)] + completion_args = completion_args[: int(cursor)] cwords = click.parser.split_arg_string(completion_args) - args = cwords[1:-1] if incomplete else cwords[1:] + args = cwords[1:-1] if incomplete else cwords[1:] for item, help in click._bashcomplete.get_choices(cli, prog_name, args, incomplete): click.echo(f"{item}:::{help or ' '}") diff --git a/typer/_completion_click8.py b/typer/_completion_click8.py index cb766ca621..739f466b93 100644 --- a/typer/_completion_click8.py +++ b/typer/_completion_click8.py @@ -176,9 +176,9 @@ def get_completion_args(self) -> Tuple[List[str], str]: incomplete = os.getenv("_TYPER_COMPLETE_WORD_TO_COMPLETE", "") cursor = os.getenv("_TYPER_CURSOR_POSITION") if cursor: - completion_args = completion_args[:int(cursor)] + completion_args = completion_args[: int(cursor)] cwords = click.parser.split_arg_string(completion_args) - args = cwords[1:-1] if incomplete else cwords[1:] + args = cwords[1:-1] if incomplete else cwords[1:] return args, incomplete def format_completion(self, item: click.shell_completion.CompletionItem) -> str: From 997b122e82f960439d31a33516a0b248a94bd3da Mon Sep 17 00:00:00 2001 From: svlandeg Date: Tue, 16 Jul 2024 16:10:26 +0200 Subject: [PATCH 3/5] Add completion test for powershell --- .../test_tutorial003.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/tests/test_tutorial/test_options_autocompletion/test_tutorial003.py b/tests/test_tutorial/test_options_autocompletion/test_tutorial003.py index ebd1e066ba..60304e9e55 100644 --- a/tests/test_tutorial/test_options_autocompletion/test_tutorial003.py +++ b/tests/test_tutorial/test_options_autocompletion/test_tutorial003.py @@ -9,7 +9,7 @@ runner = CliRunner() -def test_completion(): +def test_completion_zsh(): result = subprocess.run( [sys.executable, "-m", "coverage", "run", mod.__file__, " "], capture_output=True, @@ -25,6 +25,23 @@ def test_completion(): assert "Sebastian" in result.stdout +def test_completion_powershell(): + result = subprocess.run( + [sys.executable, "-m", "coverage", "run", mod.__file__, " "], + capture_output=True, + encoding="utf-8", + env={ + **os.environ, + "_TUTORIAL003.PY_COMPLETE": "complete_powershell", + "_TYPER_COMPLETE_ARGS": "tutorial003.py --name Seb", + "_TYPER_COMPLETE_WORD_TO_COMPLETE": "Seb", + }, + ) + assert "Camila" not in result.stdout + assert "Carlos" not in result.stdout + assert "Sebastian" in result.stdout + + def test_1(): result = runner.invoke(mod.app, ["--name", "Camila"]) assert result.exit_code == 0 From bda183eb6faab209d3637cb1b53cb3a97a502ec4 Mon Sep 17 00:00:00 2001 From: svlandeg Date: Tue, 16 Jul 2024 16:19:41 +0200 Subject: [PATCH 4/5] Remove unnecessary bits using _TYPER_CURSOR_POSITION --- typer/_completion_classes.py | 3 --- typer/_completion_shared.py | 2 -- 2 files changed, 5 deletions(-) diff --git a/typer/_completion_classes.py b/typer/_completion_classes.py index 99fae33b1c..71ba031860 100644 --- a/typer/_completion_classes.py +++ b/typer/_completion_classes.py @@ -174,9 +174,6 @@ def source_vars(self) -> Dict[str, Any]: def get_completion_args(self) -> Tuple[List[str], str]: completion_args = os.getenv("_TYPER_COMPLETE_ARGS", "") incomplete = os.getenv("_TYPER_COMPLETE_WORD_TO_COMPLETE", "") - cursor = os.getenv("_TYPER_CURSOR_POSITION") - if cursor: - completion_args = completion_args[: int(cursor)] cwords = click.parser.split_arg_string(completion_args) args = cwords[1:-1] if incomplete else cwords[1:] return args, incomplete diff --git a/typer/_completion_shared.py b/typer/_completion_shared.py index f2703fd451..10de54420d 100644 --- a/typer/_completion_shared.py +++ b/typer/_completion_shared.py @@ -53,7 +53,6 @@ class Shells(str, Enum): $Env:%(autocomplete_var)s = "complete_powershell" $Env:_TYPER_COMPLETE_ARGS = $commandAst.ToString() $Env:_TYPER_COMPLETE_WORD_TO_COMPLETE = $wordToComplete - $Env:_TYPER_CURSOR_POSITION = $cursorPosition %(prog_name)s | ForEach-Object { $commandArray = $_ -Split ":::" $command = $commandArray[0] @@ -64,7 +63,6 @@ class Shells(str, Enum): $Env:%(autocomplete_var)s = "" $Env:_TYPER_COMPLETE_ARGS = "" $Env:_TYPER_COMPLETE_WORD_TO_COMPLETE = "" - $Env:_TYPER_CURSOR_POSITION = "" } Register-ArgumentCompleter -Native -CommandName %(prog_name)s -ScriptBlock $scriptblock """ From 796fd325c341839890a48edd9d163b233b256378 Mon Sep 17 00:00:00 2001 From: svlandeg Date: Tue, 16 Jul 2024 16:20:02 +0200 Subject: [PATCH 5/5] Add equivalent test in _an test file --- .../test_tutorial003_an.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/tests/test_tutorial/test_options_autocompletion/test_tutorial003_an.py b/tests/test_tutorial/test_options_autocompletion/test_tutorial003_an.py index 8f12583e80..7688f108f5 100644 --- a/tests/test_tutorial/test_options_autocompletion/test_tutorial003_an.py +++ b/tests/test_tutorial/test_options_autocompletion/test_tutorial003_an.py @@ -9,7 +9,7 @@ runner = CliRunner() -def test_completion(): +def test_completion_zsh(): result = subprocess.run( [sys.executable, "-m", "coverage", "run", mod.__file__, " "], capture_output=True, @@ -25,6 +25,23 @@ def test_completion(): assert "Sebastian" in result.stdout +def test_completion_powershell(): + result = subprocess.run( + [sys.executable, "-m", "coverage", "run", mod.__file__, " "], + capture_output=True, + encoding="utf-8", + env={ + **os.environ, + "_TUTORIAL003_AN.PY_COMPLETE": "complete_powershell", + "_TYPER_COMPLETE_ARGS": "tutorial003.py --name Seb", + "_TYPER_COMPLETE_WORD_TO_COMPLETE": "Seb", + }, + ) + assert "Camila" not in result.stdout + assert "Carlos" not in result.stdout + assert "Sebastian" in result.stdout + + def test_1(): result = runner.invoke(mod.app, ["--name", "Camila"]) assert result.exit_code == 0