| 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 yellow]256[/] colors or [bold green]16.7 million[/] colors [blue](if supported by your terminal)[/].", |
| ( |
| "✓ [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) |
| |
| text = console.file.getvalue() |
| # https://bugs.python.org/issue37871 |
| for line in text.splitlines(True): |
| print(line, end="") |
| |
| 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( |
| "Buy devs a :coffee:", |
| "[u blue link=https://ko-fi.com/textualize]https://ko-fi.com/textualize", |
| ) |
| sponsor_message.add_row( |
| "Twitter", |
| "[u blue link=https://twitter.com/willmcgugan]https://twitter.com/willmcgugan", |
| ) |
| sponsor_message.add_row( |
| "Blog", "[u blue link=https://www.willmcgugan.com]https://www.willmcgugan.com" |
| ) |
| |
| intro_message = Text.from_markup( |
| """\ |
| We hope you enjoy using Rich! |
| |
| Rich is maintained with :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", |
| ) |