tests and small refactors for exchange rates
This commit is contained in:
parent
4973d4c61a
commit
56c6bd7620
2 changed files with 218 additions and 2 deletions
|
|
@ -1,5 +1,7 @@
|
|||
import datetime
|
||||
from typing import Iterable, Union
|
||||
from decimal import Decimal
|
||||
from numbers import Number
|
||||
from typing import Iterable, Set, Union
|
||||
|
||||
from money.currency import Currency
|
||||
from money.money import Money
|
||||
|
|
@ -11,11 +13,13 @@ class ExchangeRate:
|
|||
self,
|
||||
from_currency: Currency,
|
||||
to_currency: Currency,
|
||||
rate: Money,
|
||||
rate: Union[Money, Number],
|
||||
rate_date: datetime.date,
|
||||
) -> None:
|
||||
self.from_currency = from_currency
|
||||
self.to_currency = to_currency
|
||||
if not isinstance(rate, Money):
|
||||
rate = Money(rate, to_currency)
|
||||
self.rate = rate
|
||||
self.rate_date = rate_date
|
||||
|
||||
|
|
@ -27,6 +31,10 @@ class ExchangeRate:
|
|||
+ str(self.rate_date.strftime("%Y-%m-%d"))
|
||||
)
|
||||
|
||||
@property
|
||||
def amount(self) -> Decimal:
|
||||
return self.rate.amount
|
||||
|
||||
|
||||
class ExchangeRates:
|
||||
|
||||
|
|
@ -40,8 +48,44 @@ class ExchangeRates:
|
|||
raise TypeError("ExchangeRates can only hold Rates.")
|
||||
self._rate_index[rate.descriptor] = rate
|
||||
|
||||
@property
|
||||
def present_currencies(self) -> Set[Currency]:
|
||||
present_currencies = set()
|
||||
|
||||
for rate in self:
|
||||
present_currencies.add(rate.from_currency)
|
||||
present_currencies.add(rate.to_currency)
|
||||
|
||||
return present_currencies
|
||||
|
||||
@property
|
||||
def present_dates(self) -> Set[datetime.date]:
|
||||
return {rate.rate_date for rate in self}
|
||||
|
||||
def add_rate(self, new_rate: ExchangeRate) -> None:
|
||||
self._rate_index[new_rate.descriptor] = new_rate
|
||||
|
||||
def __iter__(self):
|
||||
return iter(self._rate_index.values())
|
||||
|
||||
def __len__(self):
|
||||
return len(self._rate_index)
|
||||
|
||||
|
||||
def add_equal_rates(rates: ExchangeRates) -> ExchangeRates:
|
||||
|
||||
present_currencies = rates.present_currencies
|
||||
present_dates = rates.present_dates
|
||||
|
||||
for date in present_dates:
|
||||
for currency in present_currencies:
|
||||
rates.add_rate(
|
||||
ExchangeRate(
|
||||
from_currency=currency,
|
||||
to_currency=currency,
|
||||
rate=Money(1, currency),
|
||||
rate_date=date,
|
||||
)
|
||||
)
|
||||
|
||||
return rates
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue