12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- 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")
|