diff --git a/docs/src/parameter_types/bool/__init__.py b/docs/src/parameter_types/bool/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/docs/src/parameter_types/bool/tutorial001.py b/docs/src/parameter_types/bool/tutorial001.py new file mode 100644 index 0000000..46f6335 --- /dev/null +++ b/docs/src/parameter_types/bool/tutorial001.py @@ -0,0 +1,12 @@ +import typer + + +def main(force: bool = typer.Option(False, "--force")): + if force: + typer.echo("Forcing operation") + else: + typer.echo("Not forcing") + + +if __name__ == "__main__": + typer.run(main) diff --git a/docs/src/parameter_types/bool/tutorial002.py b/docs/src/parameter_types/bool/tutorial002.py new file mode 100644 index 0000000..e887e14 --- /dev/null +++ b/docs/src/parameter_types/bool/tutorial002.py @@ -0,0 +1,14 @@ +import typer + + +def main(accept: bool = typer.Option(None, "--accept/--reject")): + if accept is None: + typer.echo("I don't know what you want yet") + elif accept: + typer.echo("Accepting!") + else: + typer.echo("Rejecting!") + + +if __name__ == "__main__": + typer.run(main) diff --git a/docs/src/parameter_types/bool/tutorial003.py b/docs/src/parameter_types/bool/tutorial003.py new file mode 100644 index 0000000..fda717e --- /dev/null +++ b/docs/src/parameter_types/bool/tutorial003.py @@ -0,0 +1,12 @@ +import typer + + +def main(force: bool = typer.Option(False, "--force/--no-force", "-f/-F")): + if force: + typer.echo("Forcing operation") + else: + typer.echo("Not forcing") + + +if __name__ == "__main__": + typer.run(main) diff --git a/docs/src/parameter_types/bool/tutorial004.py b/docs/src/parameter_types/bool/tutorial004.py new file mode 100644 index 0000000..8c7f47c --- /dev/null +++ b/docs/src/parameter_types/bool/tutorial004.py @@ -0,0 +1,12 @@ +import typer + + +def main(in_prod: bool = typer.Option(True, " /--demo", " /-d")): + if in_prod: + typer.echo("Running in production") + else: + typer.echo("Running demo") + + +if __name__ == "__main__": + typer.run(main) diff --git a/docs/src/parameter_types/number/tutorial003.py b/docs/src/parameter_types/number/tutorial003.py new file mode 100644 index 0000000..95737d0 --- /dev/null +++ b/docs/src/parameter_types/number/tutorial003.py @@ -0,0 +1,9 @@ +import typer + + +def main(verbose: int = typer.Option(0, "--verbose", "-v", count=True)): + typer.echo(f"Verbose level is {verbose}") + + +if __name__ == "__main__": + typer.run(main) diff --git a/docs/tutorial/parameter-types/bool.md b/docs/tutorial/parameter-types/bool.md new file mode 100644 index 0000000..cb7c56d --- /dev/null +++ b/docs/tutorial/parameter-types/bool.md @@ -0,0 +1,190 @@ +We have seen some examples of *CLI options* with `bool`, and how **Typer** creates `--something` and `--no-something` automatically. + +But we can customize those names. + +## Only `--force` + +Let's say that we want a `--force` *CLI option* only, we want to discard `--no-force`. + +We can do that by specifying the exact name we want: + +```Python hl_lines="4" +{!./src/parameter_types/bool/tutorial001.py!} +``` + +Now there's only a `--force` *CLI option*: + +
+ +```console +// Check the help +$ python main.py --help + +// Notice there's only --force, we no longer have --no-force +Usage: main.py [OPTIONS] + +Options: + --force + --install-completion Install completion for the current shell. + --show-completion Show completion for the current shell, to copy it or customize the installation. + --help Show this message and exit. + +// Try it: +$ python main.py + +Not forcing + +// Now add --force +$ python main.py --force + +Forcing operation + +// And --no-force no longer exists ⛔️ +$ python main.py --no-force + +Usage: main.py [OPTIONS] +Try "main.py --help" for help. + +Error: no such option: --no-force +``` + +
+ +## Alternative names + +Now let's imagine we have a *CLI option* `--accept`. + +And we want to allow setting `--accept` or the contrary, but `--no-accept` looks ugly. + +We might want to instead have `--accept` and `--reject`. + +We can do that by passing a single `str` with the 2 names for the `bool` *CLI option* separated by `/`: + +```Python hl_lines="4" +{!./src/parameter_types/bool/tutorial002.py!} +``` + +Check it: + +
+ +```console +// Check the help +$ python main.py --help + +// Notice the --accept / --reject +Usage: main.py [OPTIONS] + +Options: + --accept / --reject + --install-completion Install completion for the current shell. + --show-completion Show completion for the current shell, to copy it or customize the installation. + --help Show this message and exit. + +// Try it +$ python main.py + +I don't know what you want yet + +// Now pass --accept +$ python main.py --accept + +Accepting! + +// And --reject +$ python main.py --reject + +Rejecting! +``` + +
+ +## Short names + +The same way, you can declare short versions of the names for these *CLI options*. + +For example, let's say we want `-f` for `--force` and `-F` for `--no-force`: + +```Python hl_lines="4" +{!./src/parameter_types/bool/tutorial003.py!} +``` + +Check it: + +
+ +```console +// Check the help +$ python main.py --help + +// Notice the -f, --force / -F, --no-force +Usage: main.py [OPTIONS] + +Options: + -f, --force / -F, --no-force + --install-completion Install completion for the current shell. + --show-completion Show completion for the current shell, to copy it or customize the installation. + --help Show this message and exit. + +// Try with the short name -f +$ python main.py -f + +Forcing operation + +// Try with the short name -F +$ python main.py -F + +Not forcing +``` + +
+ +## Only names for `False` + +If you want to (although it might not be a good idea), you can declare only *CLI option* names to set the `False` value. + +To do that, use a space and a single `/` and pass the negative name after: + +```Python hl_lines="4" +{!./src/parameter_types/bool/tutorial004.py!} +``` + +!!! tip + Have in mind that it's a string with a preceding space and then a `/`. + + So, it's `" /-S"` not `"/-S"`. + +Check it: + +
+ +```console +// Check the help +$ python main.py --help + +// Notice the / -d, --demo +Usage: main.py [OPTIONS] + +Options: + / -d, --demo + --install-completion Install completion for the current shell. + --show-completion Show completion for the current shell, to copy it or customize the installation. + --help Show this message and exit. + +// Try it +$ python main.py + +Running in production + +// Now pass --demo +$ python main.py --demo + +Running demo + +// And the short version +$ python main.py -d + +Running demo +``` + +
diff --git a/docs/tutorial/parameter-types/number.md b/docs/tutorial/parameter-types/number.md index fc70ca7..adaba25 100644 --- a/docs/tutorial/parameter-types/number.md +++ b/docs/tutorial/parameter-types/number.md @@ -98,3 +98,51 @@ ID is 5 ``` + +## Counter *CLI options* + +You can make a *CLI option* work as a counter with the `counter` parameter: + +```Python hl_lines="4" +{!./src/parameter_types/number/tutorial003.py!} +``` + +It means that the *CLI option* will be like a boolean flag, e.g. `--verbose`. + +And the value you receive in the function will be the amount of times that `--verbose` was added: + +
+ +```console +// Check it +$ python main.py + +Verbose level is 0 + +// Now use one --verbose +$ python main.py --verbose + +Verbose level is 1 + +// Now 3 --verbose +$ python main.py --verbose --verbose --verbose + +Verbose level is 3 + +// And with the short name +$ python main.py -v + +Verbose level is 1 + +// And with the short name 3 times +$ python main.py -v -v -v + +Verbose level is 3 + +// As short names can be put together, this also works +$ python main.py -vvv + +Verbose level is 3 +``` + +
\ No newline at end of file