/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/columns.py (7131B)
from collections import defaultdict from itertools import chain from operator import itemgetter from typing import Dict, Iterable, List, Optional, Tuple from .align import Align, AlignMethod from .console import Console, ConsoleOptions, RenderableType, RenderResult from .constrain import Constrain from .measure import Measurement from .padding import Padding, PaddingDimensions from .table import Table from .text import TextType from .jupyter import JupyterMixin class Columns(JupyterMixin): """Display renderables in neat columns. Args: renderables (Iterable[RenderableType]): Any number of Rich renderables (including str). width (int, optional): The desired width of the columns, or None to auto detect. Defaults to None. padding (PaddingDimensions, optional): Optional padding around cells. Defaults to (0, 1). expand (bool, optional): Expand columns to full width. Defaults to False. equal (bool, optional): Arrange in to equal sized columns. Defaults to False. column_first (bool, optional): Align items from top to bottom (rather than left to right). Defaults to False. right_to_left (bool, optional): Start column from right hand side. Defaults to False. align (str, optional): Align value ("left", "right", or "center") or None for default. Defaults to None. title (TextType, optional): Optional title for Columns. """ def __init__( self, renderables: Optional[Iterable[RenderableType]] = None, padding: PaddingDimensions = (0, 1), *, width: Optional[int] = None, expand: bool = False, equal: bool = False, column_first: bool = False, right_to_left: bool = False, align: Optional[AlignMethod] = None, title: Optional[TextType] = None, ) -> None: self.renderables = list(renderables or []) self.width = width self.padding = padding self.expand = expand self.equal = equal self.column_first = column_first self.right_to_left = right_to_left self.align: Optional[AlignMethod] = align self.title = title def add_renderable(self, renderable: RenderableType) -> None: """Add a renderable to the columns. Args: renderable (RenderableType): Any renderable object. """ self.renderables.append(renderable) def __rich_console__( self, console: Console, options: ConsoleOptions ) -> RenderResult: render_str = console.render_str renderables = [ render_str(renderable) if isinstance(renderable, str) else renderable for renderable in self.renderables ] if not renderables: return _top, right, _bottom, left = Padding.unpack(self.padding) width_padding = max(left, right) max_width = options.max_width widths: Dict[int, int] = defaultdict(int) column_count = len(renderables) get_measurement = Measurement.get renderable_widths = [ get_measurement(console, options, renderable).maximum for renderable in renderables ] if self.equal: renderable_widths = [max(renderable_widths)] * len(renderable_widths) def iter_renderables( column_count: int, ) -> Iterable[Tuple[int, Optional[RenderableType]]]: item_count = len(renderables) if self.column_first: width_renderables = list(zip(renderable_widths, renderables)) column_lengths: List[int] = [item_count // column_count] * column_count for col_no in range(item_count % column_count): column_lengths[col_no] += 1 row_count = (item_count + column_count - 1) // column_count cells = [[-1] * column_count for _ in range(row_count)] row = col = 0 for index in range(item_count): cells[row][col] = index column_lengths[col] -= 1 if column_lengths[col]: row += 1 else: col += 1 row = 0 for index in chain.from_iterable(cells): if index == -1: break yield width_renderables[index] else: yield from zip(renderable_widths, renderables) # Pad odd elements with spaces if item_count % column_count: for _ in range(column_count - (item_count % column_count)): yield 0, None table = Table.grid(padding=self.padding, collapse_padding=True, pad_edge=False) table.expand = self.expand table.title = self.title if self.width is not None: column_count = (max_width) // (self.width + width_padding) for _ in range(column_count): table.add_column(width=self.width) else: while column_count > 1: widths.clear() column_no = 0 for renderable_width, _ in iter_renderables(column_count): widths[column_no] = max(widths[column_no], renderable_width) total_width = sum(widths.values()) + width_padding * ( len(widths) - 1 ) if total_width > max_width: column_count = len(widths) - 1 break else: column_no = (column_no + 1) % column_count else: break get_renderable = itemgetter(1) _renderables = [ get_renderable(_renderable) for _renderable in iter_renderables(column_count) ] if self.equal: _renderables = [ None if renderable is None else Constrain(renderable, renderable_widths[0]) for renderable in _renderables ] if self.align: align = self.align _Align = Align _renderables = [ None if renderable is None else _Align(renderable, align) for renderable in _renderables ] right_to_left = self.right_to_left add_row = table.add_row for start in range(0, len(_renderables), column_count): row = _renderables[start : start + column_count] if right_to_left: row = row[::-1] add_row(*row) yield table if __name__ == "__main__": # pragma: no cover import os console = Console() files = [f"{i} {s}" for i, s in enumerate(sorted(os.listdir()))] columns = Columns(files, padding=(0, 1), expand=False, equal=False) console.print(columns) console.rule() columns.column_first = True console.print(columns) columns.right_to_left = True console.rule() console.print(columns)