Merge pull request #782 from Textualize/log-drop-critical

Log drop critical
This commit is contained in:
Will McGugan
2022-09-15 16:23:56 +01:00
committed by GitHub
8 changed files with 26 additions and 59 deletions

View File

@@ -11,7 +11,7 @@ __all__ = ["log", "panic"]
from ._context import active_app from ._context import active_app
from ._log import LogGroup, LogVerbosity, LogSeverity from ._log import LogGroup, LogVerbosity
if TYPE_CHECKING: if TYPE_CHECKING:
from .app import App from .app import App
@@ -38,12 +38,10 @@ class Logger:
log_callable: LogCallable | None, log_callable: LogCallable | None,
group: LogGroup = LogGroup.INFO, group: LogGroup = LogGroup.INFO,
verbosity: LogVerbosity = LogVerbosity.NORMAL, verbosity: LogVerbosity = LogVerbosity.NORMAL,
severity: LogSeverity = LogSeverity.NORMAL,
) -> None: ) -> None:
self._log = log_callable self._log = log_callable
self._group = group self._group = group
self._verbosity = verbosity self._verbosity = verbosity
self._severity = severity
@property @property
def log(self) -> LogCallable: def log(self) -> LogCallable:
@@ -58,7 +56,6 @@ class Logger:
def __rich_repr__(self) -> rich.repr.Result: def __rich_repr__(self) -> rich.repr.Result:
yield self._group, LogGroup.INFO yield self._group, LogGroup.INFO
yield self._verbosity, LogVerbosity.NORMAL yield self._verbosity, LogVerbosity.NORMAL
yield self._severity, LogSeverity.NORMAL
def __call__(self, *args: object, **kwargs) -> None: def __call__(self, *args: object, **kwargs) -> None:
caller = inspect.stack()[1] caller = inspect.stack()[1]
@@ -66,7 +63,6 @@ class Logger:
self.log( self.log(
self._group, self._group,
self._verbosity, self._verbosity,
self._severity,
*args, *args,
_textual_calling_frame=caller, _textual_calling_frame=caller,
**kwargs, **kwargs,
@@ -86,46 +82,41 @@ class Logger:
Logger: New logger. Logger: New logger.
""" """
verbosity = LogVerbosity.HIGH if verbose else LogVerbosity.NORMAL 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 @property
def verbose(self) -> Logger: def verbose(self) -> Logger:
"""A verbose logger.""" """A verbose logger."""
return Logger(self._log, self._group, LogVerbosity.HIGH) 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 @property
def event(self) -> Logger: def event(self) -> Logger:
"""An event logger.""" """Logs events."""
return Logger(self._log, LogGroup.EVENT) return Logger(self._log, LogGroup.EVENT)
@property @property
def debug(self) -> Logger: def debug(self) -> Logger:
"""A debug logger.""" """Logs debug messages."""
return Logger(self._log, LogGroup.DEBUG) return Logger(self._log, LogGroup.DEBUG)
@property @property
def info(self) -> Logger: def info(self) -> Logger:
"""An info logger.""" """Logs information."""
return Logger(self._log, LogGroup.INFO) return Logger(self._log, LogGroup.INFO)
@property @property
def warning(self) -> Logger: def warning(self) -> Logger:
"""An info logger.""" """Logs warnings."""
return Logger(self._log, LogGroup.WARNING) return Logger(self._log, LogGroup.WARNING)
@property @property
def error(self) -> Logger: def error(self) -> Logger:
"""An error logger.""" """Logs errors."""
return Logger(self._log, LogGroup.ERROR) return Logger(self._log, LogGroup.ERROR)
@property @property
def system(self) -> Logger: def system(self) -> Logger:
"""A system logger.""" """Logs system information."""
return Logger(self._log, LogGroup.SYSTEM) return Logger(self._log, LogGroup.SYSTEM)

View File

@@ -1,4 +1,4 @@
from enum import Enum, auto from enum import Enum
class LogGroup(Enum): class LogGroup(Enum):
@@ -19,10 +19,3 @@ class LogVerbosity(Enum):
NORMAL = 0 NORMAL = 0
HIGH = 1 HIGH = 1
class LogSeverity(Enum):
"""Tags log messages as being more severe."""
NORMAL = 0
CRITICAL = 1 # Draws attention to the log message

View File

@@ -34,7 +34,6 @@ from rich.traceback import Traceback
from . import ( from . import (
Logger, Logger,
LogGroup, LogGroup,
LogSeverity,
LogVerbosity, LogVerbosity,
actions, actions,
events, events,
@@ -487,7 +486,6 @@ class App(Generic[ReturnType], DOMNode):
self, self,
group: LogGroup, group: LogGroup,
verbosity: LogVerbosity, verbosity: LogVerbosity,
severity: LogSeverity,
*objects: Any, *objects: Any,
_textual_calling_frame: inspect.FrameInfo | None = None, _textual_calling_frame: inspect.FrameInfo | None = None,
**kwargs, **kwargs,
@@ -523,7 +521,6 @@ class App(Generic[ReturnType], DOMNode):
DevtoolsLog(objects, caller=_textual_calling_frame), DevtoolsLog(objects, caller=_textual_calling_frame),
group, group,
verbosity, verbosity,
severity,
) )
else: else:
output = " ".join(str(arg) for arg in objects) output = " ".join(str(arg) for arg in objects)
@@ -536,7 +533,6 @@ class App(Generic[ReturnType], DOMNode):
DevtoolsLog(output, caller=_textual_calling_frame), DevtoolsLog(output, caller=_textual_calling_frame),
group, group,
verbosity, verbosity,
severity,
) )
except Exception as error: except Exception as error:
self._handle_exception(error) self._handle_exception(error)
@@ -1533,7 +1529,7 @@ class App(Generic[ReturnType], DOMNode):
def _on_terminal_supports_synchronized_output( def _on_terminal_supports_synchronized_output(
self, message: messages.TerminalSupportsSynchronizedOutput self, message: messages.TerminalSupportsSynchronizedOutput
) -> None: ) -> None:
log("[b green]SynchronizedOutput mode is supported") log.system("[b green]SynchronizedOutput mode is supported")
self._sync_available = True self._sync_available = True
def _begin_update(self) -> None: def _begin_update(self) -> None:

