import datetime from itertools import combinations from typing import Set, Tuple from money.currency import Currency from xexe.currency_pair import CurrencyPair 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_pairs_and_dates_combinations( date_range: DateRange, pairs: Set[CurrencyPair] ) -> Tuple[dict]: currency_date_combinations = [] for date in date_range: for pair in pairs: currency_date_combinations.append( { "from_currency": pair.from_currency, "to_currency": pair.to_currency, "date": date, } ) currency_date_combinations = tuple(currency_date_combinations) return currency_date_combinations