Source code for meavis.filesystem.loaders

"""Functions to load MeaVis description files."""
import copy
import importlib
import logging


[docs]def json2dict(filename, key): """Load decription from JSON.""" import json with open(filename) as file_obj: structure = json.load(file_obj) return structure[key] if key in structure else structure
[docs]def python2dict(filename, key): """Load decription from python module.""" return getattr(importlib.import_module(filename), "_meavis_{}".format(key))
[docs]def yaml2dict(filename, key): """Load decription from YAML.""" import yaml with open(filename) as file_obj: structure = yaml.safe_load(file_obj) return structure[key] if key in structure else structure
[docs]class LoadDispatcher: """Dispatcher to select appropriate loader."""
[docs] def __init__(self, loader_mapping): """Intialise from a mapping between string and functions.""" self.loader_mapping = copy.deepcopy(loader_mapping) self._meavis_logger = logging.getLogger("meavis")
[docs] def loads(self, filename, key, kind): """Load a MeaVis descrption file. Dispatch by its filename (or module name), its kind (e.g. py) and a main key as description files ebedded descriptions of multiple things. """ if kind: for (loader, loader_kind) in self.loader_mapping: if kind == loader_kind: loader_split = loader.split(".") self._meavis_logger.debug( "Try to load {} with {} [kind: {{{}}}]".format( filename, loader, loader_kind ) ) return getattr( importlib.import_module(".".join(loader_split[:-1])), loader_split[-1], )(filename, key) for (loader, loader_kind) in self.loader_mapping: try: loader_split = loader.split(".") self._meavis_logger.debug( "Try to load {} with {} [kind: {{{}}}]".format( filename, loader, loader_kind ) ) return getattr( importlib.import_module(".".join(loader_split[:-1])), loader_split[-1], )(filename, key) except Exception as ex: logging.getLogger("meavis").debug( "Loader [{{{}}}] failed : {}.".format(loader_kind, ex) )