def test_spinner_update(): time = 0.0 def get_time(): nonlocal time return time console = Console(width=20, force_terminal=True, get_time=get_time, _environ={}) console.begin_capture() spinner = Spinner("dots") console.print(spinner) rule = Rule("Bar") spinner.update(text=rule) time += 80 / 1000 console.print(spinner) result = console.end_capture() print(repr(result)) expected = "⠋\n⠙ \x1b[92m─\x1b[0m\n" assert result == expected
def test_newline(): console = Console(color_system=None) console.begin_capture() console.print(Pretty((1, ), insert_line=True, expand_all=True)) result = console.end_capture() expected = "\n(\n 1,\n)\n" assert result == expected
def test_spinner_update(): time = 0.0 def get_time(): nonlocal time return time console = Console(width=20, force_terminal=True, get_time=get_time, _environ={}) console.begin_capture() spinner = Spinner("dots") console.print(spinner) spinner.update(text="Bar", style="green", speed=2) time += 80 / 1000 console.print(spinner) spinner.update(text=Rule("Bar")) time += 80 / 1000 console.print(spinner) result = console.end_capture() print(repr(result)) expected = f"⠋\n\x1b[32m⠙\x1b[0m Bar\n\x1b[32m⠸\x1b[0m \x1b[92m────── \x1b[0mBar\x1b[92m ───────\x1b[0m\n" assert result == expected
def test_decode(): console = Console(force_terminal=True, legacy_windows=False, color_system="truecolor") console.begin_capture() console.print("Hello") console.print("[b]foo[/b]") console.print("[link http://example.org]bar") console.print("[#ff0000 on color(200)]red") console.print("[color(200) on #ff0000]red") terminal_codes = console.end_capture() decoder = AnsiDecoder() lines = list(decoder.decode(terminal_codes)) expected = [ Text("Hello"), Text("foo", spans=[Span(0, 3, Style.parse("bold"))]), Text("bar", spans=[Span(0, 3, Style.parse("link http://example.org"))]), Text("red", spans=[Span(0, 3, Style.parse("#ff0000 on color(200)"))]), Text("red", spans=[Span(0, 3, Style.parse("color(200) on #ff0000"))]), ] assert lines == expected
def test_no_columns(): console = Console(color_system=None) console.begin_capture() console.print(Table()) output = console.end_capture() print(repr(output)) assert output == "\n"
def will_forget(self): will_forget_msg = f"[magenta]Forget options is configured, will revert to default account[/]\n" will_forget_msg = f"{will_forget_msg}[cyan]{config.forget_account_after}[/][magenta] mins after last command[/]" console = Console(emoji=False, record=True) console.begin_capture() console.print(will_forget_msg) return console.end_capture()
def test_progress_max_refresh() -> None: """Test max_refresh argment.""" time = 0.0 def get_time() -> float: nonlocal time try: return time finally: time = time + 1.0 console = Console(color_system=None, width=80, legacy_windows=False, force_terminal=True) column = TextColumn("{task.description}") column.max_refresh = 3 progress = Progress( column, get_time=get_time, auto_refresh=False, console=console, ) console.begin_capture() with progress: task_id = progress.add_task("start") for tick in range(6): progress.update(task_id, description=f"tick {tick}") progress.refresh() result = console.end_capture() print(repr(result)) assert ( result == "\x1b[?25l\r\x1b[2Kstart\r\x1b[2Kstart\r\x1b[2Ktick 1\r\x1b[2Ktick 1\r\x1b[2Ktick 3\r\x1b[2Ktick 3\r\x1b[2Ktick 5\r\x1b[2Ktick 5\n\x1b[?25h" )
def test_render_escape(): console = Console(width=80, color_system=None) console.begin_capture() console.print(escape(r"[red]"), escape(r"\[red]"), escape(r"\\[red]"), escape(r"\\\[red]")) result = console.end_capture() expected = r"[red] \[red] \\[red] \\\[red]" + "\n" assert result == expected
def test_renderable(): console = Console( color_system=None, width=80, legacy_windows=False, get_time=lambda: 0.0 ) status = Status("foo", console=console) console.begin_capture() console.print(status) assert console.end_capture() == "РаІ foo\n"
def getResourceTreeText(self, maxLevel: int = 0) -> str: """ This function will generate a Text tree of a CSE's resource structure. """ from rich.console import Console console = Console(color_system=None) console.begin_capture() console.print(self.getResourceTreeRich()) return console.end_capture()
def test_justify(): console = Console(width=20, log_path=False, log_time=False, color_system=None) console.begin_capture() console.log("foo", justify="right") result = console.end_capture() assert result == " foo\n"
def getResourceTreeText(self, maxLevel:int=0) -> str: """ This function will generate a Text tree of a CSE's resource structure. """ from rich.console import Console as RichConsole console = RichConsole(color_system=None) console.begin_capture() console.print(self.getResourceTreeRich()) return '\n'.join([item.rstrip() for item in console.end_capture().splitlines()])
def test_min_width(): table = Table("foo", min_width=30) table.add_row("bar") assert table.__rich_measure__(Console(), 100) == Measurement(30, 30) console = Console(color_system=None) console.begin_capture() console.print(table) output = console.end_capture() print(output) assert all(len(line) == 30 for line in output.splitlines())
def test_render_single_branch(): tree = Tree("foo") tree.add("bar") console = Console(color_system=None, width=20) console.begin_capture() console.print(tree) result = console.end_capture() print(repr(result)) expected = "foo \n└── bar \n" assert result == expected
def test_tuples(): console = Console(color_system=None) console.begin_capture() pprint((1, ), console=console) pprint((1, ), expand_all=True, console=console) pprint(((1, ), ), expand_all=True, console=console) result = console.end_capture() print(repr(result)) expected = "(1,)\n(\n│ 1,\n)\n(\n│ (\n│ │ 1,\n│ ),\n)\n" assert result == expected
def test_vertical_center(): console = Console(color_system=None, height=6) console.begin_capture() vertical_center = VerticalCenter("foo") repr(vertical_center) console.print(vertical_center) result = console.end_capture() print(repr(result)) expected = " \n \nfoo\n \n \n \n" assert result == expected assert Measurement.get(console, vertical_center) == Measurement(3, 3)
def test_ipy_display_hook__repr_html(): console = Console(file=io.StringIO(), force_jupyter=True) class Thing: def _repr_html_(self): return "hello" console.begin_capture() _ipy_display_hook(Thing(), console=console) # Rendering delegated to notebook because _repr_html_ method exists assert console.end_capture() == ""
def test_ipy_display_hook__no_special_repr_methods(): console = Console(file=io.StringIO(), force_jupyter=True) class Thing: def __repr__(self) -> str: return "hello" console.begin_capture() _ipy_display_hook(Thing(), console=console) # No IPython special repr methods, so printed by Rich assert console.end_capture() == "hello\n"
def test_ipy_display_hook__classes_to_not_render(): console = Console(file=io.StringIO(), force_jupyter=True) console.begin_capture() class Thing: def __repr__(self) -> str: return "hello" class_fully_qualified_name = f"{__name__}.{Thing.__qualname__}" with patch("rich.pretty.JUPYTER_CLASSES_TO_NOT_RENDER", {class_fully_qualified_name}): _ipy_display_hook(Thing(), console=console) assert console.end_capture() == ""
def test_indent_lines(): console = Console(width=100, color_system=None) console.begin_capture() console.print(Pretty([100, 200], indent_guides=True), width=8) expected = """\ [ │ 100, │ 200 ] """ result = console.end_capture() print(repr(result)) print(result) assert result == expected
def test_render(): tree = Tree("foo") tree.add("bar", style="italic") baz_tree = tree.add("baz", guide_style="bold red", style="on blue") baz_tree.add("1") baz_tree.add("2") tree.add("egg") console = Console(width=20, force_terminal=True, color_system="standard") console.begin_capture() console.print(tree) result = console.end_capture() print(repr(result)) expected = "foo \n├── \x1b[3mbar\x1b[0m\x1b[3m \x1b[0m\n\x1b[44m├── \x1b[0m\x1b[44mbaz\x1b[0m\x1b[44m \x1b[0m\n\x1b[44m│ \x1b[0m\x1b[1;31;44m┣━━ \x1b[0m\x1b[44m1\x1b[0m\x1b[44m \x1b[0m\n\x1b[44m│ \x1b[0m\x1b[1;31;44m┗━━ \x1b[0m\x1b[44m2\x1b[0m\x1b[44m \x1b[0m\n└── egg \n" assert result == expected
def test_render_tree_hide_root_non_win32(): tree = Tree("foo", hide_root=True) tree.add("bar", style="italic") baz_tree = tree.add("baz", guide_style="bold red", style="on blue") baz_tree.add("1") baz_tree.add("2") tree.add("egg") console = Console(width=20, force_terminal=True, color_system="standard", _environ={}) console.begin_capture() console.print(tree) result = console.end_capture() print(repr(result)) expected = "\x1b[3mbar\x1b[0m\x1b[3m \x1b[0m\n\x1b[44mbaz\x1b[0m\x1b[44m \x1b[0m\n\x1b[31;44m┣━━ \x1b[0m\x1b[44m1\x1b[0m\x1b[44m \x1b[0m\n\x1b[31;44m┗━━ \x1b[0m\x1b[44m2\x1b[0m\x1b[44m \x1b[0m\negg \n" assert result == expected
def test_ipy_display_hook__multiple_special_reprs(): """ The case where there are multiple IPython special _repr_*_ methods on the object, and one of them returns None but another one does not. """ console = Console(file=io.StringIO(), force_jupyter=True) class Thing: def _repr_latex_(self): return None def _repr_html_(self): return "hello" console.begin_capture() _ipy_display_hook(Thing(), console=console) assert console.end_capture() == ""
def test_spinner_render(): time = 0.0 def get_time(): nonlocal time return time console = Console(width=80, color_system=None, force_terminal=True, get_time=get_time) console.begin_capture() spinner = Spinner("dots", "Foo") console.print(spinner) time += 80 / 1000 console.print(spinner) result = console.end_capture() print(repr(result)) expected = "⠋ Foo\n⠙ Foo\n" assert result == expected
def test_traceback_console_theme_applies(): """ Ensure that themes supplied via Console init work on Tracebacks. Regression test for https://github.com/Textualize/rich/issues/1786 """ r, g, b = 123, 234, 123 console = Console( force_terminal=True, _environ={"COLORTERM": "truecolor"}, theme=Theme({"traceback.title": f"rgb({r},{g},{b})"}), ) console.begin_capture() try: 1 / 0 except Exception: console.print_exception() result = console.end_capture() assert f"\\x1b[38;2;{r};{g};{b}mTraceback \\x1b[0m" in repr(result)
def test_ipy_display_hook__special_repr_raises_exception(): """ When an IPython special repr method raises an exception, we treat it as if it doesn't exist and look for the next. """ console = Console(file=io.StringIO(), force_jupyter=True) class Thing: def _repr_markdown_(self): raise Exception() def _repr_latex_(self): return None def _repr_html_(self): return "hello" console.begin_capture() _ipy_display_hook(Thing(), console=console) assert console.end_capture() == ""
def parse_caas_response(data: Union[dict, List[dict]]) -> List[str]: """Parses Response Object from caas API updates output attribute """ console = Console(emoji=False, record=True) data = utils.unlistify(data) out = [] lines = f"[reset]{'-' * 22}" if data.get("_global_result", {}).get("status", '') == 0: global_res = "[bright_green]Success[/bright_green]" else: global_res = "[red]Failure[/red]" out += [lines, f"Global Result: {global_res}", lines] if data.get("cli_cmds_result"): out += ["\n -- [cyan bold]Command Results[/cyan bold] --"] for cmd_resp in data["cli_cmds_result"]: for _c, _r in cmd_resp.items(): _r_code = _r.get("status") if _r_code == 0: _r_pretty = "[bright_green]OK[/bright_green]" elif _r_code == 2: _r_pretty = "[dark_orange3]WARNING[/dark_orange3]" else: _r_pretty = f"[red]ERROR[/red]" if _r_code == 1 else f"[red]ERROR ({_r_code})[/red]" out += [f" [{_r_pretty}] {_c}"] cmd_status = _r.get('status_str') if cmd_status: _r_txt = f"[italic]{escape(cmd_status)}[/italic]" out += [lines, _r_txt, lines] console.begin_capture() console.print("\n".join(out)) out = console.end_capture() return out
def test_render_single_node(): tree = Tree("foo") console = Console(color_system=None, width=20) console.begin_capture() console.print(tree) assert console.end_capture() == "foo \n"
def test_render_simple(): console = Console(width=80) console.begin_capture() console.print(Text("foo")) result = console.end_capture() assert result == "foo\n"
def test_pprint_max_string(): console = Console(color_system=None) console.begin_capture() pprint(["Hello" * 20], console=console, max_string=8) assert console.end_capture() == """['HelloHel'+92]\n"""