Source code for echo.vue._log

import logging

logger = logging.getLogger("echo")

# Global flag: when True, new widgets are automatically instrumented
_comm_logging_enabled = False

# Maps widget id -> (original_send, original_set_state, widget)
_patched_widgets = {}


[docs] def enable_comm_logging(): """ Enable logging of comm messages (state updates) between Python and the browser frontend for all widgets connected via :func:`~echo.vue.autoconnect_callbacks_to_vue` after this call. Messages are emitted at ``DEBUG`` level on the ``echo`` logger. """ global _comm_logging_enabled _comm_logging_enabled = True
[docs] def disable_comm_logging(): """ Disable comm logging. Widgets already instrumented are unpatched, and future widgets will not be instrumented. """ global _comm_logging_enabled _comm_logging_enabled = False for widget_id in list(_patched_widgets): original_send, original_set_state, widget = _patched_widgets.pop(widget_id) widget._send = original_send widget.set_state = original_set_state
def _enable_comm_logging_if_requested(widget): """Patch a single widget if comm logging is enabled and not already patched.""" if not _comm_logging_enabled: return widget_id = id(widget) if widget_id in _patched_widgets: return if not hasattr(widget, "_send") or not hasattr(widget, "set_state"): return original_send = widget._send original_set_state = widget.set_state _patched_widgets[widget_id] = (original_send, original_set_state, widget) label = type(widget).__name__ def _logged_send(msg, buffers=None): if msg.get("method") == "update": state = msg.get("state", {}) logger.debug("[PY->VUE] %s: %s", label, repr(state)) return original_send(msg, buffers=buffers) def _logged_set_state(sync_data): logger.debug("[VUE->PY] %s: %s", label, repr(sync_data)) return original_set_state(sync_data) widget._send = _logged_send widget.set_state = _logged_set_state