summaryrefslogtreecommitdiff
path: root/venv/lib/python3.11/site-packages/rich_click/cli.py
diff options
context:
space:
mode:
authorcyfraeviolae <cyfraeviolae>2024-04-03 03:10:44 -0400
committercyfraeviolae <cyfraeviolae>2024-04-03 03:10:44 -0400
commit6d7ba58f880be618ade07f8ea080fe8c4bf8a896 (patch)
treeb1c931051ffcebd2bd9d61d98d6233ffa289bbce /venv/lib/python3.11/site-packages/rich_click/cli.py
parent4f884c9abc32990b4061a1bb6997b4b37e58ea0b (diff)
venv
Diffstat (limited to 'venv/lib/python3.11/site-packages/rich_click/cli.py')
-rw-r--r--venv/lib/python3.11/site-packages/rich_click/cli.py154
1 files changed, 154 insertions, 0 deletions
diff --git a/venv/lib/python3.11/site-packages/rich_click/cli.py b/venv/lib/python3.11/site-packages/rich_click/cli.py
new file mode 100644
index 0000000..a7041a9
--- /dev/null
+++ b/venv/lib/python3.11/site-packages/rich_click/cli.py
@@ -0,0 +1,154 @@
+"""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()