Spaces:
Sleeping
Sleeping
from datetime import datetime | |
from typing import Iterable, List, Optional, TYPE_CHECKING, Union, Callable | |
from .text import Text, TextType | |
if TYPE_CHECKING: | |
from .console import Console, ConsoleRenderable, RenderableType | |
from .table import Table | |
FormatTimeCallable = Callable[[datetime], Text] | |
class LogRender: | |
def __init__( | |
self, | |
show_time: bool = True, | |
show_level: bool = False, | |
show_path: bool = True, | |
time_format: Union[str, FormatTimeCallable] = "[%x %X]", | |
omit_repeated_times: bool = True, | |
level_width: Optional[int] = 8, | |
) -> None: | |
self.show_time = show_time | |
self.show_level = show_level | |
self.show_path = show_path | |
self.time_format = time_format | |
self.omit_repeated_times = omit_repeated_times | |
self.level_width = level_width | |
self._last_time: Optional[Text] = None | |
def __call__( | |
self, | |
console: "Console", | |
renderables: Iterable["ConsoleRenderable"], | |
log_time: Optional[datetime] = None, | |
time_format: Optional[Union[str, FormatTimeCallable]] = None, | |
level: TextType = "", | |
path: Optional[str] = None, | |
line_no: Optional[int] = None, | |
link_path: Optional[str] = None, | |
) -> "Table": | |
from .containers import Renderables | |
from .table import Table | |
output = Table.grid(padding=(0, 1)) | |
output.expand = True | |
if self.show_time: | |
output.add_column(style="log.time") | |
if self.show_level: | |
output.add_column(style="log.level", width=self.level_width) | |
output.add_column(ratio=1, style="log.message", overflow="fold") | |
if self.show_path and path: | |
output.add_column(style="log.path") | |
row: List["RenderableType"] = [] | |
if self.show_time: | |
log_time = log_time or console.get_datetime() | |
time_format = time_format or self.time_format | |
if callable(time_format): | |
log_time_display = time_format(log_time) | |
else: | |
log_time_display = Text(log_time.strftime(time_format)) | |
if log_time_display == self._last_time and self.omit_repeated_times: | |
row.append(Text(" " * len(log_time_display))) | |
else: | |
row.append(log_time_display) | |
self._last_time = log_time_display | |
if self.show_level: | |
row.append(level) | |
row.append(Renderables(renderables)) | |
if self.show_path and path: | |
path_text = Text() | |
path_text.append( | |
path, style=f"link file://{link_path}" if link_path else "" | |
) | |
if line_no: | |
path_text.append(":") | |
path_text.append( | |
f"{line_no}", | |
style=f"link file://{link_path}#{line_no}" if link_path else "", | |
) | |
row.append(path_text) | |
output.add_row(*row) | |
return output | |
if __name__ == "__main__": # pragma: no cover | |
from pip._vendor.rich.console import Console | |
c = Console() | |
c.print("[on blue]Hello", justify="right") | |
c.log("[on blue]hello", justify="right") | |