data-xexe/xexe/utils.py
2024-06-11 18:35:48 +02:00

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