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