oxrlib/oxrlib/rate.py
2017-05-16 12:26:32 -04:00

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'))