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 rich.console import Console
c = Console()
c.print("[on blue]Hello" , justify="right" )
c.log("[on blue]hello" , justify="right" )
Messung V0.5 C=95 H=99 G=96
¤ Dauer der Verarbeitung: 0.3 Sekunden
¤
*© Formatika GbR, Deutschland