diff options
author | cyfraeviolae <cyfraeviolae> | 2024-04-03 03:17:55 -0400 |
---|---|---|
committer | cyfraeviolae <cyfraeviolae> | 2024-04-03 03:17:55 -0400 |
commit | 12cf076118570eebbff08c6b3090e0d4798447a1 (patch) | |
tree | 3ba25e17e3c3a5e82316558ba3864b955919ff72 /venv/lib/python3.11/site-packages/rich_click | |
parent | c45662ff3923b34614ddcc8feb9195541166dcc5 (diff) |
no venv
Diffstat (limited to 'venv/lib/python3.11/site-packages/rich_click')
25 files changed, 0 insertions, 1988 deletions
diff --git a/venv/lib/python3.11/site-packages/rich_click/__init__.py b/venv/lib/python3.11/site-packages/rich_click/__init__.py deleted file mode 100644 index 18ad228..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/__init__.py +++ /dev/null @@ -1,104 +0,0 @@ -# flake8: noqa: F401 -""" -rich-click is a minimal Python module to combine the efforts of the excellent packages 'rich' and 'click'. - -The intention is to provide attractive help output from click, formatted with rich, with minimal -customisation required. -""" - -__version__ = "1.7.4" - -# Import the entire click API here. -# We need to manually import these instead of `from click import *` to force mypy to recognize a few type annotation overrides for the rich_click decorators. -from click.core import Argument as Argument -from click.core import Command as Command -from click.core import CommandCollection as CommandCollection -from click.core import Context as Context -from click.core import Group as Group -from click.core import Option as Option -from click.core import Parameter as Parameter -from click.decorators import argument as argument -from click.decorators import confirmation_option as confirmation_option -from click.decorators import help_option as help_option -from click.decorators import make_pass_decorator as make_pass_decorator -from click.decorators import option as option -from click.decorators import pass_obj as pass_obj -from click.decorators import password_option as password_option -from click.decorators import version_option as version_option -from click.exceptions import Abort as Abort -from click.exceptions import BadArgumentUsage as BadArgumentUsage -from click.exceptions import BadOptionUsage as BadOptionUsage -from click.exceptions import BadParameter as BadParameter -from click.exceptions import ClickException as ClickException -from click.exceptions import FileError as FileError -from click.exceptions import MissingParameter as MissingParameter -from click.exceptions import NoSuchOption as NoSuchOption -from click.exceptions import UsageError as UsageError -from click.formatting import HelpFormatter as HelpFormatter -from click.formatting import wrap_text as wrap_text -from click.globals import get_current_context as get_current_context -from click.termui import clear as clear -from click.termui import confirm as confirm -from click.termui import echo_via_pager as echo_via_pager -from click.termui import edit as edit -from click.termui import getchar as getchar -from click.termui import launch as launch -from click.termui import pause as pause -from click.termui import progressbar as progressbar -from click.termui import prompt as prompt -from click.termui import secho as secho -from click.termui import style as style -from click.termui import unstyle as unstyle -from click.types import BOOL as BOOL -from click.types import Choice as Choice -from click.types import DateTime as DateTime -from click.types import File as File -from click.types import FLOAT as FLOAT -from click.types import FloatRange as FloatRange -from click.types import INT as INT -from click.types import IntRange as IntRange -from click.types import ParamType as ParamType -from click.types import Path as Path -from click.types import STRING as STRING -from click.types import Tuple as Tuple -from click.types import UNPROCESSED as UNPROCESSED -from click.types import UUID as UUID -from click.utils import echo as echo -from click.utils import format_filename as format_filename -from click.utils import get_app_dir as get_app_dir -from click.utils import get_binary_stream as get_binary_stream -from click.utils import get_text_stream as get_text_stream -from click.utils import open_file as open_file - -from . import rich_click as rich_click - -from rich_click.decorators import command as command -from rich_click.decorators import group as group -from rich_click.decorators import pass_context as pass_context -from rich_click.decorators import rich_config as rich_config -from rich_click.rich_command import RichCommand as RichCommand -from rich_click.rich_command import RichCommandCollection as RichCommandCollection -from rich_click.rich_command import RichGroup as RichGroup -from rich_click.rich_context import RichContext as RichContext -from rich_click.rich_help_configuration import RichHelpConfiguration as RichHelpConfiguration - - -def __getattr__(name: str) -> object: - from rich_click._compat_click import CLICK_IS_BEFORE_VERSION_9X - - if name == "RichMultiCommand" and CLICK_IS_BEFORE_VERSION_9X: - import warnings - - warnings.warn( - "'RichMultiCommand' is deprecated and will be removed in Click 9.0. Use 'RichGroup' instead.", - DeprecationWarning, - stacklevel=2, - ) - from rich_click.rich_command import RichMultiCommand - - return RichMultiCommand - - else: - import click - - return getattr(click, name) diff --git a/venv/lib/python3.11/site-packages/rich_click/__main__.py b/venv/lib/python3.11/site-packages/rich_click/__main__.py deleted file mode 100644 index 9406f8f..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/__main__.py +++ /dev/null @@ -1,13 +0,0 @@ -""" -Entry-point module for the command line prefixer, called in case you use `python -m rich_click`. - -Why does this file exist, and why `__main__`? For more info, read: -- https://www.python.org/dev/peps/pep-0338/ -- https://docs.python.org/3/using/cmdline.html#cmdoption-m -""" - -from rich_click.cli import main - -if __name__ == "__main__": - # main will run a Click command which will either exit or raise - main() diff --git a/venv/lib/python3.11/site-packages/rich_click/__pycache__/__init__.cpython-311.pyc b/venv/lib/python3.11/site-packages/rich_click/__pycache__/__init__.cpython-311.pyc Binary files differdeleted file mode 100644 index 16b88c4..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/__pycache__/__init__.cpython-311.pyc +++ /dev/null diff --git a/venv/lib/python3.11/site-packages/rich_click/__pycache__/__main__.cpython-311.pyc b/venv/lib/python3.11/site-packages/rich_click/__pycache__/__main__.cpython-311.pyc Binary files differdeleted file mode 100644 index bc3f2f9..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/__pycache__/__main__.cpython-311.pyc +++ /dev/null diff --git a/venv/lib/python3.11/site-packages/rich_click/__pycache__/_compat_click.cpython-311.pyc b/venv/lib/python3.11/site-packages/rich_click/__pycache__/_compat_click.cpython-311.pyc Binary files differdeleted file mode 100644 index a1ddde3..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/__pycache__/_compat_click.cpython-311.pyc +++ /dev/null diff --git a/venv/lib/python3.11/site-packages/rich_click/__pycache__/cli.cpython-311.pyc b/venv/lib/python3.11/site-packages/rich_click/__pycache__/cli.cpython-311.pyc Binary files differdeleted file mode 100644 index 7c9ec62..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/__pycache__/cli.cpython-311.pyc +++ /dev/null diff --git a/venv/lib/python3.11/site-packages/rich_click/__pycache__/decorators.cpython-311.pyc b/venv/lib/python3.11/site-packages/rich_click/__pycache__/decorators.cpython-311.pyc Binary files differdeleted file mode 100644 index 31e15f2..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/__pycache__/decorators.cpython-311.pyc +++ /dev/null diff --git a/venv/lib/python3.11/site-packages/rich_click/__pycache__/rich_click.cpython-311.pyc b/venv/lib/python3.11/site-packages/rich_click/__pycache__/rich_click.cpython-311.pyc Binary files differdeleted file mode 100644 index a7f037d..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/__pycache__/rich_click.cpython-311.pyc +++ /dev/null diff --git a/venv/lib/python3.11/site-packages/rich_click/__pycache__/rich_command.cpython-311.pyc b/venv/lib/python3.11/site-packages/rich_click/__pycache__/rich_command.cpython-311.pyc Binary files differdeleted file mode 100644 index aa6e009..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/__pycache__/rich_command.cpython-311.pyc +++ /dev/null diff --git a/venv/lib/python3.11/site-packages/rich_click/__pycache__/rich_context.cpython-311.pyc b/venv/lib/python3.11/site-packages/rich_click/__pycache__/rich_context.cpython-311.pyc Binary files differdeleted file mode 100644 index 7a7565c..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/__pycache__/rich_context.cpython-311.pyc +++ /dev/null diff --git a/venv/lib/python3.11/site-packages/rich_click/__pycache__/rich_group.cpython-311.pyc b/venv/lib/python3.11/site-packages/rich_click/__pycache__/rich_group.cpython-311.pyc Binary files differdeleted file mode 100644 index cde8f18..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/__pycache__/rich_group.cpython-311.pyc +++ /dev/null diff --git a/venv/lib/python3.11/site-packages/rich_click/__pycache__/rich_help_configuration.cpython-311.pyc b/venv/lib/python3.11/site-packages/rich_click/__pycache__/rich_help_configuration.cpython-311.pyc Binary files differdeleted file mode 100644 index e5349e1..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/__pycache__/rich_help_configuration.cpython-311.pyc +++ /dev/null diff --git a/venv/lib/python3.11/site-packages/rich_click/__pycache__/rich_help_formatter.cpython-311.pyc b/venv/lib/python3.11/site-packages/rich_click/__pycache__/rich_help_formatter.cpython-311.pyc Binary files differdeleted file mode 100644 index 3ea5313..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/__pycache__/rich_help_formatter.cpython-311.pyc +++ /dev/null diff --git a/venv/lib/python3.11/site-packages/rich_click/__pycache__/utils.cpython-311.pyc b/venv/lib/python3.11/site-packages/rich_click/__pycache__/utils.cpython-311.pyc Binary files differdeleted file mode 100644 index 62c3a8b..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/__pycache__/utils.cpython-311.pyc +++ /dev/null diff --git a/venv/lib/python3.11/site-packages/rich_click/_compat_click.py b/venv/lib/python3.11/site-packages/rich_click/_compat_click.py deleted file mode 100644 index 89a13e7..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/_compat_click.py +++ /dev/null @@ -1,25 +0,0 @@ -try: - from importlib import metadata # type: ignore[import,unused-ignore] -except ImportError: - # Python < 3.8 - import importlib_metadata as metadata # type: ignore[no-redef,import-not-found] - - -click_version = metadata.version("click") -_major = int(click_version.split(".")[0]) -_minor = int(click_version.split(".")[1]) - - -CLICK_IS_BEFORE_VERSION_8X = _major < 8 -CLICK_IS_BEFORE_VERSION_9X = _major < 9 -CLICK_IS_VERSION_80 = _major == 8 and _minor == 0 - - -if CLICK_IS_BEFORE_VERSION_8X: - import warnings - - warnings.warn( - "rich-click support for click 7.x is deprecated and will be removed soon." - " Please upgrade click to a newer version.", - DeprecationWarning, - ) diff --git a/venv/lib/python3.11/site-packages/rich_click/cli.py b/venv/lib/python3.11/site-packages/rich_click/cli.py deleted file mode 100644 index a7041a9..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/cli.py +++ /dev/null @@ -1,154 +0,0 @@ -"""The command line interface.""" - -import sys -from importlib import import_module -from textwrap import dedent -from typing import Any, List, Optional - -try: - from importlib import metadata # type: ignore[import,unused-ignore] -except ImportError: - # Python < 3.8 - import importlib_metadata as metadata # type: ignore[no-redef,import-not-found,unused-ignore] - -import click -from rich.console import Console -from rich.padding import Padding -from rich.panel import Panel -from rich.text import Text - -from rich_click.decorators import command as rich_command -from rich_click.decorators import group as rich_group -from rich_click.rich_click import ( - ALIGN_ERRORS_PANEL, - ERRORS_PANEL_TITLE, - STYLE_ERRORS_PANEL_BORDER, - STYLE_HELPTEXT, - STYLE_HELPTEXT_FIRST_LINE, - STYLE_USAGE, - STYLE_USAGE_COMMAND, -) -from rich_click.rich_command import RichCommand, RichCommandCollection, RichGroup, RichMultiCommand - -console = Console() - - -def _print_usage() -> None: - console.print( - Padding( - Text.from_markup(f"[{STYLE_USAGE}]Usage:[/] rich-click [SCRIPT | MODULE:FUNCTION] [-- SCRIPT_ARGS...]"), - 1, - ), - style=STYLE_USAGE_COMMAND, - ) - - -def _print_help() -> None: - help_paragraphs = dedent(main.__doc__ or "").split("\n\n") - help_paragraphs = [x.replace("\n", " ").strip() for x in help_paragraphs] - console.print( - Padding( - Text.from_markup(help_paragraphs[0].strip()), - (0, 1), - ), - style=STYLE_HELPTEXT_FIRST_LINE, - ) - console.print( - Padding( - Text.from_markup("\n\n".join(help_paragraphs[1:]).strip()), - (0, 1), - ), - style=STYLE_HELPTEXT, - ) - - -def patch() -> None: - """Patch Click internals to use Rich-Click types.""" - click.group = rich_group - click.command = rich_command - click.Group = RichGroup # type: ignore[misc] - click.Command = RichCommand # type: ignore[misc] - click.CommandCollection = RichCommandCollection # type: ignore[misc] - if "MultiCommand" in dir(click): - click.MultiCommand = RichMultiCommand # type: ignore[assignment,misc,unused-ignore] - - -def entry_points(*, group: str) -> "metadata.EntryPoints": # type: ignore[name-defined] - """entry_points function that is compatible with Python 3.7+.""" - if sys.version_info >= (3, 10): - return metadata.entry_points(group=group) - - epg = metadata.entry_points() - - if sys.version_info < (3, 8) and hasattr(epg, "select"): - return epg.select(group=group) - - return epg.get(group, []) - - -def main(args: Optional[List[str]] = None) -> Any: - """ - The [link=https://github.com/ewels/rich-click]rich-click[/] CLI provides attractive help output from any - tool using [link=https://click.palletsprojects.com/]click[/], formatted with - [link=https://github.com/Textualize/rich]rich[/]. - - The rich-click command line tool can be prepended before any Python package - using native click to provide attractive richified click help output. - - For example, if you have a package called [blue]my_package[/] that uses click, - you can run: - - [blue] rich-click my_package --help [/] - - It only works if the package is using vanilla click without customised [cyan]group()[/] - or [cyan]command()[/] classes. - If in doubt, please suggest to the authors that they use rich_click within their - tool natively - this will always give a better experience. - """ # noqa: D400, D401 - args = args or sys.argv[1:] - if not args or args == ["--help"]: - # Print usage if we got no args, or only --help - _print_usage() - _print_help() - sys.exit(0) - else: - script_name = args[0] - scripts = {script.name: script for script in entry_points(group="console_scripts")} - if script_name in scripts: - # a valid script was passed - script = scripts[script_name] - module_path, function_name = script.value.split(":", 1) - prog = script_name - elif ":" in script_name: - # the path to a function was passed - module_path, function_name = args[0].split(":", 1) - prog = module_path.split(".", 1)[0] - else: - _print_usage() - console.print( - Panel( - Text.from_markup(f"No such script: [bold]{script_name}[/]"), - border_style=STYLE_ERRORS_PANEL_BORDER, - title=ERRORS_PANEL_TITLE, - title_align=ALIGN_ERRORS_PANEL, - ) - ) - console.print( - Padding( - "Please run [yellow bold]rich-click --help[/] for usage information.", - (0, 1), - ), - style="dim", - ) - sys.exit(1) - if len(args) > 1: - if args[1] == "--": - del args[1] - sys.argv = [prog, *args[1:]] - # patch click before importing the program function - patch() - # import the program function - module = import_module(module_path) - function = getattr(module, function_name) - # simply run it: it should be patched as well - return function() diff --git a/venv/lib/python3.11/site-packages/rich_click/decorators.py b/venv/lib/python3.11/site-packages/rich_click/decorators.py deleted file mode 100644 index 3656be8..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/decorators.py +++ /dev/null @@ -1,216 +0,0 @@ -""" -rich-click is a minimal Python module to combine the efforts of the excellent packages 'rich' and 'click'. - -The intention is to provide attractive help output from click, formatted with rich, with minimal -customisation required. -""" - -from typing import Any, Callable, cast, Dict, Optional, overload, Type, TYPE_CHECKING, TypeVar, Union - -from click import Command -from click import command as click_command -from click import Group -from click import group as click_group -from click import pass_context as click_pass_context -from rich.console import Console -from typing_extensions import Concatenate, ParamSpec - -from . import rich_click # noqa: F401 - -from rich_click._compat_click import CLICK_IS_BEFORE_VERSION_8X -from rich_click.rich_command import RichCommand, RichGroup, RichMultiCommand # noqa: F401 -from rich_click.rich_context import RichContext -from rich_click.rich_help_configuration import RichHelpConfiguration - -# MyPy does not like star imports. Therefore when we are type checking, we import each individual module -# from click here. This way MyPy will recognize the import and not throw any errors. Furthermore, because of -# the TYPE_CHECKING check, it does not influence the start routine at all. - -_AnyCallable = Callable[..., Any] -F = TypeVar("F", bound=Callable[..., Any]) -FC = TypeVar("FC", bound=Union[Command, _AnyCallable]) - - -GrpType = TypeVar("GrpType", bound=Group) - - -# variant: no call, directly as decorator for a function. -@overload -def group(name: _AnyCallable) -> RichGroup: - ... - - -# variant: with positional name and with positional or keyword cls argument: -# @group(namearg, GroupCls, ...) or @group(namearg, cls=GroupCls, ...) -@overload -def group( - name: Optional[str], - cls: Type[GrpType], - **attrs: Any, -) -> Callable[[_AnyCallable], GrpType]: - ... - - -# variant: name omitted, cls _must_ be a keyword argument, @group(cmd=GroupCls, ...) -@overload -def group( - name: None = None, - *, - cls: Type[GrpType], - **attrs: Any, -) -> Callable[[_AnyCallable], GrpType]: - ... - - -# variant: with optional string name, no cls argument provided. -@overload -def group(name: Optional[str] = ..., cls: None = None, **attrs: Any) -> Callable[[_AnyCallable], RichGroup]: - ... - - -def group( - name: Union[str, _AnyCallable, None] = None, - cls: Optional[Type[GrpType]] = None, - **attrs: Any, -) -> Union[Group, Callable[[_AnyCallable], Union[RichGroup, GrpType]]]: - """ - Group decorator function. - - Defines the group() function so that it uses the RichGroup class by default. - """ - if cls is None: - cls = cast(Type[GrpType], RichGroup) - - if callable(name): - return command(cls=cls, **attrs)(name) - - return command(name, cls, **attrs) - - -CmdType = TypeVar("CmdType", bound=Command) - - -# variant: no call, directly as decorator for a function. -@overload -def command(name: _AnyCallable) -> RichCommand: - ... - - -# variant: with positional name and with positional or keyword cls argument: -# @command(namearg, CommandCls, ...) or @command(namearg, cls=CommandCls, ...) -@overload -def command( - name: Optional[str], - cls: Type[CmdType], - **attrs: Any, -) -> Callable[[_AnyCallable], CmdType]: - ... - - -# variant: name omitted, cls _must_ be a keyword argument, @command(cls=CommandCls, ...) -@overload -def command( - name: None = None, - *, - cls: Type[CmdType], - **attrs: Any, -) -> Callable[[_AnyCallable], CmdType]: - ... - - -# variant: with optional string name, no cls argument provided. -@overload -def command(name: Optional[str] = ..., cls: None = None, **attrs: Any) -> Callable[[_AnyCallable], RichCommand]: - ... - - -def command( - name: Union[Optional[str], _AnyCallable] = None, - cls: Optional[Type[CmdType]] = None, - **attrs: Any, -) -> Union[Command, Callable[[_AnyCallable], Union[RichCommand, CmdType]]]: - """ - Command decorator function. - - Defines the command() function so that it uses the RichCommand class by default. - """ - if cls is None: - cls = cast(Type[CmdType], RichCommand) - - if callable(name): - return click_command(cls=cls, **attrs)(name) - - return click_command(name, cls=cls, **attrs) - - -class NotSupportedError(Exception): - """Not Supported Error.""" - - pass - - -def rich_config( - console: Optional[Console] = None, help_config: Optional[RichHelpConfiguration] = None -) -> Callable[[FC], FC]: - """Use decorator to configure Rich Click settings. - - Args: - console: A Rich Console that will be accessible from the `RichContext`, `RichCommand`, and `RichGroup` instances - Defaults to None. - help_config: Rich help configuration that is used internally to format help messages and exceptions - Defaults to None. - """ - if CLICK_IS_BEFORE_VERSION_8X: - - def decorator_with_warning(obj: FC) -> FC: - import warnings - - warnings.warn( - "`rich_config()` does not work with versions of click prior to version 8.0.0." - " Please update to a newer version of click to use this functionality.", - RuntimeWarning, - ) - return obj - - return decorator_with_warning - - def decorator(obj: FC) -> FC: - extra: Dict[str, Any] = {} - if console is not None: - extra["rich_console"] = console - if help_config is not None: - extra["rich_help_config"] = help_config - - if isinstance(obj, (RichCommand, RichGroup)): - obj.context_settings.update(extra) - elif callable(obj) and not isinstance(obj, (Command, Group)): - if hasattr(obj, "__rich_context_settings__"): - obj.__rich_context_settings__.update(extra) - else: - setattr(obj, "__rich_context_settings__", extra) - else: - raise NotSupportedError("`rich_config` requires a `RichCommand` or `RichGroup`. Try using the cls keyword") - return obj - - return decorator - - -# Users of rich_click would face issues using mypy with this code, -# if not for wrapping `pass_context` with a new function signature: -# -# @click.command() -# @click.pass_context -# def cli(ctx: click.RichContext) -> None: -# ... - - -P = ParamSpec("P") -R = TypeVar("R") - - -def pass_context(f: Callable[Concatenate[RichContext, P], R]) -> Callable[P, R]: - # flake8: noqa: D400,D401 - """Marks a callback as wanting to receive the current context - object as first argument. - """ - return click_pass_context(f) # type: ignore[arg-type] diff --git a/venv/lib/python3.11/site-packages/rich_click/py.typed b/venv/lib/python3.11/site-packages/rich_click/py.typed deleted file mode 100644 index ee90bd6..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/py.typed +++ /dev/null @@ -1 +0,0 @@ -# Marker file for PEP 561. rich-click uses inline types. diff --git a/venv/lib/python3.11/site-packages/rich_click/rich_click.py b/venv/lib/python3.11/site-packages/rich_click/rich_click.py deleted file mode 100644 index 215c170..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/rich_click.py +++ /dev/null @@ -1,893 +0,0 @@ -import inspect -import re -from typing import Dict, Iterable, List, Optional, Tuple, TYPE_CHECKING, Union - -import click -import rich.columns -import rich.markdown -import rich.text - -# Due to how rich_click.cli.patch() works, it is safer to import Command types directly -# rather than use the click module e.g. click.Command -from click import Command, Group -from rich import box -from rich.align import Align -from rich.columns import Columns -from rich.emoji import Emoji -from rich.highlighter import RegexHighlighter -from rich.markdown import Markdown -from rich.padding import Padding -from rich.panel import Panel -from rich.style import StyleType -from rich.table import Table -from rich.text import Text -from typing_extensions import Literal - -from rich_click._compat_click import CLICK_IS_BEFORE_VERSION_8X, CLICK_IS_BEFORE_VERSION_9X, CLICK_IS_VERSION_80 -from rich_click.rich_help_configuration import ( - force_terminal_default, - OptionHighlighter, - RichHelpConfiguration, - terminal_width_default, -) -from rich_click.rich_help_formatter import RichHelpFormatter - -# Support rich <= 10.6.0 -try: - from rich.console import group -except ImportError: - from rich.console import render_group as group # type: ignore[attr-defined,no-redef] - - -if CLICK_IS_BEFORE_VERSION_9X: - from click import MultiCommand -else: - MultiCommand = Group # type: ignore[misc,assignment] - - -# Default styles -STYLE_OPTION: rich.style.StyleType = "bold cyan" -STYLE_ARGUMENT: rich.style.StyleType = "bold cyan" -STYLE_COMMAND: rich.style.StyleType = "bold cyan" -STYLE_SWITCH: rich.style.StyleType = "bold green" -STYLE_METAVAR: rich.style.StyleType = "bold yellow" -STYLE_METAVAR_APPEND: rich.style.StyleType = "dim yellow" -STYLE_METAVAR_SEPARATOR: rich.style.StyleType = "dim" -STYLE_HEADER_TEXT: rich.style.StyleType = "" -STYLE_EPILOG_TEXT: rich.style.StyleType = "" -STYLE_FOOTER_TEXT: rich.style.StyleType = "" -STYLE_USAGE: rich.style.StyleType = "yellow" -STYLE_USAGE_COMMAND: rich.style.StyleType = "bold" -STYLE_DEPRECATED: rich.style.StyleType = "red" -STYLE_HELPTEXT_FIRST_LINE: rich.style.StyleType = "" -STYLE_HELPTEXT: rich.style.StyleType = "dim" -STYLE_OPTION_HELP: rich.style.StyleType = "" -STYLE_OPTION_DEFAULT: rich.style.StyleType = "dim" -STYLE_OPTION_ENVVAR: rich.style.StyleType = "dim yellow" -STYLE_REQUIRED_SHORT: rich.style.StyleType = "red" -STYLE_REQUIRED_LONG: rich.style.StyleType = "dim red" -STYLE_OPTIONS_PANEL_BORDER: rich.style.StyleType = "dim" -ALIGN_OPTIONS_PANEL: rich.align.AlignMethod = "left" -STYLE_OPTIONS_TABLE_SHOW_LINES: bool = False -STYLE_OPTIONS_TABLE_LEADING: int = 0 -STYLE_OPTIONS_TABLE_PAD_EDGE: bool = False -STYLE_OPTIONS_TABLE_PADDING: rich.padding.PaddingDimensions = (0, 1) -STYLE_OPTIONS_TABLE_BOX: rich.style.StyleType = "" -STYLE_OPTIONS_TABLE_ROW_STYLES: Optional[List[rich.style.StyleType]] = None -STYLE_OPTIONS_TABLE_BORDER_STYLE: Optional[rich.style.StyleType] = None -STYLE_COMMANDS_PANEL_BORDER: rich.style.StyleType = "dim" -ALIGN_COMMANDS_PANEL: rich.align.AlignMethod = "left" -STYLE_COMMANDS_TABLE_SHOW_LINES: bool = False -STYLE_COMMANDS_TABLE_LEADING: int = 0 -STYLE_COMMANDS_TABLE_PAD_EDGE: bool = False -STYLE_COMMANDS_TABLE_PADDING: rich.padding.PaddingDimensions = (0, 1) -STYLE_COMMANDS_TABLE_BOX: rich.style.StyleType = "" -STYLE_COMMANDS_TABLE_ROW_STYLES: Optional[List[rich.style.StyleType]] = None -STYLE_COMMANDS_TABLE_BORDER_STYLE: Optional[rich.style.StyleType] = None -STYLE_COMMANDS_TABLE_COLUMN_WIDTH_RATIO: Optional[Union[Tuple[None, None], Tuple[int, int]]] = (None, None) -STYLE_ERRORS_PANEL_BORDER: rich.style.StyleType = "red" -ALIGN_ERRORS_PANEL: rich.align.AlignMethod = "left" -STYLE_ERRORS_SUGGESTION: rich.style.StyleType = "dim" -STYLE_ERRORS_SUGGESTION_COMMAND: rich.style.StyleType = "blue" -STYLE_ABORTED: rich.style.StyleType = "red" -WIDTH: Optional[int] = terminal_width_default() -MAX_WIDTH: Optional[int] = terminal_width_default() -COLOR_SYSTEM: Optional[ - Literal["auto", "standard", "256", "truecolor", "windows"] -] = "auto" # Set to None to disable colors -FORCE_TERMINAL: Optional[bool] = force_terminal_default() - -# Fixed strings -HEADER_TEXT: Optional[str] = None -FOOTER_TEXT: Optional[str] = None -DEPRECATED_STRING: str = "(Deprecated) " -DEFAULT_STRING: str = "[default: {}]" -ENVVAR_STRING: str = "[env var: {}]" -REQUIRED_SHORT_STRING: str = "*" -REQUIRED_LONG_STRING: str = "[required]" -RANGE_STRING: str = " [{}]" -APPEND_METAVARS_HELP_STRING: str = "({})" -ARGUMENTS_PANEL_TITLE: str = "Arguments" -OPTIONS_PANEL_TITLE: str = "Options" -COMMANDS_PANEL_TITLE: str = "Commands" -ERRORS_PANEL_TITLE: str = "Error" -ERRORS_SUGGESTION: Optional[str] = None # Default: Try 'cmd -h' for help. Set to False to disable. -ERRORS_EPILOGUE: Optional[str] = None -ABORTED_TEXT: str = "Aborted." - -# Behaviours -SHOW_ARGUMENTS: bool = False # Show positional arguments -SHOW_METAVARS_COLUMN: bool = True # Show a column with the option metavar (eg. INTEGER) -APPEND_METAVARS_HELP: bool = False # Append metavar (eg. [TEXT]) after the help text -GROUP_ARGUMENTS_OPTIONS: bool = False # Show arguments with options instead of in own panel -OPTION_ENVVAR_FIRST: bool = False # Show env vars before option help text instead of avert -USE_MARKDOWN: bool = False # Parse help strings as markdown -USE_MARKDOWN_EMOJI: bool = True # Parse emoji codes in markdown :smile: -USE_RICH_MARKUP: bool = False # Parse help strings for rich markup (eg. [red]my text[/]) -# Define sorted groups of panels to display subcommands -COMMAND_GROUPS: Dict[str, List[Dict[str, Union[str, List[str]]]]] = {} -# Define sorted groups of panels to display options and arguments -OPTION_GROUPS: Dict[str, List[Dict[str, Union[str, List[str], Dict[str, List[str]]]]]] = {} -USE_CLICK_SHORT_HELP: bool = False # Use click's default function to truncate help text - -highlighter: rich.highlighter.Highlighter = OptionHighlighter() -_formatter: Optional[RichHelpFormatter] = None - - -def _get_rich_formatter(formatter: Optional[click.HelpFormatter] = None) -> RichHelpFormatter: - """Get Rich Help Formatter. - - Resolves the rich help formatter from the following: - - formatter, if exists and is a `RichHelpFormatter` object - - cached, module-level formatter - - active click Context, that is cached as module-level attr - - module-level settings (default) - - Args: - formatter: A possible Rich help formatter - """ - if formatter and isinstance(formatter, RichHelpFormatter): - return formatter - - global _formatter - if _formatter: - return _formatter - ctx = click.get_current_context(True) - if ctx: - formatter = ctx.make_formatter() - if isinstance(formatter, RichHelpFormatter): - _formatter = formatter - return _formatter - - _formatter = RichHelpFormatter(config=get_module_help_configuration()) - return _formatter - - -def _make_rich_rext( - text: str, style: StyleType = "", formatter: Optional[RichHelpFormatter] = None -) -> Union[rich.markdown.Markdown, Text]: - """Take a string, remove indentations, and return styled text. - - By default, return the text as a Rich Text with the request style. - If config.use_rich_markup is True, also parse the text for Rich markup strings. - If config.use_markdown is True, parse as Markdown. - - Only one of config.use_markdown or config.use_rich_markup can be True. - If both are True, config.use_markdown takes precedence. - - Args: - text (str): Text to style - style (str): Rich style to apply - - Returns: - MarkdownElement or Text: Styled text object - """ - formatter = _get_rich_formatter(formatter) - config = formatter.config - # Remove indentations from input text - text = inspect.cleandoc(text) - if config.use_markdown: - if config.use_markdown_emoji: - text = Emoji.replace(text) - return Markdown(text, style=style) - if config.use_rich_markup: - return config.highlighter(Text.from_markup(text, style=style)) - else: - return config.highlighter(Text(text, style=style)) - - -@group() -def _get_help_text( - obj: Union[Command, Group], formatter: Optional[RichHelpFormatter] = None -) -> Iterable[Union[rich.markdown.Markdown, rich.text.Text]]: - """Build primary help text for a click command or group. - - Returns the prose help text for a command or group, rendered either as a - Rich Text object or as Markdown. - If the command is marked as depreciated, the depreciated string will be prepended. - - Args: - obj (click.Command or click.Group): Command or group to build help text for - - Yields: - Text or Markdown: Multiple styled objects (depreciated, usage) - """ - if TYPE_CHECKING: - assert isinstance(obj.help, str) - formatter = _get_rich_formatter(formatter) - config = formatter.config - # Prepend deprecated status - if obj.deprecated: - yield Text(config.deprecated_string, style=config.style_deprecated) - - # Fetch and dedent the help text - help_text = inspect.cleandoc(obj.help) - - # Trim off anything that comes after \f on its own line - help_text = help_text.partition("\f")[0] - - # Get the first paragraph - first_line = help_text.split("\n\n")[0] - # Remove single linebreaks - if not config.use_markdown and not first_line.startswith("\b"): - first_line = first_line.replace("\n", " ") - yield _make_rich_rext(first_line.strip(), config.style_helptext_first_line, formatter) - - # Get remaining lines, remove single line breaks and format as dim - remaining_paragraphs = help_text.split("\n\n")[1:] - if len(remaining_paragraphs) > 0: - if not config.use_markdown: - # Remove single linebreaks - remaining_paragraphs = [ - x.replace("\n", " ").strip() if not x.startswith("\b") else "{}\n".format(x.strip("\b\n")) - for x in remaining_paragraphs - ] - # Join back together - remaining_lines = "\n".join(remaining_paragraphs) - else: - # Join with double linebreaks if markdown - remaining_lines = "\n\n".join(remaining_paragraphs) - - yield _make_rich_rext(remaining_lines, config.style_helptext, formatter) - - -def _get_option_help( - param: Union[click.Argument, click.Option], ctx: click.Context, formatter: Optional[RichHelpFormatter] = None -) -> rich.columns.Columns: - """Build primary help text for a click option or argument. - - Returns the prose help text for an option or argument, rendered either - as a Rich Text object or as Markdown. - Additional elements are appended to show the default and required status if applicable. - - Args: - param (click.Argument or click.Option): Parameter to build help text for - ctx (click.Context): Click Context object - - Returns: - Columns: A columns element with multiple styled objects (help, default, required) - """ - formatter = _get_rich_formatter(formatter) - config = formatter.config - items: List[rich.console.RenderableType] = [] - - if TYPE_CHECKING: - assert isinstance(param.name, str) - - # Get the environment variable first - envvar = getattr(param, "envvar", None) - # https://github.com/pallets/click/blob/0aec1168ac591e159baf6f61026d6ae322c53aaf/src/click/core.py#L2720-L2726 - if envvar is None: - if ( - getattr(param, "allow_from_autoenv", None) - and getattr(ctx, "auto_envvar_prefix", None) is not None - and param.name is not None - ): - envvar = f"{ctx.auto_envvar_prefix}_{param.name.upper()}" - if envvar is not None: - envvar = ", ".join(envvar) if type(envvar) is list else envvar - - # Environment variable config.before help text - if getattr(param, "show_envvar", None) and config.option_envvar_first and envvar is not None: - items.append(Text(config.envvar_string.format(envvar), style=config.style_option_envvar)) - - # Main help text - if getattr(param, "help", None): - if TYPE_CHECKING: - assert isinstance(param, click.Option) - assert hasattr(param, "help") - assert isinstance(param.help, str) - paragraphs = param.help.split("\n\n") - # Remove single linebreaks - if not config.use_markdown: - paragraphs = [ - x.replace("\n", " ").strip() if not x.startswith("\b") else "{}\n".format(x.strip("\b\n")) - for x in paragraphs - ] - items.append(_make_rich_rext("\n".join(paragraphs).strip(), config.style_option_help, formatter)) - - # Append metavar if requested - if config.append_metavars_help: - metavar_str = param.make_metavar() - # Do it ourselves if this is a positional argument - if isinstance(param, click.core.Argument) and re.match(rf"\[?{param.name.upper()}]?", metavar_str): - metavar_str = param.type.name.upper() - # Attach metavar if param is a positional argument, or if it is a non boolean and non flag option - if isinstance(param, click.core.Argument) or (metavar_str != "BOOLEAN" and not param.is_flag): - metavar_str = metavar_str.replace("[", "").replace("]", "") - items.append( - Text( - config.append_metavars_help_string.format(metavar_str), - style=config.style_metavar_append, - overflow="fold", - ) - ) - - # Environment variable config.after help text - if getattr(param, "show_envvar", None) and not config.option_envvar_first and envvar is not None: - items.append(Text(config.envvar_string.format(envvar), style=config.style_option_envvar)) - - # Default value - # Click 7.x, 8.0, and 8.1 all behave slightly differently when handling the default value help text. - if not hasattr(param, "show_default"): - parse_default = False - elif CLICK_IS_BEFORE_VERSION_8X: - parse_default = bool(param.default is not None and (param.show_default or getattr(ctx, "show_default", None))) - elif CLICK_IS_VERSION_80: - show_default_is_str = isinstance(param.show_default, str) - parse_default = bool( - show_default_is_str or (param.default is not None and (param.show_default or ctx.show_default)) - ) - else: - show_default_is_str = False - if param.show_default is not None: - if isinstance(param.show_default, str): - show_default_is_str = show_default = True - else: - show_default = bool(param.show_default) - else: - show_default = bool(getattr(ctx, "show_default", False)) - parse_default = bool(show_default_is_str or (show_default and (param.default is not None))) - - if parse_default: - help_record = param.get_help_record(ctx) - if TYPE_CHECKING: - assert isinstance(help_record, tuple) - default_str_match = re.search(r"\[(?:.+; )?default: (.*)\]", help_record[-1]) - if default_str_match: - # Don't show the required string, as we show that afterwards anyway - default_str = default_str_match.group(1).replace("; required", "") - items.append( - Text( - config.default_string.format(default_str), - style=config.style_option_default, - ) - ) - - # Required? - if param.required: - items.append(Text(config.required_long_string, style=config.style_required_long)) - - # Use Columns - this allows us to group different renderable types - # (Text, Markdown) onto a single line. - return Columns(items) - - -def _make_command_help( - help_text: str, formatter: Optional[RichHelpFormatter] = None -) -> Union[rich.text.Text, rich.markdown.Markdown]: - """Build cli help text for a click group command. - - That is, when calling help on groups with multiple subcommands - (not the main help text when calling the subcommand help). - - Returns the first paragraph of help text for a command, rendered either as a - Rich Text object or as Markdown. - Ignores single newlines as paragraph markers, looks for double only. - - Args: - help_text (str): Help text - - Returns: - Text or Markdown: Styled object - """ - formatter = _get_rich_formatter(formatter) - config = formatter.config - paragraphs = inspect.cleandoc(help_text).split("\n\n") - # Remove single linebreaks - if not config.use_markdown and not paragraphs[0].startswith("\b"): - paragraphs[0] = paragraphs[0].replace("\n", " ") - elif paragraphs[0].startswith("\b"): - paragraphs[0] = paragraphs[0].replace("\b\n", "") - - return _make_rich_rext(paragraphs[0].strip(), config.style_option_help, formatter) - - -def get_rich_usage( - obj: Union[Command, Group], - ctx: click.Context, - formatter: click.HelpFormatter, -) -> None: - """Get usage text for a command.""" - formatter = _get_rich_formatter(formatter) - config = formatter.config - console = formatter.console - - # Highlighter for options and arguments - class UsageHighlighter(RegexHighlighter): - highlights = [ - r"(?P<argument>\w+)", - ] - - usage_highlighter = UsageHighlighter() - - # Print usage - console.print( - Padding( - Columns( - ( - Text("Usage:", style=config.style_usage), - Text(ctx.command_path, style=config.style_usage_command), - usage_highlighter(" ".join(obj.collect_usage_pieces(ctx))), - ) - ), - 1, - ), - ) - - -def rich_format_help( - obj: Command, - ctx: click.Context, - formatter: click.HelpFormatter, -) -> None: - """Print nicely formatted help text using rich. - - Based on original code from rich-cli, by @willmcgugan. - https://github.com/Textualize/rich-cli/blob/8a2767c7a340715fc6fbf4930ace717b9b2fc5e5/src/rich_cli/__main__.py#L162-L236 - - Replacement for the click function format_help(). - Takes a command or group and builds the help text output. - - Args: - obj (click.Command or click.Group): Command or group to build help text for - ctx (click.Context): Click Context object - formatter (click.HelpFormatter): Click HelpFormatter object - """ - formatter = _get_rich_formatter(formatter) - config = formatter.config - console = formatter.console - highlighter = formatter.config.highlighter - - # Header text if we have it - if config.header_text: - console.print( - Padding( - _make_rich_rext(config.header_text, config.style_header_text, formatter), - (1, 1, 0, 1), - ), - ) - - # Print usage - get_rich_usage(obj, ctx, formatter) - - # Print command / group help if we have some - if obj.help: - # Print with some padding - console.print( - Padding( - Align(_get_help_text(obj, formatter), pad=False), - (0, 1, 1, 1), - ) - ) - - # Look through config.option_groups for this command - # stick anything unmatched into a default group at the end - option_groups = config.option_groups.get(ctx.command_path, []).copy() - option_groups.append({"options": []}) - argument_group_options = [] - - for param in obj.get_params(ctx): - # Skip positional arguments - they don't have opts or helptext and are covered in usage - # See https://click.palletsprojects.com/en/8.0.x/documentation/#documenting-arguments - if isinstance(param, click.core.Argument) and not config.show_arguments: - continue - - # Skip if option is hidden - if getattr(param, "hidden", False): - continue - - # Already mentioned in a config option group - for option_group in option_groups: - if any([opt in option_group.get("options", []) for opt in param.opts]): - break - - # No break, no mention - add to the default group - else: - if isinstance(param, click.core.Argument) and not config.group_arguments_options: - argument_group_options.append(param.opts[0]) - else: - list_of_option_groups: List[str] = option_groups[-1]["options"] # type: ignore[assignment] - list_of_option_groups.append(param.opts[0]) - - # If we're not grouping arguments and we got some, prepend before default options - if len(argument_group_options) > 0: - extra_option_group = {"name": config.arguments_panel_title, "options": argument_group_options} - option_groups.insert(len(option_groups) - 1, extra_option_group) - - # print("!", option_groups) - - # Print each option group panel - for option_group in option_groups: - options_rows = [] - for opt in option_group.get("options", []): - # Get the param - for param in obj.get_params(ctx): - if any([opt in param.opts]): - break - # Skip if option is not listed in this group - else: - continue - - # Short and long form - opt_long_strs = [] - opt_short_strs = [] - for idx, opt in enumerate(param.opts): - opt_str = opt - try: - opt_str += "/" + param.secondary_opts[idx] - except IndexError: - pass - - if isinstance(param, click.core.Argument): - opt_long_strs.append(opt_str.upper()) - elif "--" in opt: - opt_long_strs.append(opt_str) - else: - opt_short_strs.append(opt_str) - - # Column for a metavar, if we have one - metavar = Text(style=config.style_metavar, overflow="fold") - metavar_str = param.make_metavar() - - if TYPE_CHECKING: - assert isinstance(param.name, str) - assert isinstance(param, click.Option) - - # Do it ourselves if this is a positional argument - if isinstance(param, click.core.Argument) and re.match(rf"\[?{param.name.upper()}]?", metavar_str): - metavar_str = param.type.name.upper() - - # Attach metavar if param is a positional argument, or if it is a non boolean and non flag option - if isinstance(param, click.core.Argument) or ( - metavar_str != "BOOLEAN" and not getattr(param, "is_flag", None) - ): - metavar.append(metavar_str) - - # Range - from - # https://github.com/pallets/click/blob/c63c70dabd3f86ca68678b4f00951f78f52d0270/src/click/core.py#L2698-L2706 # noqa: E501 - try: - # skip count with default range type - if isinstance(param.type, click.types._NumberRangeBase) and not ( - param.count and param.type.min == 0 and param.type.max is None - ): - range_str = param.type._describe_range() - if range_str: - metavar.append(config.range_string.format(range_str)) - except AttributeError: - # click.types._NumberRangeBase is only in Click 8x onwards - pass - - # Required asterisk - required: Union[Text, str] = "" - if param.required: - required = Text(config.required_short_string, style=config.style_required_short) - - # Highlighter to make [ | ] and <> dim - class MetavarHighlighter(RegexHighlighter): - highlights = [ - r"^(?P<metavar_sep>(\[|<))", - r"(?P<metavar_sep>\|)", - r"(?P<metavar_sep>(\]|>)$)", - ] - - metavar_highlighter = MetavarHighlighter() - - rows = [ - required, - highlighter(highlighter(",".join(opt_long_strs))), - highlighter(highlighter(",".join(opt_short_strs))), - metavar_highlighter(metavar), - _get_option_help(param, ctx, formatter), - ] - - # Remove metavar if specified in config - if not config.show_metavars_column: - rows.pop(3) - - options_rows.append(rows) - - if len(options_rows) > 0: - t_styles = { - "show_lines": config.style_options_table_show_lines, - "leading": config.style_options_table_leading, - "box": config.style_options_table_box, - "border_style": config.style_options_table_border_style, - "row_styles": config.style_options_table_row_styles, - "pad_edge": config.style_options_table_pad_edge, - "padding": config.style_options_table_padding, - } - t_styles.update(option_group.get("table_styles", {})) # type: ignore[arg-type] - box_style = getattr(box, t_styles.pop("box"), None) # type: ignore[arg-type] - - options_table = Table( - highlight=True, - show_header=False, - expand=True, - box=box_style, - **t_styles, # type: ignore[arg-type] - ) - # Strip the required column if none are required - if all([x[0] == "" for x in options_rows]): - options_rows = [x[1:] for x in options_rows] - for row in options_rows: - options_table.add_row(*row) - console.print( - Panel( - options_table, - border_style=config.style_options_panel_border, - title=option_group.get("name", config.options_panel_title), - title_align=config.align_options_panel, - ) - ) - - # - # Groups only: - # List click command groups - # - - if isinstance(obj, MultiCommand): - # Look through COMMAND_GROUPS for this command - # stick anything unmatched into a default group at the end - cmd_groups = config.command_groups.get(ctx.command_path, []).copy() - cmd_groups.append({"commands": []}) - for command in obj.list_commands(ctx): - for cmd_group in cmd_groups: - if command in cmd_group.get("commands", []): - break - else: - commands: List[str] = cmd_groups[-1]["commands"] # type: ignore[assignment] - commands.append(command) - - # Print each command group panel - for cmd_group in cmd_groups: - t_styles = { - "show_lines": config.style_commands_table_show_lines, - "leading": config.style_commands_table_leading, - "box": config.style_commands_table_box, - "border_style": config.style_commands_table_border_style, - "row_styles": config.style_commands_table_row_styles, - "pad_edge": config.style_commands_table_pad_edge, - "padding": config.style_commands_table_padding, - } - t_styles.update(cmd_group.get("table_styles", {})) # type: ignore[arg-type] - box_style = getattr(box, t_styles.pop("box"), None) # type: ignore[arg-type] - - commands_table = Table( - highlight=False, - show_header=False, - expand=True, - box=box_style, - **t_styles, # type: ignore[arg-type] - ) - # Define formatting in first column, as commands don't match highlighter regex - # and set column ratio for first and second column, if a ratio has been set - if config.style_commands_table_column_width_ratio is None: - table_column_width_ratio: Union[Tuple[None, None], Tuple[int, int]] = (None, None) - else: - table_column_width_ratio = config.style_commands_table_column_width_ratio - - commands_table.add_column(style=config.style_command, no_wrap=True, ratio=table_column_width_ratio[0]) - commands_table.add_column( - no_wrap=False, - ratio=table_column_width_ratio[1], - ) - for command in cmd_group.get("commands", []): - # Skip if command does not exist - if command not in obj.list_commands(ctx): - continue - cmd = obj.get_command(ctx, command) - if TYPE_CHECKING: - assert cmd is not None - if cmd.hidden: - continue - # Use the truncated short text as with vanilla text if requested - if config.use_click_short_help: - helptext = cmd.get_short_help_str() - else: - # Use short_help function argument if used, or the full help - helptext = cmd.short_help or cmd.help or "" - commands_table.add_row(command, _make_command_help(helptext, formatter)) - if commands_table.row_count > 0: - console.print( - Panel( - commands_table, - border_style=config.style_commands_panel_border, - title=cmd_group.get("name", config.commands_panel_title), - title_align=config.align_commands_panel, - ) - ) - - # Epilogue if we have it - if isinstance(obj, Command) and obj.epilog: - # Remove single linebreaks, replace double with single - lines = obj.epilog.split("\n\n") - epilogue = "\n".join([x.replace("\n", " ").strip() for x in lines]) - console.print(Padding(Align(_make_rich_rext(epilogue, config.style_epilog_text, formatter), pad=False), 1)) - - # Footer text if we have it - if config.footer_text: - console.print(Padding(_make_rich_rext(config.footer_text, config.style_footer_text, formatter), (1, 1, 0, 1))) - - -def rich_format_error(self: click.ClickException, formatter: Optional[RichHelpFormatter] = None) -> None: - """Print richly formatted click errors. - - Called by custom exception handler to print richly formatted click errors. - Mimics original click.ClickException.echo() function but with rich formatting. - - Args: - click.ClickException: Click exception to format. - """ - formatter = _get_rich_formatter(formatter) - console = formatter.console - config = formatter.config - highlighter = formatter.config.highlighter - # Print usage - if getattr(self, "ctx", None) is not None: - if TYPE_CHECKING: - assert hasattr(self, "ctx") - get_rich_usage(self.ctx.command, self.ctx, formatter) - if config.errors_suggestion: - console.print( - Padding( - config.errors_suggestion, - (0, 1, 0, 1), - ), - style=config.style_errors_suggestion, - ) - elif ( - config.errors_suggestion is None - and getattr(self, "ctx", None) is not None - and self.ctx.command.get_help_option(self.ctx) is not None # type: ignore[attr-defined] - ): - cmd_path = self.ctx.command_path # type: ignore[attr-defined] - help_option = self.ctx.help_option_names[0] # type: ignore[attr-defined] - console.print( - Padding( - Columns( - ( - Text("Try"), - Text(f"'{cmd_path} {help_option}'", style=config.style_errors_suggestion_command), - Text("for help"), - ) - ), - (0, 1, 0, 1), - ), - style=config.style_errors_suggestion, - ) - - # A major Python library using click (dbt-core) has its own exception - # logic that subclasses ClickException, but does not use the message - # attribute. Checking for the 'message' attribute works to make the - # rich-click CLI compatible. - if hasattr(self, "message"): - console.print( - Padding( - Panel( - highlighter(self.format_message()), - border_style=config.style_errors_panel_border, - title=config.errors_panel_title, - title_align=config.align_errors_panel, - ), - (0, 0, 1, 0), - ) - ) - if config.errors_epilogue: - console.print(Padding(config.errors_epilogue, (0, 1, 1, 1))) - - -def rich_abort_error(formatter: Optional[RichHelpFormatter] = None) -> None: - """Print richly formatted abort error.""" - formatter = _get_rich_formatter(formatter) - config = formatter.config - formatter.console.print(config.aborted_text, style=config.style_aborted) - - -module_config: Optional[RichHelpConfiguration] = None - - -def get_module_help_configuration() -> RichHelpConfiguration: - """Get Module-level help configuration resolved into a `RichHelpConfiguration` instance.""" - global module_config - if module_config: - return module_config - module_config = RichHelpConfiguration( - STYLE_OPTION, - STYLE_ARGUMENT, - STYLE_COMMAND, - STYLE_SWITCH, - STYLE_METAVAR, - STYLE_METAVAR_APPEND, - STYLE_METAVAR_SEPARATOR, - STYLE_HEADER_TEXT, - STYLE_EPILOG_TEXT, - STYLE_FOOTER_TEXT, - STYLE_USAGE, - STYLE_USAGE_COMMAND, - STYLE_DEPRECATED, - STYLE_HELPTEXT_FIRST_LINE, - STYLE_HELPTEXT, - STYLE_OPTION_HELP, - STYLE_OPTION_DEFAULT, - STYLE_OPTION_ENVVAR, - STYLE_REQUIRED_SHORT, - STYLE_REQUIRED_LONG, - STYLE_OPTIONS_PANEL_BORDER, - ALIGN_OPTIONS_PANEL, - STYLE_OPTIONS_TABLE_SHOW_LINES, - STYLE_OPTIONS_TABLE_LEADING, - STYLE_OPTIONS_TABLE_PAD_EDGE, - STYLE_OPTIONS_TABLE_PADDING, - STYLE_OPTIONS_TABLE_BOX, - STYLE_OPTIONS_TABLE_ROW_STYLES, - STYLE_OPTIONS_TABLE_BORDER_STYLE, - STYLE_COMMANDS_PANEL_BORDER, - ALIGN_COMMANDS_PANEL, - STYLE_COMMANDS_TABLE_SHOW_LINES, - STYLE_COMMANDS_TABLE_LEADING, - STYLE_COMMANDS_TABLE_PAD_EDGE, - STYLE_COMMANDS_TABLE_PADDING, - STYLE_COMMANDS_TABLE_BOX, - STYLE_COMMANDS_TABLE_ROW_STYLES, - STYLE_COMMANDS_TABLE_BORDER_STYLE, - STYLE_COMMANDS_TABLE_COLUMN_WIDTH_RATIO, - STYLE_ERRORS_PANEL_BORDER, - ALIGN_ERRORS_PANEL, - STYLE_ERRORS_SUGGESTION, - STYLE_ERRORS_SUGGESTION_COMMAND, - STYLE_ABORTED, - WIDTH, - MAX_WIDTH, - COLOR_SYSTEM, - FORCE_TERMINAL, - HEADER_TEXT, - FOOTER_TEXT, - DEPRECATED_STRING, - DEFAULT_STRING, - ENVVAR_STRING, - REQUIRED_SHORT_STRING, - REQUIRED_LONG_STRING, - RANGE_STRING, - APPEND_METAVARS_HELP_STRING, - ARGUMENTS_PANEL_TITLE, - OPTIONS_PANEL_TITLE, - COMMANDS_PANEL_TITLE, - ERRORS_PANEL_TITLE, - ERRORS_SUGGESTION, - ERRORS_EPILOGUE, - ABORTED_TEXT, - SHOW_ARGUMENTS, - SHOW_METAVARS_COLUMN, - APPEND_METAVARS_HELP, - GROUP_ARGUMENTS_OPTIONS, - OPTION_ENVVAR_FIRST, - USE_MARKDOWN, - USE_MARKDOWN_EMOJI, - USE_RICH_MARKUP, - COMMAND_GROUPS, - OPTION_GROUPS, - USE_CLICK_SHORT_HELP, - highlighter, - ) - return module_config diff --git a/venv/lib/python3.11/site-packages/rich_click/rich_command.py b/venv/lib/python3.11/site-packages/rich_click/rich_command.py deleted file mode 100644 index eef4eda..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/rich_command.py +++ /dev/null @@ -1,257 +0,0 @@ -import errno -import os -import sys -import warnings -from functools import wraps -from typing import Any, Callable, cast, Optional, overload, Sequence, TextIO, Type, TYPE_CHECKING, Union - -import click - -# Group, Command, and CommandCollection need to be imported directly, -# or else rich_click.cli.patch() causes a recursion error. -from click import Command, CommandCollection, Group -from click.utils import make_str, PacifyFlushWrapper -from rich.console import Console - -from rich_click._compat_click import CLICK_IS_BEFORE_VERSION_8X, CLICK_IS_BEFORE_VERSION_9X -from rich_click.rich_click import rich_abort_error, rich_format_error, rich_format_help -from rich_click.rich_context import RichContext -from rich_click.rich_help_configuration import RichHelpConfiguration -from rich_click.rich_help_formatter import RichHelpFormatter - - -class RichCommand(click.Command): - """Richly formatted click Command. - - Inherits click.Command and overrides help and error methods - to print richly formatted output. - - This class can be used as a mixin for other click command objects. - """ - - context_class: Type[RichContext] = RichContext - _formatter: Optional[RichHelpFormatter] = None - - @wraps(Command.__init__) - def __init__(self, *args: Any, **kwargs: Any): - """Create Rich Command instance.""" - super().__init__(*args, **kwargs) - self._register_rich_context_settings_from_callback() - - def _register_rich_context_settings_from_callback(self) -> None: - if self.callback is not None: - if hasattr(self.callback, "__rich_context_settings__"): - rich_context_settings = getattr(self.callback, "__rich_context_settings__", {}) - for k, v in rich_context_settings.items(): - self.context_settings.setdefault(k, v) - del self.callback.__rich_context_settings__ - - @property - def console(self) -> Optional[Console]: - """Rich Console. - - This is a separate instance from the help formatter that allows full control of the - console configuration. - - See `rich_config` decorator for how to apply the settings. - """ - return self.context_settings.get("rich_console") - - @property - def help_config(self) -> Optional[RichHelpConfiguration]: - """Rich Help Configuration.""" - return self.context_settings.get("rich_help_config") - - @property - def formatter(self) -> RichHelpFormatter: - """Rich Help Formatter. - - This is separate instance from the formatter used to display help, - but is created from the same `RichHelpConfiguration`. Currently only used - for error reporting. - """ - if self._formatter is None: - self._formatter = RichHelpFormatter(config=self.help_config) - return self._formatter - - def main( - self, - args: Optional[Sequence[str]] = None, - prog_name: Optional[str] = None, - complete_var: Optional[str] = None, - standalone_mode: bool = True, - windows_expand_args: bool = True, - **extra: Any, - ) -> Any: - # It's not feasible to use super().main() in this context and retain exact parity in behavior. - # The reason why is explained in a comment in click's source code in the "except Exit as e" block. - - if args is None: - if CLICK_IS_BEFORE_VERSION_8X: - from click.utils import get_os_args # type: ignore[attr-defined] - - args: Sequence[str] = get_os_args() # type: ignore[no-redef] - else: - args = sys.argv[1:] - - if os.name == "nt" and windows_expand_args: - from click.utils import _expand_args - - args = _expand_args(args) - else: - args = list(args) - - if TYPE_CHECKING: - assert args is not None - - if prog_name is None: - if CLICK_IS_BEFORE_VERSION_8X: - prog_name = make_str(os.path.basename(sys.argv[0] if sys.argv else __file__)) - else: - from click.utils import _detect_program_name - - prog_name = _detect_program_name() - - # Process shell completion requests and exit early. - if CLICK_IS_BEFORE_VERSION_8X: - from click.core import _bashcomplete # type: ignore[attr-defined] - - _bashcomplete(self, prog_name, complete_var) - else: - self._main_shell_completion(extra, prog_name, complete_var) - - try: - try: - with self.make_context(prog_name, args, **extra) as ctx: - rv = self.invoke(ctx) - if not standalone_mode: - return rv - # it's not safe to `ctx.exit(rv)` here! - # note that `rv` may actually contain data like "1" which - # has obvious effects - # more subtle case: `rv=[None, None]` can come out of - # chained commands which all returned `None` -- so it's not - # even always obvious that `rv` indicates success/failure - # by its truthiness/falsiness - ctx.exit() - except (EOFError, KeyboardInterrupt): - click.echo(file=sys.stderr) - raise click.exceptions.Abort() from None - except click.exceptions.ClickException as e: - rich_format_error(e, self.formatter) - if not standalone_mode: - raise - sys.stderr.write(self.formatter.getvalue()) - sys.exit(e.exit_code) - except OSError as e: - if e.errno == errno.EPIPE: - sys.stdout = cast(TextIO, PacifyFlushWrapper(sys.stdout)) - sys.stderr = cast(TextIO, PacifyFlushWrapper(sys.stderr)) - sys.exit(1) - else: - raise - except click.exceptions.Exit as e: - if standalone_mode: - sys.exit(e.exit_code) - else: - return e.exit_code - except click.exceptions.Abort: - rich_abort_error(self.formatter) - if not standalone_mode: - raise - sys.stderr.write(self.formatter.getvalue()) - sys.exit(1) - - def format_help(self, ctx: click.Context, formatter: click.HelpFormatter) -> None: - rich_format_help(self, ctx, formatter) - - -class RichGroup(RichCommand, Group): - """Richly formatted click Group. - - Inherits click.Group and overrides help and error methods - to print richly formatted output. - """ - - command_class: Optional[Type[RichCommand]] = RichCommand - group_class: Optional[Union[Type[Group], Type[type]]] = type - - @wraps(Group.__init__) - def __init__(self, *args: Any, **kwargs: Any) -> None: - """Initialize RichGroup class.""" - Group.__init__(self, *args, **kwargs) - self._register_rich_context_settings_from_callback() - - if CLICK_IS_BEFORE_VERSION_8X: - - @overload - def command(self, __func: Callable[..., Any]) -> Command: - ... - - @overload - def command(self, *args: Any, **kwargs: Any) -> Callable[[Callable[..., Any]], Command]: - ... - - def command(self, *args: Any, **kwargs: Any) -> Union[Callable[[Callable[..., Any]], Command], Command]: - # This method override is required for Click 7.x compatibility. - # (The command_class ClassVar was not added until 8.0.) - if self.command_class is not None: - kwargs.setdefault("cls", self.command_class) - return super().command(*args, **kwargs) # type: ignore[no-any-return] - - @overload - def group(self, __func: Callable[..., Any]) -> Group: - ... - - @overload - def group(self, *args: Any, **kwargs: Any) -> Callable[[Callable[..., Any]], Group]: - ... - - def group(self, *args: Any, **kwargs: Any) -> Union[Callable[[Callable[..., Any]], Group], Group]: - # This method override is required for Click 7.x compatibility. - # (The group_class ClassVar was not added until 8.0.) - if self.group_class is type: - kwargs.setdefault("cls", self.__class__) - elif self.group_class is not None: - kwargs.setdefault("cls", self.group_class) - return super().group(*args, **kwargs) # type: ignore[no-any-return] - - -if CLICK_IS_BEFORE_VERSION_9X: - with warnings.catch_warnings(): - warnings.filterwarnings("ignore", category=DeprecationWarning, module="click") - from click import MultiCommand - - class RichMultiCommand(RichCommand, MultiCommand): - """Richly formatted click MultiCommand. - - Inherits click.MultiCommand and overrides help and error methods - to print richly formatted output. - """ - - @wraps(MultiCommand.__init__) - def __init__(self, *args: Any, **kwargs: Any) -> None: # type: ignore[no-untyped-def] - """Initialize RichGroup class.""" - from click import MultiCommand - - MultiCommand.__init__(self, *args, **kwargs) - self._register_rich_context_settings_from_callback() - -else: - - class RichMultiCommand(RichGroup): # type: ignore[no-redef] - """This class is deprecated.""" - - -class RichCommandCollection(RichGroup, CommandCollection): - """Richly formatted click CommandCollection. - - Inherits click.CommandCollection and overrides help and error methods - to print richly formatted output. - """ - - @wraps(CommandCollection.__init__) - def __init__(self, *args: Any, **kwargs: Any) -> None: - """Initialize RichCommandCollection class.""" - CommandCollection.__init__(self, *args, **kwargs) - self._register_rich_context_settings_from_callback() diff --git a/venv/lib/python3.11/site-packages/rich_click/rich_context.py b/venv/lib/python3.11/site-packages/rich_click/rich_context.py deleted file mode 100644 index 8e5e0a2..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/rich_context.py +++ /dev/null @@ -1,47 +0,0 @@ -from typing import Any, Optional, Type - -import click -from rich.console import Console - -from rich_click.rich_help_configuration import RichHelpConfiguration -from rich_click.rich_help_formatter import RichHelpFormatter - - -class RichContext(click.Context): - """Click Context class endowed with Rich superpowers.""" - - formatter_class: Type[RichHelpFormatter] = RichHelpFormatter - - def __init__( - self, - *args: Any, - rich_console: Optional[Console] = None, - rich_help_config: Optional[RichHelpConfiguration] = None, - **kwargs: Any, - ) -> None: - """Create Rich Context instance. - - Args: - rich_console: Rich Console. - Defaults to None. - rich_help_config: Rich help configuration. - Defaults to None. - """ - super().__init__(*args, **kwargs) - parent: Optional[RichContext] = kwargs.pop("parent", None) - - if rich_console is None and hasattr(parent, "console"): - rich_console = parent.console # type: ignore[has-type,union-attr] - - self.console = rich_console - - if rich_help_config is None and hasattr(parent, "help_config"): - rich_help_config = parent.help_config # type: ignore[has-type,union-attr] - - self.help_config = rich_help_config - - def make_formatter(self) -> RichHelpFormatter: - """Create the Rich Help Formatter.""" - return self.formatter_class( - width=self.terminal_width, max_width=self.max_content_width, config=self.help_config - ) diff --git a/venv/lib/python3.11/site-packages/rich_click/rich_group.py b/venv/lib/python3.11/site-packages/rich_click/rich_group.py deleted file mode 100644 index 659f2f2..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/rich_group.py +++ /dev/null @@ -1,11 +0,0 @@ -import warnings - -from rich_click.rich_command import RichGroup - -warnings.warn( - "RichCommand is moving from rich_click.rich_group to rich_click.rich_command in a future version.", - DeprecationWarning, -) - - -__all__ = ["RichGroup"] diff --git a/venv/lib/python3.11/site-packages/rich_click/rich_help_configuration.py b/venv/lib/python3.11/site-packages/rich_click/rich_help_configuration.py deleted file mode 100644 index e011fe1..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/rich_help_configuration.py +++ /dev/null @@ -1,148 +0,0 @@ -import os -from dataclasses import dataclass, field -from os import getenv -from typing import Any, Dict, List, Optional, Tuple, Union - -import rich.align -import rich.highlighter -import rich.padding -import rich.style -import rich.table -from typing_extensions import Literal - -from rich_click.utils import truthy - - -def force_terminal_default() -> Optional[bool]: - """Use as the default factory for `force_terminal`.""" - env_vars = {"GITHUB_ACTIONS", "FORCE_COLOR", "PY_COLORS"} - if all(i not in os.environ for i in env_vars): - return None - else: - return any(truthy(getenv(i)) for i in env_vars) - - -def terminal_width_default() -> Optional[int]: - """Use as the default factory for `width` and `max_width`.""" - width = getenv("TERMINAL_WIDTH") - if width: - try: - return int(width) - except ValueError: - import warnings - - warnings.warn("Environment variable `TERMINAL_WIDTH` cannot be cast to an integer.", UserWarning) - return None - return None - - -class OptionHighlighter(rich.highlighter.RegexHighlighter): - """Highlights our special options.""" - - highlights = [ - r"(^|\W)(?P<switch>\-\w+)(?![a-zA-Z0-9])", - r"(^|\W)(?P<option>\-\-[\w\-]+)(?![a-zA-Z0-9])", - r"(?P<metavar>\<[^\>]+\>)", - ] - - -@dataclass -class RichHelpConfiguration: - """Rich Help Configuration Class.""" - - # Default styles - style_option: rich.style.StyleType = field(default="bold cyan") - style_argument: rich.style.StyleType = field(default="bold cyan") - style_command: rich.style.StyleType = field(default="bold cyan") - style_switch: rich.style.StyleType = field(default="bold green") - style_metavar: rich.style.StyleType = field(default="bold yellow") - style_metavar_append: rich.style.StyleType = field(default="dim yellow") - style_metavar_separator: rich.style.StyleType = field(default="dim") - style_header_text: rich.style.StyleType = field(default="") - style_epilog_text: rich.style.StyleType = field(default="") - style_footer_text: rich.style.StyleType = field(default="") - style_usage: rich.style.StyleType = field(default="yellow") - style_usage_command: rich.style.StyleType = field(default="bold") - style_deprecated: rich.style.StyleType = field(default="red") - style_helptext_first_line: rich.style.StyleType = field(default="") - style_helptext: rich.style.StyleType = field(default="dim") - style_option_help: rich.style.StyleType = field(default="") - style_option_default: rich.style.StyleType = field(default="dim") - style_option_envvar: rich.style.StyleType = field(default="dim yellow") - style_required_short: rich.style.StyleType = field(default="red") - style_required_long: rich.style.StyleType = field(default="dim red") - style_options_panel_border: rich.style.StyleType = field(default="dim") - align_options_panel: rich.align.AlignMethod = field(default="left") - style_options_table_show_lines: bool = field(default=False) - style_options_table_leading: int = field(default=0) - style_options_table_pad_edge: bool = field(default=False) - style_options_table_padding: rich.padding.PaddingDimensions = field(default_factory=lambda: (0, 1)) - style_options_table_box: rich.style.StyleType = field(default="") - style_options_table_row_styles: Optional[List[rich.style.StyleType]] = field(default=None) - style_options_table_border_style: Optional[rich.style.StyleType] = field(default=None) - style_commands_panel_border: rich.style.StyleType = field(default="dim") - align_commands_panel: rich.align.AlignMethod = field(default="left") - style_commands_table_show_lines: bool = field(default=False) - style_commands_table_leading: int = field(default=0) - style_commands_table_pad_edge: bool = field(default=False) - style_commands_table_padding: rich.padding.PaddingDimensions = field(default_factory=lambda: (0, 1)) - style_commands_table_box: rich.style.StyleType = field(default="") - style_commands_table_row_styles: Optional[List[rich.style.StyleType]] = field(default=None) - style_commands_table_border_style: Optional[rich.style.StyleType] = field(default=None) - style_commands_table_column_width_ratio: Optional[Union[Tuple[None, None], Tuple[int, int]]] = field( - default_factory=lambda: (None, None) - ) - style_errors_panel_border: rich.style.StyleType = field(default="red") - align_errors_panel: rich.align.AlignMethod = field(default="left") - style_errors_suggestion: rich.style.StyleType = field(default="dim") - style_errors_suggestion_command: rich.style.StyleType = field(default="blue") - style_aborted: rich.style.StyleType = field(default="red") - width: Optional[int] = field(default_factory=terminal_width_default) - max_width: Optional[int] = field(default_factory=terminal_width_default) - color_system: Optional[Literal["auto", "standard", "256", "truecolor", "windows"]] = field(default="auto") - force_terminal: Optional[bool] = field(default_factory=force_terminal_default) - - # Fixed strings - header_text: Optional[str] = field(default=None) - footer_text: Optional[str] = field(default=None) - deprecated_string: str = field(default="(Deprecated) ") - default_string: str = field(default="[default: {}]") - envvar_string: str = field(default="[env var: {}]") - required_short_string: str = field(default="*") - required_long_string: str = field(default="[required]") - range_string: str = field(default=" [{}]") - append_metavars_help_string: str = field(default="({})") - arguments_panel_title: str = field(default="Arguments") - options_panel_title: str = field(default="Options") - commands_panel_title: str = field(default="Commands") - errors_panel_title: str = field(default="Error") - errors_suggestion: Optional[str] = field(default=None) - """Defaults to Try 'cmd -h' for help. Set to False to disable.""" - errors_epilogue: Optional[str] = field(default=None) - aborted_text: str = field(default="Aborted.") - - # Behaviours - show_arguments: bool = field(default=False) - """Show positional arguments""" - show_metavars_column: bool = field(default=True) - """Show a column with the option metavar (eg. INTEGER)""" - append_metavars_help: bool = field(default=False) - """Append metavar (eg. [TEXT]) after the help text""" - group_arguments_options: bool = field(default=False) - """Show arguments with options instead of in own panel""" - option_envvar_first: bool = field(default=False) - """Show env vars before option help text instead of after""" - use_markdown: bool = field(default=False) - use_markdown_emoji: bool = field(default=True) - """Parse emoji codes in markdown :smile:""" - use_rich_markup: bool = field(default=False) - """Parse help strings for rich markup (eg. [red]my text[/])""" - command_groups: Dict[str, List[Dict[str, Union[str, Any]]]] = field(default_factory=lambda: {}) - """Define sorted groups of panels to display subcommands""" - option_groups: Dict[str, List[Dict[str, Union[str, Any]]]] = field(default_factory=lambda: {}) - """Define sorted groups of panels to display options and arguments""" - use_click_short_help: bool = field(default=False) - """Use click's default function to truncate help text""" - highlighter: rich.highlighter.Highlighter = field(default_factory=lambda: OptionHighlighter()) - """Rich regex highlighter for help highlighting""" - legacy_windows: Optional[bool] = field(default=None) diff --git a/venv/lib/python3.11/site-packages/rich_click/rich_help_formatter.py b/venv/lib/python3.11/site-packages/rich_click/rich_help_formatter.py deleted file mode 100644 index b068ec5..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/rich_help_formatter.py +++ /dev/null @@ -1,103 +0,0 @@ -from typing import Any, IO, Optional - -import click -import rich -import rich.highlighter -import rich.markdown -import rich.padding -import rich.text -import rich.theme -from rich.console import Console - -from rich_click.rich_help_configuration import RichHelpConfiguration - - -def create_console(config: RichHelpConfiguration, file: Optional[IO[str]] = None) -> Console: - """Create a Rich Console configured from Rich Help Configuration. - - Args: - config: Rich Help Configuration instance - file: Optional IO stream to write Rich Console output - Defaults to None. - """ - console = Console( - theme=rich.theme.Theme( - { - "option": config.style_option, - "command": config.style_command, - "argument": config.style_argument, - "switch": config.style_switch, - "metavar": config.style_metavar, - "metavar_sep": config.style_metavar_separator, - "usage": config.style_usage, - } - ), - highlighter=config.highlighter, - color_system=config.color_system, - force_terminal=config.force_terminal, - file=file, - width=config.width, - legacy_windows=config.legacy_windows, - ) - if isinstance(config.max_width, int): - console.width = min(config.max_width, console.size.width) - return console - - -def get_module_config() -> RichHelpConfiguration: - """Get the module-level help configuration. - - A function-level import is used to avoid a circular dependency - between the formatter and formatter operations. - """ - from rich_click.rich_click import get_module_help_configuration - - return get_module_help_configuration() - - -class RichHelpFormatter(click.HelpFormatter): - """Rich Help Formatter. - - This class is a container for the help configuration and Rich Console that - are used internally by the help and error printing methods. - """ - - def __init__( - self, - indent_increment: int = 2, - width: Optional[int] = None, - max_width: Optional[int] = None, - *args: Any, - config: Optional[RichHelpConfiguration] = None, - **kwargs: Any, - ) -> None: - """Create Rich Help Formatter. - - Args: - config: Configuration. - Defaults to None. - """ - if config is not None: - # Rich config overrides width and max width if set. - width = config.width or width - max_width = config.max_width or max_width - super().__init__(indent_increment, width, max_width, *args, **kwargs) - self._config = config or get_module_config() - self._console = create_console(self._config) - - @property - def config(self) -> RichHelpConfiguration: - """Rich Help Configuration.""" - return self._config - - @property - def console(self) -> Console: - """Rich Console created from the help configuration. - - This console is meant only for use with the formatter and should - not be created directly - """ - return self._console - - def write(self, string: str) -> None: - return self._console.print(string) diff --git a/venv/lib/python3.11/site-packages/rich_click/utils.py b/venv/lib/python3.11/site-packages/rich_click/utils.py deleted file mode 100644 index 128f8b1..0000000 --- a/venv/lib/python3.11/site-packages/rich_click/utils.py +++ /dev/null @@ -1,16 +0,0 @@ -from typing import Any, Optional - - -def truthy(o: Any) -> Optional[bool]: - """Check if string or other obj is truthy.""" - if isinstance(o, str): - if o.lower() in {"y", "yes", "t", "true", "1"}: - return True - elif o.lower() in {"n", "no", "f", "false", "0"}: - return False - else: - return None - elif o is None: - return None - else: - return bool(o) |