mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
Merge pull request #782 from Textualize/log-drop-critical
Log drop critical
This commit is contained in:
@@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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),
|
||||||
|
|||||||
@@ -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,
|
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user