Skip to main content

🌈 Extra colorization and configuration file for Click.

Project description

Click Extra

Last release Python versions Unittests status Coverage status

What is Click Extra?

click-extra is a collection of helpers and utilities for Click, the Python CLI framework.

It is a drop-in replacement with good defaults that saves you some boilerplate code. It also comes with some workarounds and patches that have not reached upstream yet (or are unlikely to).

Simple click example Same with click-extra
from click import command, echo, option


@command()
@option("--count", default=1, help="Number of greetings.")
@option("--name", prompt="Your name", help="The person to greet.")
def hello(count, name):
    """Simple program that greets NAME for a total of COUNT times."""
    for _ in range(count):
        echo(f"Hello, {name}!")


if __name__ == "__main__":
    hello()
from click_extra import command, echo, option


@command()
@option("--count", default=1, help="Number of greetings.")
@option("--name", prompt="Your name", help="The person to greet.")
def hello(count, name):
    """Simple program that greets NAME for a total of COUNT times."""
    for _ in range(count):
        echo(f"Hello, {name}!")


if __name__ == "__main__":
    hello()
click CLI help screen click-extra CLI help screen

This example demonstrate the all-in-one package with its default options. You are still free to pick-up some of these options one-by-one, as documented below.

Features

  • TOML, YAML and JSON configuration file loader
  • Colorization of help screens
  • --color/--no-color option flag
  • Colored --version option
  • Colored --verbosity option and logs
  • --time/--no-time flag to measure duration of command execution
  • Platform recognition utilities (macOS, Linux and Windows)
  • New conditional markers for pytest:
    • @skip_linux, @skip_macos and @skip_windows
    • @unless_linux, @unless_macos and @unless_windows
    • @destructive and @non_destructive

Installation

Install click-extra with pip:

$ pip install click-extra

Configuration loader usage

TOML configuration

Given this CLI in a my_cli.py file:

import click

from click_extra.config import config_option


@click.group(context_settings={"show_default": True})
@click.option("--dummy-flag/--no-flag")
@click.option("--my-list", multiple=True)
@config_option()
def my_cli(dummy_flag, my_list):
    click.echo(f"dummy_flag    is {dummy_flag!r}")
    click.echo(f"my_list       is {my_list!r}")


@my_cli.command()
@click.option("--int-param", type=int, default=10)
def subcommand(int_param):
    click.echo(f"int_parameter is {int_param!r}")


if __name__ == "__main__":
    my_cli()

It produces the following help screens:

$ python ./my_cli.py
Usage: my_cli.py [OPTIONS] COMMAND [ARGS]...

Options:
  --dummy-flag / --no-flag  [default: no-flag]
  --my-list TEXT
  -C, --config CONFIG_PATH  Location of the configuration file. Supports both
                            local path and remote URL.  [default:
                            ~/.my_cli.py/config.{toml,yaml,yml,json}]
  --help                    Show this message and exit.

Commands:
  subcommand

A bare call returns:

$ ./my_cli.py subcommand
dummy_flag    is False
my_list       is ()
int_parameter is 10

Now we will change the default CLI output by creating a TOML file at ~/.my_cli.py/config.toml which contains:

# My default configuration file.
top_level_param = "is_ignored"

[my-cli]
extra_value = "is ignored too"
dummy_flag = true   # New boolean default.
my_list = ["item 1", "item #2", "Very Last Item!"]

[garbage]
# An empty random section that will be skipped

[my-cli.subcommand]
int_param = 3
random_stuff = "will be ignored"

In the file above, pay attention to:

  • the configuration's folder (~/.my_cli.py/) which correspond to the script's name (my_cli.py);
  • the top-level config section ([my-cli]), that is derived from the CLI's group ID (def my_cli());
  • all the extra comments, sections and values that will be silently ignored.

Now we can verify the TOML file is read automatticaly and change the defaults:

$ ./my_cli.py subcommand
dummy_flag    is True
my_list       is ('item 1', 'item #2', 'Very Last Item!')
int_parameter is 3

