forked from platypush/platypush
42 lines
1.2 KiB
Python
42 lines
1.2 KiB
Python
import importlib
|
|
import inspect
|
|
import logging
|
|
import os
|
|
import pkgutil
|
|
from typing import List
|
|
|
|
from platypush.plugins.bluetooth._plugins import BaseBluetoothPlugin
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def scan_plugins(manager) -> List[BaseBluetoothPlugin]:
|
|
"""
|
|
Initializes all the plugins associated to the given BluetoothManager by
|
|
scanning all the modules under the ``_plugins`` folder in the manager's
|
|
package.
|
|
"""
|
|
plugins = {}
|
|
base_dir = os.path.dirname(inspect.getfile(manager.__class__))
|
|
module = inspect.getmodule(manager.__class__)
|
|
assert module is not None
|
|
package = module.__package__
|
|
assert package is not None
|
|
|
|
for _, mod_name, _ in pkgutil.walk_packages([base_dir], prefix=package + '.'):
|
|
try:
|
|
module = importlib.import_module(mod_name)
|
|
except Exception as e:
|
|
logger.warning('Could not import module %s', mod_name)
|
|
logger.exception(e)
|
|
continue
|
|
|
|
for _, obj in inspect.getmembers(module):
|
|
if (
|
|
inspect.isclass(obj)
|
|
and not inspect.isabstract(obj)
|
|
and issubclass(obj, BaseBluetoothPlugin)
|
|
):
|
|
plugins[obj] = obj(manager)
|
|
|
|
return list(plugins.values())
|