Source code for checkQC.handlers.qc_handler_factory


import importlib
import pkgutil

import checkQC.handlers
from checkQC.handlers.qc_handler import QCHandler
from checkQC.exceptions import QCHandlerNotFound


[docs]class QCHandlerFactory(object): """ This class provides way of finding and instantiating a concrete QCHandler implementation. This allows QCHandlers to be instantiated dynamically at runtime e.g. based on what is specified in a config file. """
[docs] @staticmethod def create_subclass_instance(class_name, class_config): """ This method will look for a class with the given `class_name` in the `checkQC.handlers` module. If it can find a class with a matching name it will return a instance of that class. :param class_name: the name of the class to instantiate :param class_config: dictionary with configuration for the class :returns: A instance of the class represented by class_name """ package = checkQC.handlers prefix = package.__name__ + "." modules = list(pkgutil.iter_modules(package.__path__, prefix)) for importer, modname, ispkg in modules: importlib.import_module(modname) qc_handler_subclasses = list(QCHandler.__subclasses__()) try: i = list(map(lambda clazz: clazz.__name__, qc_handler_subclasses)).index(class_name) return qc_handler_subclasses[i](qc_config=class_config) except ValueError: raise QCHandlerNotFound("Could not identify a QCHandler with name: {}".format(class_name))