Skip to content

Commit e093e4d

Browse files
committed
make plugin loader consistent with hls4ml
1 parent 1448871 commit e093e4d

File tree

1 file changed

+28
-55
lines changed

1 file changed

+28
-55
lines changed

hls4ml/backends/plugin_loader.py

Lines changed: 28 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,12 @@
33
from __future__ import annotations
44

55
import inspect
6-
import logging
76
import os
87
from collections.abc import Callable, Iterable
98
from importlib import import_module
9+
from importlib.metadata import entry_points
1010
from typing import Any
1111

12-
try: # pragma: no cover - fall back for older Python versions
13-
from importlib.metadata import entry_points
14-
except ImportError: # pragma: no cover
15-
from importlib_metadata import entry_points # type: ignore
16-
1712
from hls4ml.backends.backend import Backend, register_backend
1813
from hls4ml.writer.writers import register_writer
1914

@@ -23,111 +18,89 @@
2318
_plugins_loaded = False
2419

2520

26-
def load_backend_plugins(logger: logging.Logger | None = None) -> None:
21+
def load_backend_plugins() -> None:
2722
"""Discover and register backend plugins.
2823
2924
This function loads plugins published via Python entry points under the
3025
``hls4ml.backends`` group as well as modules listed in the
3126
``HLS4ML_BACKEND_PLUGINS`` environment variable. The environment variable
3227
accepts a separator compatible with :data:`os.pathsep`.
33-
34-
Args:
35-
logger (logging.Logger, optional): Optional logger used for diagnostics.
36-
When omitted, a module-local logger will be used.
3728
"""
38-
3929
global _plugins_loaded
4030
if _plugins_loaded:
4131
return
4232

43-
logger = logger or logging.getLogger(__name__)
44-
45-
_load_entry_point_plugins(logger)
46-
_load_env_plugins(logger)
33+
_load_entry_point_plugins()
34+
_load_env_plugins()
4735

4836
_plugins_loaded = True
4937

5038

51-
def _load_entry_point_plugins(logger: logging.Logger) -> None:
52-
eps = entry_points()
53-
54-
if hasattr(eps, 'select'):
55-
group_eps = eps.select(group=ENTRY_POINT_GROUP)
56-
else: # pragma: no cover - legacy importlib_metadata API
57-
group_eps = eps.get(ENTRY_POINT_GROUP, [])
39+
def _load_entry_point_plugins() -> None:
40+
group_eps = entry_points().select(group=ENTRY_POINT_GROUP)
5841

5942
for ep in group_eps:
6043
try:
6144
obj = ep.load()
62-
except Exception as exc: # pragma: no cover - defensive
63-
logger.warning(
64-
'Failed to load backend plugin entry %s: %s', ep.name, exc, exc_info=logger.isEnabledFor(logging.DEBUG)
65-
)
45+
except Exception as exc:
46+
print(f'WARNING: failed to load backend plugin entry "{ep.name}": {exc}')
6647
continue
67-
_register_plugin_object(ep.name, obj, logger)
48+
_register_plugin_object(ep.name, obj)
6849

6950

70-
def _load_env_plugins(logger: logging.Logger) -> None:
51+
def _load_env_plugins() -> None:
7152
raw_modules = os.environ.get(ENV_PLUGIN_MODULES, '')
7253
if not raw_modules:
7354
return
7455

7556
for module_name in filter(None, raw_modules.split(os.pathsep)):
7657
try:
7758
module = import_module(module_name)
78-
except Exception as exc: # pragma: no cover - defensive
79-
logger.warning(
80-
'Failed to import backend plugin module %s: %s',
81-
module_name,
82-
exc,
83-
exc_info=logger.isEnabledFor(logging.DEBUG),
84-
)
59+
except Exception as exc:
60+
print(f'WARNING: failed to import backend plugin module "{module_name}": {exc}')
8561
continue
8662

8763
register_callable: Any = getattr(module, 'register', module)
88-
_register_plugin_object(module_name, register_callable, logger)
64+
_register_plugin_object(module_name, register_callable)
8965

9066

91-
def _register_plugin_object(name: str, obj: Any, logger: logging.Logger) -> None:
67+
def _register_plugin_object(name: str, obj: Any) -> None:
9268
"""Interpret the plugin object and register provided backends."""
9369

9470
if inspect.isclass(obj) and issubclass(obj, Backend):
95-
_safe_register_backend(name, obj, logger)
71+
_safe_register_backend(name, obj)
9672
return
9773

9874
if isinstance(obj, Iterable) and not isinstance(obj, (str, bytes)):
9975
for item in obj:
100-
_register_plugin_object(name, item, logger)
76+
_register_plugin_object(name, item)
10177
return
10278

10379
if callable(obj):
104-
_invoke_registration_callable(name, obj, logger)
80+
_invoke_registration_callable(name, obj)
10581
return
10682

107-
logger.warning('Plugin entry %s did not provide a usable backend registration (got %r)', name, obj)
83+
print(f'WARNING: plugin entry "{name}" did not provide a usable backend registration (got {obj!r})')
10884

10985

110-
def _invoke_registration_callable(name: str, func: Callable[..., Any], logger: logging.Logger) -> None:
86+
def _invoke_registration_callable(name: str, func: Callable[..., Any]) -> None:
11187
try:
11288
func(register_backend=register_backend, register_writer=register_writer)
89+
return
11390
except TypeError:
11491
try:
11592
func(register_backend, register_writer)
116-
except Exception as exc: # pragma: no cover - defensive
117-
logger.warning('Backend plugin callable %s failed: %s', name, exc, exc_info=logger.isEnabledFor(logging.DEBUG))
118-
else:
11993
return
120-
except Exception as exc: # pragma: no cover - defensive
121-
logger.warning('Backend plugin callable %s failed: %s', name, exc, exc_info=logger.isEnabledFor(logging.DEBUG))
122-
return
123-
else:
94+
except Exception as exc:
95+
print(f'WARNING: backend plugin callable "{name}" failed: {exc}')
96+
return
97+
except Exception as exc:
98+
print(f'WARNING: backend plugin callable "{name}" failed: {exc}')
12499
return
125100

126101

127-
def _safe_register_backend(name: str, backend_cls: type[Backend], logger: logging.Logger) -> None:
102+
def _safe_register_backend(name: str, backend_cls: type[Backend]) -> None:
128103
try:
129104
register_backend(name, backend_cls)
130-
except Exception as exc: # pragma: no cover - defensive
131-
logger.warning(
132-
'Failed to register backend %s from plugin: %s', name, exc, exc_info=logger.isEnabledFor(logging.DEBUG)
133-
)
105+
except Exception as exc:
106+
print(f'WARNING: failed to register backend "{name}" from plugin: {exc}')

0 commit comments

Comments
 (0)