View File

@@ -13,7 +13,7 @@ from typing import Type, Any, NamedTuple
from rich.console import Console from rich.console import Console
from rich.segment import Segment from rich.segment import Segment
from .._log import LogGroup, LogVerbosity, LogSeverity from .._log import LogGroup, LogVerbosity
class DevtoolsDependenciesMissingError(Exception): class DevtoolsDependenciesMissingError(Exception):
@@ -218,7 +218,6 @@ class DevtoolsClient:
log: DevtoolsLog, log: DevtoolsLog,
group: LogGroup = LogGroup.UNDEFINED, group: LogGroup = LogGroup.UNDEFINED,
verbosity: LogVerbosity = LogVerbosity.NORMAL, verbosity: LogVerbosity = LogVerbosity.NORMAL,
severity: LogSeverity = LogSeverity.NORMAL,
) -> None: ) -> None:
"""Queue a log to be sent to the devtools server for display. """Queue a log to be sent to the devtools server for display.
@@ -239,7 +238,6 @@ class DevtoolsClient:
"payload": { "payload": {
"group": group.value, "group": group.value,
"verbosity": verbosity.value, "verbosity": verbosity.value,
"severity": severity.value,
"timestamp": int(time()), "timestamp": int(time()),
"path": getattr(log.caller, "filename", ""), "path": getattr(log.caller, "filename", ""),
"line_number": getattr(log.caller, "lineno", 0), "line_number": getattr(log.caller, "lineno", 0),

View File

@@ -4,7 +4,7 @@ import inspect
from typing import TYPE_CHECKING, cast from typing import TYPE_CHECKING, cast
from .client import DevtoolsLog from .client import DevtoolsLog
from .._log import LogGroup, LogVerbosity, LogSeverity from .._log import LogGroup, LogVerbosity
if TYPE_CHECKING: if TYPE_CHECKING:
from .devtools.client import DevtoolsClient from .devtools.client import DevtoolsClient
@@ -101,5 +101,4 @@ class StdoutRedirector:
DevtoolsLog(batched_log, caller=log_batch[-1].caller), DevtoolsLog(batched_log, caller=log_batch[-1].caller),
LogGroup.PRINT, LogGroup.PRINT,
LogVerbosity.NORMAL, LogVerbosity.NORMAL,
LogSeverity.NORMAL,
) )

View File

@@ -90,24 +90,29 @@ class DevConsoleLog:
file_and_line = escape(f"{Path(self.path).name}:{self.line_number}") file_and_line = escape(f"{Path(self.path).name}:{self.line_number}")
group = LogGroup(self.group).name group = LogGroup(self.group).name
time = local_time.time() time = local_time.time()
message = Text(
f":warning-emoji: [{time}] {group}" group_text = Text(group)
if self.severity > 0 if group == "WARNING":
else f"[{time}] {group}" group_text.stylize("bold yellow reverse")
) elif group == "ERROR":
message.stylize("dim") group_text.stylize("bold red reverse")
else:
group_text.stylize("dim")
log_message = Text.assemble((f"[{time}]", "dim"), " ", group_text)
table.add_row( table.add_row(
message, log_message,
Align.right( Align.right(
Text(f"{file_and_line}", style=Style(dim=True, link=file_link)) Text(f"{file_and_line}", style=Style(dim=True, link=file_link))
), ),
) )
yield table yield table
if group == "PRINT": if group == "PRINT":
yield Styled(Segments(self.segments), "bold") yield Styled(Segments(self.segments), "bold")
else: else:
yield Segments(self.segments) yield from self.segments
class DevConsoleNotice: class DevConsoleNotice:

View File

@@ -59,7 +59,7 @@ class ScrollToRegion(Message, bubble=False):
@rich.repr.auto @rich.repr.auto
class StylesUpdated(Message): class StylesUpdated(Message, verbose=True):
def __init__(self, sender: MessagePump) -> None: def __init__(self, sender: MessagePump) -> None:
super().__init__(sender) super().__init__(sender)

View File

@@ -38,20 +38,6 @@ async def test_devtools_log_places_encodes_and_queues_message(devtools):
print(repr(queued_log_data)) 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)) @time_machine.travel(datetime.utcfromtimestamp(TIMESTAMP))
async def test_devtools_log_places_encodes_and_queues_many_logs_as_string(devtools): async def test_devtools_log_places_encodes_and_queues_many_logs_as_string(devtools):
await devtools._stop_log_queue_processing() 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": { "payload": {
"group": 0, "group": 0,
"verbosity": 0, "verbosity": 0,
"severity": 0,
"timestamp": 1649166819, "timestamp": 1649166819,
"path": "a/b/c.py", "path": "a/b/c.py",
"line_number": 123, "line_number": 123,