diff --git a/src/textual/__init__.py b/src/textual/__init__.py index 29bf8f018..4958b9a7d 100644 --- a/src/textual/__init__.py +++ b/src/textual/__init__.py @@ -1,3 +1,4 @@ +import inspect from typing import Any from rich.console import RenderableType @@ -9,7 +10,9 @@ def log(*args: object, verbosity: int = 0, **kwargs) -> None: from ._context import active_app app = active_app.get() - app.log(*args, verbosity=verbosity, **kwargs) + + caller = inspect.stack()[1] + app.log(*args, verbosity=verbosity, _textual_calling_frame=caller, **kwargs) def panic(*args: RenderableType) -> None: diff --git a/src/textual/app.py b/src/textual/app.py index 9cdd71946..02040bae4 100644 --- a/src/textual/app.py +++ b/src/textual/app.py @@ -208,7 +208,7 @@ class App(DOMNode): self, *objects: Any, verbosity: int = 1, - caller: inspect.FrameInfo | None = None, + _textual_calling_frame: inspect.FrameInfo | None = None, **kwargs, ) -> None: """Write to logs. @@ -216,6 +216,8 @@ class App(DOMNode): Args: *objects (Any): Positional arguments are converted to string and written to logs. verbosity (int, optional): Verbosity level 0-3. Defaults to 1. + _textual_calling_frame (inspect.FrameInfo | None): The frame info to include in + the log message sent to the devtools server. """ output = "" try: @@ -224,11 +226,11 @@ class App(DOMNode): key_values = " ".join(f"{key}={value}" for key, value in kwargs.items()) output = " ".join((output, key_values)) - if not caller: - caller = inspect.stack()[1] + if not _textual_calling_frame: + _textual_calling_frame = inspect.stack()[1] - calling_path = caller.filename - calling_lineno = caller.lineno + calling_path = _textual_calling_frame.filename + calling_lineno = _textual_calling_frame.lineno if self.devtools.is_connected and verbosity <= self.log_verbosity: if len(objects) > 1 or len(kwargs) >= 1 and output: diff --git a/src/textual/message_pump.py b/src/textual/message_pump.py index e50d0e646..420ffe3b6 100644 --- a/src/textual/message_pump.py +++ b/src/textual/message_pump.py @@ -87,7 +87,7 @@ class MessagePump: return self._running def log(self, *args, **kwargs) -> None: - return self.app.log(*args, **kwargs, caller=inspect.stack()[1]) + return self.app.log(*args, **kwargs, _textual_calling_frame=inspect.stack()[1]) def set_parent(self, parent: MessagePump) -> None: self._parent = parent