Aluode/PerceptionLabPortable
0
1from datetime import datetime2from typing import Iterable, List, Optional, TYPE_CHECKING, Union, Callable3 4 5from .text import Text, TextType6 7if TYPE_CHECKING:8 from .console import Console, ConsoleRenderable, RenderableType9 from .table import Table10 11FormatTimeCallable = Callable[[datetime], Text]12 13 14class LogRender:15 def __init__(16 self,17 show_time: bool = True,18 show_level: bool = False,19 show_path: bool = True,20 time_format: Union[str, FormatTimeCallable] = "[%x %X]",21 omit_repeated_times: bool = True,22 level_width: Optional[int] = 8,23 ) -> None:24 self.show_time = show_time25 self.show_level = show_level26 self.show_path = show_path27 self.time_format = time_format28 self.omit_repeated_times = omit_repeated_times29 self.level_width = level_width30 self._last_time: Optional[Text] = None31 32 def __call__(33 self,34 console: "Console",35 renderables: Iterable["ConsoleRenderable"],36 log_time: Optional[datetime] = None,37 time_format: Optional[Union[str, FormatTimeCallable]] = None,38 level: TextType = "",39 path: Optional[str] = None,40 line_no: Optional[int] = None,41 link_path: Optional[str] = None,42 ) -> "Table":43 from .containers import Renderables44 from .table import Table45 46 output = Table.grid(padding=(0, 1))47 output.expand = True48 if self.show_time:49 output.add_column(style="log.time")50 if self.show_level:51 output.add_column(style="log.level", width=self.level_width)52 output.add_column(ratio=1, style="log.message", overflow="fold")53 if self.show_path and path:54 output.add_column(style="log.path")55 row: List["RenderableType"] = []56 if self.show_time:57 log_time = log_time or console.get_datetime()58 time_format = time_format or self.time_format59 if callable(time_format):60 log_time_display = time_format(log_time)61 else:62 log_time_display = Text(log_time.strftime(time_format))63 if log_time_display == self._last_time and self.omit_repeated_times:64 row.append(Text(" " * len(log_time_display)))65 else:66 row.append(log_time_display)67 self._last_time = log_time_display68 if self.show_level:69 row.append(level)70 71 row.append(Renderables(renderables))72 if self.show_path and path:73 path_text = Text()74 path_text.append(75 path, style=f"link file://{link_path}" if link_path else ""76 )77 if line_no:78 path_text.append(":")79 path_text.append(80 f"{line_no}",81 style=f"link file://{link_path}#{line_no}" if link_path else "",82 )83 row.append(path_text)84 85 output.add_row(*row)86 return output87 88 89if __name__ == "__main__": # pragma: no cover90 from pip._vendor.rich.console import Console91 92 c = Console()93 c.print("[on blue]Hello", justify="right")94 c.log("[on blue]hello", justify="right")95 