paccmann / utils.py
jannisborn's picture
refacor loading
bb77ad9 unverified
raw
history blame
8.82 kB
# coding: utf-8
from __future__ import absolute_import
import datetime
import pprint
import sys
import typing
from datetime import datetime # noqa: F401
from typing import Dict, List # noqa: F401
import six
import warnings
import dill
def load(filepath: str):
"""
Load a pickled object with Python downwards compatibility
Args:
filepath (str): path to the file.
"""
warnings.warn(
"Loading languages will use a text files in the future", FutureWarning
)
try:
with open(filepath, 'rb') as f:
obj = dill.load(f)
except TypeError:
# Necessary to load python3.7 pickled objects with >=3.8:
# For details see: https://github.com/uqfoundation/dill/pull/406
storage = dill._dill._reverse_typemap['CodeType']
dill._dill._reverse_typemap['CodeType'] = dill._dill._create_code
with open(filepath, 'rb') as f:
obj = dill.load(f)
dill._dill._reverse_typemap['CodeType'] = storage
return obj
if sys.version_info < (3, 7):
import typing
def is_generic(klass):
"""Determine whether klass is a generic class"""
return type(klass) == typing.GenericMeta
def is_dict(klass):
"""Determine whether klass is a Dict"""
return klass.__extra__ == dict
def is_list(klass):
"""Determine whether klass is a List"""
return klass.__extra__ == list
else:
def is_generic(klass):
"""Determine whether klass is a generic class"""
return hasattr(klass, "__origin__")
def is_dict(klass):
"""Determine whether klass is a Dict"""
return klass.__origin__ == dict
def is_list(klass):
"""Determine whether klass is a List"""
return klass.__origin__ == list
def _deserialize(data, klass):
"""Deserializes dict, list, str into an object.
:param data: dict, list or str.
:param klass: class literal, or string of class name.
:return: object.
"""
if data is None:
return None
if klass in six.integer_types or klass in (float, str, bool, bytearray):
return _deserialize_primitive(data, klass)
elif klass == object:
return _deserialize_object(data)
elif klass == datetime.date:
return deserialize_date(data)
elif klass == datetime.datetime:
return deserialize_datetime(data)
elif typing_utils.is_generic(klass):
if typing_utils.is_list(klass):
return _deserialize_list(data, klass.__args__[0])
if typing_utils.is_dict(klass):
return _deserialize_dict(data, klass.__args__[1])
else:
return deserialize_model(data, klass)
def _deserialize_primitive(data, klass):
"""Deserializes to primitive type.
:param data: data to deserialize.
:param klass: class literal.
:return: int, long, float, str, bool.
:rtype: int | long | float | str | bool
"""
try:
value = klass(data)
except UnicodeEncodeError:
value = six.u(data)
except TypeError:
value = data
return value
def _deserialize_object(value):
"""Return an original value.
:return: object.
"""
return value
def deserialize_date(string):
"""Deserializes string to date.
:param string: str.
:type string: str
:return: date.
:rtype: date
"""
try:
from dateutil.parser import parse
return parse(string).date()
except ImportError:
return string
def deserialize_datetime(string):
"""Deserializes string to datetime.
The string should be in iso8601 datetime format.
:param string: str.
:type string: str
:return: datetime.
:rtype: datetime
"""
try:
from dateutil.parser import parse
return parse(string)
except ImportError:
return string
def deserialize_model(data, klass):
"""Deserializes list or dict to model.
:param data: dict, list.
:type data: dict | list
:param klass: class literal.
:return: model object.
"""
instance = klass()
if not instance.openapi_types:
return data
for attr, attr_type in six.iteritems(instance.openapi_types):
if (
data is not None
and instance.attribute_map[attr] in data
and isinstance(data, (list, dict))
):
value = data[instance.attribute_map[attr]]
setattr(instance, attr, _deserialize(value, attr_type))
return instance
def _deserialize_list(data, boxed_type):
"""Deserializes a list and its elements.
:param data: list to deserialize.
:type data: list
:param boxed_type: class literal.
:return: deserialized list.
:rtype: list
"""
return [_deserialize(sub_data, boxed_type) for sub_data in data]
def _deserialize_dict(data, boxed_type):
"""Deserializes a dict and its elements.
:param data: dict to deserialize.
:type data: dict
:param boxed_type: class literal.
:return: deserialized dict.
:rtype: dict
"""
return {k: _deserialize(v, boxed_type) for k, v in six.iteritems(data)}
T = typing.TypeVar("T")
class Model(object):
# openapiTypes: The key is attribute name and the
# value is attribute type.
openapi_types = {}
# attributeMap: The key is attribute name and the
# value is json key in definition.
attribute_map = {}
@classmethod
def from_dict(cls: typing.Type[T], dikt) -> T:
"""Returns the dict as a model"""
return util.deserialize_model(dikt, cls)
def to_dict(self):
"""Returns the model properties as a dict
:rtype: dict
"""
result = {}
for attr, _ in six.iteritems(self.openapi_types):
value = getattr(self, attr)
if isinstance(value, list):
result[attr] = list(
map(lambda x: x.to_dict() if hasattr(x, "to_dict") else x, value)
)
elif hasattr(value, "to_dict"):
result[attr] = value.to_dict()
elif isinstance(value, dict):
result[attr] = dict(
map(
lambda item: (item[0], item[1].to_dict())
if hasattr(item[1], "to_dict")
else item,
value.items(),
)
)
else:
result[attr] = value
return result
def to_str(self):
"""Returns the string representation of the model
:rtype: str
"""
return pprint.pformat(self.to_dict())
def __repr__(self):
"""For `print` and `pprint`"""
return self.to_str()
def __eq__(self, other):
"""Returns true if both objects are equal"""
return self.__dict__ == other.__dict__
def __ne__(self, other):
"""Returns true if both objects are not equal"""
return not self == other
class Drug(Model):
"""NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
Do not edit the class manually.
"""
def __init__(self, smiles=None, name=None): # noqa: E501
"""Drug - a model defined in OpenAPI
:param smiles: The smiles of this Drug. # noqa: E501
:type smiles: str
:param name: The name of this Drug. # noqa: E501
:type name: str
"""
self.openapi_types = {"smiles": str, "name": str}
self.attribute_map = {"smiles": "smiles", "name": "name"}
self._smiles = smiles
self._name = name
@classmethod
def from_dict(cls, dikt) -> "Drug":
"""Returns the dict as a model
:param dikt: A dict.
:type: dict
:return: The Drug of this Drug. # noqa: E501
:rtype: Drug
"""
return util.deserialize_model(dikt, cls)
@property
def smiles(self):
"""Gets the smiles of this Drug.
:return: The smiles of this Drug.
:rtype: str
"""
return self._smiles
@smiles.setter
def smiles(self, smiles):
"""Sets the smiles of this Drug.
:param smiles: The smiles of this Drug.
:type smiles: str
"""
if smiles is None:
raise ValueError(
"Invalid value for `smiles`, must not be `None`"
) # noqa: E501
self._smiles = smiles
@property
def name(self):
"""Gets the name of this Drug.
:return: The name of this Drug.
:rtype: str
"""
return self._name
@name.setter
def name(self, name):
"""Sets the name of this Drug.
:param name: The name of this Drug.
:type name: str
"""
self._name = name