mirror of
https://github.com/bec-project/bec_widgets.git
synced 2025-07-14 03:31:50 +02:00
fix(cli/rpc): rpc client can return any type of object + config dict of the widgets
This commit is contained in:
@ -88,12 +88,12 @@ class BECFigureClientMixin:
|
|||||||
|
|
||||||
|
|
||||||
class RPCBase:
|
class RPCBase:
|
||||||
def __init__(self, gui_id: str = None, config: dict = None, parent=None, **kwargs) -> None:
|
def __init__(self, gui_id: str = None, config: dict = None, parent=None) -> None:
|
||||||
self._client = BECDispatcher().client
|
self._client = BECDispatcher().client
|
||||||
self._config = config if config is not None else {}
|
self._config = config if config is not None else {}
|
||||||
self._gui_id = gui_id if gui_id is not None else str(uuid.uuid4())
|
self._gui_id = gui_id if gui_id is not None else str(uuid.uuid4())
|
||||||
self._parent = parent
|
self._parent = parent
|
||||||
super().__init__(**kwargs)
|
super().__init__()
|
||||||
print(f"RPCBase: {self._gui_id}")
|
print(f"RPCBase: {self._gui_id}")
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@ -139,20 +139,25 @@ class RPCBase:
|
|||||||
if not response.content["accepted"]:
|
if not response.content["accepted"]:
|
||||||
raise ValueError(response.content["message"]["error"])
|
raise ValueError(response.content["message"]["error"])
|
||||||
msg_result = response.content["message"].get("result")
|
msg_result = response.content["message"].get("result")
|
||||||
if not msg_result:
|
|
||||||
return None
|
|
||||||
if isinstance(msg_result, list):
|
|
||||||
return [self._create_widget_from_msg_result(res) for res in msg_result]
|
|
||||||
return self._create_widget_from_msg_result(msg_result)
|
return self._create_widget_from_msg_result(msg_result)
|
||||||
|
|
||||||
def _create_widget_from_msg_result(self, msg_result):
|
def _create_widget_from_msg_result(self, msg_result):
|
||||||
|
if msg_result is None:
|
||||||
|
return None
|
||||||
|
if isinstance(msg_result, list):
|
||||||
|
return [self._create_widget_from_msg_result(res) for res in msg_result]
|
||||||
|
if isinstance(msg_result, dict):
|
||||||
|
if "__rpc__" not in msg_result:
|
||||||
|
return msg_result
|
||||||
cls = msg_result.pop("widget_class", None)
|
cls = msg_result.pop("widget_class", None)
|
||||||
|
|
||||||
if not cls:
|
if not cls:
|
||||||
return msg_result
|
return msg_result
|
||||||
|
|
||||||
cls = getattr(client, cls)
|
cls = getattr(client, cls)
|
||||||
print(msg_result)
|
print(msg_result)
|
||||||
return cls(parent=self, **msg_result)
|
return cls(parent=self, **msg_result)
|
||||||
|
return msg_result
|
||||||
|
|
||||||
def _wait_for_response(self, request_id):
|
def _wait_for_response(self, request_id):
|
||||||
"""
|
"""
|
||||||
|
@ -95,6 +95,7 @@ class BECWidgetsCLIServer:
|
|||||||
"gui_id": obj.gui_id,
|
"gui_id": obj.gui_id,
|
||||||
"widget_class": obj.__class__.__name__,
|
"widget_class": obj.__class__.__name__,
|
||||||
"config": obj.config.model_dump(),
|
"config": obj.config.model_dump(),
|
||||||
|
"__rpc__": True,
|
||||||
}
|
}
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
|
@ -1,35 +1,35 @@
|
|||||||
import pytest
|
# import pytest
|
||||||
import threading
|
# import threading
|
||||||
|
#
|
||||||
from bec_lib.bec_service import BECService
|
# from bec_lib.bec_service import BECService
|
||||||
from bec_widgets.utils import bec_dispatcher as bec_dispatcher_module
|
# from bec_widgets.utils import bec_dispatcher as bec_dispatcher_module
|
||||||
|
#
|
||||||
|
#
|
||||||
@pytest.fixture()
|
# @pytest.fixture()
|
||||||
def threads_check():
|
# def threads_check():
|
||||||
current_threads = set(
|
# current_threads = set(
|
||||||
th
|
# th
|
||||||
for th in threading.enumerate()
|
# for th in threading.enumerate()
|
||||||
if "loguru" not in th.name and th is not threading.main_thread()
|
# if "loguru" not in th.name and th is not threading.main_thread()
|
||||||
)
|
# )
|
||||||
yield
|
# yield
|
||||||
threads_after = set(
|
# threads_after = set(
|
||||||
th
|
# th
|
||||||
for th in threading.enumerate()
|
# for th in threading.enumerate()
|
||||||
if "loguru" not in th.name and th is not threading.main_thread()
|
# if "loguru" not in th.name and th is not threading.main_thread()
|
||||||
)
|
# )
|
||||||
additional_threads = threads_after - current_threads
|
# additional_threads = threads_after - current_threads
|
||||||
assert (
|
# assert (
|
||||||
len(additional_threads) == 0
|
# len(additional_threads) == 0
|
||||||
), f"Test creates {len(additional_threads)} threads that are not cleaned: {additional_threads}"
|
# ), f"Test creates {len(additional_threads)} threads that are not cleaned: {additional_threads}"
|
||||||
|
#
|
||||||
|
#
|
||||||
@pytest.fixture(autouse=True)
|
# @pytest.fixture(autouse=True)
|
||||||
def bec_dispatcher(threads_check):
|
# def bec_dispatcher(threads_check):
|
||||||
bec_dispatcher = bec_dispatcher_module.BECDispatcher()
|
# bec_dispatcher = bec_dispatcher_module.BECDispatcher()
|
||||||
yield bec_dispatcher
|
# yield bec_dispatcher
|
||||||
bec_dispatcher.disconnect_all()
|
# bec_dispatcher.disconnect_all()
|
||||||
# clean BEC client
|
# # clean BEC client
|
||||||
BECService.shutdown(bec_dispatcher.client)
|
# BECService.shutdown(bec_dispatcher.client)
|
||||||
# reinitialize singleton for next test
|
# # reinitialize singleton for next test
|
||||||
bec_dispatcher_module._bec_dispatcher = None
|
# bec_dispatcher_module._bec_dispatcher = None
|
||||||
|
Reference in New Issue
Block a user