platypush/platypush/plugins/bluetooth/_plugins/_scanner.py

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())