|
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__": |
|
from rich.console import Console |
|
|
|
c = Console() |
|
c.print("[on blue]Hello", justify="right") |
|
c.log("[on blue]hello", justify="right") |
|
|