From d95da30a19bb79d12f419c768b9bb366fe04b14d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 5 Nov 2022 15:47:48 +0100 Subject: [PATCH 1/6] =?UTF-8?q?=E2=9C=A8=20Make=20typer.run()=20not=20add?= =?UTF-8?q?=20completion=20scripts=20by=20default,=20it=20only=20makes=20s?= =?UTF-8?q?ense=20in=20installed=20apps?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- typer/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/typer/main.py b/typer/main.py index e17c4b2b8..f493e544e 100644 --- a/typer/main.py +++ b/typer/main.py @@ -1045,6 +1045,6 @@ def wrapper(ctx: click.Context, args: List[str], incomplete: Optional[str]) -> A def run(function: Callable[..., Any]) -> None: - app = Typer() + app = Typer(add_completion=False) app.command()(function) app() From ce97b926da1ae8442197d7c6b529f74ee5e6515b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 5 Nov 2022 17:02:12 +0100 Subject: [PATCH 2/6] =?UTF-8?q?=F0=9F=93=9D=20Update=20docs=20about=20CLI?= =?UTF-8?q?=20Option=20autocompletion,=20move=20it=20to=20its=20own=20sect?= =?UTF-8?q?ion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/tutorial/commands/index.md | 40 ++++++++++++++++++- ...ompletion.md => options-autocompletion.md} | 24 +++++------ .../tutorial001.py | 5 ++- .../tutorial002.py | 6 ++- .../tutorial003.py | 6 ++- .../tutorial004.py | 6 ++- .../tutorial005.py | 6 ++- .../tutorial006.py | 5 ++- .../tutorial007.py | 6 ++- .../tutorial008.py | 6 ++- .../tutorial009.py | 6 ++- mkdocs.yml | 2 +- 12 files changed, 95 insertions(+), 23 deletions(-) rename docs/tutorial/{options/autocompletion.md => options-autocompletion.md} (95%) rename docs_src/{options/autocompletion => options_autocompletion}/tutorial001.py (76%) rename docs_src/{options/autocompletion => options_autocompletion}/tutorial002.py (84%) rename docs_src/{options/autocompletion => options_autocompletion}/tutorial003.py (90%) rename docs_src/{options/autocompletion => options_autocompletion}/tutorial004.py (92%) rename docs_src/{options/autocompletion => options_autocompletion}/tutorial005.py (91%) rename docs_src/{options/autocompletion => options_autocompletion}/tutorial006.py (82%) rename docs_src/{options/autocompletion => options_autocompletion}/tutorial007.py (93%) rename docs_src/{options/autocompletion => options_autocompletion}/tutorial008.py (93%) rename docs_src/{options/autocompletion => options_autocompletion}/tutorial009.py (94%) diff --git a/docs/tutorial/commands/index.md b/docs/tutorial/commands/index.md index 0aaf8cd49..373f1187d 100644 --- a/docs/tutorial/commands/index.md +++ b/docs/tutorial/commands/index.md @@ -76,7 +76,7 @@ When you use `typer.run()`, **Typer** is doing more or less the same as above, i In our case, this decorator tells **Typer** that the function below is a "`command`". -Both ways, with `typer.run()` and creating the explicit application, achieve the same. +Both ways, with `typer.run()` and creating the explicit application, achieve almost the same. !!! tip If your use case is solved with just `typer.run()`, that's fine, you don't have to create the explicit `app` and use `@app.command()`, etc. @@ -114,6 +114,44 @@ Options: +## CLI application completion + +There's a little detail that is worth noting here. + +To get shell/tab completion, it's necessary to build a package that you and your users can install and **call directly**. + +So instead of running a Python script like: + +
+ +```console +$ python main.py + +✨ Some magic here ✨ +``` + +
+ +...It would be called like: + +
+ +```console +$ magic-app + +✨ Some magic here ✨ +``` + +
+ +Having a standalone program like that allows setting up shell/tab completion. + +The first step to be able to create an installable package like that is to use an explicit `typer.Typer()` app. + +Later you can learn all the process to create a standalone CLI application and [Build a Package](../package.md){.internal-link target=_blank}. + +But for now, it's just good to know that you are on that path. 😎 + ## A CLI application with multiple commands Coming back to the CLI applications with multiple commands/subcommands, **Typer** allows creating CLI applications with multiple of them. diff --git a/docs/tutorial/options/autocompletion.md b/docs/tutorial/options-autocompletion.md similarity index 95% rename from docs/tutorial/options/autocompletion.md rename to docs/tutorial/options-autocompletion.md index c52273847..a49cd6247 100644 --- a/docs/tutorial/options/autocompletion.md +++ b/docs/tutorial/options-autocompletion.md @@ -12,10 +12,10 @@ After installing completion (for your own Python package or for **Typer CLI**), To check it quickly without creating a new Python package, install [Typer CLI](../../typer-cli.md){.internal-link target=_blank}. -Then let's create small example script: +Then let's create small example program: ```Python -{!../docs_src/options/autocompletion/tutorial001.py!} +{!../docs_src/options_autocompletion/tutorial001.py!} ``` And let's try it with **Typer CLI** to get completion: @@ -50,8 +50,8 @@ Right now we get completion for the *CLI option* names, but not for the values. We can provide completion for the values creating an `autocompletion` function, similar to the `callback` functions from [CLI Option Callback and Context](./callback-and-context.md){.internal-link target=_blank}: -```Python hl_lines="4 5 10" -{!../docs_src/options/autocompletion/tutorial002.py!} +```Python hl_lines="4-5 14" +{!../docs_src/options_autocompletion/tutorial002.py!} ``` We return a `list` of strings from the `complete_name()` function. @@ -82,7 +82,7 @@ Modify the `complete_name()` function to receive a parameter of type `str`, it w Then we can check and return only the values that start with the incomplete value from the command line: ```Python hl_lines="6 7 8 9 10 11" -{!../docs_src/options/autocompletion/tutorial003.py!} +{!../docs_src/options_autocompletion/tutorial003.py!} ``` Now let's try it: @@ -120,7 +120,7 @@ In the `complete_name()` function, instead of providing one `str` per completion So, in the end, we return a `list` of `tuples` of `str`: ```Python hl_lines="3 4 5 6 7 10 11 12 13 14 15 16" -{!../docs_src/options/autocompletion/tutorial004.py!} +{!../docs_src/options_autocompletion/tutorial004.py!} ``` !!! tip @@ -157,7 +157,7 @@ Instead of creating and returning a list with values (`str` or `tuple`), we can That way our function will be a generator that **Typer** (actually Click) can iterate: ```Python hl_lines="10 11 12 13" -{!../docs_src/options/autocompletion/tutorial005.py!} +{!../docs_src/options_autocompletion/tutorial005.py!} ``` That simplifies our code a bit and works the same. @@ -185,8 +185,8 @@ So, we will allow multiple `--name` *CLI options*. For this we use a `List` of `str`: -```Python hl_lines="6 7 8" -{!../docs_src/options/autocompletion/tutorial006.py!} +```Python hl_lines="8-11" +{!../docs_src/options_autocompletion/tutorial006.py!} ``` And then we can use it like: @@ -213,7 +213,7 @@ But you can access the context by declaring a function parameter of type `typer. And from that context you can get the current values for each parameter. ```Python hl_lines="12 13 15" -{!../docs_src/options/autocompletion/tutorial007.py!} +{!../docs_src/options_autocompletion/tutorial007.py!} ``` We are getting the `names` already provided with `--name` in the command line before this completion was triggered. @@ -282,7 +282,7 @@ You can print to "standard error" with a **Rich** `Console(stderr=True)`. Using `stderr=True` tells **Rich** that the output should be shown in "standard error". ```Python hl_lines="12 15-16" -{!../docs_src/options/autocompletion/tutorial008.py!} +{!../docs_src/options_autocompletion/tutorial008.py!} ``` !!! info @@ -323,7 +323,7 @@ Sebastian -- The type hints guy. Of course, you can declare everything if you need it, the context, the raw *CLI parameters*, and the incomplete `str`: ```Python hl_lines="15" -{!../docs_src/options/autocompletion/tutorial009.py!} +{!../docs_src/options_autocompletion/tutorial009.py!} ``` Check it: diff --git a/docs_src/options/autocompletion/tutorial001.py b/docs_src/options_autocompletion/tutorial001.py similarity index 76% rename from docs_src/options/autocompletion/tutorial001.py rename to docs_src/options_autocompletion/tutorial001.py index 436615810..1cfc18cc2 100644 --- a/docs_src/options/autocompletion/tutorial001.py +++ b/docs_src/options_autocompletion/tutorial001.py @@ -1,9 +1,12 @@ import typer +app = typer.Typer() + +@app.command() def main(name: str = typer.Option("World", help="The name to say hi to.")): print(f"Hello {name}") if __name__ == "__main__": - typer.run(main) + app() diff --git a/docs_src/options/autocompletion/tutorial002.py b/docs_src/options_autocompletion/tutorial002.py similarity index 84% rename from docs_src/options/autocompletion/tutorial002.py rename to docs_src/options_autocompletion/tutorial002.py index bca95374c..8b18760d4 100644 --- a/docs_src/options/autocompletion/tutorial002.py +++ b/docs_src/options_autocompletion/tutorial002.py @@ -5,6 +5,10 @@ def complete_name(): return ["Camila", "Carlos", "Sebastian"] +app = typer.Typer() + + +@app.command() def main( name: str = typer.Option( "World", help="The name to say hi to.", autocompletion=complete_name @@ -14,4 +18,4 @@ def main( if __name__ == "__main__": - typer.run(main) + app() diff --git a/docs_src/options/autocompletion/tutorial003.py b/docs_src/options_autocompletion/tutorial003.py similarity index 90% rename from docs_src/options/autocompletion/tutorial003.py rename to docs_src/options_autocompletion/tutorial003.py index 4e7996714..b2fe53402 100644 --- a/docs_src/options/autocompletion/tutorial003.py +++ b/docs_src/options_autocompletion/tutorial003.py @@ -11,6 +11,10 @@ def complete_name(incomplete: str): return completion +app = typer.Typer() + + +@app.command() def main( name: str = typer.Option( "World", help="The name to say hi to.", autocompletion=complete_name @@ -20,4 +24,4 @@ def main( if __name__ == "__main__": - typer.run(main) + app() diff --git a/docs_src/options/autocompletion/tutorial004.py b/docs_src/options_autocompletion/tutorial004.py similarity index 92% rename from docs_src/options/autocompletion/tutorial004.py rename to docs_src/options_autocompletion/tutorial004.py index 9ebc7f910..9bb08dd19 100644 --- a/docs_src/options/autocompletion/tutorial004.py +++ b/docs_src/options_autocompletion/tutorial004.py @@ -16,6 +16,10 @@ def complete_name(incomplete: str): return completion +app = typer.Typer() + + +@app.command() def main( name: str = typer.Option( "World", help="The name to say hi to.", autocompletion=complete_name @@ -25,4 +29,4 @@ def main( if __name__ == "__main__": - typer.run(main) + app() diff --git a/docs_src/options/autocompletion/tutorial005.py b/docs_src/options_autocompletion/tutorial005.py similarity index 91% rename from docs_src/options/autocompletion/tutorial005.py rename to docs_src/options_autocompletion/tutorial005.py index bc467e976..d6efb4fe1 100644 --- a/docs_src/options/autocompletion/tutorial005.py +++ b/docs_src/options_autocompletion/tutorial005.py @@ -13,6 +13,10 @@ def complete_name(incomplete: str): yield (name, help_text) +app = typer.Typer() + + +@app.command() def main( name: str = typer.Option( "World", help="The name to say hi to.", autocompletion=complete_name @@ -22,4 +26,4 @@ def main( if __name__ == "__main__": - typer.run(main) + app() diff --git a/docs_src/options/autocompletion/tutorial006.py b/docs_src/options_autocompletion/tutorial006.py similarity index 82% rename from docs_src/options/autocompletion/tutorial006.py rename to docs_src/options_autocompletion/tutorial006.py index b89901824..4e6dba302 100644 --- a/docs_src/options/autocompletion/tutorial006.py +++ b/docs_src/options_autocompletion/tutorial006.py @@ -2,11 +2,14 @@ import typer +app = typer.Typer() + +@app.command() def main(name: List[str] = typer.Option(["World"], help="The name to say hi to.")): for each_name in name: print(f"Hello {each_name}") if __name__ == "__main__": - typer.run(main) + app() diff --git a/docs_src/options/autocompletion/tutorial007.py b/docs_src/options_autocompletion/tutorial007.py similarity index 93% rename from docs_src/options/autocompletion/tutorial007.py rename to docs_src/options_autocompletion/tutorial007.py index 00b6e86db..c60dfe95d 100644 --- a/docs_src/options/autocompletion/tutorial007.py +++ b/docs_src/options_autocompletion/tutorial007.py @@ -16,6 +16,10 @@ def complete_name(ctx: typer.Context, incomplete: str): yield (name, help_text) +app = typer.Typer() + + +@app.command() def main( name: List[str] = typer.Option( ["World"], help="The name to say hi to.", autocompletion=complete_name @@ -26,4 +30,4 @@ def main( if __name__ == "__main__": - typer.run(main) + app() diff --git a/docs_src/options/autocompletion/tutorial008.py b/docs_src/options_autocompletion/tutorial008.py similarity index 93% rename from docs_src/options/autocompletion/tutorial008.py rename to docs_src/options_autocompletion/tutorial008.py index 70433eac1..f90073b15 100644 --- a/docs_src/options/autocompletion/tutorial008.py +++ b/docs_src/options_autocompletion/tutorial008.py @@ -19,6 +19,10 @@ def complete_name(args: List[str], incomplete: str): yield (name, help_text) +app = typer.Typer() + + +@app.command() def main( name: List[str] = typer.Option( ["World"], help="The name to say hi to.", autocompletion=complete_name @@ -29,4 +33,4 @@ def main( if __name__ == "__main__": - typer.run(main) + app() diff --git a/docs_src/options/autocompletion/tutorial009.py b/docs_src/options_autocompletion/tutorial009.py similarity index 94% rename from docs_src/options/autocompletion/tutorial009.py rename to docs_src/options_autocompletion/tutorial009.py index ea10d4e79..829f20903 100644 --- a/docs_src/options/autocompletion/tutorial009.py +++ b/docs_src/options_autocompletion/tutorial009.py @@ -20,6 +20,10 @@ def complete_name(ctx: typer.Context, args: List[str], incomplete: str): yield (name, help_text) +app = typer.Typer() + + +@app.command() def main( name: List[str] = typer.Option( ["World"], help="The name to say hi to.", autocompletion=complete_name @@ -30,4 +34,4 @@ def main( if __name__ == "__main__": - typer.run(main) + app() diff --git a/mkdocs.yml b/mkdocs.yml index a0b0f7cc4..ed0786340 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -41,7 +41,6 @@ nav: - CLI Option Name: tutorial/options/name.md - CLI Option Callback and Context: tutorial/options/callback-and-context.md - Version CLI Option, is_eager: tutorial/options/version.md - - CLI Option autocompletion: tutorial/options/autocompletion.md - Commands: - Commands Intro: tutorial/commands/index.md - Command CLI Arguments: tutorial/commands/arguments.md @@ -51,6 +50,7 @@ nav: - Typer Callback: tutorial/commands/callback.md - One or Multiple Commands: tutorial/commands/one-or-multiple.md - Using the Context: tutorial/commands/context.md + - CLI Option autocompletion: tutorial/options-autocompletion.md - CLI Parameter Types: - CLI Parameter Types Intro: tutorial/parameter-types/index.md - Number: tutorial/parameter-types/number.md From 1f4bf03c2eddb705bc2b28bece00682585d7d31e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 5 Nov 2022 17:02:49 +0100 Subject: [PATCH 3/6] =?UTF-8?q?=F0=9F=8E=A8=20Update=20and=20simplify=20hl?= =?UTF-8?q?=5Flines=20for=20options=20completion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/tutorial/options-autocompletion.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial/options-autocompletion.md b/docs/tutorial/options-autocompletion.md index a49cd6247..c22f964ae 100644 --- a/docs/tutorial/options-autocompletion.md +++ b/docs/tutorial/options-autocompletion.md @@ -81,7 +81,7 @@ Modify the `complete_name()` function to receive a parameter of type `str`, it w Then we can check and return only the values that start with the incomplete value from the command line: -```Python hl_lines="6 7 8 9 10 11" +```Python hl_lines="6-11" {!../docs_src/options_autocompletion/tutorial003.py!} ``` From 89c9332e844ff09a4dcdeb2b8f23d4fafcf3c0fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 5 Nov 2022 17:03:49 +0100 Subject: [PATCH 4/6] =?UTF-8?q?=E2=9C=85=20Update=20tests=20for=20CLI=20op?= =?UTF-8?q?tion=20completion?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__init__.py | 0 .../test_tutorial002.py | 8 ++------ .../test_tutorial003.py | 8 ++------ .../test_tutorial004.py | 10 +++------- .../test_tutorial007.py | 8 ++------ .../test_tutorial008.py | 8 ++------ .../test_tutorial009.py | 8 ++------ 7 files changed, 13 insertions(+), 37 deletions(-) rename tests/test_tutorial/{test_options/test_completion => test_options_autocompletion}/__init__.py (100%) rename tests/test_tutorial/{test_options/test_completion => test_options_autocompletion}/test_tutorial002.py (84%) rename tests/test_tutorial/{test_options/test_completion => test_options_autocompletion}/test_tutorial003.py (84%) rename tests/test_tutorial/{test_options/test_completion => test_options_autocompletion}/test_tutorial004.py (80%) rename tests/test_tutorial/{test_options/test_completion => test_options_autocompletion}/test_tutorial007.py (84%) rename tests/test_tutorial/{test_options/test_completion => test_options_autocompletion}/test_tutorial008.py (85%) rename tests/test_tutorial/{test_options/test_completion => test_options_autocompletion}/test_tutorial009.py (86%) diff --git a/tests/test_tutorial/test_options/test_completion/__init__.py b/tests/test_tutorial/test_options_autocompletion/__init__.py similarity index 100% rename from tests/test_tutorial/test_options/test_completion/__init__.py rename to tests/test_tutorial/test_options_autocompletion/__init__.py diff --git a/tests/test_tutorial/test_options/test_completion/test_tutorial002.py b/tests/test_tutorial/test_options_autocompletion/test_tutorial002.py similarity index 84% rename from tests/test_tutorial/test_options/test_completion/test_tutorial002.py rename to tests/test_tutorial/test_options_autocompletion/test_tutorial002.py index 593f28b53..c9d19700d 100644 --- a/tests/test_tutorial/test_options/test_completion/test_tutorial002.py +++ b/tests/test_tutorial/test_options_autocompletion/test_tutorial002.py @@ -1,16 +1,12 @@ import os import subprocess -import typer from typer.testing import CliRunner -from docs_src.options.autocompletion import tutorial002 as mod +from docs_src.options_autocompletion import tutorial002 as mod runner = CliRunner() -app = typer.Typer() -app.command()(mod.main) - def test_completion(): result = subprocess.run( @@ -31,7 +27,7 @@ def test_completion(): def test_1(): - result = runner.invoke(app, ["--name", "Camila"]) + result = runner.invoke(mod.app, ["--name", "Camila"]) assert result.exit_code == 0 assert "Hello Camila" in result.output diff --git a/tests/test_tutorial/test_options/test_completion/test_tutorial003.py b/tests/test_tutorial/test_options_autocompletion/test_tutorial003.py similarity index 84% rename from tests/test_tutorial/test_options/test_completion/test_tutorial003.py rename to tests/test_tutorial/test_options_autocompletion/test_tutorial003.py index fccb86764..77fee38cd 100644 --- a/tests/test_tutorial/test_options/test_completion/test_tutorial003.py +++ b/tests/test_tutorial/test_options_autocompletion/test_tutorial003.py @@ -1,16 +1,12 @@ import os import subprocess -import typer from typer.testing import CliRunner -from docs_src.options.autocompletion import tutorial003 as mod +from docs_src.options_autocompletion import tutorial003 as mod runner = CliRunner() -app = typer.Typer() -app.command()(mod.main) - def test_completion(): result = subprocess.run( @@ -31,7 +27,7 @@ def test_completion(): def test_1(): - result = runner.invoke(app, ["--name", "Camila"]) + result = runner.invoke(mod.app, ["--name", "Camila"]) assert result.exit_code == 0 assert "Hello Camila" in result.output diff --git a/tests/test_tutorial/test_options/test_completion/test_tutorial004.py b/tests/test_tutorial/test_options_autocompletion/test_tutorial004.py similarity index 80% rename from tests/test_tutorial/test_options/test_completion/test_tutorial004.py rename to tests/test_tutorial/test_options_autocompletion/test_tutorial004.py index 6ae5d9a83..f2d8dd367 100644 --- a/tests/test_tutorial/test_options/test_completion/test_tutorial004.py +++ b/tests/test_tutorial/test_options_autocompletion/test_tutorial004.py @@ -1,16 +1,12 @@ import os import subprocess -import typer from typer.testing import CliRunner -from docs_src.options.autocompletion import tutorial004 as mod +from docs_src.options_autocompletion import tutorial004 as mod runner = CliRunner() -app = typer.Typer() -app.command()(mod.main) - def test_completion(): result = subprocess.run( @@ -21,7 +17,7 @@ def test_completion(): env={ **os.environ, "_TUTORIAL004.PY_COMPLETE": "complete_zsh", - "_TYPER_COMPLETE_ARGS": "tutorial004.py --name ", + "_TYPER_COMPLETE_ARGS": "tutorial004_aux.py --name ", "_TYPER_COMPLETE_TESTING": "True", }, ) @@ -31,7 +27,7 @@ def test_completion(): def test_1(): - result = runner.invoke(app, ["--name", "Camila"]) + result = runner.invoke(mod.app, ["--name", "Camila"]) assert result.exit_code == 0 assert "Hello Camila" in result.output diff --git a/tests/test_tutorial/test_options/test_completion/test_tutorial007.py b/tests/test_tutorial/test_options_autocompletion/test_tutorial007.py similarity index 84% rename from tests/test_tutorial/test_options/test_completion/test_tutorial007.py rename to tests/test_tutorial/test_options_autocompletion/test_tutorial007.py index 097654163..c8bc08958 100644 --- a/tests/test_tutorial/test_options/test_completion/test_tutorial007.py +++ b/tests/test_tutorial/test_options_autocompletion/test_tutorial007.py @@ -1,16 +1,12 @@ import os import subprocess -import typer from typer.testing import CliRunner -from docs_src.options.autocompletion import tutorial007 as mod +from docs_src.options_autocompletion import tutorial007 as mod runner = CliRunner() -app = typer.Typer() -app.command()(mod.main) - def test_completion(): result = subprocess.run( @@ -31,7 +27,7 @@ def test_completion(): def test_1(): - result = runner.invoke(app, ["--name", "Camila", "--name", "Sebastian"]) + result = runner.invoke(mod.app, ["--name", "Camila", "--name", "Sebastian"]) assert result.exit_code == 0 assert "Hello Camila" in result.output assert "Hello Sebastian" in result.output diff --git a/tests/test_tutorial/test_options/test_completion/test_tutorial008.py b/tests/test_tutorial/test_options_autocompletion/test_tutorial008.py similarity index 85% rename from tests/test_tutorial/test_options/test_completion/test_tutorial008.py rename to tests/test_tutorial/test_options_autocompletion/test_tutorial008.py index 597d8f002..06a82affa 100644 --- a/tests/test_tutorial/test_options/test_completion/test_tutorial008.py +++ b/tests/test_tutorial/test_options_autocompletion/test_tutorial008.py @@ -1,16 +1,12 @@ import os import subprocess -import typer from typer.testing import CliRunner -from docs_src.options.autocompletion import tutorial008 as mod +from docs_src.options_autocompletion import tutorial008 as mod runner = CliRunner() -app = typer.Typer() -app.command()(mod.main) - def test_completion(): result = subprocess.run( @@ -33,7 +29,7 @@ def test_completion(): def test_1(): - result = runner.invoke(app, ["--name", "Camila", "--name", "Sebastian"]) + result = runner.invoke(mod.app, ["--name", "Camila", "--name", "Sebastian"]) assert result.exit_code == 0 assert "Hello Camila" in result.output assert "Hello Sebastian" in result.output diff --git a/tests/test_tutorial/test_options/test_completion/test_tutorial009.py b/tests/test_tutorial/test_options_autocompletion/test_tutorial009.py similarity index 86% rename from tests/test_tutorial/test_options/test_completion/test_tutorial009.py rename to tests/test_tutorial/test_options_autocompletion/test_tutorial009.py index 8e5290806..692da7ec6 100644 --- a/tests/test_tutorial/test_options/test_completion/test_tutorial009.py +++ b/tests/test_tutorial/test_options_autocompletion/test_tutorial009.py @@ -1,16 +1,12 @@ import os import subprocess -import typer from typer.testing import CliRunner -from docs_src.options.autocompletion import tutorial009 as mod +from docs_src.options_autocompletion import tutorial009 as mod runner = CliRunner() -app = typer.Typer() -app.command()(mod.main) - def test_completion(): result = subprocess.run( @@ -33,7 +29,7 @@ def test_completion(): def test_1(): - result = runner.invoke(app, ["--name", "Camila", "--name", "Sebastian"]) + result = runner.invoke(mod.app, ["--name", "Camila", "--name", "Sebastian"]) assert result.exit_code == 0 assert "Hello Camila" in result.output assert "Hello Sebastian" in result.output From 9f3e22d44fdb06bab4d3433d824dec8094dfb5f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 5 Nov 2022 17:04:17 +0100 Subject: [PATCH 5/6] =?UTF-8?q?=E2=9C=85=20Update=20tests=20for=20completi?= =?UTF-8?q?on=20to=20use=20a=20full=20app=20and=20not=20a=20typer.run=20sc?= =?UTF-8?q?ript?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/test_completion/test_completion.py | 2 +- tests/test_completion/test_completion_install.py | 2 +- tests/test_completion/test_completion_show.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_completion/test_completion.py b/tests/test_completion/test_completion.py index d7ec6d3c6..ee128a382 100644 --- a/tests/test_completion/test_completion.py +++ b/tests/test_completion/test_completion.py @@ -3,7 +3,7 @@ import sys from pathlib import Path -from docs_src.first_steps import tutorial001 as mod +from docs_src.commands.index import tutorial001 as mod def test_show_completion(): diff --git a/tests/test_completion/test_completion_install.py b/tests/test_completion/test_completion_install.py index 7862fb6b8..d7c96b95b 100644 --- a/tests/test_completion/test_completion_install.py +++ b/tests/test_completion/test_completion_install.py @@ -7,7 +7,7 @@ import typer from typer.testing import CliRunner -from docs_src.first_steps import tutorial001 as mod +from docs_src.commands.index import tutorial001 as mod runner = CliRunner() app = typer.Typer() diff --git a/tests/test_completion/test_completion_show.py b/tests/test_completion/test_completion_show.py index 669815d54..6996fed36 100644 --- a/tests/test_completion/test_completion_show.py +++ b/tests/test_completion/test_completion_show.py @@ -1,7 +1,7 @@ import os import subprocess -from docs_src.first_steps import tutorial001 as mod +from docs_src.commands.index import tutorial001 as mod def test_completion_show_no_shell(): From a50570ea955c4fba2e8ee4d74bed37ab80d57c84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 5 Nov 2022 17:04:59 +0100 Subject: [PATCH 6/6] =?UTF-8?q?=F0=9F=94=A7=20Add=20pytest=20configs=20and?= =?UTF-8?q?=20filterwarnings?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 15e100bb7..b79661362 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -74,3 +74,19 @@ skip_glob = [ "docs_src/subcommands/tutorial003/lands.py", "docs_src/subcommands/tutorial003/main.py", ] + +[tool.pytest.ini_options] +addopts = [ + "--strict-config", + "--strict-markers", +] +xfail_strict = true +junit_family = "xunit2" +filterwarnings = [ + "error", + # TODO: until I refactor completion to use the new shell_complete + "ignore:'autocompletion' is renamed to 'shell_complete'. The old name is deprecated and will be removed in Click 8.1. See the docs about 'Parameter' for information about new behavior.:DeprecationWarning:typer", + 'ignore:starlette.middleware.wsgi is deprecated and will be removed in a future release\..*:DeprecationWarning:starlette', + # For pytest-xdist + 'ignore::DeprecationWarning:xdist', +]