Source code for pymt.model_collection
import traceback
import pkg_resources
from .framework.bmi_bridge import bmi_factory
[docs]class ModelLoadError(Exception):
def __init__(self, name, reason=None):
self._name = name
self._reason = reason or "no reason given"
def __str__(self):
return f"unable to load model ({self._name}):\n{self._reason}"
[docs]class ModelCollection:
def __new__(cls):
models = []
errors = []
for entry_point in pkg_resources.iter_entry_points(group="pymt.plugins"):
try:
models.append(ModelCollection.load_entry_point(entry_point))
except ModelLoadError as error:
errors.append((entry_point.name, str(error)))
for name, model in models:
setattr(cls, name, property(lambda self, name=name: self._data[name]))
inst = super().__new__(cls)
inst._errors = tuple(errors)
inst._data = dict(models)
return inst
def __getitem__(self, name):
return self._data[name]
[docs] def keys(self):
return self._data.keys()
[docs] def items(self):
return self._data.items()
[docs] def values(self):
return self._data.values()
def __iter__(self):
return self._data.__iter__()
def __len__(self):
return len(self._data)
def __str__(self):
return str(self._data)
def __repr__(self):
return repr(set(self.keys()))
@property
def errors(self):
return self._errors
[docs] @staticmethod
def load_entry_point(entry_point):
try:
model = entry_point.load()
except Exception:
raise ModelLoadError(entry_point.name, reason=traceback.format_exc())
else:
Model = bmi_factory(model)
Model.__name__ = entry_point.name
Model.__qualname__ = entry_point.name
Model.__module__ = "pymt.models"
return entry_point.name, Model