EliteBot/elitebot/lib/python3.11/site-packages/sqlalchemy_utils/primitives/weekdays.py
2024-02-19 15:34:25 +01:00

57 lines
1.7 KiB
Python

from ..utils import str_coercible
from .weekday import WeekDay
@str_coercible
class WeekDays:
def __init__(self, bit_string_or_week_days):
if isinstance(bit_string_or_week_days, str):
self._days = set()
if len(bit_string_or_week_days) != WeekDay.NUM_WEEK_DAYS:
raise ValueError(
'Bit string must be {} characters long.'.format(
WeekDay.NUM_WEEK_DAYS
)
)
for index, bit in enumerate(bit_string_or_week_days):
if bit not in '01':
raise ValueError(
'Bit string may only contain zeroes and ones.'
)
if bit == '1':
self._days.add(WeekDay(index))
elif isinstance(bit_string_or_week_days, WeekDays):
self._days = bit_string_or_week_days._days
else:
self._days = set(bit_string_or_week_days)
def __eq__(self, other):
if isinstance(other, WeekDays):
return self._days == other._days
elif isinstance(other, str):
return self.as_bit_string() == other
else:
return NotImplemented
def __iter__(self):
yield from sorted(self._days)
def __contains__(self, value):
return value in self._days
def __repr__(self):
return '{}({!r})'.format(
self.__class__.__name__,
self.as_bit_string()
)
def __unicode__(self):
return ', '.join(str(day) for day in self)
def as_bit_string(self):
return ''.join(
'1' if WeekDay(index) in self._days else '0'
for index in range(WeekDay.NUM_WEEK_DAYS)
)