0
0
mirror of https://github.com/bec-project/bec_widgets.git synced 2025-07-14 11:41:49 +02:00

fix(cli/rpc): rpc client can return any type of object + config dict of the widgets

This commit is contained in:
wyzula-jan
2024-02-26 14:06:36 +01:00
parent 57132a4721
commit fd711b475f
3 changed files with 53 additions and 47 deletions

View File

@ -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):
cls = msg_result.pop("widget_class", None) if msg_result is None:
if not cls: return None
return msg_result 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 = getattr(client, cls) if not cls:
print(msg_result) return msg_result
return cls(parent=self, **msg_result)
cls = getattr(client, cls)
print(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):
""" """

View File

@ -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

View File

@ -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