From 7bd45971a02c50ef41eeb9d1bc8f4be513065452 Mon Sep 17 00:00:00 2001 From: Matthieu LAURENT Date: Fri, 1 Mar 2024 14:36:46 +0100 Subject: [PATCH 01/17] Add StrEnum example for python 3.11+ --- docs/tutorial/parameter-types/enum.md | 22 ++++++++++++++++--- .../parameter_types/enum/tutorial001_v3_11.py | 17 ++++++++++++++ .../enum/tutorial002_an_v3_11.py | 22 +++++++++++++++++++ 3 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 docs_src/parameter_types/enum/tutorial001_v3_11.py create mode 100644 docs_src/parameter_types/enum/tutorial002_an_v3_11.py diff --git a/docs/tutorial/parameter-types/enum.md b/docs/tutorial/parameter-types/enum.md index 767c329b27..5ef3dfacc8 100644 --- a/docs/tutorial/parameter-types/enum.md +++ b/docs/tutorial/parameter-types/enum.md @@ -1,8 +1,18 @@ To define a *CLI parameter* that can take a value from a predefined set of values you can use a standard Python `enum.Enum`: -```Python hl_lines="1 6 7 8 9 12 13" -{!../docs_src/parameter_types/enum/tutorial001.py!} -``` + +=== "Python 3.11+" + + ```Python hl_lines="1 6 7 8 9 12 13" + {!> ../docs_src/parameter_types/enum/tutorial001_v3_11.py!} + ``` + +=== "Python 3.6+" + + ```Python hl_lines="1 6 7 8 9 12 13" + {!> ../docs_src/parameter_types/enum/tutorial001.py!} + ``` + !!! tip Notice that the function parameter `network` will be an `Enum`, not a `str`. @@ -43,6 +53,12 @@ Error: Invalid value for '--network': invalid choice: capsule. (choose from simp You can make an `Enum` (choice) *CLI parameter* be case-insensitive with the `case_sensitive` parameter: +=== "Python 3.11+" + + ```Python hl_lines="15" + {!> ../docs_src/parameter_types/enum/tutorial002_an_v3_11.py!} + ``` + === "Python 3.6+" ```Python hl_lines="15" diff --git a/docs_src/parameter_types/enum/tutorial001_v3_11.py b/docs_src/parameter_types/enum/tutorial001_v3_11.py new file mode 100644 index 0000000000..929a5e165b --- /dev/null +++ b/docs_src/parameter_types/enum/tutorial001_v3_11.py @@ -0,0 +1,17 @@ +from enum import StrEnum + +import typer + + +class NeuralNetwork(StrEnum): + simple = "simple" + conv = "conv" + lstm = "lstm" + + +def main(network: NeuralNetwork = NeuralNetwork.simple): + print(f"Training neural network of type: {network.value}") + + +if __name__ == "__main__": + typer.run(main) diff --git a/docs_src/parameter_types/enum/tutorial002_an_v3_11.py b/docs_src/parameter_types/enum/tutorial002_an_v3_11.py new file mode 100644 index 0000000000..da3c7482d0 --- /dev/null +++ b/docs_src/parameter_types/enum/tutorial002_an_v3_11.py @@ -0,0 +1,22 @@ +from enum import StrEnum + +import typer +from typing_extensions import Annotated + + +class NeuralNetwork(StrEnum): + simple = "simple" + conv = "conv" + lstm = "lstm" + + +def main( + network: Annotated[ + NeuralNetwork, typer.Option(case_sensitive=False) + ] = NeuralNetwork.simple +): + print(f"Training neural network of type: {network.value}") + + +if __name__ == "__main__": + typer.run(main) From a18db2cc5b4fa21337265fb0f1c76d3b218da01d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 29 Mar 2024 10:16:37 +0000 Subject: [PATCH 02/17] =?UTF-8?q?=F0=9F=8E=A8=20[pre-commit.ci]=20Auto=20f?= =?UTF-8?q?ormat=20from=20pre-commit.com=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs_src/parameter_types/enum/tutorial002_an_v3_11.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs_src/parameter_types/enum/tutorial002_an_v3_11.py b/docs_src/parameter_types/enum/tutorial002_an_v3_11.py index da3c7482d0..8b9abc4113 100644 --- a/docs_src/parameter_types/enum/tutorial002_an_v3_11.py +++ b/docs_src/parameter_types/enum/tutorial002_an_v3_11.py @@ -13,7 +13,7 @@ class NeuralNetwork(StrEnum): def main( network: Annotated[ NeuralNetwork, typer.Option(case_sensitive=False) - ] = NeuralNetwork.simple + ] = NeuralNetwork.simple, ): print(f"Training neural network of type: {network.value}") From d9048979fedff19bc7ab4f98acc6d8779ab26ec8 Mon Sep 17 00:00:00 2001 From: svlandeg Date: Fri, 29 Mar 2024 11:17:32 +0100 Subject: [PATCH 03/17] update to Python 3.7 as support for 3.6 was recently dropped --- docs/tutorial/parameter-types/enum.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial/parameter-types/enum.md b/docs/tutorial/parameter-types/enum.md index b5e777da43..a3300d4aa7 100644 --- a/docs/tutorial/parameter-types/enum.md +++ b/docs/tutorial/parameter-types/enum.md @@ -7,7 +7,7 @@ To define a *CLI parameter* that can take a value from a predefined set of value {!> ../docs_src/parameter_types/enum/tutorial001_v3_11.py!} ``` -=== "Python 3.6+" +=== "Python 3.7+" ```Python hl_lines="1 6 7 8 9 12 13" {!> ../docs_src/parameter_types/enum/tutorial001.py!} From 96e12d6cac1857ba985cdbee3e1a8aabcd8eea8b Mon Sep 17 00:00:00 2001 From: svlandeg Date: Tue, 2 Apr 2024 17:56:45 +0200 Subject: [PATCH 04/17] Rename to clarify what the difference exactly is --- docs/tutorial/parameter-types/enum.md | 4 ++-- .../enum/{tutorial001_v3_11.py => tutorial001_str_enum.py} | 0 .../enum/{tutorial002_an_v3_11.py => tutorial002_str_enum.py} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename docs_src/parameter_types/enum/{tutorial001_v3_11.py => tutorial001_str_enum.py} (100%) rename docs_src/parameter_types/enum/{tutorial002_an_v3_11.py => tutorial002_str_enum.py} (100%) diff --git a/docs/tutorial/parameter-types/enum.md b/docs/tutorial/parameter-types/enum.md index a3300d4aa7..d7f4238b69 100644 --- a/docs/tutorial/parameter-types/enum.md +++ b/docs/tutorial/parameter-types/enum.md @@ -4,7 +4,7 @@ To define a *CLI parameter* that can take a value from a predefined set of value === "Python 3.11+" ```Python hl_lines="1 6 7 8 9 12 13" - {!> ../docs_src/parameter_types/enum/tutorial001_v3_11.py!} + {!> ../docs_src/parameter_types/enum/tutorial001_str_enum.py!} ``` === "Python 3.7+" @@ -64,7 +64,7 @@ You can make an `Enum` (choice) *CLI parameter* be case-insensitive with the `ca === "Python 3.11+" ```Python hl_lines="15" - {!> ../docs_src/parameter_types/enum/tutorial002_an_v3_11.py!} + {!> ../docs_src/parameter_types/enum/tutorial002_str_enum.py!} ``` === "Python 3.7+" diff --git a/docs_src/parameter_types/enum/tutorial001_v3_11.py b/docs_src/parameter_types/enum/tutorial001_str_enum.py similarity index 100% rename from docs_src/parameter_types/enum/tutorial001_v3_11.py rename to docs_src/parameter_types/enum/tutorial001_str_enum.py diff --git a/docs_src/parameter_types/enum/tutorial002_an_v3_11.py b/docs_src/parameter_types/enum/tutorial002_str_enum.py similarity index 100% rename from docs_src/parameter_types/enum/tutorial002_an_v3_11.py rename to docs_src/parameter_types/enum/tutorial002_str_enum.py From 918563e3b6f9c105872c42288fe736ad13916177 Mon Sep 17 00:00:00 2001 From: svlandeg Date: Tue, 2 Apr 2024 17:57:43 +0200 Subject: [PATCH 05/17] add unit tests --- .../test_enum/test_tutorial001_str_enum.py | 53 +++++++++++++++++++ .../test_enum/test_tutorial002_str_enum.py | 33 ++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001_str_enum.py create mode 100644 tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002_str_enum.py diff --git a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001_str_enum.py b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001_str_enum.py new file mode 100644 index 0000000000..c6314ce4e0 --- /dev/null +++ b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001_str_enum.py @@ -0,0 +1,53 @@ +import subprocess +import sys + +import typer +from typer.testing import CliRunner + +from docs_src.parameter_types.enum import tutorial001_str_enum as mod + +runner = CliRunner() + +app = typer.Typer() +app.command()(mod.main) + + +def test_help(): + result = runner.invoke(app, ["--help"]) + assert result.exit_code == 0 + assert "--network" in result.output + assert "[simple|conv|lstm]" in result.output + assert "default: simple" in result.output + + +def test_main(): + result = runner.invoke(app, ["--network", "conv"]) + assert result.exit_code == 0 + assert "Training neural network of type: conv" in result.output + + +def test_invalid_case(): + result = runner.invoke(app, ["--network", "CONV"]) + assert result.exit_code != 0 + assert "Invalid value for '--network': 'CONV' is not one of" in result.output + assert "simple" in result.output + assert "conv" in result.output + assert "lstm" in result.output + + +def test_invalid_other(): + result = runner.invoke(app, ["--network", "capsule"]) + assert result.exit_code != 0 + assert "Invalid value for '--network': 'capsule' is not one of" in result.output + assert "simple" in result.output + assert "conv" in result.output + assert "lstm" in result.output + + +def test_script(): + result = subprocess.run( + [sys.executable, "-m", "coverage", "run", mod.__file__, "--help"], + capture_output=True, + encoding="utf-8", + ) + assert "Usage" in result.stdout diff --git a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002_str_enum.py b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002_str_enum.py new file mode 100644 index 0000000000..ff9cccaede --- /dev/null +++ b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002_str_enum.py @@ -0,0 +1,33 @@ +import subprocess +import sys + +import typer +from typer.testing import CliRunner + +from docs_src.parameter_types.enum import tutorial002_str_enum as mod + +runner = CliRunner() + +app = typer.Typer() +app.command()(mod.main) + + +def test_upper(): + result = runner.invoke(app, ["--network", "CONV"]) + assert result.exit_code == 0 + assert "Training neural network of type: conv" in result.output + + +def test_mix(): + result = runner.invoke(app, ["--network", "LsTm"]) + assert result.exit_code == 0 + assert "Training neural network of type: lstm" in result.output + + +def test_script(): + result = subprocess.run( + [sys.executable, "-m", "coverage", "run", mod.__file__, "--help"], + capture_output=True, + encoding="utf-8", + ) + assert "Usage" in result.stdout From 2ebaa5e18397630dd0fec49d107087485a555c60 Mon Sep 17 00:00:00 2001 From: svlandeg Date: Fri, 12 Sep 2025 17:30:57 +0200 Subject: [PATCH 06/17] use pytest.param to simplify test suite --- ...al001_str_enum.py => tutorial001_py311.py} | 0 ...al002_str_enum.py => tutorial002_py311.py} | 0 .../test_enum/test_tutorial001.py | 32 ++++++++--- .../test_enum/test_tutorial001_str_enum.py | 53 ------------------- .../test_enum/test_tutorial002.py | 27 ++++++++-- .../test_enum/test_tutorial002_an.py | 33 ------------ .../test_enum/test_tutorial002_str_enum.py | 33 ------------ tests/utils.py | 4 ++ 8 files changed, 50 insertions(+), 132 deletions(-) rename docs_src/parameter_types/enum/{tutorial001_str_enum.py => tutorial001_py311.py} (100%) rename docs_src/parameter_types/enum/{tutorial002_str_enum.py => tutorial002_py311.py} (100%) delete mode 100644 tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001_str_enum.py delete mode 100644 tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002_an.py delete mode 100644 tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002_str_enum.py diff --git a/docs_src/parameter_types/enum/tutorial001_str_enum.py b/docs_src/parameter_types/enum/tutorial001_py311.py similarity index 100% rename from docs_src/parameter_types/enum/tutorial001_str_enum.py rename to docs_src/parameter_types/enum/tutorial001_py311.py diff --git a/docs_src/parameter_types/enum/tutorial002_str_enum.py b/docs_src/parameter_types/enum/tutorial002_py311.py similarity index 100% rename from docs_src/parameter_types/enum/tutorial002_str_enum.py rename to docs_src/parameter_types/enum/tutorial002_py311.py diff --git a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001.py b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001.py index 567a9d3486..5a09242ba4 100644 --- a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001.py +++ b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001.py @@ -1,18 +1,34 @@ +import importlib import subprocess import sys +import pytest import typer +from typer import Typer from typer.testing import CliRunner from docs_src.parameter_types.enum import tutorial001 as mod +from tests.utils import needs_py311 runner = CliRunner() -app = typer.Typer() -app.command()(mod.main) +@pytest.fixture( + name="app", + params=[ + "tutorial001", + pytest.param("tutorial001_py311", marks=needs_py311), + ], +) +def get_app(request: pytest.FixtureRequest): + mod = importlib.import_module(f"docs_src.parameter_types.enum.{request.param}") -def test_help(): + app = typer.Typer() + app.command()(mod.main) + return app + + +def test_help(app: Typer): result = runner.invoke(app, ["--help"]) assert result.exit_code == 0 assert "--network" in result.output @@ -20,19 +36,19 @@ def test_help(): assert "default: simple" in result.output -def test_main(): +def test_main(app: Typer): result = runner.invoke(app, ["--network", "conv"]) assert result.exit_code == 0 assert "Training neural network of type: conv" in result.output -def test_main_default(): +def test_main_default(app: Typer): result = runner.invoke(app) assert result.exit_code == 0 assert "Training neural network of type: simple" in result.output -def test_invalid_case(): +def test_invalid_case(app: Typer): result = runner.invoke(app, ["--network", "CONV"]) assert result.exit_code != 0 assert "Invalid value for '--network'" in result.output @@ -42,7 +58,7 @@ def test_invalid_case(): assert "lstm" in result.output -def test_invalid_other(): +def test_invalid_other(app: Typer): result = runner.invoke(app, ["--network", "capsule"]) assert result.exit_code != 0 assert "Invalid value for '--network'" in result.output @@ -52,7 +68,7 @@ def test_invalid_other(): assert "lstm" in result.output -def test_script(): +def test_script(app: Typer): result = subprocess.run( [sys.executable, "-m", "coverage", "run", mod.__file__, "--help"], capture_output=True, diff --git a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001_str_enum.py b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001_str_enum.py deleted file mode 100644 index c6314ce4e0..0000000000 --- a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001_str_enum.py +++ /dev/null @@ -1,53 +0,0 @@ -import subprocess -import sys - -import typer -from typer.testing import CliRunner - -from docs_src.parameter_types.enum import tutorial001_str_enum as mod - -runner = CliRunner() - -app = typer.Typer() -app.command()(mod.main) - - -def test_help(): - result = runner.invoke(app, ["--help"]) - assert result.exit_code == 0 - assert "--network" in result.output - assert "[simple|conv|lstm]" in result.output - assert "default: simple" in result.output - - -def test_main(): - result = runner.invoke(app, ["--network", "conv"]) - assert result.exit_code == 0 - assert "Training neural network of type: conv" in result.output - - -def test_invalid_case(): - result = runner.invoke(app, ["--network", "CONV"]) - assert result.exit_code != 0 - assert "Invalid value for '--network': 'CONV' is not one of" in result.output - assert "simple" in result.output - assert "conv" in result.output - assert "lstm" in result.output - - -def test_invalid_other(): - result = runner.invoke(app, ["--network", "capsule"]) - assert result.exit_code != 0 - assert "Invalid value for '--network': 'capsule' is not one of" in result.output - assert "simple" in result.output - assert "conv" in result.output - assert "lstm" in result.output - - -def test_script(): - result = subprocess.run( - [sys.executable, "-m", "coverage", "run", mod.__file__, "--help"], - capture_output=True, - encoding="utf-8", - ) - assert "Usage" in result.stdout diff --git a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002.py b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002.py index 6c712d3b6e..4692673c49 100644 --- a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002.py +++ b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002.py @@ -1,30 +1,47 @@ +import importlib import subprocess import sys +import pytest import typer +from typer import Typer from typer.testing import CliRunner from docs_src.parameter_types.enum import tutorial002 as mod +from tests.utils import needs_py311 runner = CliRunner() -app = typer.Typer() -app.command()(mod.main) +@pytest.fixture( + name="app", + params=[ + "tutorial002", + "tutorial002_an", + pytest.param("tutorial002_py311", marks=needs_py311), + ], +) +def get_app(request: pytest.FixtureRequest): + mod = importlib.import_module(f"docs_src.parameter_types.enum.{request.param}") -def test_upper(): + app = typer.Typer() + app.command()(mod.main) + return app + + +def test_upper(app: Typer): result = runner.invoke(app, ["--network", "CONV"]) assert result.exit_code == 0 assert "Training neural network of type: conv" in result.output -def test_mix(): +def test_mix(app: Typer): result = runner.invoke(app, ["--network", "LsTm"]) assert result.exit_code == 0 assert "Training neural network of type: lstm" in result.output -def test_script(): +def test_script(app: Typer): result = subprocess.run( [sys.executable, "-m", "coverage", "run", mod.__file__, "--help"], capture_output=True, diff --git a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002_an.py b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002_an.py deleted file mode 100644 index a3c72b7eea..0000000000 --- a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002_an.py +++ /dev/null @@ -1,33 +0,0 @@ -import subprocess -import sys - -import typer -from typer.testing import CliRunner - -from docs_src.parameter_types.enum import tutorial002_an as mod - -runner = CliRunner() - -app = typer.Typer() -app.command()(mod.main) - - -def test_upper(): - result = runner.invoke(app, ["--network", "CONV"]) - assert result.exit_code == 0 - assert "Training neural network of type: conv" in result.output - - -def test_mix(): - result = runner.invoke(app, ["--network", "LsTm"]) - assert result.exit_code == 0 - assert "Training neural network of type: lstm" in result.output - - -def test_script(): - result = subprocess.run( - [sys.executable, "-m", "coverage", "run", mod.__file__, "--help"], - capture_output=True, - encoding="utf-8", - ) - assert "Usage" in result.stdout diff --git a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002_str_enum.py b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002_str_enum.py deleted file mode 100644 index ff9cccaede..0000000000 --- a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002_str_enum.py +++ /dev/null @@ -1,33 +0,0 @@ -import subprocess -import sys - -import typer -from typer.testing import CliRunner - -from docs_src.parameter_types.enum import tutorial002_str_enum as mod - -runner = CliRunner() - -app = typer.Typer() -app.command()(mod.main) - - -def test_upper(): - result = runner.invoke(app, ["--network", "CONV"]) - assert result.exit_code == 0 - assert "Training neural network of type: conv" in result.output - - -def test_mix(): - result = runner.invoke(app, ["--network", "LsTm"]) - assert result.exit_code == 0 - assert "Training neural network of type: lstm" in result.output - - -def test_script(): - result = subprocess.run( - [sys.executable, "-m", "coverage", "run", mod.__file__, "--help"], - capture_output=True, - encoding="utf-8", - ) - assert "Usage" in result.stdout diff --git a/tests/utils.py b/tests/utils.py index 019b006fa0..3282e7f557 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -19,6 +19,10 @@ sys.version_info < (3, 10), reason="requires python3.10+" ) +needs_py311 = pytest.mark.skipif( + sys.version_info < (3, 11), reason="requires python3.11+" +) + needs_linux = pytest.mark.skipif( not sys.platform.startswith("linux"), reason="Test requires Linux" ) From e5c0968bb71a9240f4e66f9855aef9a794d66fb6 Mon Sep 17 00:00:00 2001 From: svlandeg Date: Fri, 12 Sep 2025 17:39:34 +0200 Subject: [PATCH 07/17] try specifying a py311 file as standard --- docs/tutorial/parameter-types/enum.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial/parameter-types/enum.md b/docs/tutorial/parameter-types/enum.md index 60852faf54..26ce117e60 100644 --- a/docs/tutorial/parameter-types/enum.md +++ b/docs/tutorial/parameter-types/enum.md @@ -54,7 +54,7 @@ Error: Invalid value for '--network': 'CONV' is not one of 'simple', 'conv', 'ls You can make an `Enum` (choice) *CLI parameter* be case-insensitive with the `case_sensitive` parameter: -{* docs_src/parameter_types/enum/tutorial002_an.py hl[15] *} +{* docs_src/parameter_types/enum/tutorial002_py311.py hl[15] *} And then the values of the `Enum` will be checked no matter if lower case, upper case, or a mix: From d32b8d9661ffc139c1eadabb53bbbe5808386e30 Mon Sep 17 00:00:00 2001 From: svlandeg Date: Wed, 26 Nov 2025 12:37:02 +0100 Subject: [PATCH 08/17] updates --- docs/tutorial/parameter-types/enum.md | 2 +- docs_src/parameter_types/enum/tutorial001_py311.py | 4 ++++ docs_src/parameter_types/enum/tutorial002_py311.py | 4 ++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/tutorial/parameter-types/enum.md b/docs/tutorial/parameter-types/enum.md index 9c907b1812..cec81c669c 100644 --- a/docs/tutorial/parameter-types/enum.md +++ b/docs/tutorial/parameter-types/enum.md @@ -54,7 +54,7 @@ Error: Invalid value for '--network': 'CONV' is not one of 'simple', 'conv', 'ls You can make an `Enum` (choice) *CLI parameter* be case-insensitive with the `case_sensitive` parameter: -{* docs_src/parameter_types/enum/tutorial002_an.py hl[19] *} +{* docs_src/parameter_types/enum/tutorial002_py311.py hl[15] *} And then the values of the `Enum` will be checked no matter if lower case, upper case, or a mix: diff --git a/docs_src/parameter_types/enum/tutorial001_py311.py b/docs_src/parameter_types/enum/tutorial001_py311.py index 929a5e165b..0b9e698c1d 100644 --- a/docs_src/parameter_types/enum/tutorial001_py311.py +++ b/docs_src/parameter_types/enum/tutorial001_py311.py @@ -9,6 +9,10 @@ class NeuralNetwork(StrEnum): lstm = "lstm" +app = typer.Typer() + + +@app.command() def main(network: NeuralNetwork = NeuralNetwork.simple): print(f"Training neural network of type: {network.value}") diff --git a/docs_src/parameter_types/enum/tutorial002_py311.py b/docs_src/parameter_types/enum/tutorial002_py311.py index 8b9abc4113..1a366e6fa1 100644 --- a/docs_src/parameter_types/enum/tutorial002_py311.py +++ b/docs_src/parameter_types/enum/tutorial002_py311.py @@ -10,6 +10,10 @@ class NeuralNetwork(StrEnum): lstm = "lstm" +app = typer.Typer() + + +@app.command() def main( network: Annotated[ NeuralNetwork, typer.Option(case_sensitive=False) From 6908dbda2017adebcbcf1334597c37fdfb9f95af Mon Sep 17 00:00:00 2001 From: svlandeg Date: Wed, 26 Nov 2025 12:54:48 +0100 Subject: [PATCH 09/17] use mod as fixture instead of app --- .../test_enum/test_tutorial001.py | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001.py b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001.py index 14ef7f60b2..3008282c91 100644 --- a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001.py +++ b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001.py @@ -3,8 +3,6 @@ import sys import pytest -import typer -from typer import Typer from typer.testing import CliRunner from tests.utils import needs_py311 @@ -13,42 +11,39 @@ @pytest.fixture( - name="app", + name="mod", params=[ "tutorial001", pytest.param("tutorial001_py311", marks=needs_py311), ], ) -def get_app(request: pytest.FixtureRequest): +def get_mod(request: pytest.FixtureRequest): mod = importlib.import_module(f"docs_src.parameter_types.enum.{request.param}") + return mod - app = typer.Typer() - app.command()(mod.main) - return app - -def test_help(app: Typer): - result = runner.invoke(app, ["--help"]) +def test_help(mod): + result = runner.invoke(mod.app, ["--help"]) assert result.exit_code == 0 assert "--network" in result.output assert "[simple|conv|lstm]" in result.output assert "default: simple" in result.output -def test_main(app: Typer): - result = runner.invoke(app, ["--network", "conv"]) +def test_main(mod): + result = runner.invoke(mod.app, ["--network", "conv"]) assert result.exit_code == 0 assert "Training neural network of type: conv" in result.output -def test_main_default(app: Typer): - result = runner.invoke(app) +def test_main_default(mod): + result = runner.invoke(mod.app) assert result.exit_code == 0 assert "Training neural network of type: simple" in result.output -def test_invalid_case(app: Typer): - result = runner.invoke(app, ["--network", "CONV"]) +def test_invalid_case(mod): + result = runner.invoke(mod.app, ["--network", "CONV"]) assert result.exit_code != 0 assert "Invalid value for '--network'" in result.output assert "'CONV' is not one of" in result.output @@ -57,8 +52,8 @@ def test_invalid_case(app: Typer): assert "lstm" in result.output -def test_invalid_other(app: Typer): - result = runner.invoke(app, ["--network", "capsule"]) +def test_invalid_other(mod): + result = runner.invoke(mod.app, ["--network", "capsule"]) assert result.exit_code != 0 assert "Invalid value for '--network'" in result.output assert "'capsule' is not one of" in result.output @@ -67,7 +62,8 @@ def test_invalid_other(app: Typer): assert "lstm" in result.output -def test_script(app: Typer): +def test_script(mod): + from docs_src.parameter_types.enum import tutorial001 as mod result = subprocess.run( [sys.executable, "-m", "coverage", "run", mod.__file__, "--help"], capture_output=True, From 2147114b0e1e01bfaaac2314a3454b4b94777dc1 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 26 Nov 2025 11:55:20 +0000 Subject: [PATCH 10/17] =?UTF-8?q?=F0=9F=8E=A8=20[pre-commit.ci]=20Auto=20f?= =?UTF-8?q?ormat=20from=20pre-commit.com=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test_parameter_types/test_enum/test_tutorial001.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001.py b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001.py index 3008282c91..1cd55da9aa 100644 --- a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001.py +++ b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001.py @@ -64,6 +64,7 @@ def test_invalid_other(mod): def test_script(mod): from docs_src.parameter_types.enum import tutorial001 as mod + result = subprocess.run( [sys.executable, "-m", "coverage", "run", mod.__file__, "--help"], capture_output=True, From 8a3d5af531263dc1f976a92c8ddaa90f83e2a231 Mon Sep 17 00:00:00 2001 From: svlandeg Date: Wed, 26 Nov 2025 12:57:21 +0100 Subject: [PATCH 11/17] fix --- docs_src/parameter_types/enum/tutorial001_py311.py | 2 +- docs_src/parameter_types/enum/tutorial002_py311.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs_src/parameter_types/enum/tutorial001_py311.py b/docs_src/parameter_types/enum/tutorial001_py311.py index 0b9e698c1d..4aed7e686b 100644 --- a/docs_src/parameter_types/enum/tutorial001_py311.py +++ b/docs_src/parameter_types/enum/tutorial001_py311.py @@ -18,4 +18,4 @@ def main(network: NeuralNetwork = NeuralNetwork.simple): if __name__ == "__main__": - typer.run(main) + app() diff --git a/docs_src/parameter_types/enum/tutorial002_py311.py b/docs_src/parameter_types/enum/tutorial002_py311.py index 1a366e6fa1..f659b2d27b 100644 --- a/docs_src/parameter_types/enum/tutorial002_py311.py +++ b/docs_src/parameter_types/enum/tutorial002_py311.py @@ -23,4 +23,4 @@ def main( if __name__ == "__main__": - typer.run(main) + app() From 01e0f26999fb48384f02e4dc96721153f1014c3e Mon Sep 17 00:00:00 2001 From: svlandeg Date: Wed, 26 Nov 2025 12:58:23 +0100 Subject: [PATCH 12/17] cleanup --- .../test_parameter_types/test_enum/test_tutorial001.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001.py b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001.py index 1cd55da9aa..7871b34318 100644 --- a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001.py +++ b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial001.py @@ -63,8 +63,6 @@ def test_invalid_other(mod): def test_script(mod): - from docs_src.parameter_types.enum import tutorial001 as mod - result = subprocess.run( [sys.executable, "-m", "coverage", "run", mod.__file__, "--help"], capture_output=True, From 6a3d9ba20182f980a0bac0ff0cd7c9aa085a4589 Mon Sep 17 00:00:00 2001 From: svlandeg Date: Wed, 26 Nov 2025 12:59:34 +0100 Subject: [PATCH 13/17] use mod as fixture --- .../test_enum/test_tutorial002.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002.py b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002.py index 4692673c49..7a0caee679 100644 --- a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002.py +++ b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002.py @@ -7,14 +7,13 @@ from typer import Typer from typer.testing import CliRunner -from docs_src.parameter_types.enum import tutorial002 as mod from tests.utils import needs_py311 runner = CliRunner() @pytest.fixture( - name="app", + name="mod", params=[ "tutorial002", "tutorial002_an", @@ -23,25 +22,22 @@ ) def get_app(request: pytest.FixtureRequest): mod = importlib.import_module(f"docs_src.parameter_types.enum.{request.param}") + return mod - app = typer.Typer() - app.command()(mod.main) - return app - -def test_upper(app: Typer): - result = runner.invoke(app, ["--network", "CONV"]) +def test_upper(mod): + result = runner.invoke(mod.app, ["--network", "CONV"]) assert result.exit_code == 0 assert "Training neural network of type: conv" in result.output -def test_mix(app: Typer): - result = runner.invoke(app, ["--network", "LsTm"]) +def test_mix(mod): + result = runner.invoke(mod.app, ["--network", "LsTm"]) assert result.exit_code == 0 assert "Training neural network of type: lstm" in result.output -def test_script(app: Typer): +def test_script(mod): result = subprocess.run( [sys.executable, "-m", "coverage", "run", mod.__file__, "--help"], capture_output=True, From 089748907525e028fd9aaf76b374174cb334700e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 26 Nov 2025 11:59:54 +0000 Subject: [PATCH 14/17] =?UTF-8?q?=F0=9F=8E=A8=20[pre-commit.ci]=20Auto=20f?= =?UTF-8?q?ormat=20from=20pre-commit.com=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test_parameter_types/test_enum/test_tutorial002.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002.py b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002.py index 7a0caee679..a26227c156 100644 --- a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002.py +++ b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002.py @@ -3,8 +3,6 @@ import sys import pytest -import typer -from typer import Typer from typer.testing import CliRunner from tests.utils import needs_py311 From b20f925e33527c025d2e71d45c135d0502c201e9 Mon Sep 17 00:00:00 2001 From: svlandeg Date: Wed, 26 Nov 2025 13:06:18 +0100 Subject: [PATCH 15/17] fix highlighting --- docs/tutorial/parameter-types/enum.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorial/parameter-types/enum.md b/docs/tutorial/parameter-types/enum.md index cec81c669c..36e85f0067 100644 --- a/docs/tutorial/parameter-types/enum.md +++ b/docs/tutorial/parameter-types/enum.md @@ -54,7 +54,7 @@ Error: Invalid value for '--network': 'CONV' is not one of 'simple', 'conv', 'ls You can make an `Enum` (choice) *CLI parameter* be case-insensitive with the `case_sensitive` parameter: -{* docs_src/parameter_types/enum/tutorial002_py311.py hl[15] *} +{* docs_src/parameter_types/enum/tutorial002_py311.py hl[19] *} And then the values of the `Enum` will be checked no matter if lower case, upper case, or a mix: From d0ce3db970bc0142d2d386ace4ede2462534a17d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Mon, 12 Jan 2026 16:50:42 +0000 Subject: [PATCH 16/17] =?UTF-8?q?=F0=9F=8E=A8=20Auto=20format?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs_src/parameter_types/enum/tutorial002_py311.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs_src/parameter_types/enum/tutorial002_py311.py b/docs_src/parameter_types/enum/tutorial002_py311.py index f659b2d27b..a81c6a8460 100644 --- a/docs_src/parameter_types/enum/tutorial002_py311.py +++ b/docs_src/parameter_types/enum/tutorial002_py311.py @@ -1,7 +1,7 @@ from enum import StrEnum +from typing import Annotated import typer -from typing_extensions import Annotated class NeuralNetwork(StrEnum): From 06bba6709d9cd7a05b905a4e6adf551bfefea625 Mon Sep 17 00:00:00 2001 From: svlandeg Date: Mon, 12 Jan 2026 17:57:01 +0100 Subject: [PATCH 17/17] small fixes --- docs/tutorial/parameter-types/enum.md | 4 ++-- .../enum/{tutorial002_py311.py => tutorial002_an_py311.py} | 0 .../test_parameter_types/test_enum/test_tutorial002.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename docs_src/parameter_types/enum/{tutorial002_py311.py => tutorial002_an_py311.py} (100%) diff --git a/docs/tutorial/parameter-types/enum.md b/docs/tutorial/parameter-types/enum.md index c78dc60cc4..b6a159a040 100644 --- a/docs/tutorial/parameter-types/enum.md +++ b/docs/tutorial/parameter-types/enum.md @@ -2,7 +2,7 @@ To define a *CLI parameter* that can take a value from a predefined set of values you can use a standard Python `enum.Enum`: -{* docs_src/parameter_types/enum/tutorial001_py39.py hl[1,6:9,16:17] *} +{* docs_src/parameter_types/enum/tutorial001_py311.py hl[1,6:9,16:17] *} /// tip @@ -54,7 +54,7 @@ Error: Invalid value for '--network': 'CONV' is not one of 'simple', 'conv', 'ls You can make an `Enum` (choice) *CLI parameter* be case-insensitive with the `case_sensitive` parameter: -{* docs_src/parameter_types/enum/tutorial002_an_py39.py hl[19] *} +{* docs_src/parameter_types/enum/tutorial002_an_py311.py hl[19] *} And then the values of the `Enum` will be checked no matter if lower case, upper case, or a mix: diff --git a/docs_src/parameter_types/enum/tutorial002_py311.py b/docs_src/parameter_types/enum/tutorial002_an_py311.py similarity index 100% rename from docs_src/parameter_types/enum/tutorial002_py311.py rename to docs_src/parameter_types/enum/tutorial002_an_py311.py diff --git a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002.py b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002.py index b55d804fe3..5a8389e4d7 100644 --- a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002.py +++ b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial002.py @@ -16,7 +16,7 @@ params=[ pytest.param("tutorial002_py39"), pytest.param("tutorial002_an_py39"), - pytest.param("tutorial002_py311", marks=needs_py311), + pytest.param("tutorial002_an_py311", marks=needs_py311), ], ) def get_mod(request: pytest.FixtureRequest) -> ModuleType: