/opt/support/venv/lib/python3.13/site-packages/pip/_vendor/rich
NameSizeModeActions
__pycache__/-0755rm
abc.py8900755editdlrm
align.py103240755editdlrm
ansi.py69210755editdlrm
bar.py32630755editdlrm
box.py106860755editdlrm
cells.py51300755editdlrm
color.py182110755editdlrm
color_triplet.py10540755editdlrm
columns.py71310755editdlrm
console.py1008490755editdlrm
constrain.py12880755editdlrm
containers.py55020755editdlrm
control.py64870755editdlrm
default_styles.py82570755editdlrm
diagnose.py10250755editdlrm
emoji.py23670755editdlrm
errors.py6420755editdlrm
filesize.py24840755editdlrm
file_proxy.py16830755editdlrm
highlighter.py95860755editdlrm
json.py50310755editdlrm
jupyter.py32520755editdlrm
layout.py140040755editdlrm
LICENSE10560755editdlrm
live.py151800755editdlrm
live_render.py35210755editdlrm
logging.py124680755editdlrm
markup.py84510755editdlrm
measure.py53050755editdlrm
padding.py49080755editdlrm
pager.py8280755editdlrm
palette.py33960755editdlrm
panel.py111570755editdlrm
pretty.py363910755editdlrm
progress.py604080755editdlrm
progress_bar.py81620755editdlrm
prompt.py124470755editdlrm
protocol.py13910755editdlrm
py.typed00755editdlrm
region.py1660755editdlrm
repr.py44310755editdlrm
rule.py46020755editdlrm
scope.py28430755editdlrm
screen.py15910755editdlrm
segment.py247430755editdlrm
spinner.py42140755editdlrm
status.py44240755editdlrm
style.py269900755editdlrm
styled.py12580755editdlrm
syntax.py363710755editdlrm
table.py400490755editdlrm
terminal_theme.py33700755editdlrm
text.py475520755editdlrm
theme.py37710755editdlrm
themes.py1020755editdlrm
traceback.py358610755editdlrm
tree.py94510755editdlrm
_cell_widths.py102090755editdlrm
_emoji_codes.py1402350755editdlrm
_emoji_replace.py10640755editdlrm
_export_format.py21280755editdlrm
_extension.py2650755editdlrm
_fileno.py7990755editdlrm
_inspect.py96560755editdlrm
_log_render.py32250755editdlrm
_loop.py12360755editdlrm
_null_file.py13940755editdlrm
_palettes.py70630755editdlrm
_pick.py4230755editdlrm
_ratio.py53250755editdlrm
_spinners.py199190755editdlrm
_stack.py3510755editdlrm
_timer.py4170755editdlrm
_win32_console.py227550755editdlrm
_windows.py19250755editdlrm
_windows_renderer.py27830755editdlrm
_wrap.py34040755editdlrm
__init__.py60900755editdlrm
__main__.py78960755editdlrm
Edit: /opt/support/venv/lib/python3.13/site-packages/pip/_vendor/rich/panel.py (11157B)
from typing import TYPE_CHECKING, Optional from .align import AlignMethod from .box import ROUNDED, Box from .cells import cell_len from .jupyter import JupyterMixin from .measure import Measurement, measure_renderables from .padding import Padding, PaddingDimensions from .segment import Segment from .style import Style, StyleType from .text import Text, TextType if TYPE_CHECKING: from .console import Console, ConsoleOptions, RenderableType, RenderResult class Panel(JupyterMixin): """A console renderable that draws a border around its contents. Example: >>> console.print(Panel("Hello, World!")) Args: renderable (RenderableType): A console renderable object. box (Box): A Box instance that defines the look of the border (see :ref:`appendix_box`. Defaults to box.ROUNDED. title (Optional[TextType], optional): Optional title displayed in panel header. Defaults to None. title_align (AlignMethod, optional): Alignment of title. Defaults to "center". subtitle (Optional[TextType], optional): Optional subtitle displayed in panel footer. Defaults to None. subtitle_align (AlignMethod, optional): Alignment of subtitle. Defaults to "center". safe_box (bool, optional): Disable box characters that don't display on windows legacy terminal with *raster* fonts. Defaults to True. expand (bool, optional): If True the panel will stretch to fill the console width, otherwise it will be sized to fit the contents. Defaults to True. style (str, optional): The style of the panel (border and contents). Defaults to "none". border_style (str, optional): The style of the border. Defaults to "none". width (Optional[int], optional): Optional width of panel. Defaults to None to auto-detect. height (Optional[int], optional): Optional height of panel. Defaults to None to auto-detect. padding (Optional[PaddingDimensions]): Optional padding around renderable. Defaults to 0. highlight (bool, optional): Enable automatic highlighting of panel title (if str). Defaults to False. """ def __init__( self, renderable: "RenderableType", box: Box = ROUNDED, *, title: Optional[TextType] = None, title_align: AlignMethod = "center", subtitle: Optional[TextType] = None, subtitle_align: AlignMethod = "center", safe_box: Optional[bool] = None, expand: bool = True, style: StyleType = "none", border_style: StyleType = "none", width: Optional[int] = None, height: Optional[int] = None, padding: PaddingDimensions = (0, 1), highlight: bool = False, ) -> None: self.renderable = renderable self.box = box self.title = title self.title_align: AlignMethod = title_align self.subtitle = subtitle self.subtitle_align = subtitle_align self.safe_box = safe_box self.expand = expand self.style = style self.border_style = border_style self.width = width self.height = height self.padding = padding self.highlight = highlight @classmethod def fit( cls, renderable: "RenderableType", box: Box = ROUNDED, *, title: Optional[TextType] = None, title_align: AlignMethod = "center", subtitle: Optional[TextType] = None, subtitle_align: AlignMethod = "center", safe_box: Optional[bool] = None, style: StyleType = "none", border_style: StyleType = "none", width: Optional[int] = None, height: Optional[int] = None, padding: PaddingDimensions = (0, 1), highlight: bool = False, ) -> "Panel": """An alternative constructor that sets expand=False.""" return cls( renderable, box, title=title, title_align=title_align, subtitle=subtitle, subtitle_align=subtitle_align, safe_box=safe_box, style=style, border_style=border_style, width=width, height=height, padding=padding, highlight=highlight, expand=False, ) @property def _title(self) -> Optional[Text]: if self.title: title_text = ( Text.from_markup(self.title) if isinstance(self.title, str) else self.title.copy() ) title_text.end = "" title_text.plain = title_text.plain.replace("\n", " ") title_text.no_wrap = True title_text.expand_tabs() title_text.pad(1) return title_text return None @property def _subtitle(self) -> Optional[Text]: if self.subtitle: subtitle_text = ( Text.from_markup(self.subtitle) if isinstance(self.subtitle, str) else self.subtitle.copy() ) subtitle_text.end = "" subtitle_text.plain = subtitle_text.plain.replace("\n", " ") subtitle_text.no_wrap = True subtitle_text.expand_tabs() subtitle_text.pad(1) return subtitle_text return None def __rich_console__( self, console: "Console", options: "ConsoleOptions" ) -> "RenderResult": _padding = Padding.unpack(self.padding) renderable = ( Padding(self.renderable, _padding) if any(_padding) else self.renderable ) style = console.get_style(self.style) border_style = style + console.get_style(self.border_style) width = ( options.max_width if self.width is None else min(options.max_width, self.width) ) safe_box: bool = console.safe_box if self.safe_box is None else self.safe_box box = self.box.substitute(options, safe=safe_box) def align_text( text: Text, width: int, align: str, character: str, style: Style ) -> Text: """Gets new aligned text. Args: text (Text): Title or subtitle text. width (int): Desired width. align (str): Alignment. character (str): Character for alignment. style (Style): Border style Returns: Text: New text instance """ text = text.copy() text.truncate(width) excess_space = width - cell_len(text.plain) if text.style: text.stylize(console.get_style(text.style)) if excess_space: if align == "left": return Text.assemble( text, (character * excess_space, style), no_wrap=True, end="", ) elif align == "center": left = excess_space // 2 return Text.assemble( (character * left, style), text, (character * (excess_space - left), style), no_wrap=True, end="", ) else: return Text.assemble( (character * excess_space, style), text, no_wrap=True, end="", ) return text title_text = self._title if title_text is not None: title_text.stylize_before(border_style) child_width = ( width - 2 if self.expand else console.measure( renderable, options=options.update_width(width - 2) ).maximum ) child_height = self.height or options.height or None if child_height: child_height -= 2 if title_text is not None: child_width = min( options.max_width - 2, max(child_width, title_text.cell_len + 2) ) width = child_width + 2 child_options = options.update( width=child_width, height=child_height, highlight=self.highlight ) lines = console.render_lines(renderable, child_options, style=style) line_start = Segment(box.mid_left, border_style) line_end = Segment(f"{box.mid_right}", border_style) new_line = Segment.line() if title_text is None or width <= 4: yield Segment(box.get_top([width - 2]), border_style) else: title_text = align_text( title_text, width - 4, self.title_align, box.top, border_style, ) yield Segment(box.top_left + box.top, border_style) yield from console.render(title_text, child_options.update_width(width - 4)) yield Segment(box.top + box.top_right, border_style) yield new_line for line in lines: yield line_start yield from line yield line_end yield new_line subtitle_text = self._subtitle if subtitle_text is not None: subtitle_text.stylize_before(border_style) if subtitle_text is None or width <= 4: yield Segment(box.get_bottom([width - 2]), border_style) else: subtitle_text = align_text( subtitle_text, width - 4, self.subtitle_align, box.bottom, border_style, ) yield Segment(box.bottom_left + box.bottom, border_style) yield from console.render( subtitle_text, child_options.update_width(width - 4) ) yield Segment(box.bottom + box.bottom_right, border_style) yield new_line def __rich_measure__( self, console: "Console", options: "ConsoleOptions" ) -> "Measurement": _title = self._title _, right, _, left = Padding.unpack(self.padding) padding = left + right renderables = [self.renderable, _title] if _title else [self.renderable] if self.width is None: width = ( measure_renderables( console, options.update_width(options.max_width - padding - 2), renderables, ).maximum + padding + 2 ) else: width = self.width return Measurement(width, width) if __name__ == "__main__": # pragma: no cover from .console import Console c = Console() from .box import DOUBLE, ROUNDED from .padding import Padding p = Panel( "Hello, World!", title="rich.Panel", style="white on blue", box=DOUBLE, padding=1, ) c.print() c.print(p)