Example #1
0
 def __iter__ (self) :
     d = CAL.Date_Delta (1)
     f = self.finis
     s = self.start
     while s <= f :
         yield s
         s += d
Example #2
0
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))
Example #3
0
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)
Example #4
0
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)