0
0
mirror of https://github.com/bec-project/bec_widgets.git synced 2025-07-14 03:31:50 +02:00

fix: wrap fetching plugin widgets in case of errors

This commit is contained in:
2025-04-15 13:45:18 +02:00
committed by wakonig_k
parent e10f5ec088
commit ef148317de
3 changed files with 72 additions and 61 deletions

View File

@ -5,6 +5,7 @@ from __future__ import annotations
import enum import enum
import inspect import inspect
import traceback
from typing import Literal, Optional from typing import Literal, Optional
from bec_lib.logger import bec_logger from bec_lib.logger import bec_logger
@ -47,29 +48,32 @@ _Widgets = {
} }
_plugin_widgets = get_all_plugin_widgets() try:
plugin_client = get_plugin_client_module() _plugin_widgets = get_all_plugin_widgets()
Widgets = _WidgetsEnumType("Widgets", {name: name for name in _plugin_widgets} | _Widgets) plugin_client = get_plugin_client_module()
Widgets = _WidgetsEnumType("Widgets", {name: name for name in _plugin_widgets} | _Widgets)
if (_overlap := _Widgets.keys() & _plugin_widgets.keys()) != set(): if (_overlap := _Widgets.keys() & _plugin_widgets.keys()) != set():
for _widget in _overlap: for _widget in _overlap:
logger.warning(
f"Detected duplicate widget {_widget} in plugin repo file: {inspect.getfile(_plugin_widgets[_widget])} !"
)
for plugin_name, plugin_class in inspect.getmembers(plugin_client, inspect.isclass):
if issubclass(plugin_class, RPCBase) and plugin_class is not RPCBase:
if plugin_name in globals():
conflicting_file = (
inspect.getfile(_plugin_widgets[plugin_name])
if plugin_name in _plugin_widgets
else f"{plugin_client}"
)
logger.warning( logger.warning(
f"Plugin widget {plugin_name} from {conflicting_file} conflicts with a built-in class!" f"Detected duplicate widget {_widget} in plugin repo file: {inspect.getfile(_plugin_widgets[_widget])} !"
) )
continue for plugin_name, plugin_class in inspect.getmembers(plugin_client, inspect.isclass):
if plugin_name not in _overlap: if issubclass(plugin_class, RPCBase) and plugin_class is not RPCBase:
globals()[plugin_name] = plugin_class if plugin_name in globals():
conflicting_file = (
inspect.getfile(_plugin_widgets[plugin_name])
if plugin_name in _plugin_widgets
else f"{plugin_client}"
)
logger.warning(
f"Plugin widget {plugin_name} from {conflicting_file} conflicts with a built-in class!"
)
continue
if plugin_name not in _overlap:
globals()[plugin_name] = plugin_class
except ImportError as e:
logger.error(f"Failed loading plugins: \n{reduce(add, traceback.format_exception(e))}")
class AutoUpdates(RPCBase): class AutoUpdates(RPCBase):

View File

