55 lines
1.6 KiB
Python
55 lines
1.6 KiB
Python
import datetime
|
|
import decimal
|
|
import functools
|
|
import json
|
|
|
|
class Rate:
|
|
FIELDS = [
|
|
'base',
|
|
'disclaimer',
|
|
'license',
|
|
'rates',
|
|
'timestamp',
|
|
]
|
|
|
|
@classmethod
|
|
def walk_fields(cls, get_field, transform_prefix):
|
|
for fieldname in cls.FIELDS:
|
|
value = get_field(fieldname)
|
|
if value is not None:
|
|
try:
|
|
transformer = getattr(cls, '{}_{}'.format(transform_prefix, fieldname))
|
|
except AttributeError:
|
|
pass
|
|
else:
|
|
value = transformer(value)
|
|
yield (fieldname, value)
|
|
|
|
def __init__(self, base, rates, **kwargs):
|
|
for key, value in self.walk_fields(kwargs.get, 'deserialize'):
|
|
setattr(self, key, value)
|
|
self.base = base
|
|
self.rates = rates
|
|
|
|
@classmethod
|
|
def deserialize_timestamp(cls, value):
|
|
return datetime.datetime.fromtimestamp(value)
|
|
|
|
@classmethod
|
|
def serialize_rates(cls, rates):
|
|
return {code: float(rates[code]) for code in rates}
|
|
|
|
@classmethod
|
|
def serialize_timestamp(cls, value):
|
|
return int(value.timestamp())
|
|
|
|
@classmethod
|
|
def from_json_file(cls, json_file):
|
|
response = json.load(json_file, parse_float=decimal.Decimal)
|
|
return cls(**response)
|
|
|
|
def convert(self, amount, from_currency, to_currency):
|
|
return amount * self.rates[to_currency] / self.rates[from_currency]
|
|
|
|
def serialize(self):
|
|
return dict(self.walk_fields(functools.partial(getattr, self), 'serialize'))
|