Skip to main content

A rich text formatter for argparse help with export and default features

Project description

rich-argparse-plus

Format argparse help output with rich.

This is a fork of the awesome original rich-argparse so check there to see the details. This version adds a few features:

  1. Render to various image/web formats by setting an variable when you run --help. PNG, PDF, HTML, SVG, PS, EPS, colored text are supported. Show off your fancy stuff.
  2. Select from several preconfigured color themes.
  3. Displays default argument values by default.
  4. Displays the range of acceptable values for integer arguments limited by choices=range(n).

Attn: PyPi Users: To see the images view this README on github

prince

(That's the prince theme, for obvious reasons).

Installation

pip install rich-argparse-plus

Or copy the file rich_argparse.py to your project provided you have rich already installed.

Usage

Pass the formatter_class to the argument parser, optionally choosing a theme.

import argparse
from rich_argparse_plus import RichHelpFormatterPlus

RichHelpFormatterPlus.choose_theme('prince')
parser = argparse.ArgumentParser(..., formatter_class=RichHelpFormatterPlus)

Rendering Help Text As Imagery

Formats supported are html, png, pdf, ps, svg, eps, and txt (colored text). To actually render send the RENDER_HELP_FORMAT environment variable while you run your program with --help:

# Render a png to the current directory
RENDER_HELP_FORMAT=png my_awesome_program.py --help

# Set RENDER_HELP_OUTPUT_DIR to send the output somewhere else
RENDER_HELP_FORMAT=pdf RENDER_HELP_OUTPUT_DIR=doc/themes/ my_awesome_program --help

Perusing Themes

You can view images of all the themes here in the repo. Here's a couple of them:

roses

black_and_white

black_and_white

black_and_white

dracula

dracula

default

default

Alternatively you can run RICH_RENDER_THEMES=true python -m rich_argparse_plus xyz to print them to your terminal.

Recipes

argparse's subparsers

argparse subparsers do not inherit the formatter class from the parent parser. To have the help text of subparsers formatted with rich, you have to explicitly pass formatter_class to the subparsers:

  1. you can pass it to all subparsers at once:
     subparsers = parser.add_subparsers(
         ..., parser_class=lambda **k: type(parser)(**k, formatter_class=parser.formatter_class),
     )
     p1 = subparsers.add_parser(...)
     p2 = subparsers.add_parser(...)
    
  2. or to each subparser individually:
     subparsers = parser.add_subparsers(...)
     p1 = subparsers.add_parser(..., formatter_class=parser.formatter_class)
     p2 = subparsers.add_parser(..., formatter_class=parser.formatter_class)
    

django's commands

django uses argparse for its built in commands as well as for extension libraries and user defined commands. To use rich_argparse with these commands, change your manage.py file as follows:

diff --git a/my_project/manage.py b/my_project/manage.py
index 7fb6855..5e5d48a 100755
--- a/my_project/manage.py
+++ b/my_project/manage.py
@@ -1,22 +1,38 @@
 #!/usr/bin/env python
 """Django's command-line utility for administrative tasks."""
 import os
 import sys


 def main():
     """Run administrative tasks."""
     os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_project.settings')
     try:
         from django.core.management import execute_from_command_line
     except ImportError as exc:
         raise ImportError(
             "Couldn't import Django. Are you sure it's installed and "
             "available on your PYTHONPATH environment variable? Did you "
             "forget to activate a virtual environment?"
         ) from exc
+
+    from django.core.management.base import BaseCommand, DjangoHelpFormatter
+    from rich_argparse_plus import RichHelpFormatterPlus
+
+    class RichDjangoHelpFormatter(DjangoHelpFormatter, RichHelpFormatterPlus):  # django first
+        """A rich-based help formatter for django commands."""
+
+    original_create_parser = BaseCommand.create_parser
+
+    def create_parser(*args, **kwargs):
+        parser = original_create_parser(*args, **kwargs)
+        parser.formatter_class = RichDjangoHelpFormatter  # set the formatter_class
+        return parser
+
+    BaseCommand.create_parser = create_parser
+
     execute_from_command_line(sys.argv)


 if __name__ == '__main__':
     main()

Now try out some command like: python manage.py runserver --help

Special text highlighting

You can highlight patterns in the help text of your CLI. By default, RichHelpFormatterPlus defines the following styles:

>>> pprint(RichHelpFormatterPlus.styles)
{'argparse.args': 'cyan',
 'argparse.groups': 'dark_orange',
 'argparse.help': 'default',
 'argparse.metavar': 'dark_cyan',
 'argparse.syntax': 'bold',
 'argparse.text': 'default'}

The following example highlights all occurrences of pyproject.toml in green.

# add a style called `pyproject` which applies a green style (any rich style works)
RichHelpFormatterPlus.styles["argparse.pyproject"] = "green"
# add the highlight regex (the regex group name must match an existing style name)
RichHelpFormatterPlus.highlights.append(r"\b(?P<pyproject>pyproject\.toml)\b")
# pass the formatter class to argparse
parser = argparse.ArgumentParser(..., formatter_class=RichHelpFormatterPlus)
...

Custom group name formatting

You can change the formatting of the group name (like 'positional arguments' and 'options') by setting the RichHelpFormatterPlus.group_name_formatter to any function that takes the group name as an input and returns a str. By default, RichHelpFormatterPlus sets the function to str.upper.

RichHelpFormatterPlus.group_name_formatter = str.title

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

rich_argparse_plus-0.3.1.1.tar.gz (23.8 kB view details)

Uploaded Source

Built Distribution

rich_argparse_plus-0.3.1.1-py3-none-any.whl (11.6 kB view details)

Uploaded Python 3

File details

Details for the file rich_argparse_plus-0.3.1.1.tar.gz.

File metadata

  • Download URL: rich_argparse_plus-0.3.1.1.tar.gz
  • Upload date:
  • Size: 23.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.28.1

File hashes

Hashes for rich_argparse_plus-0.3.1.1.tar.gz
Algorithm Hash digest
SHA256 9347f3ba49096f7a1ef80339dd5aeccf34558995d574f3c1e6bd67e8302c8f18
MD5 ba3ed93ac7632feb6241d865a0093067
BLAKE2b-256 161ae791e88344f899deb8582208115cd8cd925d37e5b9a733b5afe0da4a0eee

See more details on using hashes here.

Provenance

File details

Details for the file rich_argparse_plus-0.3.1.1-py3-none-any.whl.

File metadata

File hashes

Hashes for rich_argparse_plus-0.3.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 beae8e1e43701229eb4eab7952d306d286aa6799a28382b9abeb42e99d53ba0a
MD5 5b142a82f5c034f216b477949730bc8b
BLAKE2b-256 6b68ec05de90816cdfca1649b8144558788976eed5fa09754a278e9d418fa546

See more details on using hashes here.

Provenance

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