89 lines
2.6 KiB
Python
89 lines
2.6 KiB
Python
import datetime
|
|
from itertools import combinations
|
|
from typing import Set
|
|
|
|
from money.currency import Currency
|
|
|
|
|
|
class DateRange:
|
|
|
|
def __init__(self, start_date: datetime.date, end_date: datetime.date):
|
|
if type(start_date) != datetime.date or type(end_date) != datetime.date:
|
|
raise TypeError("start_date and end_date must be date objects.")
|
|
|
|
if start_date > end_date:
|
|
raise ValueError("start_date can't be after end_date.")
|
|
|
|
self._start_date = start_date
|
|
self._end_date = end_date
|
|
|
|
@property
|
|
def start_date(self):
|
|
return self._start_date
|
|
|
|
@start_date.setter
|
|
def start_date(self, value: datetime.date):
|
|
if type(value) != datetime.date:
|
|
raise TypeError("start_date must be a date object.")
|
|
|
|
if value > self._end_date:
|
|
raise ValueError("start_date can't be after end_date.")
|
|
|
|
self._start_date = value
|
|
|
|
@property
|
|
def end_date(self):
|
|
return self._end_date
|
|
|
|
@end_date.setter
|
|
def end_date(self, value: datetime.date):
|
|
if type(value) != datetime.date:
|
|
raise TypeError("end_date must be a date object.")
|
|
|
|
if value < self._start_date:
|
|
raise ValueError("end_date can't be before start_date.")
|
|
|
|
self._end_date = value
|
|
|
|
def __eq__(self, other: "DateRange") -> bool:
|
|
if not isinstance(other, DateRange):
|
|
raise TypeError("DataRange can only be compared to other DateRange.")
|
|
|
|
start_dates_are_different = self.start_date != other.start_date
|
|
end_dates_are_different = self.end_date != other.end_date
|
|
|
|
if start_dates_are_different or end_dates_are_different:
|
|
return False
|
|
|
|
return True
|
|
|
|
def __repr__(self) -> str:
|
|
return f"""Date Range: {self.start_date.strftime("%Y-%m-%d")} to {self.end_date.strftime("%Y-%m-%d")}."""
|
|
|
|
def __iter__(self):
|
|
current_date = self.start_date
|
|
while current_date <= self.end_date:
|
|
yield current_date
|
|
current_date += datetime.timedelta(days=1)
|
|
|
|
|
|
def generate_currency_and_dates_combinations(
|
|
date_range: DateRange, currencies: Set[Currency]
|
|
):
|
|
currency_pairs = list(combinations(currencies, 2))
|
|
|
|
combinations = []
|
|
for date in date_range:
|
|
for from_currency, to_currency in currency_pairs:
|
|
combinations.append(
|
|
{
|
|
"from_currency": from_currency,
|
|
"to_currency": to_currency,
|
|
"date": date,
|
|
}
|
|
)
|
|
|
|
combinations = tuple(combinations)
|
|
|
|
# Convert the result to a tuple
|
|
return combinations
|