Source code for termlog.formatting
import textwrap
from pathlib import Path
from typing import Any, Optional, Union
import pygments
from pygments.formatters import get_formatter_by_name
from pygments.lexer import Lexer
from pygments.lexers import get_lexer_by_name, guess_lexer
from .config import _terminal_config
from .message import Message
__all__ = ("beautify", "format")
[docs]def beautify(message: Any, indent: int = 0, lexer: Optional[Union[pygments.lexer.Lexer, str]] = None) -> str:
"""Beautify *message*.
Args:
message: message to beautify
indent: number of spaces to indent
lexer: message lexical analyzer
Returns:
str: beautified message
"""
formatter = get_formatter_by_name("16m")
indent = max(int(indent or 0), 0)
if isinstance(message, Path):
message = str(message)
elif isinstance(message, bytes):
message = message.decode("utf-8")
single = False
if isinstance(message, str):
single = len(message) - len(message.rstrip("\n")) == 0
if isinstance(message, Exception):
lexer = lexer or "py3tb"
if isinstance(lexer, str):
lexer = get_lexer_by_name(lexer)
if not lexer and isinstance(message, str):
lexer = guess_lexer(message, stripall=True) if lexer is None else lexer
if lexer and isinstance(message, str):
messages = message.split("\n")
for index, message in enumerate(messages):
message = pygments.highlight(message, lexer, formatter)
messages[index] = message.rstrip("\n")
message = "\n".join(messages)
if indent > 0:
message = textwrap.indent(message, " " * indent)
return message.rstrip("\n") if single and isinstance(message, str) else message
[docs]def format(
*messages: Any,
lexer: Optional[Union[Lexer, str]] = None,
color: bool = None,
json: bool = None,
time_format: Optional[str] = None,
add_timestamp: Optional[bool] = None,
) -> str:
"""Creates *message*, but does not echo it to a stdout, log, or other
lexers can be passed in, and if they are, the resulting output
will attempt to be setup
Args:
messages: messages to echo
color: colorize output
lexer: message lexical analyzer
json: Dump out a structured text
time_format: control time format
add_timestamp: add a timestamp to the output
Returns:
Tuple[str]: beautified messages
"""
time_format = time_format if time_format is not None else _terminal_config.time_format
add_timestamp = add_timestamp if add_timestamp is not None else _terminal_config.timestamp
json = json if json is not None else _terminal_config.json
color = color if color is not None else _terminal_config.color
# Allows echo to be used in settings and prevents circular dependencies
string = ""
for index, message in enumerate(messages):
include_timestamp = False
if add_timestamp is True:
include_timestamp = True
if add_timestamp is None:
if index == 0:
include_timestamp = True
elif json is True:
include_timestamp = True
msg = Message(
data=message,
lexer=str(lexer) if lexer else "",
json=bool(json),
color=bool(color),
time_format=time_format,
include_timestamp=include_timestamp,
)
separator = ("\n" if json else " ") if string else ""
try:
string = f"{string}{separator}{msg}"
except TypeError:
msg.fields = {}
string = f"{string}{separator}{msg}"
return string