import colorsys import io from time import process_time from pip._vendor.rich import box from pip._vendor.rich.color import Color from pip._vendor.rich.console import Console, ConsoleOptions, Group, RenderableType, RenderResult from pip._vendor.rich.markdown import Markdown from pip._vendor.rich.measure import Measurement from pip._vendor.rich.pretty import Pretty from pip._vendor.rich.segment import Segment from pip._vendor.rich.style import Style from pip._vendor.rich.syntax import Syntax from pip._vendor.rich.table import Table from pip._vendor.rich.text import Text class ColorBox: def __rich_console__( self, console: Console, options: ConsoleOptions ) -> RenderResult: for y in range(0, 5): for x in range(options.max_width): h = x / options.max_width l = 0.1 + ((y / 5) * 0.7) r1, g1, b1 = colorsys.hls_to_rgb(h, l, 1.0) r2, g2, b2 = colorsys.hls_to_rgb(h, l + 0.7 / 10, 1.0) bgcolor = Color.from_rgb(r1 * 255, g1 * 255, b1 * 255) color = Color.from_rgb(r2 * 255, g2 * 255, b2 * 255) yield Segment("▄", Style(color=color, bgcolor=bgcolor)) yield Segment.line() def __rich_measure__( self, console: "Console", options: ConsoleOptions ) -> Measurement: return Measurement(1, options.max_width) def make_test_card() -> Table: """Get a renderable that demonstrates a number of features.""" table = Table.grid(padding=1, pad_edge=True) table.title = "Rich features" table.add_column("Feature", no_wrap=True, justify="center", style="bold red") table.add_column("Demonstration") color_table = Table( box=None, expand=False, show_header=False, show_edge=False, pad_edge=False, ) color_table.add_row( ( "✓ [bold green]4-bit color[/]\n" "✓ [bold blue]8-bit color[/]\n" "✓ [bold magenta]Truecolor (16.7 million)[/]\n" "✓ [bold yellow]Dumb terminals[/]\n" "✓ [bold cyan]Automatic color conversion" ), ColorBox(), ) table.add_row("Colors", color_table) table.add_row( "Styles", "All ansi styles: [bold]bold[/], [dim]dim[/], [italic]italic[/italic], [underline]underline[/], [strike]strikethrough[/], [reverse]reverse[/], and even [blink]blink[/].", ) lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque in metus sed sapien ultricies pretium a at justo. Maecenas luctus velit et auctor maximus." lorem_table = Table.grid(padding=1, collapse_padding=True) lorem_table.pad_edge = False lorem_table.add_row( Text(lorem, justify="left", style="green"), Text(lorem, justify="center", style="yellow"), Text(lorem, justify="right", style="blue"), Text(lorem, justify="full", style="red"), ) table.add_row( "Text", Group( Text.from_markup( """Word wrap text. Justify [green]left[/], [yellow]center[/], [blue]right[/] or [red]full[/].\n""" ), lorem_table, ), ) def comparison(renderable1: RenderableType, renderable2: RenderableType) -> Table: table = Table(show_header=False, pad_edge=False, box=None, expand=True) table.add_column("1", ratio=1) table.add_column("2", ratio=1) table.add_row(renderable1, renderable2) return table table.add_row( "Asian\nlanguage\nsupport", ":flag_for_china: 该库支持中文,日文和韩文文本!\n:flag_for_japan: ライブラリは中国語、日本語、韓国語のテキストをサポートしています\n:flag_for_south_korea: 이 라이브러리는 중국어, 일본어 및 한국어 텍스트를 지원합니다", ) markup_example = ( "[bold magenta]Rich[/] supports a simple [i]bbcode[/i]-like [b]markup[/b] for [yellow]color[/], [underline]style[/], and emoji! " ":+1: :apple: :ant: :bear: :baguette_bread: :bus: " ) table.add_row("Markup", markup_example) example_table = Table( show_edge=False, show_header=True, expand=False, row_styles=["none", "dim"], box=box.SIMPLE, ) example_table.add_column("[green]Date", style="green", no_wrap=True) example_table.add_column("[blue]Title", style="blue") example_table.add_column( "[cyan]Production Budget", style="cyan", justify="right", no_wrap=True, ) example_table.add_column( "[magenta]Box Office", style="magenta", justify="right", no_wrap=True, ) example_table.add_row( "Dec 20, 2019", "Star Wars: The Rise of Skywalker", "$275,000,000", "$375,126,118", ) example_table.add_row( "May 25, 2018", "[b]Solo[/]: A Star Wars Story", "$275,000,000", "$393,151,347", ) example_table.add_row( "Dec 15, 2017", "Star Wars Ep. VIII: The Last Jedi", "$262,000,000", "[bold]$1,332,539,889[/bold]", ) example_table.add_row( "May 19, 1999", "Star Wars Ep. [b]I[/b]: [i]The phantom Menace", "$115,000,000", "$1,027,044,677", ) table.add_row("Tables", example_table) code = '''\ def iter_last(values: Iterable[T]) -> Iterable[Tuple[bool, T]]: """Iterate and generate a tuple with a flag for last value.""" iter_values = iter(values) try: previous_value = next(iter_values) except StopIteration: return for value in iter_values: yield False, previous_value previous_value = value yield True, previous_value''' pretty_data = { "foo": [ 3.1427, ( "Paul Atreides", "Vladimir Harkonnen", "Thufir Hawat", ), ], "atomic": (False, True, None), } table.add_row( "Syntax\nhighlighting\n&\npretty\nprinting", comparison( Syntax(code, "python3", line_numbers=True, indent_guides=True), Pretty(pretty_data, indent_guides=True), ), ) markdown_example = """\ # Markdown Supports much of the *markdown* __syntax__! - Headers - Basic formatting: **bold**, *italic*, `code` - Block quotes - Lists, and more... """ table.add_row( "Markdown", comparison("[cyan]" + markdown_example, Markdown(markdown_example)) ) table.add_row( "+more!", """Progress bars, columns, styled logging handler, tracebacks, etc...""", ) return table if __name__ == "__main__": # pragma: no cover console = Console( file=io.StringIO(), force_terminal=True, ) test_card = make_test_card() # Print once to warm cache start = process_time() console.print(test_card) pre_cache_taken = round((process_time() - start) * 1000.0, 1) console.file = io.StringIO() start = process_time() console.print(test_card) taken = round((process_time() - start) * 1000.0, 1) c = Console(record=True) c.print(test_card) print(f"rendered in {pre_cache_taken}ms (cold cache)") print(f"rendered in {taken}ms (warm cache)") from pip._vendor.rich.panel import Panel console = Console() sponsor_message = Table.grid(padding=1) sponsor_message.add_column(style="green", justify="right") sponsor_message.add_column(no_wrap=True) sponsor_message.add_row( "Textualize", "[u blue link=https://github.com/textualize]https://github.com/textualize", ) sponsor_message.add_row( "Twitter", "[u blue link=https://twitter.com/willmcgugan]https://twitter.com/willmcgugan", ) intro_message = Text.from_markup( """\ We hope you enjoy using Rich! Rich is maintained with [red]:heart:[/] by [link=https://www.textualize.io]Textualize.io[/] - Will McGugan""" ) message = Table.grid(padding=2) message.add_column() message.add_column(no_wrap=True) message.add_row(intro_message, sponsor_message) console.print( Panel.fit( message, box=box.ROUNDED, padding=(1, 2), title="[b red]Thanks for trying out Rich!", border_style="bright_blue", ), justify="center", )
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__pycache__ | Folder | 0755 |
|
|
__init__.py | File | 5.95 KB | 0644 |
|
__main__.py | File | 8.28 KB | 0644 |
|
_cell_widths.py | File | 9.97 KB | 0644 |
|
_emoji_codes.py | File | 136.95 KB | 0644 |
|
_emoji_replace.py | File | 1.04 KB | 0644 |
|
_export_format.py | File | 2.08 KB | 0644 |
|
_extension.py | File | 265 B | 0644 |
|
_fileno.py | File | 799 B | 0644 |
|
_inspect.py | File | 9.47 KB | 0644 |
|
_log_render.py | File | 3.15 KB | 0644 |
|
_loop.py | File | 1.21 KB | 0644 |
|
_null_file.py | File | 1.35 KB | 0644 |
|
_palettes.py | File | 6.9 KB | 0644 |
|
_pick.py | File | 423 B | 0644 |
|
_ratio.py | File | 5.34 KB | 0644 |
|
_spinners.py | File | 19.45 KB | 0644 |
|
_stack.py | File | 351 B | 0644 |
|
_timer.py | File | 417 B | 0644 |
|
_win32_console.py | File | 22.29 KB | 0644 |
|
_windows.py | File | 1.88 KB | 0644 |
|
_windows_renderer.py | File | 2.72 KB | 0644 |
|
_wrap.py | File | 3.32 KB | 0644 |
|
abc.py | File | 890 B | 0644 |
|
align.py | File | 10.13 KB | 0644 |
|
ansi.py | File | 6.74 KB | 0644 |
|
bar.py | File | 3.19 KB | 0644 |
|
box.py | File | 10.58 KB | 0644 |
|
cells.py | File | 4.67 KB | 0644 |
|
color.py | File | 17.8 KB | 0644 |
|
color_triplet.py | File | 1.03 KB | 0644 |
|
columns.py | File | 6.96 KB | 0644 |
|
console.py | File | 96.85 KB | 0644 |
|
constrain.py | File | 1.26 KB | 0644 |
|
containers.py | File | 5.37 KB | 0644 |
|
control.py | File | 6.47 KB | 0644 |
|
default_styles.py | File | 7.89 KB | 0644 |
|
diagnose.py | File | 972 B | 0644 |
|
emoji.py | File | 2.44 KB | 0644 |
|
errors.py | File | 642 B | 0644 |
|
file_proxy.py | File | 1.64 KB | 0644 |
|
filesize.py | File | 2.45 KB | 0644 |
|
highlighter.py | File | 9.36 KB | 0644 |
|
json.py | File | 4.91 KB | 0644 |
|
jupyter.py | File | 3.18 KB | 0644 |
|
layout.py | File | 13.68 KB | 0644 |
|
live.py | File | 13.94 KB | 0644 |
|
live_render.py | File | 3.58 KB | 0644 |
|
logging.py | File | 11.62 KB | 0644 |
|
markup.py | File | 8.25 KB | 0644 |
|
measure.py | File | 5.18 KB | 0644 |
|
padding.py | File | 4.85 KB | 0644 |
|
pager.py | File | 828 B | 0644 |
|
palette.py | File | 3.32 KB | 0644 |
|
panel.py | File | 10.45 KB | 0644 |
|
pretty.py | File | 35.01 KB | 0644 |
|
progress.py | File | 58.32 KB | 0644 |
|
progress_bar.py | File | 7.97 KB | 0644 |
|
prompt.py | File | 11.04 KB | 0644 |
|
protocol.py | File | 1.36 KB | 0644 |
|
py.typed | File | 0 B | 0644 |
|
region.py | File | 166 B | 0644 |
|
repr.py | File | 4.33 KB | 0644 |
|
rule.py | File | 4.49 KB | 0644 |
|
scope.py | File | 2.78 KB | 0644 |
|
screen.py | File | 1.55 KB | 0644 |
|
segment.py | File | 23.68 KB | 0644 |
|
spinner.py | File | 4.24 KB | 0644 |
|
status.py | File | 4.32 KB | 0644 |
|
style.py | File | 26.44 KB | 0644 |
|
styled.py | File | 1.23 KB | 0644 |
|
syntax.py | File | 34.64 KB | 0644 |
|
table.py | File | 38.75 KB | 0644 |
|
terminal_theme.py | File | 3.29 KB | 0644 |
|
text.py | File | 46.2 KB | 0644 |
|
theme.py | File | 3.69 KB | 0644 |
|
themes.py | File | 102 B | 0644 |
|
traceback.py | File | 28.91 KB | 0644 |
|
tree.py | File | 8.95 KB | 0644 |
|