aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesonbuild/_typing.py3
-rw-r--r--mesonbuild/mlog.py13
2 files changed, 14 insertions, 2 deletions
diff --git a/mesonbuild/_typing.py b/mesonbuild/_typing.py
index a8faa43..a01be33 100644
--- a/mesonbuild/_typing.py
+++ b/mesonbuild/_typing.py
@@ -33,6 +33,9 @@ from typing_extensions import Protocol
T = typing.TypeVar('T')
+class StringProtocol(Protocol):
+ def __str__(self) -> str: ...
+
class ImmutableListProtocol(Protocol[T]):
"""A protocol used in cases where a list is returned, but should not be
diff --git a/mesonbuild/mlog.py b/mesonbuild/mlog.py
index 230b6f7..5c76677 100644
--- a/mesonbuild/mlog.py
+++ b/mesonbuild/mlog.py
@@ -21,6 +21,9 @@ import typing as T
from contextlib import contextmanager
from pathlib import Path
+if T.TYPE_CHECKING:
+ from ._typing import StringProtocol
+
"""This is (mostly) a standalone module used to write logging
information about Meson runs. Some output goes to screen,
some to logging dir and some goes to both."""
@@ -136,7 +139,7 @@ class AnsiDecorator:
def __str__(self) -> str:
return self.get_text(colorize_console())
-TV_Loggable = T.Union[str, AnsiDecorator]
+TV_Loggable = T.Union[str, AnsiDecorator, 'StringProtocol']
TV_LoggableList = T.List[TV_Loggable]
class AnsiText:
@@ -269,7 +272,13 @@ def log_once(*args: TV_Loggable, is_error: bool = False,
This considers ansi decorated values by the values they wrap without
regard for the AnsiDecorator itself.
"""
- t = tuple(a.text if isinstance(a, AnsiDecorator) else a for a in args)
+ def to_str(x: TV_Loggable) -> str:
+ if isinstance(x, str):
+ return x
+ if isinstance(x, AnsiDecorator):
+ return x.text
+ return str(x)
+ t = tuple(to_str(a) for a in args)
if t in _logged_once:
return
_logged_once.add(t)