diff --git a/oxrlib/rate.py b/oxrlib/rate.py index fbbc9cbae1615245537b422c93465e88d8cd694f..9bfef8cdae042672bb25b6024223f3f8416a05a3 100644 --- a/oxrlib/rate.py +++ b/oxrlib/rate.py @@ -1,4 +1,5 @@ import datetime +import decimal import functools import json @@ -34,14 +35,21 @@ class Rate: 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) + 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')) diff --git a/tests/historical1.json b/tests/historical1.json index b96812d2d886252dda2a2978a80b607d15682dba..6431839d34c1689f1db7e4be56cee0d0245cb077 100644 --- a/tests/historical1.json +++ b/tests/historical1.json @@ -6,6 +6,7 @@ "rates": { "AED": 3.67246, "ALL": 144.529793, - "ANG": 1.79 + "ANG": 1.79, + "USD": 1 } } diff --git a/tests/test_Rate.py b/tests/test_Rate.py index 98ebdf9c76dba9eb6eb0eab66994a5cbb0691e4c..ebdf0e9f737fd0e7f50ceb3d7abef618d10b2d63 100644 --- a/tests/test_Rate.py +++ b/tests/test_Rate.py @@ -1,4 +1,5 @@ import datetime +import decimal import io import json @@ -7,6 +8,9 @@ from . import relpath import oxrlib.rate import pytest +HIST1_AED_RATE = decimal.Decimal('3.67246') +HIST1_ALL_RATE = decimal.Decimal('144.529793') + @pytest.fixture def historical1_rate(): with open(relpath('historical1.json').as_posix()) as rate_file: @@ -21,3 +25,7 @@ def test_serialize(historical1_rate): expected = json.load(rate_file) assert expected == historical1_rate.serialize() +def test_convert(historical1_rate): + assert historical1_rate.convert(2, 'USD', 'ALL') == (2 * HIST1_ALL_RATE) + assert historical1_rate.convert(10, 'AED', 'USD') == (10 / HIST1_AED_RATE) + assert historical1_rate.convert(1, 'AED', 'ALL') == (HIST1_ALL_RATE / HIST1_AED_RATE)