From 7a1b8748a433f854671ac95f2eaf4604e6b8df20 Mon Sep 17 00:00:00 2001 From: wyzula-jan Date: Wed, 13 Nov 2024 13:44:40 +0100 Subject: [PATCH] fix(plugin_utils): plugin utils are able to detect classes for plugin creation based on class attribute rather than if it is top level widget --- bec_widgets/cli/generate_cli.py | 4 ++-- bec_widgets/cli/rpc_wigdet_handler.py | 6 ++--- bec_widgets/utils/plugin_utils.py | 23 ++++++++++++-------- bec_widgets/utils/ui_loader.py | 4 ++-- tests/unit_tests/test_generate_cli_client.py | 4 ++-- tests/unit_tests/test_plugin_utils.py | 4 ++-- 6 files changed, 25 insertions(+), 20 deletions(-) diff --git a/bec_widgets/cli/generate_cli.py b/bec_widgets/cli/generate_cli.py index 9ace78c1..257ca7b4 100644 --- a/bec_widgets/cli/generate_cli.py +++ b/bec_widgets/cli/generate_cli.py @@ -11,7 +11,7 @@ import isort from qtpy.QtCore import Property as QtProperty from bec_widgets.utils.generate_designer_plugin import DesignerPluginGenerator -from bec_widgets.utils.plugin_utils import BECClassContainer, get_rpc_classes +from bec_widgets.utils.plugin_utils import BECClassContainer, get_custom_classes if sys.version_info >= (3, 11): from typing import get_overloads @@ -175,7 +175,7 @@ def main(): current_path = os.path.dirname(__file__) client_path = os.path.join(current_path, "client.py") - rpc_classes = get_rpc_classes("bec_widgets") + rpc_classes = get_custom_classes("bec_widgets") generator = ClientGenerator() generator.generate_client(rpc_classes) diff --git a/bec_widgets/cli/rpc_wigdet_handler.py b/bec_widgets/cli/rpc_wigdet_handler.py index 63a31f21..d1cdb401 100644 --- a/bec_widgets/cli/rpc_wigdet_handler.py +++ b/bec_widgets/cli/rpc_wigdet_handler.py @@ -28,10 +28,10 @@ class RPCWidgetHandler: Returns: None """ - from bec_widgets.utils.plugin_utils import get_rpc_classes + from bec_widgets.utils.plugin_utils import get_custom_classes - clss = get_rpc_classes("bec_widgets") - self._widget_classes = {cls.__name__: cls for cls in clss.top_level_classes} + clss = get_custom_classes("bec_widgets") + self._widget_classes = {cls.__name__: cls for cls in clss.widgets} def create_widget(self, widget_type, **kwargs) -> BECConnector: """ diff --git a/bec_widgets/utils/plugin_utils.py b/bec_widgets/utils/plugin_utils.py index fa392c18..e2d9b6be 100644 --- a/bec_widgets/utils/plugin_utils.py +++ b/bec_widgets/utils/plugin_utils.py @@ -53,7 +53,7 @@ class BECClassInfo: obj: type is_connector: bool = False is_widget: bool = False - is_top_level: bool = False + is_plugin: bool = False class BECClassContainer: @@ -88,14 +88,14 @@ class BECClassContainer: """ Get all top-level classes. """ - return [info.obj for info in self.collection if info.is_top_level] + return [info.obj for info in self.collection if info.is_plugin] @property def plugins(self): """ Get all plugins. These are all classes that are on the top level and are widgets. """ - return [info.obj for info in self.collection if info.is_widget and info.is_top_level] + return [info.obj for info in self.collection if info.is_widget and info.is_plugin] @property def widgets(self): @@ -109,10 +109,17 @@ class BECClassContainer: """ Get all top-level classes that are RPC-enabled. These are all classes that users can choose from. """ - return [info.obj for info in self.collection if info.is_top_level and info.is_connector] + return [info.obj for info in self.collection if info.is_plugin and info.is_connector] + + @property + def classes(self): + """ + Get all classes. + """ + return [info.obj for info in self.collection] -def get_rpc_classes(repo_name: str) -> BECClassContainer: +def get_custom_classes(repo_name: str) -> BECClassContainer: """ Get all RPC-enabled classes in the specified repository. @@ -149,10 +156,8 @@ def get_rpc_classes(repo_name: str) -> BECClassContainer: class_info.is_connector = True if issubclass(obj, BECWidget): class_info.is_widget = True - if len(subs) == 1 and ( - issubclass(obj, QWidget) or issubclass(obj, QGraphicsWidget) - ): - class_info.is_top_level = True + if hasattr(obj, "PLUGIN") and obj.PLUGIN: + class_info.is_plugin = True collection.add_class(class_info) return collection diff --git a/bec_widgets/utils/ui_loader.py b/bec_widgets/utils/ui_loader.py index 5a2560e9..90fec46e 100644 --- a/bec_widgets/utils/ui_loader.py +++ b/bec_widgets/utils/ui_loader.py @@ -4,7 +4,7 @@ from qtpy import PYQT6, PYSIDE6, QT_VERSION from qtpy.QtCore import QFile, QIODevice from bec_widgets.utils.generate_designer_plugin import DesignerPluginInfo -from bec_widgets.utils.plugin_utils import get_rpc_classes +from bec_widgets.utils.plugin_utils import get_custom_classes if PYSIDE6: from PySide6.QtUiTools import QUiLoader @@ -30,7 +30,7 @@ class UILoader: def __init__(self, parent=None): self.parent = parent - widgets = get_rpc_classes("bec_widgets").top_level_classes + widgets = get_custom_classes("bec_widgets").classes self.custom_widgets = {widget.__name__: widget for widget in widgets} diff --git a/tests/unit_tests/test_generate_cli_client.py b/tests/unit_tests/test_generate_cli_client.py index bc4a9f73..7f24fad2 100644 --- a/tests/unit_tests/test_generate_cli_client.py +++ b/tests/unit_tests/test_generate_cli_client.py @@ -43,7 +43,7 @@ def test_client_generator_with_black_formatting(): obj=MockBECWaveform1D, is_connector=True, is_widget=True, - is_top_level=False, + is_plugin=False, ) ) container.add_class( @@ -54,7 +54,7 @@ def test_client_generator_with_black_formatting(): obj=MockBECFigure, is_connector=True, is_widget=True, - is_top_level=True, + is_plugin=True, ) ) diff --git a/tests/unit_tests/test_plugin_utils.py b/tests/unit_tests/test_plugin_utils.py index 2a0616b9..be46478d 100644 --- a/tests/unit_tests/test_plugin_utils.py +++ b/tests/unit_tests/test_plugin_utils.py @@ -1,8 +1,8 @@ -from bec_widgets.utils.plugin_utils import get_rpc_classes +from bec_widgets.utils.plugin_utils import get_custom_classes def test_client_generator_classes(): - out = get_rpc_classes("bec_widgets") + out = get_custom_classes("bec_widgets") connector_cls_names = [cls.__name__ for cls in out.connector_classes] top_level_cls_names = [cls.__name__ for cls in out.top_level_classes]