Coverage for /Users/coordt/Documents/code/bump-my-version/bumpversion/indented_logger.py: 88%
26 statements
« prev ^ index » next coverage.py v7.4.4, created at 2024-06-11 14:29 -0500
« prev ^ index » next coverage.py v7.4.4, created at 2024-06-11 14:29 -0500
1"""A logger adapter that adds an indent to the beginning of each message."""
3import logging
4from contextvars import ContextVar
5from typing import Any, MutableMapping, Optional, Tuple
7CURRENT_INDENT = ContextVar("current_indent", default=0)
10class IndentedLoggerAdapter(logging.LoggerAdapter):
11 """
12 Logger adapter that adds an indent to the beginning of each message.
14 Parameters:
15 logger: The logger to adapt.
16 extra: Extra values to add to the logging context.
17 depth: The number of `indent_char` to generate for each indent level.
18 indent_char: The character or string to use for indenting.
19 reset: `True` if the indent level should be reset to zero.
20 """
22 def __init__(
23 self,
24 logger: logging.Logger,
25 extra: Optional[dict] = None,
26 depth: int = 2,
27 indent_char: str = " ",
28 reset: bool = False,
29 ):
30 super().__init__(logger, extra or {})
31 self._depth = depth
32 self._indent_char = indent_char
33 if reset: 33 ↛ 34line 33 didn't jump to line 34, because the condition on line 33 was never true
34 self.reset()
36 @property
37 def current_indent(self) -> int:
38 """
39 The current indent level.
40 """
41 return CURRENT_INDENT.get()
43 def indent(self, amount: int = 1) -> None:
44 """
45 Increase the indent level by `amount`.
46 """
47 CURRENT_INDENT.set(CURRENT_INDENT.get() + amount)
49 def dedent(self, amount: int = 1) -> None:
50 """
51 Decrease the indent level by `amount`.
52 """
53 CURRENT_INDENT.set(max(0, CURRENT_INDENT.get() - amount))
55 def reset(self) -> None:
56 """
57 Reset the indent level to zero.
58 """
59 CURRENT_INDENT.set(0)
61 @property
62 def indent_str(self) -> str:
63 """
64 The indent string.
65 """
66 return (self._indent_char * self._depth) * CURRENT_INDENT.get()
68 def process(self, msg: str, kwargs: Optional[MutableMapping[str, Any]]) -> Tuple[str, MutableMapping[str, Any]]:
69 """
70 Process the message and add the indent.
72 Args:
73 msg: The logging message.
74 kwargs: Keyword arguments passed to the logger.
76 Returns:
77 A tuple containing the message and keyword arguments.
78 """
79 msg = self.indent_str + msg
81 return msg, kwargs