diff options
Diffstat (limited to 'venv/lib/python3.11/site-packages/rich_click-1.7.4.dist-info/METADATA')
-rw-r--r-- | venv/lib/python3.11/site-packages/rich_click-1.7.4.dist-info/METADATA | 633 |
1 files changed, 633 insertions, 0 deletions
diff --git a/venv/lib/python3.11/site-packages/rich_click-1.7.4.dist-info/METADATA b/venv/lib/python3.11/site-packages/rich_click-1.7.4.dist-info/METADATA new file mode 100644 index 0000000..13b442a --- /dev/null +++ b/venv/lib/python3.11/site-packages/rich_click-1.7.4.dist-info/METADATA @@ -0,0 +1,633 @@ +Metadata-Version: 2.1 +Name: rich-click +Version: 1.7.4 +Summary: Format click help output nicely with rich +Home-page: https://github.com/ewels/rich-click +Author: Phil Ewels +Author-email: phil@ewels.co.uk +Maintainer: Phil Ewels +Maintainer-email: phil@ewels.co.uk +License: MIT +Project-URL: Documentation, https://github.com/ewels/rich-click +Project-URL: Source Code, https://github.com/ewels/rich-click +Project-URL: Issue Tracker, https://github.com/ewels/rich-click/issues/ +Classifier: Development Status :: 3 - Alpha +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Requires-Python: >=3.7 +Description-Content-Type: text/markdown +License-File: LICENSE +Requires-Dist: click >=7 +Requires-Dist: rich >=10.7.0 +Requires-Dist: typing-extensions +Requires-Dist: importlib-metadata ; python_version < "3.8" +Provides-Extra: dev +Requires-Dist: mypy ; extra == 'dev' +Requires-Dist: pre-commit ; extra == 'dev' +Requires-Dist: pytest ; extra == 'dev' +Requires-Dist: flake8 ; extra == 'dev' +Requires-Dist: flake8-docstrings ; extra == 'dev' +Requires-Dist: pytest-cov ; extra == 'dev' +Requires-Dist: packaging ; extra == 'dev' +Requires-Dist: types-setuptools ; extra == 'dev' + +<p align="center"> + <picture> + <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/ewels/rich-click/main/docs/images/rich-click-logo-darkmode.png"> + <img alt="rich-click logo" src="https://raw.githubusercontent.com/ewels/rich-click/main/docs/images/rich-click-logo.png"> + </picture> +</p> +<p align="center"> + <em>Richly rendered command line interfaces in click.</em> +</p> +<p align="center"> + <img src="https://github.com/ewels/rich-click/workflows/Test%20Coverage/badge.svg" alt="Test Coverage badge"> + <img src="https://github.com/ewels/rich-click/workflows/Lint%20code/badge.svg" alt="Lint code badge"> +</p> + +--- + +**rich-click** is a shim around [click](https://click.palletsprojects.com/) that renders help output nicely using [Rich](https://github.com/Textualize/rich). + +- Click is a _"Python package for creating beautiful command line interfaces"_. +- Rich is a _"Python library for rich text and beautiful formatting in the terminal"_. + +The intention of `rich-click` is to provide attractive help output from +click, formatted with rich, with minimal customisation required. + +## Features + +- 🌈 Rich command-line formatting of click help and error messages +- 💫 Nice styles be default, usage is simply `import rich_click as click` +- 💻 CLI tool to run on _other people's_ tools (prefix the command with `rich-click`) +- 🎁 Group commands and options into named panels +- ❌ Well formatted error messages +- 🔢 Easily give custom sort order for options and commands +- 🎨 Extensive customisation of styling and behaviour possible + +## Examples + +### Simple Example + +To use rich-click in your code, replace `import click` with `import rich_click as click` in your existing click CLI: + +```python +import rich_click as click + +@click.command() +@click.option("--count", default=1, help="Number of greetings.") +@click.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): + click.echo(f"Hello, {name}!") + +if __name__ == '__main__': + hello() +``` + +![`python examples/11_hello.py --help`](docs/images/hello.svg) + +_Screenshot from [`examples/11_hello.py`](examples/11_hello.py)_ + +### More complex example + +![examples/03_groups_sorting.py](docs/images/command_groups.svg) + +_Screenshot from [`examples/03_groups_sorting.py`](examples/03_groups_sorting.py)_ + +## Installation + +You can install `rich-click` from the [Python Package Index (PyPI)](https://pypi.org/project/rich-click/) with `pip` or equivalent. + +```bash +python -m pip install rich-click +``` + +Conda users can find `rich-click` on [conda forge](https://anaconda.org/conda-forge/rich-click). +Just set up conda to use conda-forge (see [docs](https://conda-forge.org/docs/user/introduction.html#how-can-i-install-packages-from-conda-forge)) then run: + +```bash +conda install rich-click +``` + +Users on macOS can install `rich-click` via [MacPorts](https://ports.macports.org/port/py-rich-click/). + +```bash +sudo port install py-rich-click +``` + +Note that rich-click requires `click>=7` but formatted subcommands (groups) only work with `click>=8`. With v7 the output simply reverts to default click output. + +## Usage + +### Import as click + +To use `rich-click`, switch out your normal `click` import with `rich-click`, using the same namespace: + +```python +import rich_click as click +``` + +That's it! ✨ Then continue to use `click` as you would normally. + +> See [`examples/01_simple.py`](examples/01_simple.py) for an example. + +The intention is to maintain most / all of the normal click functionality and arguments. +If you spot something that breaks or is missing once you start using the plugin, please create an issue about it. + +### Declarative + +If you prefer, you can `RichGroup` or `RichCommand` with the `cls` argument in your click usage instead. +This means that you can continue to use the unmodified `click` package in parallel. + +> See [`examples/02_declarative.py`](examples/02_declarative.py) for an example. + +### Command-line usage + +`rich-click` comes with a CLI tool that allows you to format the click help output from _any_ package. +As long as that tool is using click and isn't already passing custom `cls` objects, it should work. +However, please consider it an experimental feature at this point. + +To use, simply prefix to your normal command. +For example, to get richified click help text from a package called `awesometool`, you could run: + +```console +$ rich-click awesometool --help + +Usage: awesometool [OPTIONS] +..more richified output below.. +``` + +### Patching + +In some situations, you might be registering a command from another Click CLI that does not use Rich-Click: + +```python +import rich_click as click +from some_library import another_cli + +@click.group("my-cli") +def cli(): + pass + +# `another_cli` will NOT have Rich-Click markup. :( +cli.add_command(another_cli) +``` + +In this situation, `another_cli` retains its original behavior. In order to make `another_cli` work with Rich-Click, you need to patch `click` before you import `another_cli`. You can patch Click with `rich_click.cli.patch` like this: + +```python +import rich_click as click +from rich_click.cli import patch + +patch() + +from some_library import another_cli # noqa: E402 + +@click.group("my-cli") +def cli(): + pass + +# `another_cli` will have Rich-Click markup. :) +cli.add_command(another_cli) +``` + +## Customisation + +There are a large number of customisation options in rich-click. +These can be modified by changing variables in the `click.rich_click` namespace. + +Note that most normal click options should still work, such as `show_default=True`, `required=True` and `hidden=True`. + +> Note: All images below are auto-generated using another side-project of mine: [rich-codex](https://github.com/ewels/rich-codex). Pretty cool! + +### Using Rich markup + +In order to be as widely compatible as possible with a simple import, rich-click does _not_ parse rich formatting markup (eg. `[red]`) by default. You need to opt-in to this behaviour. + +To use rich markup in your help texts, add the following: + +```python +click.rich_click.USE_RICH_MARKUP = True +``` + +Or alternatively, with the `rich_config` and `RichHelpConfiguration`: + +```python +@click.command() +@click.rich_config(help_config=click.RichHelpConfiguration(use_rich_markup=True)) +def cli(): + ... +``` + +Remember that you'll need to escape any regular square brackets using a back slash in your help texts, +for example: `[dim]\[my-default: foo][\]` + +![`python examples/04_rich_markup.py --help`](docs/images/rich_markup.svg "Rich markup example") + +> See [`examples/04_rich_markup.py`](examples/04_rich_markup.py) for an example. + +### Using Markdown + +If you prefer, you can use Markdown text. +You must choose either Markdown or rich markup. If you specify both, Markdown takes preference. + +```python +click.rich_click.USE_MARKDOWN = True +``` + +Or alternatively, with the `RichHelpConfiguration`: + +```python +@click.command() +@click.rich_config(help_config=click.RichHelpConfiguration(use_markdown=True)) +def cli(): + ... +``` + +![`python examples/05_markdown.py --help`](docs/images/markdown.svg "Markdown example") + +> See [`examples/05_markdown.py`](examples/05_markdown.py) for an example. + +### Positional arguments + +The default click behaviour is to only show positional arguments in the top usage string, +and not in the list below with the options. + +If you prefer, you can tell rich-click to show arguments with `SHOW_ARGUMENTS`. +By default, they will get their own panel but you can tell rich-click to bundle them together with `GROUP_ARGUMENTS_OPTIONS`: + +```python +click.rich_click.SHOW_ARGUMENTS = True +click.rich_click.GROUP_ARGUMENTS_OPTIONS = True +``` + +Or alternatively, with the `RichHelpConfiguration`: + +```python +help_config = click.RichHelpConfiguration( + show_arguments=True, + group_arguments_options=True +) + +@click.command() +@click.rich_config(help_config=help_config) +def cli(): + ... +``` + +![`python examples/06_arguments.py --help`](docs/images/arguments.svg "Positional arguments example") + +> See [`examples/06_arguments.py`](examples/06_arguments.py) for an example. + +### Metavars and option choices + +Metavars are click's way of showing expected input types. +For example, if you have an option that must be an integer, the metavar is `INTEGER`. +If you have a choice, the metavar is a list of the possible values. + +By default, rich-click shows metavars in their own column. +However, if you have a long list of choices, this column can be quite wide and result in a lot of white space: + +![`python examples/08_metavars_default.py --help`](docs/images/metavars_default.svg "Default metavar display") + +It may look better to show metavars appended to the help text, instead of in their own column. +For this, use the following: + +```python +click.rich_click.SHOW_METAVARS_COLUMN = False +click.rich_click.APPEND_METAVARS_HELP = True +``` + +```python +help_config = click.RichHelpConfiguration( + show_metavars_column=False, + append_metavars_help=True +) + +@click.command() +@click.rich_config(help_config=help_config) +def cli(): + ... +``` + +![`python examples/08_metavars.py --help`](docs/images/metavars_appended.svg "Appended metavar") + +> See [`examples/08_metavars.py`](examples/08_metavars.py) for an example. + +### Error messages + +By default, rich-click gives some nice formatting to error messages: + +![`python examples/01_simple.py --hep || true`](docs/images/error.svg "Error message") + +You can customise the _Try 'command --help' for help._ message with `ERRORS_SUGGESTION` +using rich-click though, and add some text after the error with `ERRORS_EPILOGUE`. + +For example, from [`examples/07_custom_errors.py`](examples/07_custom_errors.py): + +```python +click.rich_click.STYLE_ERRORS_SUGGESTION = "magenta italic" +click.rich_click.ERRORS_SUGGESTION = "Try running the '--help' flag for more information." +click.rich_click.ERRORS_EPILOGUE = "To find out more, visit [link=https://mytool.com]https://mytool.com[/link]" +``` + +![`python examples/07_custom_errors.py --hep || true`](docs/images/custom_error.svg "Custom error message") + +> See [`examples/07_custom_errors.py`](examples/07_custom_errors.py) for an example. + +### Help width + +The default behaviour of rich-click is to use the full width of the terminal for output. +However, if you've carefully crafted your help texts for the default narrow click output, you may find that you now have a lot of whitespace at the side of the panels. + +To limit the maximum width of the help output, regardless of the terminal size, set `WIDTH` in characters as follows: + +```python +click.rich_click.WIDTH = 128 +``` + +To still use the full width of the terminal up to a certain limit, set `MAX_WIDTH` in characters as follows: + +```python +click.rich_click.MAX_WIDTH = 96 +``` + +Setting `MAX_WIDTH` overrides the effect of `WIDTH` + +### Styling + +Most aspects of rich-click formatting can be customised, from colours to alignment. + +For example, to print the option flags in a different colour, you can use: + +```python +click.rich_click.STYLE_OPTION = "magenta" +``` + +To add a blank line between rows of options, you can use: + +```python +click.rich_click.STYLE_OPTIONS_TABLE_LEADING = 1 +click.rich_click.STYLE_OPTIONS_TABLE_BOX = "SIMPLE" +``` + +You can make some really ~horrible~ _colourful_ solutions using these styles if you wish: + +<!-- RICH-CODEX +extra_env: + TERMINAL_WIDTH: 160 +--> + +![`python examples/10_table_styles.py --help`](docs/images/style_tables.svg "Rich markup example") + +> See [`examples/10_table_styles.py`](examples/10_table_styles.py) for an example. + +See the [_Configuration options_](#configuration-options) section below for the full list of available options. + +## Groups and sorting + +`rich-click` gives functionality to list options and subcommands in groups, printed as separate panels. +It accepts a list of options / commands which means you can also choose a custom sorting order. + +- For options (flags), set `click.rich_click.OPTION_GROUPS` +- For subcommands (groups), set `click.rich_click.COMMAND_GROUPS` + +![`python examples/03_groups_sorting.py --help`](docs/images/command_groups.svg "Command groups") + +When grouping subcommands into more than one group (in above example: 'Main usage' and 'Configuration') you may find that the automatically calculated widths of different groups do not line up, due to varying option name lengths. + +You can avoid this by enforcing the alignment of the help text across groups by setting `click.rich_click.STYLE_COMMANDS_TABLE_COLUMN_WIDTH_RATIO = (1, 2)`. This results in a fixed ratio of 1:2 for the width of command name and help text column. + +> See [`examples/03_groups_sorting.py`](examples/03_groups_sorting.py) for a full example. + +### Options + +To group option flags into two sections with custom names, see the following example: + +```python +click.rich_click.OPTION_GROUPS = { + "mytool": [ + { + "name": "Simple options", + "options": ["--name", "--description", "--version", "--help"], + }, + { + "name": "Advanced options", + "options": ["--force", "--yes", "--delete"], + }, + ] +} +``` + +If you omit `name` it will use `Commands` (can be configured with `OPTIONS_PANEL_TITLE`). + +### Commands + +Here we create two groups of commands for the base command of `mytool`. +Any subcommands not listed will automatically be printed in a panel at the end labelled "Commands" as usual. + +```python +click.rich_click.COMMAND_GROUPS = { + "mytool": [ + { + "name": "Commands for uploading", + "commands": ["sync", "upload"], + }, + { + "name": "Download data", + "commands": ["get", "fetch", "download"], + }, + ] +} +``` + +If you omit `name` it will use `Commands` (can be configured with `COMMANDS_PANEL_TITLE`). + +### Multiple commands + +If you use multiple nested subcommands, you can specify their commands using the top-level dictionary keys: + +```python +click.rich_click.COMMAND_GROUPS = { + "mytool": [{"commands": ["sync", "auth"]}], + "mytool sync": [ + { + "name": "Commands for uploading", + "commands": ["sync", "upload"], + }, + { + "name": "Download data", + "commands": ["get", "fetch", "download"], + }, + ], + "mytool auth":[{"commands": ["login", "logout"]}], +} +``` + +### Table styling + +Typically you would style the option / command tables using the global config options. +However, if you wish you may style tables on a per-group basis using the `table_styles` key: + +```python +click.rich_click.COMMAND_GROUPS = { + "mytool": [ + { + "commands": ["sync", "auth"], + "table_styles": { + "show_lines": True, + "row_styles": ["magenta", "yellow", "cyan", "green"], + "border_style": "red", + "box": "DOUBLE", + }, + }, + ], +} +``` + +The available keys are: `show_lines`, `leading`, `box`, `border_style`, `row_styles`, `pad_edge`, `padding`. + +## Configuration options + +Here is the full list of config options: + +```python +# Default styles +STYLE_OPTION = "bold cyan" +STYLE_ARGUMENT = "bold cyan" +STYLE_COMMAND = "bold cyan" +STYLE_SWITCH = "bold green" +STYLE_METAVAR = "bold yellow" +STYLE_METAVAR_APPEND = "dim yellow" +STYLE_METAVAR_SEPARATOR = "dim" +STYLE_HEADER_TEXT = "" +STYLE_EPILOG_TEXT = "" +STYLE_FOOTER_TEXT = "" +STYLE_USAGE = "yellow" +STYLE_USAGE_COMMAND = "bold" +STYLE_DEPRECATED = "red" +STYLE_HELPTEXT_FIRST_LINE = "" +STYLE_HELPTEXT = "dim" +STYLE_OPTION_HELP = "" +STYLE_OPTION_DEFAULT = "dim" +STYLE_OPTION_ENVVAR = "dim yellow" +STYLE_REQUIRED_SHORT = "red" +STYLE_REQUIRED_LONG = "dim red" +STYLE_OPTIONS_PANEL_BORDER = "dim" +ALIGN_OPTIONS_PANEL = "left" +STYLE_OPTIONS_TABLE_SHOW_LINES = False +STYLE_OPTIONS_TABLE_LEADING = 0 +STYLE_OPTIONS_TABLE_PAD_EDGE = False +STYLE_OPTIONS_TABLE_PADDING = (0, 1) +STYLE_OPTIONS_TABLE_BOX = "" +STYLE_OPTIONS_TABLE_ROW_STYLES = None +STYLE_OPTIONS_TABLE_BORDER_STYLE = None +STYLE_COMMANDS_PANEL_BORDER = "dim" +ALIGN_COMMANDS_PANEL = "left" +STYLE_COMMANDS_TABLE_SHOW_LINES = False +STYLE_COMMANDS_TABLE_LEADING = 0 +STYLE_COMMANDS_TABLE_PAD_EDGE = False +STYLE_COMMANDS_TABLE_PADDING = (0, 1) +STYLE_COMMANDS_TABLE_BOX = "" +STYLE_COMMANDS_TABLE_ROW_STYLES = None +STYLE_COMMANDS_TABLE_BORDER_STYLE = None +STYLE_COMMANDS_TABLE_COLUMN_WIDTH_RATIO = (None, None) +STYLE_ERRORS_PANEL_BORDER = "red" +ALIGN_ERRORS_PANEL = "left" +STYLE_ERRORS_SUGGESTION = "dim" +STYLE_ERRORS_SUGGESTION_COMMAND = "blue" +STYLE_ABORTED = "red" +WIDTH = int(getenv("TERMINAL_WIDTH")) if getenv("TERMINAL_WIDTH") else None +MAX_WIDTH = int(getenv("TERMINAL_WIDTH")) if getenv("TERMINAL_WIDTH") else WIDTH +COLOR_SYSTEM = "auto" # Set to None to disable colors +FORCE_TERMINAL = True if getenv("GITHUB_ACTIONS") or getenv("FORCE_COLOR") or getenv("PY_COLORS") else None + +# Fixed strings +HEADER_TEXT = None +FOOTER_TEXT = None +DEPRECATED_STRING = "(Deprecated) " +DEFAULT_STRING = "[default: {}]" +ENVVAR_STRING = "[env var: {}]" +REQUIRED_SHORT_STRING = "*" +REQUIRED_LONG_STRING = "[required]" +RANGE_STRING = " [{}]" +APPEND_METAVARS_HELP_STRING = "({})" +ARGUMENTS_PANEL_TITLE = "Arguments" +OPTIONS_PANEL_TITLE = "Options" +COMMANDS_PANEL_TITLE = "Commands" +ERRORS_PANEL_TITLE = "Error" +ERRORS_SUGGESTION = None # Default: Try 'cmd -h' for help. Set to False to disable. +ERRORS_EPILOGUE = None +ABORTED_TEXT = "Aborted." + +# Behaviours +SHOW_ARGUMENTS = False # Show positional arguments +SHOW_METAVARS_COLUMN = True # Show a column with the option metavar (eg. INTEGER) +APPEND_METAVARS_HELP = False # Append metavar (eg. [TEXT]) after the help text +GROUP_ARGUMENTS_OPTIONS = False # Show arguments with options instead of in own panel +OPTION_ENVVAR_FIRST = False # Show env vars before option help text instead of avert +USE_MARKDOWN = False # Parse help strings as markdown +USE_MARKDOWN_EMOJI = True # Parse emoji codes in markdown :smile: +USE_RICH_MARKUP = False # Parse help strings for rich markup (eg. [red]my text[/]) +COMMAND_GROUPS = {} # Define sorted groups of panels to display subcommands +OPTION_GROUPS = {} # Define sorted groups of panels to display options and arguments +USE_CLICK_SHORT_HELP = False # Use click's default function to truncate help text +``` + +Full type annotations of these config options are availble in `src/rich_click/rich_click.py`. + +100% of these options are supported in the `RichHelpConfiguration` class, as well. + +## Contributing + +Contributions and suggestions for new features are welcome, as are bug reports! +Please create a new [issue](https://github.com/ewels/rich-click/issues) +or better still, dive right in with a pull-request. + +### Local setup + +1. Create a new venv with a python3.7+ interpreter using `python3 -m venv venv` +2. Activate the venv with `source venv/bin/activate` +3. Install our the package as an editable including all dev dependencies with `pip3 install -e ."[dev]"` +4. Install pre-commit with `pre-commit install` + +#### Pre-commit + +Our pre-commit hooks contain the following hooks: + +- [Prettier](https://prettier.io/): formats our markdown and yaml files nicely. +- no relative imports: prevents you from using relative imports. +- [iSort](https://pycqa.github.io/isort/): will automatically sort the imports alphabetically. +- [black](https://black.readthedocs.io/): will automatically format your code to be according to standardized python format. +- [flake8](https://flake8.pycqa.org/): will do linting checks to make sure all your code is correctly styled and used. +- [mypy](http://mypy-lang.org/): static type checker which verifies you are not using objects incorrectly. + +As mentioned, some of these tools automatically fix your code while other only highlight potential issues. +Sometimes it will be enough to try to commit a second time and it will pass, while other times it may require +manual changes to your code. + +In rare cases it may be difficult or undesirable to change to code to pass the linting rules. +If this happens, it's ok to add a flake8 `# noqa` or mypy `# type: ignore` comment to skip that line. +For details of how to do this, please see the [flake8 docs](https://flake8.pycqa.org/en/3.1.1/user/ignoring-errors.html#in-line-ignoring-errors) +and [mypy docs](https://mypy.readthedocs.io/en/stable/common_issues.html#spurious-errors-and-locally-silencing-the-checker). + +## Credits + +This package was written by Phil Ewels ([@ewels](http://github.com/ewels/)), +based on initial code by Will McGugan ([@willmcgugan](https://github.com/willmcgugan)). + +rich-click is co-maintained by [@dwreeves](http://github.com/dwreeves/). + +Furthermore, these contributors helped make the package what it is today: + +- [@BrutalSimplicity](https://github.com/BrutalSimplicity) +- [@harens](http://github.com/harens/) +- [@fridex](http://github.com/fridex/) +- [@pawamoy](http://github.com/pawamoy/) +- [@jorrick](http://github.com/harens/) + +See the full list of contributors [here](https://github.com/ewels/rich-click/graphs/contributors). |