Source code for schrodinger.models.adapters.abstractadapter
[docs]class AbstractAdapter:
"""
Abstract class for copying data from compound params to other data classes.
Subclasses must implement `_createDefaultObj` and `_copyItem`.
Behavior can be customized by overriding the virtual methods:
`_paramToDict`: to customize param keywords or values
`_convertKeyword`: to customize how all keywords are transformed
"""
[docs] @classmethod
def convert(cls, param, destination_obj=None):
"""
Copy data from the compound param to the destination object.
If no destination object is supplied, an empty one will be created.
:param param: Compound param instance
:type param: schrodinger.models.parameters.CompoundParam
:param destination_obj: Destination object or None to create empty
:type destination_obj: object or NoneType
:return: Destination object containing data from the compound param
:rtype: object
"""
if destination_obj is None:
destination_obj = cls._createDefaultObj()
param_dict = cls._paramToDict(param)
for param_key, value in param_dict.items():
if isinstance(value, dict):
# TODO add nested support
raise ValueError("Nested params are not supported")
config_key = cls._convertKeyword(param_key)
cls._copyItem(config_key, value, destination_obj)
return destination_obj
#########################################
# Pure virtual methods
#########################################
@classmethod
def _createDefaultObj(cls):
"""
Create a default destination object to be used by `convert` if none is
supplied
:return: Default destination object
:rtype: object
"""
raise NotImplementedError()
@classmethod
def _copyItem(cls, key, value, destination_obj):
"""
Copy the specified item onto the destination object.
Override this method with logic to copy the compound param `value` named
`key` to the destination object in the appropriate format.
:param key: Item key (already converted and transformed)
:param value: Item value (already transformed but not copied)
"""
raise NotImplementedError()
#########################################
# Virtual methods
#########################################
@classmethod
def _paramToDict(cls, param):
"""
Convert the compound param into a dictionary. Subclasses that need to
transform keys or values should do it here.
"""
return param.toDict()
@classmethod
def _convertKeyword(cls, param_key):
"""
Convert a keyword from params conventions to destination obj conventions
:param param_key: Keyword from parameters object
:type param_key: str
:return: Converted key appropriate for destination obj
:rtype: str
"""
return param_key