Source code for dirty_loader.factories

import logging


def instance_params(desc):
    if isinstance(desc, str):
        return desc, {}
    try:
        klass = desc['type']
        try:
            params = desc['params']
        except KeyError:
            params = {}
    except KeyError:
        klass = list(desc.keys())[0]
        params = desc.pop(klass)

    return klass, params


[docs]class BaseFactory: """ Base class factory. It should be used in order to implement specific ones. """ def __init__(self, loader, klass): self.loader = loader self.klass = klass def __call__(self, *args, **kwargs): return self.klass(*args, **kwargs) def load_item(self, item, allowed_classes=tuple()): if isinstance(item, allowed_classes): return item klass, params = instance_params(item) return self.loader.factory(klass, **params) def iter_loaded_item_list(self, item_list, allowed_classes=tuple()): try: for item in item_list: yield self.load_item(item, allowed_classes) except TypeError: pass def iter_loaded_named_item_list(self, item_list, allowed_classes=tuple()): try: for name, item in item_list.items(): yield name, self.load_item(item, allowed_classes) except AttributeError: pass
class BaseLoggingFactory(BaseFactory): def add_filters(self, obj, filters): list(map(obj.addFilter, self.iter_loaded_item_list(filters, logging.Filter)))
[docs]class LoggerFactory(BaseLoggingFactory): """ Logger factory. """ def __call__(self, name, propagate=True, level=logging.DEBUG, handlers=None, filters=None): logger = logging.getLogger(name) logger.propagate = propagate logger.setLevel(level) list(map(logger.addHandler, self.iter_loaded_item_list(handlers, logging.Handler))) self.add_filters(logger, filters) return logger
[docs]class LoggingHandlerFactory(BaseLoggingFactory): """ Logger handle factory. """ def __call__(self, formatter=None, filters=None, *args, **kwargs): handler = self.klass(*args, **kwargs) if formatter: handler.setFormatter(self.load_item(formatter, logging.Formatter)) self.add_filters(handler, filters) return handler
[docs]def register_logging_factories(loader): """ Registers default factories for logging standard package. :param loader: Loader where you want register default logging factories """ loader.register_factory(logging.Logger, LoggerFactory) loader.register_factory(logging.Handler, LoggingHandlerFactory)