rate: Initial commit.
This commit is contained in:
commit
a181166311
6 changed files with 88 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
__pycache__/
|
0
oxrlib/__init__.py
Normal file
0
oxrlib/__init__.py
Normal file
47
oxrlib/rate.py
Normal file
47
oxrlib/rate.py
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
import datetime
|
||||||
|
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_timestamp(cls, value):
|
||||||
|
return int(value.timestamp())
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_json_file(cls, json_file):
|
||||||
|
response = json.load(json_file)
|
||||||
|
return cls(**response)
|
||||||
|
|
||||||
|
def serialize(self):
|
||||||
|
return dict(self.walk_fields(functools.partial(getattr, self), 'serialize'))
|
6
tests/__init__.py
Normal file
6
tests/__init__.py
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
import pathlib
|
||||||
|
|
||||||
|
TEST_DIR = pathlib.Path(__file__).parent
|
||||||
|
|
||||||
|
def relpath(path):
|
||||||
|
return TEST_DIR / pathlib.Path(path)
|
11
tests/historical1.json
Normal file
11
tests/historical1.json
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"disclaimer": "https://openexchangerates.org/terms/",
|
||||||
|
"license": "https://openexchangerates.org/license/",
|
||||||
|
"timestamp": 982342800,
|
||||||
|
"base": "USD",
|
||||||
|
"rates": {
|
||||||
|
"AED": 3.67246,
|
||||||
|
"ALL": 144.529793,
|
||||||
|
"ANG": 1.79
|
||||||
|
}
|
||||||
|
}
|
23
tests/test_Rate.py
Normal file
23
tests/test_Rate.py
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
import datetime
|
||||||
|
import io
|
||||||
|
import json
|
||||||
|
|
||||||
|
from . import relpath
|
||||||
|
|
||||||
|
import oxrlib.rate
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def historical1_rate():
|
||||||
|
with open(relpath('historical1.json').as_posix()) as rate_file:
|
||||||
|
return oxrlib.rate.Rate.from_json_file(rate_file)
|
||||||
|
|
||||||
|
def test_rate_from_json(historical1_rate):
|
||||||
|
assert historical1_rate.base == 'USD'
|
||||||
|
assert historical1_rate.timestamp == datetime.datetime(2001, 2, 16, 12, 0, 0)
|
||||||
|
|
||||||
|
def test_serialize(historical1_rate):
|
||||||
|
with open(relpath('historical1.json').as_posix()) as rate_file:
|
||||||
|
expected = json.load(rate_file)
|
||||||
|
assert expected == historical1_rate.serialize()
|
||||||
|
|
Loading…
Reference in a new issue