mirror of
https://github.com/bec-project/bec_widgets.git
synced 2025-07-14 11:41:49 +02:00
fix: warning in logpanel
- chain a signal to the child BecLogsQueue rather than passing the signal instance in
This commit is contained in:
@ -8,13 +8,14 @@ import re
|
|||||||
from collections import deque
|
from collections import deque
|
||||||
from functools import partial, reduce
|
from functools import partial, reduce
|
||||||
from re import Pattern
|
from re import Pattern
|
||||||
from typing import TYPE_CHECKING, Literal
|
from typing import Literal
|
||||||
|
|
||||||
from bec_lib.client import BECClient
|
from bec_lib.client import BECClient
|
||||||
from bec_lib.connector import ConnectorBase
|
from bec_lib.connector import ConnectorBase
|
||||||
from bec_lib.endpoints import MessageEndpoints
|
from bec_lib.endpoints import MessageEndpoints
|
||||||
from bec_lib.logger import LogLevel, bec_logger
|
from bec_lib.logger import LogLevel, bec_logger
|
||||||
from bec_lib.messages import LogMessage, StatusMessage
|
from bec_lib.messages import LogMessage, StatusMessage
|
||||||
|
from PySide6.QtCore import QObject
|
||||||
from qtpy.QtCore import QDateTime, Qt, Signal # type: ignore
|
from qtpy.QtCore import QDateTime, Qt, Signal # type: ignore
|
||||||
from qtpy.QtGui import QFont
|
from qtpy.QtGui import QFont
|
||||||
from qtpy.QtWidgets import (
|
from qtpy.QtWidgets import (
|
||||||
@ -51,9 +52,6 @@ from bec_widgets.widgets.utility.logpanel._util import (
|
|||||||
simple_color_format,
|
simple_color_format,
|
||||||
)
|
)
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
|
||||||
from PySide6.QtCore import SignalInstance
|
|
||||||
|
|
||||||
logger = bec_logger.logger
|
logger = bec_logger.logger
|
||||||
|
|
||||||
MODULE_PATH = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
|
MODULE_PATH = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
|
||||||
@ -68,20 +66,22 @@ DEFAULT_LOG_COLORS = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class BecLogsQueue:
|
class BecLogsQueue(QObject):
|
||||||
"""Manages getting logs from BEC Redis and formatting them for display"""
|
"""Manages getting logs from BEC Redis and formatting them for display"""
|
||||||
|
|
||||||
|
new_message = Signal()
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
|
parent: QObject | None,
|
||||||
conn: ConnectorBase,
|
conn: ConnectorBase,
|
||||||
new_message_signal: SignalInstance,
|
|
||||||
maxlen: int = 1000,
|
maxlen: int = 1000,
|
||||||
line_formatter: LineFormatter = noop_format,
|
line_formatter: LineFormatter = noop_format,
|
||||||
) -> None:
|
) -> None:
|
||||||
|
super().__init__(parent=parent)
|
||||||
self._timestamp_start: QDateTime | None = None
|
self._timestamp_start: QDateTime | None = None
|
||||||
self._timestamp_end: QDateTime | None = None
|
self._timestamp_end: QDateTime | None = None
|
||||||
self._conn = conn
|
self._conn = conn
|
||||||
self._new_message_signal: SignalInstance | None = new_message_signal
|
|
||||||
self._max_length = maxlen
|
self._max_length = maxlen
|
||||||
self._data: deque[LogMessage] = deque([], self._max_length)
|
self._data: deque[LogMessage] = deque([], self._max_length)
|
||||||
self._display_queue: deque[str] = deque([], self._max_length)
|
self._display_queue: deque[str] = deque([], self._max_length)
|
||||||
@ -91,9 +91,9 @@ class BecLogsQueue:
|
|||||||
self._set_formatter_and_update_filter(line_formatter)
|
self._set_formatter_and_update_filter(line_formatter)
|
||||||
self._conn.register([MessageEndpoints.log()], None, self._process_incoming_log_msg)
|
self._conn.register([MessageEndpoints.log()], None, self._process_incoming_log_msg)
|
||||||
|
|
||||||
def disconnect(self):
|
def unsub_and_disconnect(self):
|
||||||
self._conn.unregister([MessageEndpoints.log()], None, self._process_incoming_log_msg)
|
self._conn.unregister([MessageEndpoints.log()], None, self._process_incoming_log_msg)
|
||||||
self._new_message_signal.disconnect()
|
self.new_message.disconnect()
|
||||||
|
|
||||||
def _process_incoming_log_msg(self, msg: dict):
|
def _process_incoming_log_msg(self, msg: dict):
|
||||||
try:
|
try:
|
||||||
@ -101,10 +101,9 @@ class BecLogsQueue:
|
|||||||
self._data.append(_msg)
|
self._data.append(_msg)
|
||||||
if self.filter is None or self.filter(_msg):
|
if self.filter is None or self.filter(_msg):
|
||||||
self._display_queue.append(self._line_formatter(_msg))
|
self._display_queue.append(self._line_formatter(_msg))
|
||||||
if self._new_message_signal:
|
self.new_message.emit()
|
||||||
self._new_message_signal.emit()
|
except Exception as e:
|
||||||
except Exception:
|
logger.warning(f"Error in LogPanel incoming message callback: {e}")
|
||||||
pass
|
|
||||||
|
|
||||||
def _set_formatter_and_update_filter(self, line_formatter: LineFormatter = noop_format):
|
def _set_formatter_and_update_filter(self, line_formatter: LineFormatter = noop_format):
|
||||||
self._line_formatter: LineFormatter = line_formatter
|
self._line_formatter: LineFormatter = line_formatter
|
||||||
@ -396,10 +395,11 @@ class LogPanel(TextBox):
|
|||||||
self._update_colors()
|
self._update_colors()
|
||||||
self._service_status = service_status or BECServiceStatusMixin(self, client=self.client) # type: ignore
|
self._service_status = service_status or BECServiceStatusMixin(self, client=self.client) # type: ignore
|
||||||
self._log_manager = BecLogsQueue(
|
self._log_manager = BecLogsQueue(
|
||||||
|
parent,
|
||||||
self.client.connector, # type: ignore
|
self.client.connector, # type: ignore
|
||||||
new_message_signal=self._new_messages,
|
|
||||||
line_formatter=partial(simple_color_format, colors=self._colors),
|
line_formatter=partial(simple_color_format, colors=self._colors),
|
||||||
)
|
)
|
||||||
|
self._log_manager.new_message.connect(self._new_messages)
|
||||||
|
|
||||||
self.toolbar = LogPanelToolbar(parent=parent)
|
self.toolbar = LogPanelToolbar(parent=parent)
|
||||||
self.toolbar_area = QScrollArea()
|
self.toolbar_area = QScrollArea()
|
||||||
@ -513,7 +513,7 @@ class LogPanel(TextBox):
|
|||||||
|
|
||||||
def cleanup(self):
|
def cleanup(self):
|
||||||
self._service_status.cleanup()
|
self._service_status.cleanup()
|
||||||
self._log_manager.disconnect()
|
self._log_manager.unsub_and_disconnect()
|
||||||
super().cleanup()
|
super().cleanup()
|
||||||
|
|
||||||
|
|
||||||
|
@ -62,6 +62,7 @@ def log_panel(qtbot, mocked_client: MagicMock):
|
|||||||
qtbot.addWidget(widget)
|
qtbot.addWidget(widget)
|
||||||
qtbot.waitExposed(widget)
|
qtbot.waitExposed(widget)
|
||||||
yield widget
|
yield widget
|
||||||
|
widget.cleanup()
|
||||||
|
|
||||||
|
|
||||||
def test_log_panel_init(log_panel: LogPanel):
|
def test_log_panel_init(log_panel: LogPanel):
|
||||||
@ -89,6 +90,7 @@ def test_logpanel_output(qtbot, log_panel: LogPanel):
|
|||||||
assert log_panel.plain_text == TEST_COMBINED_PLAINTEXT
|
assert log_panel.plain_text == TEST_COMBINED_PLAINTEXT
|
||||||
|
|
||||||
def display_queue_empty():
|
def display_queue_empty():
|
||||||
|
print(log_panel._log_manager._display_queue)
|
||||||
return len(log_panel._log_manager._display_queue) == 0
|
return len(log_panel._log_manager._display_queue) == 0
|
||||||
|
|
||||||
next_text = "datetime | error | test log message"
|
next_text = "datetime | error | test log message"
|
||||||
@ -102,7 +104,7 @@ def test_logpanel_output(qtbot, log_panel: LogPanel):
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
qtbot.waitUntil(display_queue_empty)
|
qtbot.waitUntil(display_queue_empty, timeout=5000)
|
||||||
assert log_panel.plain_text == TEST_COMBINED_PLAINTEXT + next_text + "\n"
|
assert log_panel.plain_text == TEST_COMBINED_PLAINTEXT + next_text + "\n"
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user