1import os
2
3import click
4from click.shell_completion import CompletionItem
5
6
7@click.group()
8def cli():
9    pass
10
11
12@cli.command()
13@click.option("--dir", type=click.Path(file_okay=False))
14def ls(dir):
15    click.echo("\n".join(os.listdir(dir)))
16
17
18def get_env_vars(ctx, param, incomplete):
19    # Returning a list of values is a shortcut to returning a list of
20    # CompletionItem(value).
21    return [k for k in os.environ if incomplete in k]
22
23
24@cli.command(help="A command to print environment variables")
25@click.argument("envvar", shell_complete=get_env_vars)
26def show_env(envvar):
27    click.echo(f"Environment variable: {envvar}")
28    click.echo(f"Value: {os.environ[envvar]}")
29
30
31@cli.group(help="A group that holds a subcommand")
32def group():
33    pass
34
35
36def list_users(ctx, param, incomplete):
37    # You can generate completions with help strings by returning a list
38    # of CompletionItem. You can match on whatever you want, including
39    # the help.
40    items = [("bob", "butcher"), ("alice", "baker"), ("jerry", "candlestick maker")]
41    out = []
42
43    for value, help in items:
44        if incomplete in value or incomplete in help:
45            out.append(CompletionItem(value, help=help))
46
47    return out
48
49
50@group.command(help="Choose a user")
51@click.argument("user", shell_complete=list_users)
52def select_user(user):
53    click.echo(f"Chosen user is {user}")
54
55
56cli.add_command(group)
57