Still, any inline parameter is allowedal to ovverides the configuration defaults:

$ ./my_cli.py subcommand --int-param 555
dummy_flag    is True
my_list       is ('item 1', 'item #2', 'Very Last Item!')
int_parameter is 555

YAML configuration

Same example as above is working as-is with YAML.

Just replace the TOML file with the following configuration at ~/.my_cli.py/config.yaml:

# My default configuration file.
top_level_param: is_ignored

my-cli:
  extra_value: is ignored too
  dummy_flag: true   # New boolean default.
  my_list:
    - point 1
    - 'point #2'
    - Very Last Point!

  subcommand:
    int_param: 77
    random_stuff: will be ignored

garbage: >
  An empty random section that will be skipped
$ ./my_cli.py --config ~/.my_cli.py/config.yaml subcommand
dummy_flag    is True
my_list       is ('point 1', 'point #2', 'Very Last Point!')
int_parameter is 77

JSON configuration

Again, same for JSON:

{
  "top_level_param": "is_ignored",
  "garbage": {},
  "my-cli": {
    "dummy_flag": true,
    "extra_value": "is ignored too",
    "my_list": [
      "item 1",
      "item #2",
      "Very Last Item!"
    ],
    "subcommand": {
      "int_param": 65,
      "random_stuff": "will be ignored"
    }
  }
}
$ ./my_cli.py --config ~/.my_cli.py/config.json subcommand
dummy_flag    is True
my_list       is ('item 1', 'item #2', 'Very Last Item!')
int_parameter is 65

Remote configuration

Remote URL can be passed directly to the --config option:

$ ./my_cli.py --config https://example.com/dummy/configuration.yaml subcommand
dummy_flag    is True
my_list       is ('point 1', 'point #2', 'Very Last Point!')
int_parameter is 77

Colorization of help screen

Extend Cloup's own help formatter and theme to add colorization of:

  • Options
  • Choices
  • Metavars

Used in

Check these projects to get real-life example of click-extra usage:

Issues addressed by click-extra

Keep track of things to undo if they reach upstream.

click:

click-config-file:

click-help-color:

click-log:

cli-helper:

cloup:

python-tabulate:

Dependencies

Here is a graph of Python package dependencies:

click-extra dependency graph

Development

Development guidelines are the same as parent project mpm, from which click-extra originated.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

click-extra-1.8.0.tar.gz (29.5 kB view details)

Uploaded Source

Built Distribution

click_extra-1.8.0-py3-none-any.whl (41.2 kB view details)

Uploaded Python 3

File details

Details for the file click-extra-1.8.0.tar.gz.

File metadata

  • Download URL: click-extra-1.8.0.tar.gz
  • Upload date:
  • Size: 29.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.9.12

File hashes

Hashes for click-extra-1.8.0.tar.gz
Algorithm Hash digest
SHA256 282a675c4bcb7fa602547e60e5f7beff5dbd834a98970f9e9d949eabb25bfc63
MD5 3eb295be71dcae880ba74860289c45b7
BLAKE2b-256 c38cd99e0bfeb17b0d5fac5cf9f0063b5f586c44fedc04f91dc46d14a3c5690e

See more details on using hashes here.

File details

Details for the file click_extra-1.8.0-py3-none-any.whl.

File metadata

  • Download URL: click_extra-1.8.0-py3-none-any.whl
  • Upload date:
  • Size: 41.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.0 CPython/3.9.12

File hashes

Hashes for click_extra-1.8.0-py3-none-any.whl
Algorithm Hash digest
SHA256 319c93e92f912aa3a971f7c1a24ac6c69a769ddc1767a1db14d3b16aac0bcd78
MD5 7eb01dab20c34a1f2fc2db6bd9edbb1a
BLAKE2b-256 cfb876c3b6084984ee35b4104ba6d837dd972a7206505bb9e27f3fb5dcaf8ae6

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page