def render(self) -> RenderableType: style = Style( bgcolor=(Color.parse("#555555" if self.mouse_over else "#444444")), color=Color.parse( "bright_yellow" if self.grabbed else "bright_magenta"), ) return ScrollBarRender( virtual_size=self.virtual_size, window_size=self.window_size, position=self.position, vertical=self.vertical, style=style, )
def test_rich() -> None: color = Color.parse("red") as_text = color.__rich__() print(repr(as_text)) print(repr(as_text.spans)) assert as_text == Text("<color 'red' (standard)⬤ >", spans=[Span(23, 24, Style(color=color))])
def test_get_ansi_codes() -> None: assert Color.parse("default").get_ansi_codes() == ("39",) assert Color.parse("default").get_ansi_codes(False) == ("49",) assert Color.parse("red").get_ansi_codes() == ("31",) assert Color.parse("red").get_ansi_codes(False) == ("41",) assert Color.parse("color(1)").get_ansi_codes() == ("31",) assert Color.parse("color(1)").get_ansi_codes(False) == ("41",) assert Color.parse("#ff0000").get_ansi_codes() == ("38", "2", "255", "0", "0") assert Color.parse("#ff0000").get_ansi_codes(False) == ("48", "2", "255", "0", "0")
def test_get_ansi_codes() -> None: assert Color.parse("default").get_ansi_codes() == ["39"] assert Color.parse("default").get_ansi_codes(False) == ["49"] assert Color.parse("red").get_ansi_codes() == ["31"] assert Color.parse("red").get_ansi_codes(False) == ["41"] assert Color.parse("1").get_ansi_codes() == ["38", "5", "1"] assert Color.parse("1").get_ansi_codes(False) == ["48", "5", "1"] assert Color.parse("#ff0000").get_ansi_codes() == ["38", "2", "255", "0", "0"] assert Color.parse("#ff0000").get_ansi_codes(False) == ["48", "2", "255", "0", "0"]
def test_downgrade() -> None: assert Color.parse("9").downgrade(0) == Color("9", ColorType.EIGHT_BIT, 9, None) assert Color.parse("#000000").downgrade(ColorSystem.EIGHT_BIT) == Color( "#000000", ColorType.EIGHT_BIT, 16, None ) assert Color.parse("#ffffff").downgrade(ColorSystem.EIGHT_BIT) == Color( "#ffffff", ColorType.EIGHT_BIT, 231, None ) assert Color.parse("#404142").downgrade(ColorSystem.EIGHT_BIT) == Color( "#404142", ColorType.EIGHT_BIT, 237, None ) assert Color.parse("#ff0000").downgrade(ColorSystem.EIGHT_BIT) == Color( "#ff0000", ColorType.EIGHT_BIT, 196, None ) assert Color.parse("#ff0000").downgrade(ColorSystem.STANDARD) == Color( "#ff0000", ColorType.STANDARD, 1, None ) assert Color.parse("9").downgrade(ColorSystem.STANDARD) == Color( "9", ColorType.STANDARD, 1, None )
def setup(self): self.console = Console( file=StringIO(), color_system="truecolor", legacy_windows=False, width=100 ) self.color = Color.parse("#0d1da0") # Warm cache self.color.downgrade(ColorSystem.EIGHT_BIT) self.color.downgrade(ColorSystem.STANDARD) self.color.downgrade(ColorSystem.WINDOWS)
def __rich_console__(self, console: Console, options: ConsoleOptions) -> RenderResult: size = ((options.height or console.height) if self.vertical else (options.max_width or console.width)) thickness = ((options.max_width or console.width) if self.vertical else (options.height or console.height)) _style = console.get_style(self.style) bar = self.render_bar( size=size, window_size=self.window_size, virtual_size=self.virtual_size, position=self.position, vertical=self.vertical, thickness=thickness, back_color=_style.bgcolor or Color.parse("#555555"), bar_color=_style.color or Color.parse("bright_magenta"), ) yield bar
def test_truecolor() -> None: assert Color.parse("#ff0000").get_truecolor() == ColorTriplet(255, 0, 0) assert Color.parse("red").get_truecolor() == ColorTriplet(128, 0, 0) assert Color.parse("1").get_truecolor() == ColorTriplet(128, 0, 0) assert Color.parse("17").get_truecolor() == ColorTriplet(0, 0, 95) assert Color.parse("default").get_truecolor() == ColorTriplet(0, 0, 0) assert Color.parse("default").get_truecolor(foreground=False) == ColorTriplet( 255, 255, 255 )
def test_truecolor() -> None: assert Color.parse("#ff0000").get_truecolor() == ColorTriplet(255, 0, 0) assert Color.parse("red").get_truecolor() == ColorTriplet(128, 0, 0) assert Color.parse("color(1)").get_truecolor() == ColorTriplet(128, 0, 0) assert Color.parse("color(17)").get_truecolor() == ColorTriplet(0, 0, 95) assert Color.parse("default").get_truecolor() == ColorTriplet(0, 0, 0) assert Color.parse("default").get_truecolor( foreground=False) == ColorTriplet(255, 255, 255) assert Color("red", ColorType.WINDOWS, number=1).get_truecolor() == ColorTriplet(197, 15, 31)
def test_parse_success() -> None: assert Color.parse("default") == Color("default", ColorType.DEFAULT, None, None) assert Color.parse("red") == Color("red", ColorType.STANDARD, 1, None) assert Color.parse("bright_red") == Color("bright_red", ColorType.STANDARD, 9, None) assert Color.parse("yellow4") == Color("yellow4", ColorType.EIGHT_BIT, 106, None) assert Color.parse("color(100)") == Color( "color(100)", ColorType.EIGHT_BIT, 100, None ) assert Color.parse("#112233") == Color( "#112233", ColorType.TRUECOLOR, None, ColorTriplet(0x11, 0x22, 0x33) ) assert Color.parse("rgb(90,100,110)") == Color( "rgb(90,100,110)", ColorType.TRUECOLOR, None, ColorTriplet(90, 100, 110) )
# -*- coding: utf-8 -*- ######################################################################## # # # # # # # MIT License # # Copyright (c) 2021 Michael Nikitenko # # # ######################################################################## from rich import inspect from rich.color import Color if __name__ == '__main__': color = Color.parse("red") inspect(color, methods=True) # Выводит всю инфу по классу в удобочитаемом виде
def test_parse_error() -> None: with pytest.raises(ColorParseError): Color.parse("256") with pytest.raises(ColorParseError): Color.parse("rgb(999,0,0)") with pytest.raises(ColorParseError): Color.parse("rgb(0,0)") with pytest.raises(ColorParseError): Color.parse("rgb(0,0,0,0)") with pytest.raises(ColorParseError): Color.parse("nosuchcolor") with pytest.raises(ColorParseError): Color.parse("#xxyyzz")
def test_system() -> None: assert Color.parse("default").system == ColorSystem.STANDARD assert Color.parse("red").system == ColorSystem.STANDARD assert Color.parse("#ff0000").system == ColorSystem.TRUECOLOR
def test_repr() -> None: assert repr(Color.parse("red")) == "<color 'red' (standard)>"
def test_str() -> None: assert str( Color.parse("red")) == "\x1b[31m⬤ \x1b[0m<color 'red' (standard)>"
def setup(self): self.console = Console( file=StringIO(), color_system="truecolor", legacy_windows=False, width=100 ) self.color = Color.parse("#0d1da0")
if __name__ == "__main__": # type: ignore from rich import print inspect = Inspect({}, docs=True, methods=True, dunder=True) print(inspect) t = Text("Hello, World") print(Inspect(t)) from rich.style import Style from rich.color import Color print(Inspect(Style.parse("bold red on black"), methods=True, docs=True)) print(Inspect(Color.parse("#ffe326"), methods=True, docs=True)) from rich import get_console print(Inspect(get_console(), methods=False)) print(Inspect(open("foo.txt", "wt"), methods=False)) print(Inspect("Hello", methods=False, dunder=True)) print(Inspect(inspect, methods=False, dunder=False, docs=False)) class Foo: @property def broken(self): 1 / 0
def render_bar( cls, size: int = 25, virtual_size: float = 50, window_size: float = 20, position: float = 0, ascii_only: bool = False, thickness: int = 1, vertical: bool = True, back_color: Color = Color.parse("#555555"), bar_color: Color = Color.parse("bright_magenta"), ) -> Segments: if vertical: if ascii_only: bars = ["|", "|", "|", "|", "|", "|", "|", "|"] else: bars = ["▁", "▂", "▃", "▄", "▅", "▆", "▇", "█"] else: if ascii_only: bars = ["-", "-", "-", "-", "-", "-", "-", "-"] else: bars = ["█", "▉", "▊", "▋", "▌", "▍", "▎", "▏"] back = back_color bar = bar_color width_thickness = thickness if vertical else 1 _Segment = Segment _Style = Style blank = " " * width_thickness foreground_meta = {"@mouse.up": "release", "@mouse.down": "grab"} if window_size and size and virtual_size: step_size = virtual_size / size start = int(position / step_size * 8) end = start + max(8, int(window_size / step_size * 8)) start_index, start_bar = divmod(start, 8) end_index, end_bar = divmod(end, 8) upper = {"@click": "scroll_up"} lower = {"@click": "scroll_down"} upper_back_segment = Segment(blank, _Style(bgcolor=back, meta=upper)) lower_back_segment = Segment(blank, _Style(bgcolor=back, meta=lower)) segments = [upper_back_segment] * int(size) segments[end_index:] = [lower_back_segment] * (size - end_index) segments[start_index:end_index] = [ _Segment(blank, _Style(bgcolor=bar, meta=foreground_meta)) ] * (end_index - start_index) if start_index < len(segments): segments[start_index] = _Segment( bars[7 - start_bar] * width_thickness, _Style(bgcolor=back, color=bar, meta=foreground_meta) if vertical else _Style( bgcolor=bar, color=back, meta=foreground_meta), ) if end_index < len(segments): segments[end_index] = _Segment( bars[7 - end_bar] * width_thickness, _Style(bgcolor=bar, color=back, meta=foreground_meta) if vertical else _Style( bgcolor=back, color=bar, meta=foreground_meta), ) else: segments = [_Segment(blank)] * int(size) if vertical: return Segments(segments, new_lines=True) else: return Segments((segments + [_Segment.line()]) * thickness, new_lines=False)
def test_str() -> None: assert str(Color.parse("red")) == "<color 'red' 1 (standard)>"
def test_downgrade() -> None: assert Color.parse("color(9)").downgrade(0) == Color( "color(9)", ColorType.STANDARD, 9, None) assert Color.parse("#000000").downgrade(ColorSystem.EIGHT_BIT) == Color( "#000000", ColorType.EIGHT_BIT, 16, None) assert Color.parse("#ffffff").downgrade(ColorSystem.EIGHT_BIT) == Color( "#ffffff", ColorType.EIGHT_BIT, 231, None) assert Color.parse("#404142").downgrade(ColorSystem.EIGHT_BIT) == Color( "#404142", ColorType.EIGHT_BIT, 237, None) assert Color.parse("#ff0000").downgrade(ColorSystem.EIGHT_BIT) == Color( "#ff0000", ColorType.EIGHT_BIT, 196, None) assert Color.parse("#ff0000").downgrade(ColorSystem.STANDARD) == Color( "#ff0000", ColorType.STANDARD, 1, None) assert Color.parse("color(9)").downgrade(ColorSystem.STANDARD) == Color( "color(9)", ColorType.STANDARD, 9, None) assert Color.parse("color(20)").downgrade(ColorSystem.STANDARD) == Color( "color(20)", ColorType.STANDARD, 4, None) assert Color.parse("red").downgrade(ColorSystem.WINDOWS) == Color( "red", ColorType.WINDOWS, 1, None) assert Color.parse("bright_red").downgrade(ColorSystem.WINDOWS) == Color( "bright_red", ColorType.WINDOWS, 9, None) assert Color.parse("#ff0000").downgrade(ColorSystem.WINDOWS) == Color( "#ff0000", ColorType.WINDOWS, 1, None) assert Color.parse("color(255)").downgrade(ColorSystem.WINDOWS) == Color( "color(255)", ColorType.WINDOWS, 15, None) assert Color.parse("#00ff00").downgrade(ColorSystem.STANDARD) == Color( "#00ff00", ColorType.STANDARD, 2, None)