# Extracted and modified from https://github.com/ewels/rich-click import inspect import io from collections import defaultdict from collections.abc import Iterable from gettext import gettext as _ from os import getenv from typing import Any, Literal import click from rich import box from rich.align import Align from rich.columns import Columns from rich.console import Console, RenderableType, group from rich.emoji import Emoji from rich.highlighter import RegexHighlighter from rich.markdown import Markdown from rich.markup import escape from rich.padding import Padding from rich.panel import Panel from rich.table import Table from rich.text import Text from rich.theme import Theme from rich.traceback import Traceback from typer.models import DeveloperExceptionConfig # Default styles STYLE_OPTION = "bold cyan" STYLE_SWITCH = "bold green" STYLE_NEGATIVE_OPTION = "bold magenta" STYLE_NEGATIVE_SWITCH = "bold red" STYLE_METAVAR = "bold yellow" STYLE_METAVAR_SEPARATOR = "dim" STYLE_USAGE = "yellow" STYLE_USAGE_COMMAND = "bold" STYLE_DEPRECATED = "red" STYLE_DEPRECATED_COMMAND = "dim" 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: Literal["left", "center", "right"] = "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: Literal["left", "center", "right"] = "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_FIRST_COLUMN = "bold cyan" STYLE_ERRORS_PANEL_BORDER = "red" ALIGN_ERRORS_PANEL: Literal["left", "center", "right"] = "left" STYLE_ERRORS_SUGGESTION = "dim" STYLE_ABORTED = "red" _TERMINAL_WIDTH = getenv("TERMINAL_WIDTH") MAX_WIDTH = int(_TERMINAL_WIDTH) if _TERMINAL_WIDTH else None COLOR_SYSTEM: Literal["auto", "standard", "256", "truecolor", "windows"] | None = ( "auto" # Set to None to disable colors ) _TYPER_FORCE_DISABLE_TERMINAL = getenv("_TYPER_FORCE_DISABLE_TERMINAL") FORCE_TERMINAL = ( True if getenv("GITHUB_ACTIONS") or getenv("FORCE_COLOR") or getenv("PY_COLORS") else None ) if _TYPER_FORCE_DISABLE_TERMINAL: FORCE_TERMINAL = False # Fixed strings DEPRECATED_STRING = _("(deprecated) ") DEFAULT_STRING = _("[default: {}]") ENVVAR_STRING = _("[env var: {}]") REQUIRED_SHORT_STRING = "*" REQUIRED_LONG_STRING = _("[required]") RANGE_STRING = " [{}]" ARGUMENTS_PANEL_TITLE = _("Arguments") OPTIONS_PANEL_TITLE = _("Options") COMMANDS_PANEL_TITLE = _("Commands") ERRORS_PANEL_TITLE = _("Error") ABORTED_TEXT = _("Aborted.") RICH_HELP = _("Try [blue]'{command_path} {help_option}'[/] for help.") MARKUP_MODE_MARKDOWN = "markdown" MARKUP_MODE_RICH = "rich" _RICH_HELP_PANEL_NAME = "rich_help_panel" ANSI_PREFIX = "\033[" MarkupModeStrict = Literal["markdown", "rich"] # Rich regex highlighter class OptionHighlighter(RegexHighlighter): """Highlights our special options.""" highlights = [ r"(^|\W)(?P\-\w+)(?![a-zA-Z0-9])", r"(^|\W)(?P