diff --git a/src/textual/__init__.py b/src/textual/__init__.py index e5b9181af..617752147 100644 --- a/src/textual/__init__.py +++ b/src/textual/__init__.py @@ -11,7 +11,7 @@ __all__ = ["log", "panic"] from ._context import active_app -from ._log import LogGroup, LogVerbosity, LogSeverity +from ._log import LogGroup, LogVerbosity if TYPE_CHECKING: from .app import App @@ -38,12 +38,10 @@ class Logger: log_callable: LogCallable | None, group: LogGroup = LogGroup.INFO, verbosity: LogVerbosity = LogVerbosity.NORMAL, - severity: LogSeverity = LogSeverity.NORMAL, ) -> None: self._log = log_callable self._group = group self._verbosity = verbosity - self._severity = severity @property def log(self) -> LogCallable: @@ -58,7 +56,6 @@ class Logger: def __rich_repr__(self) -> rich.repr.Result: yield self._group, LogGroup.INFO yield self._verbosity, LogVerbosity.NORMAL - yield self._severity, LogSeverity.NORMAL def __call__(self, *args: object, **kwargs) -> None: caller = inspect.stack()[1] @@ -66,7 +63,6 @@ class Logger: self.log( self._group, self._verbosity, - self._severity, *args, _textual_calling_frame=caller, **kwargs, @@ -86,46 +82,41 @@ class Logger: Logger: New logger. """ verbosity = LogVerbosity.HIGH if verbose else LogVerbosity.NORMAL - return Logger(self._log, self._group, verbosity, LogSeverity.NORMAL) + return Logger(self._log, self._group, verbosity) @property def verbose(self) -> Logger: """A verbose logger.""" return Logger(self._log, self._group, LogVerbosity.HIGH) - @property - def critical(self) -> Logger: - """A critical logger.""" - return Logger(self._log, self._group, self._verbosity, LogSeverity.CRITICAL) - @property def event(self) -> Logger: - """An event logger.""" + """Logs events.""" return Logger(self._log, LogGroup.EVENT) @property def debug(self) -> Logger: - """A debug logger.""" + """Logs debug messages.""" return Logger(self._log, LogGroup.DEBUG) @property def info(self) -> Logger: - """An info logger.""" + """Logs information.""" return Logger(self._log, LogGroup.INFO) @property def warning(self) -> Logger: - """An info logger.""" + """Logs warnings.""" return Logger(self._log, LogGroup.WARNING) @property def error(self) -> Logger: - """An error logger.""" + """Logs errors.""" return Logger(self._log, LogGroup.ERROR) @property def system(self) -> Logger: - """A system logger.""" + """Logs system information.""" return Logger(self._log, LogGroup.SYSTEM) diff --git a/src/textual/_log.py b/src/textual/_log.py index 97211b807..e9adcef42 100644 --- a/src/textual/_log.py +++ b/src/textual/_log.py @@ -1,4 +1,4 @@ -from enum import Enum, auto +from enum import Enum class LogGroup(Enum): @@ -19,10 +19,3 @@ class LogVerbosity(Enum): NORMAL = 0 HIGH = 1 - - -class LogSeverity(Enum): - """Tags log messages as being more severe.""" - - NORMAL = 0 - CRITICAL = 1 # Draws attention to the log message diff --git a/src/textual/app.py b/src/textual/app.py index f3fcd68a2..de4a90ac0 100644 --- a/src/textual/app.py +++ b/src/textual/app.py @@ -34,7 +34,6 @@ from rich.traceback import Traceback from . import ( Logger, LogGroup, - LogSeverity, LogVerbosity, actions, events, @@ -487,7 +486,6 @@ class App(Generic[ReturnType], DOMNode): self, group: LogGroup, verbosity: LogVerbosity, - severity: LogSeverity, *objects: Any, _textual_calling_frame: inspect.FrameInfo | None = None, **kwargs, @@ -523,7 +521,6 @@ class App(Generic[ReturnType], DOMNode): DevtoolsLog(objects, caller=_textual_calling_frame), group, verbosity, - severity, ) else: output = " ".join(str(arg) for arg in objects) @@ -536,7 +533,6 @@ class App(Generic[ReturnType], DOMNode): DevtoolsLog(output, caller=_textual_calling_frame), group, verbosity, - severity, ) except Exception as error: self._handle_exception(error) @@ -1533,7 +1529,7 @@ class App(Generic[ReturnType], DOMNode): def _on_terminal_supports_synchronized_output( self, message: messages.TerminalSupportsSynchronizedOutput ) -> None: - log("[b green]SynchronizedOutput mode is supported") + log.system("[b green]SynchronizedOutput mode is supported") self._sync_available = True def _begin_update(self) -> None: diff --git a/src/textual/devtools/client.py b/src/textual/devtools/client.py index 991f740fd..e711f9d58 100644 --- a/src/textual/devtools/client.py +++ b/src/textual/devtools/client.py @@ -13,7 +13,7 @@ from typing import Type, Any, NamedTuple from rich.console import Console from rich.segment import Segment -from .._log import LogGroup, LogVerbosity, LogSeverity +from .._log import LogGroup, LogVerbosity class DevtoolsDependenciesMissingError(Exception): @@ -218,7 +218,6 @@ class DevtoolsClient: log: DevtoolsLog, group: LogGroup = LogGroup.UNDEFINED, verbosity: LogVerbosity = LogVerbosity.NORMAL, - severity: LogSeverity = LogSeverity.NORMAL, ) -> None: """Queue a log to be sent to the devtools server for display. @@ -239,7 +238,6 @@ class DevtoolsClient: "payload": { "group": group.value, "verbosity": verbosity.value, - "severity": severity.value, "timestamp": int(time()), "path": getattr(log.caller, "filename", ""), "line_number": getattr(log.caller, "lineno", 0), diff --git a/src/textual/devtools/redirect_output.py b/src/textual/devtools/redirect_output.py index 3122da9ec..b7c721554 100644 --- a/src/textual/devtools/redirect_output.py +++ b/src/textual/devtools/redirect_output.py @@ -4,7 +4,7 @@ import inspect from typing import TYPE_CHECKING, cast from .client import DevtoolsLog -from .._log import LogGroup, LogVerbosity, LogSeverity +from .._log import LogGroup, LogVerbosity if TYPE_CHECKING: from .devtools.client import DevtoolsClient @@ -101,5 +101,4 @@ class StdoutRedirector: DevtoolsLog(batched_log, caller=log_batch[-1].caller), LogGroup.PRINT, LogVerbosity.NORMAL, - LogSeverity.NORMAL, ) diff --git a/src/textual/devtools/renderables.py b/src/textual/devtools/renderables.py index cd0035d47..4f6f40d7b 100644 --- a/src/textual/devtools/renderables.py +++ b/src/textual/devtools/renderables.py @@ -90,24 +90,29 @@ class DevConsoleLog: file_and_line = escape(f"{Path(self.path).name}:{self.line_number}") group = LogGroup(self.group).name time = local_time.time() - message = Text( - f":warning-emoji: [{time}] {group}" - if self.severity > 0 - else f"[{time}] {group}" - ) - message.stylize("dim") + + group_text = Text(group) + if group == "WARNING": + group_text.stylize("bold yellow reverse") + elif group == "ERROR": + group_text.stylize("bold red reverse") + else: + group_text.stylize("dim") + + log_message = Text.assemble((f"[{time}]", "dim"), " ", group_text) table.add_row( - message, + log_message, Align.right( Text(f"{file_and_line}", style=Style(dim=True, link=file_link)) ), ) yield table + if group == "PRINT": yield Styled(Segments(self.segments), "bold") else: - yield Segments(self.segments) + yield from self.segments class DevConsoleNotice: diff --git a/src/textual/messages.py b/src/textual/messages.py index cadeaeb21..e744e19c2 100644 --- a/src/textual/messages.py +++ b/src/textual/messages.py @@ -59,7 +59,7 @@ class ScrollToRegion(Message, bubble=False): @rich.repr.auto -class StylesUpdated(Message): +class StylesUpdated(Message, verbose=True): def __init__(self, sender: MessagePump) -> None: super().__init__(sender) diff --git a/tests/devtools/test_devtools_client.py b/tests/devtools/test_devtools_client.py index 0f5f6e490..6f4eae22c 100644 --- a/tests/devtools/test_devtools_client.py +++ b/tests/devtools/test_devtools_client.py @@ -38,20 +38,6 @@ async def test_devtools_log_places_encodes_and_queues_message(devtools): print(repr(queued_log_data)) -{ - "type": "client_log", - "payload": { - "group": 0, - "verbosity": 0, - "severity": 0, - "timestamp": 1649166819, - "path": "a/b/c.py", - "line_number": 123, - "segments": b"\x80\x04\x95@\x00\x00\x00\x00\x00\x00\x00]\x94(\x8c\x0crich.segment\x94\x8c\x07Segment\x94\x93\x94\x8c\x0bhello world\x94NN\x87\x94\x81\x94h\x03\x8c\x01\n\x94NN\x87\x94\x81\x94e.", - }, -} - - @time_machine.travel(datetime.utcfromtimestamp(TIMESTAMP)) async def test_devtools_log_places_encodes_and_queues_many_logs_as_string(devtools): await devtools._stop_log_queue_processing() @@ -64,7 +50,6 @@ async def test_devtools_log_places_encodes_and_queues_many_logs_as_string(devtoo "payload": { "group": 0, "verbosity": 0, - "severity": 0, "timestamp": 1649166819, "path": "a/b/c.py", "line_number": 123,