class Quarter (_Period_) : """Model a calendary quarter. >>> from _TFL.json_dump import to_string as jsonified >>> p = Quarter (2000, 1) >>> print (p, p.days, p.start, p.finis) 2000/Q1 91 2000-01-01 2000-03-31 >>> print (jsonified ([p])) ["2000/Q1"] >>> p_days = list (p) >>> print (p_days [0], "..", p_days [-1], ":", len (p_days)) 2000-01-01 .. 2000-03-31 : 91 >>> for i in range (8) : ... r = p + i ... print (r, r.days, r.start, r.finis) ... 2000/Q1 91 2000-01-01 2000-03-31 2000/Q2 91 2000-04-01 2000-06-30 2000/Q3 92 2000-07-01 2000-09-30 2000/Q4 92 2000-10-01 2000-12-31 2001/Q1 90 2001-01-01 2001-03-31 2001/Q2 91 2001-04-01 2001-06-30 2001/Q3 92 2001-07-01 2001-09-30 2001/Q4 92 2001-10-01 2001-12-31 >>> p > r False >>> p < r True >>> p == r False >>> p == p True >>> Quarter.from_string ("2014/Q1") Quarter (2014, 1) >>> Quarter.from_string ("Q1 2015") Quarter (2015, 1) >>> Quarter.from_string ("2016-01-29") Quarter (2016, 1) >>> Quarter.from_string ("2015-01") Traceback (most recent call last): ... ValueError: 2015-01 """ format = "%4.4d/Q%d" kind = "quarter" number = Alias_Property (kind) _delta = CAL.Month_Delta (3) _pattern = Multi_Regexp \ ( r"(?P<year> \d{4,4}) (?: [-/]) Q(?P<quarter> \d{1,1}) $" , r"Q(?P<quarter> \d{1,1}) (?: (?: \s+|[-/]) (?P<year> \d{4,4}))? $" , flags = re.VERBOSE | re.IGNORECASE ) def __init__ (self, year, quarter) : if not (1 <= quarter <= 4) : raise ValueError ("Illegal value for quarter: '%s'" % (quarter, )) self.year = year self.quarter = quarter # end def __init__ @TFL.Meta.Once_Property def month (self) : return 1 + 3 * (self.quarter - 1)
class Year (_Period_) : """Model a calendary year. >>> from _TFL.json_dump import to_string as jsonified >>> p = Year (2012) >>> print (p, p.days, p.start, p.finis) 2012 366 2012-01-01 2012-12-31 >>> print (jsonified ([p])) ["2012"] >>> p_days = list (p) >>> print (p_days [0], "..", p_days [-1], ":", len (p_days)) 2012-01-01 .. 2012-12-31 : 366 >>> for i in range (5) : ... r = p + i ... print (r, r.days, r.start, r.finis) ... 2012 366 2012-01-01 2012-12-31 2013 365 2013-01-01 2013-12-31 2014 365 2014-01-01 2014-12-31 2015 365 2015-01-01 2015-12-31 2016 366 2016-01-01 2016-12-31 >>> p > r False >>> p < r True >>> p == r False >>> p == p True """ format = "%4.4d" kind = "year" number = Alias_Property (kind) month = property (lambda s : 1) _delta = CAL.Month_Delta (12) _pattern = Regexp \ ( r"(?P<year> \d{4,4})" r"$" , flags = re.VERBOSE ) def __init__ (self, year, _ = None) : self.year = year # end def __init__ @classmethod def from_date (cls, date) : return cls (date.year) # end def from_date def __repr__ (self) : return "%s (%s)" % (self.__class__.__name__, self.number) # end def __repr__ def __str__ (self) : return self.format % (self.number, )
class Month (_Period_) : """Model a calendary month. >>> from _TFL.json_dump import to_string as jsonified >>> p = Month (2016, 1) >>> print (p, p.days, p.start, p.finis) 2016-01 31 2016-01-01 2016-01-31 >>> print (jsonified ([p])) ["2016-01"] >>> p_days = list (p) >>> print (p_days [0], "..", p_days [-1], ":", len (p_days)) 2016-01-01 .. 2016-01-31 : 31 >>> for i in range (8) : ... r = p + i ... print (r, r.days, r.start, r.finis) ... 2016-01 31 2016-01-01 2016-01-31 2016-02 29 2016-02-01 2016-02-29 2016-03 31 2016-03-01 2016-03-31 2016-04 30 2016-04-01 2016-04-30 2016-05 31 2016-05-01 2016-05-31 2016-06 30 2016-06-01 2016-06-30 2016-07 31 2016-07-01 2016-07-31 2016-08 31 2016-08-01 2016-08-31 >>> p > r False >>> p < r True >>> p == r False >>> p == p True >>> Month.from_string ("2014/02") Month (2014, 2) >>> Month.from_string ("2014/03/28") Month (2014, 3) >>> with TFL.I18N.test_language ("de") : ... Month.from_string ("2014-mai") Month (2014, 5) >>> Month.from_string ("2014/Q1") Traceback (most recent call last): ... ValueError: 2014/Q1 """ format = "%4.4d-%2.2d" kind = "month" number = Alias_Property (kind) _delta = CAL.Month_Delta (1) _pattern = Multi_Regexp \ ( r"(?P<year> \d{4,4}) (?: [-/]) (?P<month> \d{2,2}) $" , r"(?P<year> \d{4,4}) (?: \s+|[-/]) (?P<month> [a-z]+) $" , r"(?P<month> [a-z]+) (?: (?: \s+|[-/.]) (?P<year> \d{4,4}))? $" , flags = re.VERBOSE | re.IGNORECASE ) def __init__ (self, year, month) : self.year = year self.month = month