Skip to content

Commit 1c68e53

Browse files
authored
Move Quickstart doc from reST to MyST and reinstate Utils doc directives (#3026)
2 parents ee054e9 + 4b695e5 commit 1c68e53

3 files changed

Lines changed: 209 additions & 217 deletions

File tree

docs/quickstart.md

Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
# Quickstart
2+
3+
```{currentmodule} click
4+
```
5+
6+
## Install
7+
8+
Install from PyPI:
9+
10+
```console
11+
pip install click
12+
```
13+
14+
Installing into a virtual environment is highly recommended. We suggest {ref}`virtualenv-heading`.
15+
16+
## Examples
17+
18+
Some standalone examples of Click applications are packaged with Click. They are available in the
19+
[examples folder](https://github.com/pallets/click/tree/main/examples) of the repo.
20+
21+
- [inout](https://github.com/pallets/click/tree/main/examples/inout) : A very simple example of an application that can
22+
read from files and write to files and also accept input from stdin or write to stdout.
23+
- [validation](https://github.com/pallets/click/tree/main/examples/validation) : A simple example of an application that
24+
performs custom validation of parameters in different ways.
25+
- [naval](https://github.com/pallets/click/tree/main/examples/naval) : Port of the [docopt](http://docopt.org/) naval
26+
example.
27+
- [colors](https://github.com/pallets/click/tree/main/examples/colors) : A simple example that colorizes text. Uses
28+
colorama on Windows.
29+
- [aliases](https://github.com/pallets/click/tree/main/examples/aliases) : An advanced example that implements
30+
{ref}`aliases`.
31+
- [imagepipe](https://github.com/pallets/click/tree/main/examples/imagepipe) : A complex example that implements some
32+
{ref}`command-pipelines` . It chains together image processing instructions. Requires pillow.
33+
- [repo](https://github.com/pallets/click/tree/main/examples/repo) : An advanced example that implements a
34+
Git-/Mercurial-like command line interface.
35+
- [complex](https://github.com/pallets/click/tree/main/examples/complex) : A very advanced example that implements
36+
loading subcommands dynamically from a plugin folder.
37+
- [termui](https://github.com/pallets/click/tree/main/examples/termui) : A simple example that showcases terminal UI
38+
helpers provided by click.
39+
40+
## Basic Concepts - Creating a Command
41+
42+
Click is based on declaring commands through decorators. Internally, there is a non-decorator interface for advanced use
43+
cases, but it's discouraged for high-level usage.
44+
45+
A function becomes a Click command line tool by decorating it through {func}`command`. At its simplest, just
46+
decorating a function with this decorator will make it into a callable script:
47+
48+
49+
```{eval-rst}
50+
.. click:example::
51+
import click
52+
53+
@click.command()
54+
def hello():
55+
click.echo('Hello World!')
56+
57+
What's happening is that the decorator converts the function into a :class:`Command` which then can be invoked:
58+
59+
.. click:example::
60+
if __name__ == '__main__':
61+
hello()
62+
63+
And what it looks like:
64+
65+
.. click:run::
66+
invoke(hello, args=[], prog_name='python hello.py')
67+
68+
And the corresponding help page:
69+
70+
.. click:run::
71+
invoke(hello, args=['--help'], prog_name='python hello.py')
72+
```
73+
74+
## Echoing
75+
76+
Why does this example use {func}`echo` instead of the regular {func}`print` function? The answer to this question is
77+
that Click attempts to support different environments consistently and to be very robust even when the environment is
78+
misconfigured. Click wants to be functional at least on a basic level even if everything is completely broken.
79+
80+
What this means is that the {func}`echo` function applies some error correction in case the terminal is misconfigured
81+
instead of dying with a {exc}`UnicodeError`.
82+
83+
The echo function also supports color and other styles in output. It will automatically remove styles if the output
84+
stream is a file. On Windows, colorama is automatically installed and used. See {ref}`ansi-colors`.
85+
86+
If you don't need this, you can also use the `print()` construct / function.
87+
88+
## Nesting Commands
89+
90+
Commands can be attached to other commands of type {class}`Group`. This allows arbitrary nesting of scripts. As an
91+
example here is a script that implements two commands for managing databases:
92+
93+
```{eval-rst}
94+
.. click:example::
95+
@click.group()
96+
def cli():
97+
pass
98+
99+
@click.command()
100+
def initdb():
101+
click.echo('Initialized the database')
102+
103+
@click.command()
104+
def dropdb():
105+
click.echo('Dropped the database')
106+
107+
cli.add_command(initdb)
108+
cli.add_command(dropdb)
109+
```
110+
111+
As you can see, the {func}`group` decorator works like the {func}`command` decorator, but creates a {class}`Group`
112+
object instead which can be given multiple subcommands that can be attached with {meth}`Group.add_command`.
113+
114+
For simple scripts, it's also possible to automatically attach and create a command by using the {meth}`Group.command`
115+
decorator instead. The above script can instead be written like this:
116+
117+
```{eval-rst}
118+
.. click:example::
119+
@click.group()
120+
def cli():
121+
pass
122+
123+
@cli.command()
124+
def initdb():
125+
click.echo('Initialized the database')
126+
127+
@cli.command()
128+
def dropdb():
129+
click.echo('Dropped the database')
130+
131+
You would then invoke the :class:`Group` in your entry points or other invocations:
132+
133+
.. click:example::
134+
if __name__ == '__main__':
135+
cli()
136+
```
137+
138+
## Registering Commands Later
139+
140+
Instead of using the `@group.command()` decorator, commands can be decorated with the plain `@command()` decorator
141+
and registered with a group later with `group.add_command()`. This could be used to split commands into multiple Python
142+
modules.
143+
144+
```{code-block} python
145+
@click.command()
146+
def greet():
147+
click.echo("Hello, World!")
148+
```
149+
150+
```{code-block} python
151+
@click.group()
152+
def group():
153+
pass
154+
155+
group.add_command(greet)
156+
```
157+
158+
## Adding Parameters
159+
160+
To add parameters, use the {func}`option` and {func}`argument` decorators:
161+
162+
```{eval-rst}
163+
.. click:example::
164+
@click.command()
165+
@click.option('--count', default=1, help='number of greetings')
166+
@click.argument('name')
167+
def hello(count, name):
168+
for x in range(count):
169+
click.echo(f"Hello {name}!")
170+
171+
What it looks like:
172+
173+
.. click:run::
174+
invoke(hello, args=['--help'], prog_name='python hello.py')
175+
```
176+
177+
## Switching to Entry Points
178+
179+
In the code you wrote so far there is a block at the end of the file which looks like this:
180+
`if __name__ == '__main__':`. This is traditionally how a standalone Python file looks like. With Click you can continue
181+
doing that, but a better way is to package your app with an entry point.
182+
183+
There are two main (and many more) reasons for this:
184+
185+
The first one is that installers automatically generate executable wrappers for Windows so your command line utilities
186+
work on Windows too.
187+
188+
The second reason is that entry point scripts work with virtualenv on Unix without the virtualenv having to be
189+
activated. This is a very useful concept which allows you to bundle your scripts with all requirements into a
190+
virtualenv.
191+
192+
Click is perfectly equipped to work with that and in fact the rest of the documentation will assume that you are writing
193+
applications as distributed packages.
194+
195+
Look at the {doc}`entry-points` chapter before reading the rest as the examples assume that you will be using entry
196+
points.

0 commit comments

Comments
 (0)