Source code for openscm_runner.adapters

"""
Adapters for different climate models
"""

from .base import _Adapter
from .ciceroscm_adapter import CICEROSCM
from .ciceroscm_py_adapter import CICEROSCMPY
from .fair_adapter import FAIR
from .magicc7 import MAGICC7

_registered_adapters: list[type[_Adapter]] = [
    CICEROSCM,
    CICEROSCMPY,
    FAIR,
    MAGICC7,
]


[docs]def get_adapter(climate_model): """ Get an adapter for a given climate_model Parameters ---------- climate_model: str The name of the model to fetch This parameter is case-insensitive Raises ------ NotImplementedError A matching adapter could not be found Returns ------- openscm_runner.adapters.base._Adapter The adapter for a given climate model """ adapters_classes = get_adapters_classes() for Adapter in adapters_classes: if Adapter.model_name.upper() == climate_model.upper(): return Adapter() raise NotImplementedError(f"No adapter available for {climate_model}")
[docs]def get_adapters_classes(): """ Get a list of registered adapter classes Returns ------- list of Type[:class:`openscm_runner.adapters.base._Adapter`] """ return _registered_adapters
[docs]def register_adapter_class(adapter_cls: type[_Adapter]): """ Register a new adapter class Parameters ---------- adapter_cls: Type[:class:`openscm_runner.adapters.base._Adapter`] Adapter class to register Must inherit from openscm_runner :class:`openscm_runner.adapters.base._Adapter` and have a unique `model_name` Raises ------ ValueError `adapter_cls` does not inherit from :class:`openscm_runner.adapters.base._Adapter` Invalid or non unique `model_name` """ existing_names = [a.model_name.upper() for a in _registered_adapters] if not issubclass(adapter_cls, _Adapter): raise ValueError( "Adapter does not inherit from openscm_runner.adapters.base._Adapter" ) if adapter_cls.model_name is None or not isinstance(adapter_cls.model_name, str): raise ValueError("Cannot determine model_name") if any(adapter_cls.model_name.upper() == name for name in existing_names): raise ValueError( "An adapter with the same model_name has already been registered" ) _registered_adapters.append(adapter_cls)