Skip to main content

Command line interface framework

Project description

libcli

Command line interface framework.

The libcli package, built on argparse, provides functions and features that are common to or desired by many command line applications:

  • Colorized help output, with prog -h, or prog --help.

  • Help output in Markdown format, with prog --md-help.

  • Print all help (top command, and all subcommands), with prog -H, or prog --long-help. (For commands with subcommands).

  • Configure logging, with -v, or --verbose ("-v"=INFO, "-vv"=DEBUG, "-vvv"=TRACE). Integrated with loguru and logging.

  • Print the current version of the application, with -V, or --version; uses value from application's package metadata.

  • Load configuration from a file, before parsing the command line, with --config FILE. (Well, it parsed at least that much.. and "-v" for debugging "--config" itself.) This allows values from the config file to be available when building the argparse.ArgumentParser, for setting defaults, or including within help strings of arguments/options.

  • Print the active configuration, after loading the config file, with --print-config.

  • Print the application's URL, with --print-url; uses value from application's package metadata.

  • Integrate with argcomplete, with --completion.

  • Automatic inclusion of all common options, above.

  • Normalized help text of all command line arguments/options.

    • Force the first letter of all help strings to be upper case.
    • Force all help strings to end with a period.
  • Provides a function add_default_to_help to consistently include a default value in an argument/option's help string.

  • Supports single command applications, and command/sub-commands applications.

class BaseCLI

Command line interface base class.

$ cat minimal.py

from libcli import BaseCLI
class HelloCLI(BaseCLI):
    def main(self) -> None:
        print("Hello")
if __name__ == "__main__":
    HelloCLI().main()

$ python minimal.py -h

Usage: minimal.py [-h] [-v] [-V] [--print-config] [--print-url] [--completion [SHELL]]

General Options:
  -h, --help            Show this help message and exit.
  -v, --verbose         `-v` for detailed output and `-vv` for more detailed.
  -V, --version         Print version number and exit.
  --print-config        Print effective config and exit.
  --print-url           Print project url and exit.
  --completion [SHELL]  Print completion scripts for `SHELL` and exit (default: `bash`).

$ cat simple.py

from libcli import BaseCLI

class HelloCLI(BaseCLI):

    def init_parser(self) -> None:
        self.parser = self.ArgumentParser(
            prog=__package__,
            description="This program says hello.",
        )

    def add_arguments(self) -> None:
        self.parser.add_argument(
            "--spanish",
            action="store_true",
            help="Say hello in Spanish.",
        )
        self.parser.add_argument(
            "name",
            help="The person to say hello to.",
        )

    def main(self) -> None:
        if self.options.spanish:
            print(f"Hola, {self.options.name}!")
        else:
            print(f"Hello, {self.options.name}!")

if __name__ == "__main__":
    HelloCLI().main()

$ python simply.py -h

Usage: simple.py [--spanish] [-h] [-v] [-V] [--print-config] [--print-url]
                 [--completion [SHELL]] name

This program says hello.

Positional Arguments:
  name                  The person to say hello to.

Options:
  --spanish             Say hello in Spanish.

General Options:
  -h, --help            Show this help message and exit.
  -v, --verbose         `-v` for detailed output and `-vv` for more detailed.
  -V, --version         Print version number and exit.
  --print-config        Print effective config and exit.
  --print-url           Print project url and exit.
  --completion [SHELL]  Print completion scripts for `SHELL` and exit (default: `bash`).

class BaseCmd

Base command class; for commands with subcommands.

$ cat complex.py

from libcli import BaseCLI, BaseCmd

class EnglishCmd(BaseCmd):

    def init_command(self) -> None:

        parser = self.add_subcommand_parser(
            "english",
            help="Say hello in English",
            description="The `%(prog)s` command says hello in English.",
        )

        parser.add_argument(
            "name",
            help="The person to say hello to.",
        )

    def run(self) -> None:
        print(f"Hello {self.options.name}!")

class SpanishCmd(BaseCmd):

    def init_command(self) -> None:

        parser = self.add_subcommand_parser(
            "spanish",
            help="Say hello in Spanish",
            description="The `%(prog)s` command says hello in Spanish.",
        )

        parser.add_argument(
            "name",
            help="The person to say hello to.",
        )

    def run(self) -> None:
        print(f"Hola {self.options.name}!")

class HelloCLI(BaseCLI):

    def init_parser(self) -> None:
        self.parser = self.ArgumentParser(
            prog=__package__,
            description="This program says hello.",
        )

    def add_arguments(self) -> None:
        self.add_subcommand_classes([EnglishCmd, SpanishCmd])

    def main(self) -> None:
        if not self.options.cmd:
            self.parser.print_help()
            self.parser.exit(2, "error: Missing COMMAND")
        self.options.cmd()

if __name__ == "__main__":
    HelloCLI().main()

$ python complex.py -H

---------------------------------- COMPLEX.PY ----------------------------------

usage: complex.py [-h] [-H] [-v] [-V] [--print-config] [--print-url]
                  [--completion [SHELL]]
                  COMMAND ...

This program says hello.

Specify one of:
  COMMAND
    english             Say hello in English.
    spanish             Say hello in Spanish.

General options:
  -h, --help            Show this help message and exit.
  -H, --long-help       Show help for all commands and exit.
  -v, --verbose         `-v` for detailed output and `-vv` for more detailed.
  -V, --version         Print version number and exit.
  --print-config        Print effective config and exit.
  --print-url           Print project url and exit.
  --completion [SHELL]  Print completion scripts for `SHELL` and exit
                        (default: `bash`).

------------------------------ COMPLEX.PY ENGLISH ------------------------------

usage: complex.py english [-h] name

The `complex.py english` command says hello in English.

positional arguments:
  name        The person to say hello to.

options:
  -h, --help  Show this help message and exit.

------------------------------ COMPLEX.PY SPANISH ------------------------------

usage: complex.py spanish [-h] name

The `complex.py spanish` command says hello in Spanish.

positional arguments:
  name        The person to say hello to.

options:
  -h, --help  Show this help message and exit.

Project details


Download files

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

Source Distribution

rlane_libcli-1.0.8.tar.gz (18.6 kB view details)

Uploaded Source

Built Distribution

rlane_libcli-1.0.8-py3-none-any.whl (20.6 kB view details)

Uploaded Python 3

File details

Details for the file rlane_libcli-1.0.8.tar.gz.

File metadata

  • Download URL: rlane_libcli-1.0.8.tar.gz
  • Upload date:
  • Size: 18.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.13.0

File hashes

Hashes for rlane_libcli-1.0.8.tar.gz
Algorithm Hash digest
SHA256 16fb629a7498ede181e6439f5933a865e0a68d93273d6fcfdd27cac11732be92
MD5 f65984c250b106c5616862c1fcb9d880
BLAKE2b-256 c57cb4b5e40616496c9aa1945fe5b5ab30c486afb310fcd4a84d495593faf24b

See more details on using hashes here.

File details

Details for the file rlane_libcli-1.0.8-py3-none-any.whl.

File metadata

  • Download URL: rlane_libcli-1.0.8-py3-none-any.whl
  • Upload date:
  • Size: 20.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.13.0

File hashes

Hashes for rlane_libcli-1.0.8-py3-none-any.whl
Algorithm Hash digest
SHA256 451092677facd4e8e5c3df6f9f21969fc69b85b1278d1f9e99166fd49a1936d1
MD5 56e4d5684c46e98addbda0bf63daa165
BLAKE2b-256 7fd26db38c96a62ecd2e367ec5373a9ec60bc115165bbcc249ad9b79d8de2b08

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