def __iter__ (self) : d = CAL.Date_Delta (1) f = self.finis s = self.start while s <= f : yield s s += d
class Week (_Period_) : """Model a calendary week. >>> from _TFL.json_dump import to_string as jsonified >>> p = Week (2016, 16) >>> print (p, p.days, p.start, p.finis) 2016/W16 7 2016-04-18 2016-04-24 >>> print (jsonified ([p])) ["2016/W16"] >>> p_days = list (p) >>> print (p_days [0], "..", p_days [-1], ":", len (p_days)) 2016-04-18 .. 2016-04-24 : 7 >>> print (", ".join (str (d) for d in p)) 2016-04-18, 2016-04-19, 2016-04-20, 2016-04-21, 2016-04-22, 2016-04-23, 2016-04-24 >>> for i in range (5) : ... r = p + i ... print (r, r.days, r.start, r.finis) ... 2016/W16 7 2016-04-18 2016-04-24 2016/W17 7 2016-04-25 2016-05-01 2016/W18 7 2016-05-02 2016-05-08 2016/W19 7 2016-05-09 2016-05-15 2016/W20 7 2016-05-16 2016-05-22 >>> p > r False >>> p < r True >>> p == r False >>> p == p True >>> Week.from_string ("2016/W1") Week (2016, 1) >>> Week.now = CAL.Date (2016, 4, 19) >>> Week.from_string ("W13", add_year = True) Week (2016, 13) """ format = "%4.4d/W%d" kind = "week" number = Alias_Property (kind) start = Alias_Property ("monday") _delta = CAL.Date_Delta (7) _pattern = Multi_Regexp \ ( r"(?P<year> \d{4,4}) (?: [-/]) W(?P<week> \d{1,2}) $" , r"W(?P<week> \d{1,2}) (?: (?: \s+|[-/]) (?P<year> \d{4,4}))? $" , flags = re.VERBOSE | re.IGNORECASE ) def __init__ (self, * args, ** kw) : if kw : date = kw.pop ("date") if args or kw : raise TypeError \ ("Need a single `date` arg or two args (year, week)") elif len (args) == 1 : date = args [0] date -= date.weekday else : date = self._monday (* args) self.monday = date self.year = date.year self.week = date.week # end def __init__ @TFL.Meta.Once_Property def month (self) : return self.monday.month # end def month @classmethod def from_date (cls, date) : return cls (date) # end def from_date @classmethod def _from_string_match_kw \ (cls, s, match, add_year = False, future_p = False) : result = CAL.Date._from_string_match_kw (s, match) week = result.pop ("week") year = result.get ("year") if year is None : if add_year : now = cls.now year = now.year if future_p and getattr (now, cls.kind) >= week : year += 1 else : raise ValueError (s) return dict (date = cls._monday (year, week)) # end def _from_string_match_kw @classmethod def _monday (cls, year, week) : from _CAL.Year import Year as Y try : return Y (year).weeks [week].mon.date except IndexError : raise ValueError ("Invalid value for week: '%s'" % (week, )) except Exception : raise ValueError (cls.format % (year, week))
class Interval (_Period_) : """Model an arbitrary calendary interval. >>> from _TFL.json_dump import to_string as jsonified >>> s = CAL.Date (2016, 4, 11) >>> f = CAL.Date (2016, 4, 14) >>> p = Interval (s, f) >>> print (p, p.days, p.start, p.finis) 2016-04-11..2016-04-14 4 2016-04-11 2016-04-14 >>> print (jsonified ([p])) ["2016-04-11..2016-04-14"] >>> for d in p : ... print (d) 2016-04-11 2016-04-12 2016-04-13 2016-04-14 >>> for i in range (5) : ... r = p + i ... print (r, r.days, r.start, r.finis) ... 2016-04-11..2016-04-14 4 2016-04-11 2016-04-14 2016-04-12..2016-04-15 4 2016-04-12 2016-04-15 2016-04-13..2016-04-16 4 2016-04-13 2016-04-16 2016-04-14..2016-04-17 4 2016-04-14 2016-04-17 2016-04-15..2016-04-18 4 2016-04-15 2016-04-18 >>> Interval.from_string ("2016-04-18") Interval (Date (2016, 4, 18), Date (2016, 4, 18)) >>> print (Interval.from_string ("2016-04-18 - 2016-04-19")) 2016-04-18..2016-04-19 >>> print (Interval.from_string ("2016-04-18 – 2016-04-19")) 2016-04-18..2016-04-19 >>> print (Interval.from_string ("2016-04-18–2016-04-19")) 2016-04-18..2016-04-19 >>> print (Interval.from_string ("2016-04-18 .. 2016-04-19")) 2016-04-18..2016-04-19 >>> print (Interval.from_string ("2016-04-18..2016-04-19")) 2016-04-18..2016-04-19 """ format = "%s..%s" kind = "" number = Alias_Property (kind) _delta = CAL.Date_Delta (1) _pattern = Regexp \ ( r"(?P<start>[^ –]+)(?: - | ?(?:–|\.\.) ?)(?P<finis>[^ ]+)$" ) def __init__ (self, start, finis) : self.start = start self.finis = finis # end def __init__ @property def finis (self) : return self._finis # end def finis @finis.setter def finis (self, value) : self._finis = value # end def finis @TFL.Meta.Once_Property def month (self) : return self.start.month # end def month @property def start (self) : return self._start # end def start @start.setter def start (self, value) : self._start = value # end def start @classmethod def from_date (cls, date) : return cls (date, date) # end def from_date @classmethod def _from_string_match_kw \ (cls, s, match, add_year = False, future_p = False) : s = CAL.Date.from_string (match.group ("start")) f = CAL.Date.from_string (match.group ("finis")) result = dict (start = s, finis = f) return result # end def _from_string_match_kw def __add__ (self, rhs) : delta = self._delta * rhs return self.__class__ (self.start + delta, self.finis + delta) # end def __add__ def __repr__ (self) : return "%s (%r, %r)" % \ (self.__class__.__name__, self.start, self.finis) # end def __repr__ def __str__ (self) : return self.format % (self.start, self.finis) # end def __str__ def __sub__ (self, rhs) : delta = self._delta * rhs return self.__class__ (self.start - delta, self.finis - delta)
class Day (_Period_) : """Model a calendary day. >>> from _TFL.json_dump import to_string as jsonified >>> p = Day (2016, 2, 27) >>> print (p, p.days, p.start, p.finis) 2016-02-27 1 2016-02-27 2016-02-27 >>> print (jsonified ([p])) ["2016-02-27"] >>> for d in p : ... print (d) 2016-02-27 >>> for i in range (5) : ... r = p + i ... print (r, r.days, r.start, r.finis) ... 2016-02-27 1 2016-02-27 2016-02-27 2016-02-28 1 2016-02-28 2016-02-28 2016-02-29 1 2016-02-29 2016-02-29 2016-03-01 1 2016-03-01 2016-03-01 2016-03-02 1 2016-03-02 2016-03-02 >>> p > r False >>> p < r True >>> p == r False >>> p == p True """ days = property (lambda s : 1) finis = Alias_Property ("start") format = "%4.4d-%2.2d-%2.2d" kind = "day" number = Alias_Property (kind) _delta = CAL.Date_Delta (1) _pattern = None def __init__ (self, year, month, day) : self.year = year self.month = month self.day = day # end def __init__ @classmethod def from_date (cls, date) : return cls (date.year, date.month, date.day) # end def from_date @TFL.Meta.Once_Property def start (self) : return CAL.Date (self.year, self.month, self.day) # end def start def __repr__ (self) : return "%s (%s, %s, %s)" % \ (self.__class__.__name__, self.year, self.month, self.day) # end def __repr__ def __str__ (self) : return self.format % (self.year, self.month, self.day)