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.  [default: False]

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

This version

1.6.0

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.6.0.tar.gz (28.9 kB view details)

Uploaded Source

Built Distribution

click_extra-1.6.0-py3-none-any.whl (40.3 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: click-extra-1.6.0.tar.gz
  • Upload date:
  • Size: 28.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.63.0 importlib-metadata/4.11.2 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.9.10

File hashes

Hashes for click-extra-1.6.0.tar.gz
Algorithm Hash digest
SHA256 c372e24ab3965cfbec577d2a55bf733bbbffe9a3f54cc7368054b44b9f9db2ac
MD5 50e807de50ee973565bd9a8383d7f6b5
BLAKE2b-256 531c0672d9c37144bb928ce3404746f1fe93254889b9e964423b890efff81e24

See more details on using hashes here.

File details

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

File metadata

  • Download URL: click_extra-1.6.0-py3-none-any.whl
  • Upload date:
  • Size: 40.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.8.0 pkginfo/1.8.2 readme-renderer/32.0 requests/2.27.1 requests-toolbelt/0.9.1 urllib3/1.26.8 tqdm/4.63.0 importlib-metadata/4.11.2 keyring/23.5.0 rfc3986/2.0.0 colorama/0.4.4 CPython/3.9.10

File hashes

Hashes for click_extra-1.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5b12141f9ace40d4a481f92ce2e34d2c9d11e836413a2d91b436a24b6806ed31
MD5 14b5f258b6acce84b9445bd95137547d
BLAKE2b-256 61bee75497dbc076da54bafa3ea76d98a908d57e9047201e616156d8906ecdcc

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