From 65a07e9331c23e5a106f9f8e1a781a84dd7457ce Mon Sep 17 00:00:00 2001 From: Ben Torvaney Date: Tue, 17 May 2022 12:15:56 +0200 Subject: [PATCH 01/10] Add documentation for functional API enums --- docs/tutorial/parameter-types/enum.md | 13 +++++++++++++ docs_src/parameter_types/enum/tutorial003.py | 18 ++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 docs_src/parameter_types/enum/tutorial003.py diff --git a/docs/tutorial/parameter-types/enum.md b/docs/tutorial/parameter-types/enum.md index 6af834bf54..5cdbf37ebb 100644 --- a/docs/tutorial/parameter-types/enum.md +++ b/docs/tutorial/parameter-types/enum.md @@ -66,3 +66,16 @@ Training neural network of type: lstm ``` + + +### Functional API + +In order to use an `Enum` created using the functional API, you need to create an enum with string values. + +You also need to supply the default value as a string (not the enum): + +```Python hl_lines="5 9" +{!../docs_src/parameter_types/enum/tutorial003.py!} +``` + +Alternatively, you can create an `Enum` that extends both `str` and `Enum`. In Python 3.11+, there is `enum.StrEnum`. For Python 3.10 or earlier, there is the StrEnum package. diff --git a/docs_src/parameter_types/enum/tutorial003.py b/docs_src/parameter_types/enum/tutorial003.py new file mode 100644 index 0000000000..2b4e7f60d3 --- /dev/null +++ b/docs_src/parameter_types/enum/tutorial003.py @@ -0,0 +1,18 @@ +from enum import Enum + +import typer + +NeuralNetwork = Enum( + "NeuralNetwork", + {k: k for k in ["simple", "conv", "lstm"]} +) + + +def main( + network: NeuralNetwork = typer.Option("simple", case_sensitive=False) +): + typer.echo(f"Training neural network of type: {network.value}") + + +if __name__ == "__main__": + typer.run(main) From e3f2d03773072e99d2f2ceab66d7fa4a22c2edd6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 17 May 2022 10:26:42 +0000 Subject: [PATCH 02/10] =?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/tutorial003.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/docs_src/parameter_types/enum/tutorial003.py b/docs_src/parameter_types/enum/tutorial003.py index 2b4e7f60d3..66c35ef308 100644 --- a/docs_src/parameter_types/enum/tutorial003.py +++ b/docs_src/parameter_types/enum/tutorial003.py @@ -2,15 +2,10 @@ import typer -NeuralNetwork = Enum( - "NeuralNetwork", - {k: k for k in ["simple", "conv", "lstm"]} -) +NeuralNetwork = Enum("NeuralNetwork", {k: k for k in ["simple", "conv", "lstm"]}) -def main( - network: NeuralNetwork = typer.Option("simple", case_sensitive=False) -): +def main(network: NeuralNetwork = typer.Option("simple", case_sensitive=False)): typer.echo(f"Training neural network of type: {network.value}") From 10c9aa84192342bbd426cd0fb3bfe34a3b0ab70f Mon Sep 17 00:00:00 2001 From: svlandeg Date: Fri, 19 Jul 2024 15:43:07 +0200 Subject: [PATCH 03/10] Move new tutorial file to 004 --- docs_src/parameter_types/enum/tutorial004.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs_src/parameter_types/enum/tutorial004.py b/docs_src/parameter_types/enum/tutorial004.py index e69de29bb2..25dd8c6ecd 100644 --- a/docs_src/parameter_types/enum/tutorial004.py +++ b/docs_src/parameter_types/enum/tutorial004.py @@ -0,0 +1,13 @@ +from enum import Enum + +import typer + +NeuralNetwork = Enum("NeuralNetwork", {k: k for k in ["simple", "conv", "lstm"]}) + + +def main(network: NeuralNetwork = typer.Option("simple", case_sensitive=False)): + typer.echo(f"Training neural network of type: {network.value}") + + +if __name__ == "__main__": + typer.run(main) \ No newline at end of file From 7abe6009c490b5485aadca6771e941ffd0d64e7e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2024 13:43:20 +0000 Subject: [PATCH 04/10] =?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/tutorial004.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs_src/parameter_types/enum/tutorial004.py b/docs_src/parameter_types/enum/tutorial004.py index 25dd8c6ecd..66c35ef308 100644 --- a/docs_src/parameter_types/enum/tutorial004.py +++ b/docs_src/parameter_types/enum/tutorial004.py @@ -10,4 +10,4 @@ def main(network: NeuralNetwork = typer.Option("simple", case_sensitive=False)): if __name__ == "__main__": - typer.run(main) \ No newline at end of file + typer.run(main) From 47009811012c3bbde428f863f863389c64fe1e23 Mon Sep 17 00:00:00 2001 From: svlandeg Date: Fri, 19 Jul 2024 15:46:06 +0200 Subject: [PATCH 05/10] Add annotated version --- docs/tutorial/parameter-types/enum.md | 17 ++++++++++++++--- docs_src/parameter_types/enum/tutorial004.py | 2 +- docs_src/parameter_types/enum/tutorial004_an.py | 16 ++++++++++++++++ 3 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 docs_src/parameter_types/enum/tutorial004_an.py diff --git a/docs/tutorial/parameter-types/enum.md b/docs/tutorial/parameter-types/enum.md index d3dab97d8b..3429e283c1 100644 --- a/docs/tutorial/parameter-types/enum.md +++ b/docs/tutorial/parameter-types/enum.md @@ -142,8 +142,19 @@ In order to use an `Enum` created using the ../docs_src/parameter_types/enum/tutorial004_an.py!} + ``` + +=== "Python 3.7+ non-Annotated" + + !!! tip + Prefer to use the `Annotated` version if possible. + + ```Python hl_lines="5 9" + {!> ../docs_src/parameter_types/enum/tutorial004.py!} + ``` Alternatively, you can create an `Enum` that extends both `str` and `Enum`. In Python 3.11+, there is `enum.StrEnum`. For Python 3.10 or earlier, there is the StrEnum package. diff --git a/docs_src/parameter_types/enum/tutorial004.py b/docs_src/parameter_types/enum/tutorial004.py index 66c35ef308..8aae98c12e 100644 --- a/docs_src/parameter_types/enum/tutorial004.py +++ b/docs_src/parameter_types/enum/tutorial004.py @@ -6,7 +6,7 @@ def main(network: NeuralNetwork = typer.Option("simple", case_sensitive=False)): - typer.echo(f"Training neural network of type: {network.value}") + print(f"Training neural network of type: {network.value}") if __name__ == "__main__": diff --git a/docs_src/parameter_types/enum/tutorial004_an.py b/docs_src/parameter_types/enum/tutorial004_an.py new file mode 100644 index 0000000000..a60ed650e8 --- /dev/null +++ b/docs_src/parameter_types/enum/tutorial004_an.py @@ -0,0 +1,16 @@ +from enum import Enum + +import typer +from typing_extensions import Annotated + +NeuralNetwork = Enum("NeuralNetwork", {k: k for k in ["simple", "conv", "lstm"]}) + + +def main( + network: Annotated[NeuralNetwork, typer.Option(case_sensitive=False)] = "simple", +): + print(f"Training neural network of type: {network.value}") + + +if __name__ == "__main__": + typer.run(main) From b91c009ef485f4e8f0fc2440c4cb9dd361877094 Mon Sep 17 00:00:00 2001 From: svlandeg Date: Fri, 19 Jul 2024 15:53:09 +0200 Subject: [PATCH 06/10] Fix line numbers --- docs/tutorial/parameter-types/enum.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tutorial/parameter-types/enum.md b/docs/tutorial/parameter-types/enum.md index 3429e283c1..0475386fd5 100644 --- a/docs/tutorial/parameter-types/enum.md +++ b/docs/tutorial/parameter-types/enum.md @@ -144,7 +144,7 @@ You also need to supply the default value as a string (not the enum): === "Python 3.7+" - ```Python hl_lines="14" + ```Python hl_lines="6 10" {!> ../docs_src/parameter_types/enum/tutorial004_an.py!} ``` @@ -153,7 +153,7 @@ You also need to supply the default value as a string (not the enum): !!! tip Prefer to use the `Annotated` version if possible. - ```Python hl_lines="5 9" + ```Python hl_lines="5 8" {!> ../docs_src/parameter_types/enum/tutorial004.py!} ``` From 478e2eb6610c029e958706624a8ce85df1b66e29 Mon Sep 17 00:00:00 2001 From: svlandeg Date: Thu, 28 Aug 2025 15:13:39 +0200 Subject: [PATCH 07/10] update docs to new format --- docs/tutorial/parameter-types/enum.md | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/docs/tutorial/parameter-types/enum.md b/docs/tutorial/parameter-types/enum.md index a34c2bb20a..82b170e4b7 100644 --- a/docs/tutorial/parameter-types/enum.md +++ b/docs/tutorial/parameter-types/enum.md @@ -119,19 +119,6 @@ In order to use an `Enum` created using the ../docs_src/parameter_types/enum/tutorial004_an.py!} - ``` - -=== "Python 3.7+ non-Annotated" - - !!! tip - Prefer to use the `Annotated` version if possible. - - ```Python hl_lines="5 8" - {!> ../docs_src/parameter_types/enum/tutorial004.py!} - ``` +{* docs_src/parameter_types/enum/tutorial004_an.py hl[6,10] *} Alternatively, you can create an `Enum` that extends both `str` and `Enum`. In Python 3.11+, there is `enum.StrEnum`. For Python 3.10 or earlier, there is the StrEnum package. From 44f6a952fb7cd0a81562a4fa4a9084e428626d35 Mon Sep 17 00:00:00 2001 From: svlandeg Date: Mon, 3 Nov 2025 11:13:44 +0100 Subject: [PATCH 08/10] add test files --- .../test_enum/test_tutorial005.py | 46 +++++++++++++++++++ .../test_enum/test_tutorial005_an.py | 46 +++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 tests/test_tutorial/test_parameter_types/test_enum/test_tutorial005.py create mode 100644 tests/test_tutorial/test_parameter_types/test_enum/test_tutorial005_an.py diff --git a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial005.py b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial005.py new file mode 100644 index 0000000000..72f77027c6 --- /dev/null +++ b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial005.py @@ -0,0 +1,46 @@ +import subprocess +import sys + +import typer +from typer.testing import CliRunner + +from docs_src.parameter_types.enum import tutorial005 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 [simple|conv|lstm]" in result.output.replace(" ", "") + + +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(): + result = runner.invoke(app, ["--network", "capsule"]) + assert result.exit_code != 0 + assert "Invalid value for '--network'" in result.output + assert ( + "invalid choice: capsule. (choose from" in result.output + or "'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_tutorial005_an.py b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial005_an.py new file mode 100644 index 0000000000..79e0dbee5c --- /dev/null +++ b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial005_an.py @@ -0,0 +1,46 @@ +import subprocess +import sys + +import typer +from typer.testing import CliRunner + +from docs_src.parameter_types.enum import tutorial005_an 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 [simple|conv|lstm]" in result.output.replace(" ", "") + + +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(): + result = runner.invoke(app, ["--network", "capsule"]) + assert result.exit_code != 0 + assert "Invalid value for '--network'" in result.output + assert ( + "invalid choice: capsule. (choose from" in result.output + or "'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 From d000e960417185c42c82c9db9325229489c533f8 Mon Sep 17 00:00:00 2001 From: svlandeg Date: Tue, 25 Nov 2025 17:32:45 +0100 Subject: [PATCH 09/10] update tutorial files to use explicit Typer() --- docs/tutorial/parameter-types/enum.md | 2 +- docs_src/parameter_types/enum/tutorial005.py | 5 ++++- docs_src/parameter_types/enum/tutorial005_an.py | 5 ++++- .../test_parameter_types/test_enum/test_tutorial005.py | 5 +---- .../test_parameter_types/test_enum/test_tutorial005_an.py | 5 +---- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/tutorial/parameter-types/enum.md b/docs/tutorial/parameter-types/enum.md index ae27205b93..a94a9acde5 100644 --- a/docs/tutorial/parameter-types/enum.md +++ b/docs/tutorial/parameter-types/enum.md @@ -153,6 +153,6 @@ In order to use an `Enum` created using the `enum.StrEnum`. For Python 3.10 or earlier, there is the StrEnum package. diff --git a/docs_src/parameter_types/enum/tutorial005.py b/docs_src/parameter_types/enum/tutorial005.py index 8aae98c12e..15d114c417 100644 --- a/docs_src/parameter_types/enum/tutorial005.py +++ b/docs_src/parameter_types/enum/tutorial005.py @@ -4,10 +4,13 @@ NeuralNetwork = Enum("NeuralNetwork", {k: k for k in ["simple", "conv", "lstm"]}) +app = typer.Typer() + +@app.command() def main(network: NeuralNetwork = typer.Option("simple", case_sensitive=False)): print(f"Training neural network of type: {network.value}") if __name__ == "__main__": - typer.run(main) + app() diff --git a/docs_src/parameter_types/enum/tutorial005_an.py b/docs_src/parameter_types/enum/tutorial005_an.py index a60ed650e8..df13f54c30 100644 --- a/docs_src/parameter_types/enum/tutorial005_an.py +++ b/docs_src/parameter_types/enum/tutorial005_an.py @@ -5,7 +5,10 @@ NeuralNetwork = Enum("NeuralNetwork", {k: k for k in ["simple", "conv", "lstm"]}) +app = typer.Typer() + +@app.command() def main( network: Annotated[NeuralNetwork, typer.Option(case_sensitive=False)] = "simple", ): @@ -13,4 +16,4 @@ def main( if __name__ == "__main__": - typer.run(main) + app() diff --git a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial005.py b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial005.py index 72f77027c6..a646ed302d 100644 --- a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial005.py +++ b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial005.py @@ -1,15 +1,12 @@ import subprocess import sys -import typer from typer.testing import CliRunner from docs_src.parameter_types.enum import tutorial005 as mod runner = CliRunner() - -app = typer.Typer() -app.command()(mod.main) +app = mod.app def test_help(): diff --git a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial005_an.py b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial005_an.py index 79e0dbee5c..2e5a805fc1 100644 --- a/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial005_an.py +++ b/tests/test_tutorial/test_parameter_types/test_enum/test_tutorial005_an.py @@ -1,15 +1,12 @@ import subprocess import sys -import typer from typer.testing import CliRunner from docs_src.parameter_types.enum import tutorial005_an as mod runner = CliRunner() - -app = typer.Typer() -app.command()(mod.main) +app = mod.app def test_help(): From 556376a73389f2588988b79f36c839971e3c9002 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Tue, 24 Mar 2026 15:26:49 +0000 Subject: [PATCH 10/10] =?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/tutorial005_an.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs_src/parameter_types/enum/tutorial005_an.py b/docs_src/parameter_types/enum/tutorial005_an.py index df13f54c30..7f49d03785 100644 --- a/docs_src/parameter_types/enum/tutorial005_an.py +++ b/docs_src/parameter_types/enum/tutorial005_an.py @@ -1,7 +1,7 @@ from enum import Enum +from typing import Annotated import typer -from typing_extensions import Annotated NeuralNetwork = Enum("NeuralNetwork", {k: k for k in ["simple", "conv", "lstm"]})