@ -39,6 +39,7 @@ class ClientGenerator:
base_imports = ( base_imports = (
"""import enum """import enum
import inspect import inspect
import traceback
from typing import Literal, Optional from typing import Literal, Optional
""" """
if self._base if self._base
@ -107,28 +108,30 @@ _Widgets = {
if self._base: if self._base:
self.content += """ self.content += """
_plugin_widgets = get_all_plugin_widgets() try:
plugin_client = get_plugin_client_module() _plugin_widgets = get_all_plugin_widgets()
Widgets = _WidgetsEnumType("Widgets", {name: name for name in _plugin_widgets} | _Widgets) plugin_client = get_plugin_client_module()
Widgets = _WidgetsEnumType("Widgets", {name: name for name in _plugin_widgets} | _Widgets)
if (_overlap := _Widgets.keys() & _plugin_widgets.keys()) != set():
for _widget in _overlap:
logger.warning(f"Detected duplicate widget {_widget} in plugin repo file: {inspect.getfile(_plugin_widgets[_widget])} !")
for plugin_name, plugin_class in inspect.getmembers(plugin_client, inspect.isclass):
if issubclass(plugin_class, RPCBase) and plugin_class is not RPCBase:
if plugin_name in globals():
conflicting_file = (
inspect.getfile(_plugin_widgets[plugin_name])
if plugin_name in _plugin_widgets
else f"{plugin_client}"
)
logger.warning(
f"Plugin widget {plugin_name} from {conflicting_file} conflicts with a built-in class!"
)
continue
if plugin_name not in _overlap:
globals()[plugin_name] = plugin_class
if (_overlap := _Widgets.keys() & _plugin_widgets.keys()) != set():
for _widget in _overlap:
logger.warning(f"Detected duplicate widget {_widget} in plugin repo file: {inspect.getfile(_plugin_widgets[_widget])} !")
for plugin_name, plugin_class in inspect.getmembers(plugin_client, inspect.isclass):
if issubclass(plugin_class, RPCBase) and plugin_class is not RPCBase:
if plugin_name in globals():
conflicting_file = (
inspect.getfile(_plugin_widgets[plugin_name])
if plugin_name in _plugin_widgets
else f"{plugin_client}"
)
logger.warning(
f"Plugin widget {plugin_name} from {conflicting_file} conflicts with a built-in class!"
)
continue
if plugin_name not in _overlap:
globals()[plugin_name] = plugin_class
except ImportError as e:
logger.error(f"Failed loading plugins: \\n{reduce(add, traceback.format_exception(e))}")
""" """
def generate_content_for_class(self, cls): def generate_content_for_class(self, cls):

View File

@ -72,6 +72,7 @@ def test_client_generator_with_black_formatting():
import enum import enum
import inspect import inspect
import traceback
from typing import Literal, Optional from typing import Literal, Optional
from bec_lib.logger import bec_logger from bec_lib.logger import bec_logger
@ -95,27 +96,30 @@ def test_client_generator_with_black_formatting():
} }
_plugin_widgets = get_all_plugin_widgets() try:
plugin_client = get_plugin_client_module() _plugin_widgets = get_all_plugin_widgets()
Widgets = _WidgetsEnumType("Widgets", {name: name for name in _plugin_widgets} | _Widgets) plugin_client = get_plugin_client_module()
Widgets = _WidgetsEnumType("Widgets", {name: name for name in _plugin_widgets} | _Widgets)
if (_overlap := _Widgets.keys() & _plugin_widgets.keys()) != set(): if (_overlap := _Widgets.keys() & _plugin_widgets.keys()) != set():
for _widget in _overlap: for _widget in _overlap:
logger.warning(f"Detected duplicate widget {_widget} in plugin repo file: {inspect.getfile(_plugin_widgets[_widget])} !") logger.warning(f"Detected duplicate widget {_widget} in plugin repo file: {inspect.getfile(_plugin_widgets[_widget])} !")
for plugin_name, plugin_class in inspect.getmembers(plugin_client, inspect.isclass): for plugin_name, plugin_class in inspect.getmembers(plugin_client, inspect.isclass):
if issubclass(plugin_class, RPCBase) and plugin_class is not RPCBase: if issubclass(plugin_class, RPCBase) and plugin_class is not RPCBase:
if plugin_name in globals(): if plugin_name in globals():
conflicting_file = ( conflicting_file = (
inspect.getfile(_plugin_widgets[plugin_name]) inspect.getfile(_plugin_widgets[plugin_name])
if plugin_name in _plugin_widgets if plugin_name in _plugin_widgets
else f"{plugin_client}" else f"{plugin_client}"
) )
logger.warning( logger.warning(
f"Plugin widget {plugin_name} from {conflicting_file} conflicts with a built-in class!" f"Plugin widget {plugin_name} from {conflicting_file} conflicts with a built-in class!"
) )
continue continue
if plugin_name not in _overlap: if plugin_name not in _overlap:
globals()[plugin_name] = plugin_class globals()[plugin_name] = plugin_class
except ImportError as e:
logger.error(f"Failed loading plugins: \\n{reduce(add, traceback.format_exception(e))}")
class MockBECFigure(RPCBase): class MockBECFigure(RPCBase):
@rpc_call @rpc_call