# HG changeset patch # User Paul Boddie # Date 1463244364 -7200 # Node ID 4c9993fbc5bce6d049d95975cae25148a619c720 # Parent 237e48421b7b1309d49d11cc2c14c4ddc81482d5 Made get_overlapping accept multiple periods for possible future optimisation. Moved the iCalendar recurrence qualifiers test; added a period overlapping test. diff -r 237e48421b7b -r 4c9993fbc5bc imiptools/data.py --- a/imiptools/data.py Sat May 14 00:56:54 2016 +0200 +++ b/imiptools/data.py Sat May 14 18:46:04 2016 +0200 @@ -617,7 +617,7 @@ # Get a constrained view if start and end limits are specified. if period: - periods = freebusy.get_overlapping(period) + periods = freebusy.get_overlapping([period]) else: periods = freebusy diff -r 237e48421b7b -r 4c9993fbc5bc imiptools/handlers/scheduling/common.py --- a/imiptools/handlers/scheduling/common.py Sat May 14 00:56:54 2016 +0200 +++ b/imiptools/handlers/scheduling/common.py Sat May 14 18:46:04 2016 +0200 @@ -55,16 +55,15 @@ for user in users: conflicts[user] = 0 - for period in handler.get_periods(handler.obj): - overlapping = freebusy.get_overlapping(period) + overlapping = freebusy.get_overlapping(handler.get_periods(handler.obj)) - # Where scheduling cannot occur, find the busy potential users. + # Where scheduling cannot occur, find the busy potential users. - if overlapping: - for p in overlapping: - involved = attendee and p.attendee or p.organiser - if conflicts.has_key(involved): - conflicts[involved] += 1 + if overlapping: + for p in overlapping: + involved = attendee and p.attendee or p.organiser + if conflicts.has_key(involved): + conflicts[involved] += 1 return conflicts diff -r 237e48421b7b -r 4c9993fbc5bc imiptools/period.py --- a/imiptools/period.py Sat May 14 00:56:54 2016 +0200 +++ b/imiptools/period.py Sat May 14 18:46:04 2016 +0200 @@ -665,7 +665,7 @@ is set to a true value. """ - overlapping = self.get_overlapping(period) + overlapping = self.get_overlapping([period]) if get_periods: return overlapping @@ -1006,35 +1006,14 @@ last = bisect_right(self.periods, Period(period.get_end(), period.get_end(), period.get_tzid())) return self.periods[:last] - def get_overlapping(self, period): + def get_overlapping(self, periods): """ Return the entries in the collection providing periods overlapping with - 'period'. + the given sorted collection of 'periods'. """ - # Find the range of periods potentially overlapping the period in the - # free/busy collection. - - startpoints = self.periods_until(period) - - # Find the range of periods potentially overlapping the period in a version - # of the free/busy collection sorted according to end datetimes. - - endpoints = [(Period(fb.get_end_point(), fb.get_end_point()), fb) for fb in startpoints] - endpoints.sort() - first = bisect_left(endpoints, (Period(period.get_start_point(), period.get_start_point()),)) - endpoints = endpoints[first:] - - overlapping = set() - - for p, fb in endpoints: - if fb.overlaps(period): - overlapping.add(fb) - - overlapping = list(overlapping) - overlapping.sort() - return overlapping + return get_overlapping(self.periods, periods) def remove_overlapping(self, period): @@ -1042,7 +1021,7 @@ self._check_mutable() - overlapping = self.get_overlapping(period) + overlapping = self.get_overlapping([period]) if overlapping: for fb in overlapping: @@ -1329,25 +1308,32 @@ return map(lambda t: self.make_period(t), self.cursor.fetchall()) - def get_overlapping(self, period): + def get_overlapping(self, periods): """ Return the entries in the collection providing periods overlapping with - 'period'. + the given sorted collection of 'periods'. """ - columns, values = self._get_period_values(period) + overlapping = set() + + for period in periods: + columns, values = self._get_period_values(period) - query, values = self.get_query( - "select %(columns)s from %(table)s :condition" % { - "columns" : self.columnlist(self.period_columns), - "table" : self.table_name - }, - columns, values) + query, values = self.get_query( + "select %(columns)s from %(table)s :condition" % { + "columns" : self.columnlist(self.period_columns), + "table" : self.table_name + }, + columns, values) - self.cursor.execute(query, values) + self.cursor.execute(query, values) + + overlapping.update(map(lambda t: self.make_period(t), self.cursor.fetchall())) - return map(lambda t: self.make_period(t), self.cursor.fetchall()) + overlapping = list(overlapping) + overlapping.sort() + return overlapping def remove_overlapping(self, period): @@ -1437,6 +1423,37 @@ pass +def get_overlapping(first, second): + + """ + Return the entries in the sorted 'first' collection that are overlapping + with the given sorted 'second' collection. + """ + + if not first or not second: + return [] + + # Examine each period in the second collection, attempting to match periods + # in the first collection. + + overlapping = set() + + for p2 in second: + last_point = p2.get_end_point() + + # Examine the first collection up to the point where no matches will + # occur. + + for p1 in first: + if p1.get_start_point() > last_point: + break + elif p1.overlaps(p2): + overlapping.add(p1) + + overlapping = list(overlapping) + overlapping.sort() + return overlapping + # Period layout. def get_scale(periods, tzid, view_period=None): diff -r 237e48421b7b -r 4c9993fbc5bc imipweb/calendar.py --- a/imipweb/calendar.py Sat May 14 00:56:54 2016 +0200 +++ b/imipweb/calendar.py Sat May 14 18:46:04 2016 +0200 @@ -327,8 +327,8 @@ view_end = view_period.get_end() duration = view_period.get_duration() - preceding_events = view_start and freebusy.get_overlapping(Period(None, view_start, self.get_tzid())) or [] - following_events = view_end and freebusy.get_overlapping(Period(view_end, None, self.get_tzid())) or [] + preceding_events = view_start and freebusy.get_overlapping([Period(None, view_start, self.get_tzid())]) or [] + following_events = view_end and freebusy.get_overlapping([Period(view_end, None, self.get_tzid())]) or [] last_preceding = preceding_events and to_date(preceding_events[-1].get_end()) + timedelta(1) or None first_following = following_events and to_date(following_events[0].get_start()) or None @@ -491,7 +491,7 @@ # Filter periods outside the given view. if view_period: - periods = periods.get_overlapping(view_period) + periods = periods.get_overlapping([view_period]) # Get the time scale with start and end points. diff -r 237e48421b7b -r 4c9993fbc5bc tests/internal/periods.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/internal/periods.py Sat May 14 18:46:04 2016 +0200 @@ -0,0 +1,102 @@ +#!/usr/bin/env python + +""" +Test periods. + +Copyright (C) 2016 Paul Boddie + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 3 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +details. + +You should have received a copy of the GNU General Public License along with +this program. If not, see . +""" + +from imiptools.dates import format_datetime +from imiptools.period import Period, get_overlapping + +l1 = [ + Period("20160501T020000Z", "20160501T045000Z"), + Period("20160501T023000Z", "20160501T030000Z"), + Period("20160501T024500Z", "20160501T031500Z"), + Period("20160501T040000Z", "20160501T043000Z"), + Period("20160501T050000Z", "20160501T060000Z"), + Period("20160501T051500Z", "20160501T054500Z"), + Period("20160501T052000Z", "20160501T053000Z"), + Period("20160501T090000Z", "20160501T093000Z"), + Period("20160501T094000Z", "20160501T104000Z"), + Period("20160501T100000Z", "20160501T110000Z"), + ] + +l2 = [ + Period("20160501T010000Z", "20160501T020000Z"), + Period("20160501T013000Z", "20160501T014000Z"), + Period("20160501T014000Z", "20160501T015000Z"), + Period("20160501T020000Z", "20160501T033000Z"), + Period("20160501T040000Z", "20160501T044000Z"), + Period("20160501T050000Z", "20160501T051000Z"), + Period("20160501T052000Z", "20160501T053000Z"), + Period("20160501T085900Z", "20160501T090000Z"), + Period("20160501T085900Z", "20160501T090100Z"), + Period("20160501T100000Z", "20160501T110000Z"), + ] + +o1 = [ + Period("20160501T020000Z", "20160501T045000Z"), + Period("20160501T023000Z", "20160501T030000Z"), + Period("20160501T024500Z", "20160501T031500Z"), + Period("20160501T040000Z", "20160501T043000Z"), + Period("20160501T050000Z", "20160501T060000Z"), + Period("20160501T051500Z", "20160501T054500Z"), + Period("20160501T052000Z", "20160501T053000Z"), + Period("20160501T090000Z", "20160501T093000Z"), + Period("20160501T094000Z", "20160501T104000Z"), + Period("20160501T100000Z", "20160501T110000Z"), + ] + +o2 = [ + Period("20160501T020000Z", "20160501T033000Z"), + Period("20160501T040000Z", "20160501T044000Z"), + Period("20160501T050000Z", "20160501T051000Z"), + Period("20160501T052000Z", "20160501T053000Z"), + Period("20160501T085900Z", "20160501T090100Z"), + Period("20160501T100000Z", "20160501T110000Z"), + ] + +print o1 == get_overlapping(l1, l2) + +for p in get_overlapping(l1, l2): + print format_datetime(p.get_start_point()), format_datetime(p.get_end_point()) + +print "----" + +print o2 == get_overlapping(l2, l1) + +for p in get_overlapping(l2, l1): + print format_datetime(p.get_start_point()), format_datetime(p.get_end_point()) + +print "----" + +l1[0] = Period("20160501T020000Z", "20160501T120000Z") +o1[0] = l1[0] +print o1 == get_overlapping(l1, l2) + +for p in get_overlapping(l1, l2): + print format_datetime(p.get_start_point()), format_datetime(p.get_end_point()) + +print "----" + +o2 = l2[3:] +print o2 == get_overlapping(l2, l1) + +for p in get_overlapping(l2, l1): + print format_datetime(p.get_start_point()), format_datetime(p.get_end_point()) + +# vim: tabstop=4 expandtab shiftwidth=4 diff -r 237e48421b7b -r 4c9993fbc5bc tests/internal/qualifiers.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/internal/qualifiers.py Sat May 14 18:46:04 2016 +0200 @@ -0,0 +1,775 @@ +#!/usr/bin/env python + +""" +Test qualifiers for recurring events. + +Copyright (C) 2014, 2015 Paul Boddie + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; either version 3 of the License, or (at your option) any later +version. + +This program is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +details. + +You should have received a copy of the GNU General Public License along with +this program. If not, see . +""" + +from vRecurrence import * + +def show(l): + for x in l: + print x + print + +qualifiers = [ + ("YEARLY", {"interval" : 1}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 11, 2) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (2003, 12, 24)) +print len(l) == 7, 7, len(l) +print l[0] == (1997, 11, 2), (1997, 11, 2), l[0] +print l[-1] == (2003, 11, 2), (2003, 11, 2), l[-1] +print + +qualifiers = [ + ("YEARLY", {"interval" : 2}), + ("BYMONTH", {"values" : [1]}), + ("BYDAY", {"values" : [(6, None)]}), + ("BYHOUR", {"values" : [8, 9]}), + ("BYMINUTE", {"values" : [30]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 1, 5, 8, 30, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (2003, 12, 24, 0, 0, 0)) +print len(l) == 32, 32, len(l) +print l[0] == (1997, 1, 11, 8, 30, 0), (1997, 1, 11, 8, 30, 0), l[0] +print l[-1] == (2003, 1, 25, 9, 30, 0), (2003, 1, 25, 9, 30, 0), l[-1] +print + +qualifiers = [ + ("DAILY", {"interval" : 1}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 2, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1997, 12, 24), 10) +print len(l) == 10, 10, len(l) +print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] +print l[-1] == (1997, 9, 11, 9, 0, 0), (1997, 9, 11, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("DAILY", {"interval" : 1}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 2, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1997, 12, 24, 0, 0, 0)) +print len(l) == 113, 113, len(l) +print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] +print l[-1] == (1997, 12, 23, 9, 0, 0), (1997, 12, 23, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("DAILY", {"interval" : 2}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 2, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1997, 12, 24, 0, 0, 0)) +print len(l) == 57, 57, len(l) +print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] +print l[-1] == (1997, 12, 23, 9, 0, 0), (1997, 12, 23, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("WEEKLY", {"interval" : 1}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 2, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1997, 12, 24, 0, 0, 0)) +print len(l) == 17, 17, len(l) +print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] +print l[-1] == (1997, 12, 23, 9, 0, 0), (1997, 12, 23, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("DAILY", {"interval" : 10}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 2, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1997, 12, 24, 0, 0, 0), 5) +print len(l) == 5, 5, len(l) +print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] +print l[-1] == (1997, 10, 12, 9, 0, 0), (1997, 10, 12, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("YEARLY", {"interval" : 1}), + ("BYMONTH", {"values" : [1]}), + ("BYDAY", {"values" : [(1, None), (2, None), (3, None), (4, None), (5, None), (6, None), (7, None)]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1998, 1, 1, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (2000, 1, 31, 14, 0, 0)) +print len(l) == 93, 93, len(l) +print l[0] == (1998, 1, 1, 9, 0, 0), (1998, 1, 1, 9, 0, 0), l[0] +print l[-1] == (2000, 1, 31, 9, 0, 0), (2000, 1, 31, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("DAILY", {"interval" : 1}), + ("BYMONTH", {"values" : [1]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1998, 1, 1, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (2000, 1, 31, 14, 0, 0)) +print len(l) == 93, 93, len(l) +print l[0] == (1998, 1, 1, 9, 0, 0), (1998, 1, 1, 9, 0, 0), l[0] +print l[-1] == (2000, 1, 31, 9, 0, 0), (2000, 1, 31, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("WEEKLY", {"interval" : 1}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 2, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1997, 12, 24, 0, 0, 0), 10) +print len(l) == 10, 10, len(l) +print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] +print l[-1] == (1997, 11, 4, 9, 0, 0), (1997, 11, 4, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("WEEKLY", {"interval" : 1}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 2, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1997, 12, 24, 0, 0, 0)) +print len(l) == 17, 17, len(l) +print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] +print l[-1] == (1997, 12, 23, 9, 0, 0), (1997, 12, 23, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("WEEKLY", {"interval" : 2}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 2, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1998, 2, 20, 0, 0, 0)) +print len(l) == 13, 13, len(l) +print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] +print l[-1] == (1998, 2, 17, 9, 0, 0), (1998, 2, 17, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("WEEKLY", {"interval" : 1}), + ("BYDAY", {"values" : [(2, None), (4, None)]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 2, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1997, 10, 7, 9, 0, 0)) +print len(l) == 10, 10, len(l) +print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] +print l[-1] == (1997, 10, 2, 9, 0, 0), (1997, 10, 2, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("WEEKLY", {"interval" : 1}), + ("BYDAY", {"values" : [(2, None), (4, None)]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 2, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1997, 12, 24, 0, 0, 0), 10) +print len(l) == 10, 10, len(l) +print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] +print l[-1] == (1997, 10, 2, 9, 0, 0), (1997, 10, 2, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("WEEKLY", {"interval" : 2}), + ("BYDAY", {"values" : [(1, None), (3, None), (5, None)]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 1, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1997, 12, 24, 0, 0, 0)) +print len(l) == 25, 25, len(l) +print l[0] == (1997, 9, 1, 9, 0, 0), (1997, 9, 1, 9, 0, 0), l[0] +print l[-1] == (1997, 12, 22, 9, 0, 0), (1997, 12, 22, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("WEEKLY", {"interval" : 2}), + ("BYDAY", {"values" : [(2, None), (4, None)]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 2, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1997, 12, 24, 0, 0, 0), 8) +print len(l) == 8, 8, len(l) +print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] +print l[-1] == (1997, 10, 16, 9, 0, 0), (1997, 10, 16, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("MONTHLY", {"interval" : 1}), + ("BYDAY", {"values" : [(5, 1)]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 5, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1998, 12, 24, 0, 0, 0), 10) +print len(l) == 10, 10, len(l) +print l[0] == (1997, 9, 5, 9, 0, 0), (1997, 9, 5, 9, 0, 0), l[0] +print l[-1] == (1998, 6, 5, 9, 0, 0), (1998, 6, 5, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("MONTHLY", {"interval" : 1}), + ("BYDAY", {"values" : [(5, 1)]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 5, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1997, 12, 24, 0, 0, 0)) +print len(l) == 4, 4, len(l) +print l[0] == (1997, 9, 5, 9, 0, 0), (1997, 9, 5, 9, 0, 0), l[0] +print l[-1] == (1997, 12, 5, 9, 0, 0), (1997, 12, 5, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("MONTHLY", {"interval" : 2}), + ("BYDAY", {"values" : [(7, 1), (7, -1)]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 7, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1998, 12, 24, 0, 0, 0), 10) +print len(l) == 10, 10, len(l) +print l[0] == (1997, 9, 7, 9, 0, 0), (1997, 9, 7, 9, 0, 0), l[0] +print l[-1] == (1998, 5, 31, 9, 0, 0), (1998, 5, 31, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("MONTHLY", {"interval" : 1}), + ("BYDAY", {"values" : [(1, -2)]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 22, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1998, 12, 24, 0, 0, 0), 6) +print len(l) == 6, 6, len(l) +print l[0] == (1997, 9, 22, 9, 0, 0), (1997, 9, 22, 9, 0, 0), l[0] +print l[-1] == (1998, 2, 16, 9, 0, 0), (1998, 2, 16, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("MONTHLY", {"interval" : 1}), + ("BYMONTHDAY", {"values" : [-3]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 28, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1998, 12, 24, 0, 0, 0), 6) +print len(l) == 6, 6, len(l) +print l[0] == (1997, 9, 28, 9, 0, 0), (1997, 9, 28, 9, 0, 0), l[0] +print l[-1] == (1998, 2, 26, 9, 0, 0), (1998, 2, 26, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("MONTHLY", {"interval" : 1}), + ("BYMONTHDAY", {"values" : [2, 15]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 2, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1998, 12, 24, 0, 0, 0), 10) +print len(l) == 10, 10, len(l) +print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] +print l[-1] == (1998, 1, 15, 9, 0, 0), (1998, 1, 15, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("MONTHLY", {"interval" : 1}), + ("BYMONTHDAY", {"values" : [1, -1]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 30, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1998, 12, 24, 0, 0, 0), 10) +print len(l) == 10, 10, len(l) +print l[0] == (1997, 9, 30, 9, 0, 0), (1997, 9, 30, 9, 0, 0), l[0] +print l[-1] == (1998, 2, 1, 9, 0, 0), (1998, 2, 1, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("MONTHLY", {"interval" : 18}), + ("BYMONTHDAY", {"values" : [10, 11, 12, 13, 14, 15]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 10, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1999, 12, 24, 0, 0, 0), 10) +print len(l) == 10, 10, len(l) +print l[0] == (1997, 9, 10, 9, 0, 0), (1997, 9, 10, 9, 0, 0), l[0] +print l[-1] == (1999, 3, 13, 9, 0, 0), (1999, 3, 13, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("MONTHLY", {"interval" : 2}), + ("BYDAY", {"values" : [(2, None)]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 2, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1998, 4, 1, 0, 0, 0)) +print len(l) == 18, 18, len(l) +print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] +print l[-1] == (1998, 3, 31, 9, 0, 0), (1998, 3, 31, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("YEARLY", {"interval" : 1}), + ("BYMONTH", {"values" : [6, 7]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 6, 10, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (2001, 12, 24, 0, 0, 0), 10) +print len(l) == 10, 10, len(l) +print l[0] == (1997, 6, 10, 9, 0, 0), (1997, 6, 10, 9, 0, 0), l[0] +print l[-1] == (2001, 7, 10, 9, 0, 0), (2001, 7, 10, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("YEARLY", {"interval" : 2}), + ("BYMONTH", {"values" : [1, 2, 3]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 3, 10, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (2003, 12, 24, 0, 0, 0), 10) +print len(l) == 10, 10, len(l) +print l[0] == (1997, 3, 10, 9, 0, 0), (1997, 3, 10, 9, 0, 0), l[0] +print l[-1] == (2003, 3, 10, 9, 0, 0), (2003, 3, 10, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("YEARLY", {"interval" : 3}), + ("BYYEARDAY", {"values" : [1, 100, 200]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 1, 1, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (2006, 2, 1, 0, 0, 0), 10) +print len(l) == 10, 10, len(l) +print l[0] == (1997, 1, 1, 9, 0, 0), (1997, 1, 1, 9, 0, 0), l[0] +print l[-1] == (2006, 1, 1, 9, 0, 0), (2006, 1, 1, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("YEARLY", {"interval" : 1}), + ("BYDAY", {"values" : [(1, 20)]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 5, 19, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1999, 12, 24, 0, 0, 0)) +print len(l) == 3, 3, len(l) +print l[0] == (1997, 5, 19, 9, 0, 0), (1997, 5, 19, 9, 0, 0), l[0] +print l[-1] == (1999, 5, 17, 9, 0, 0), (1999, 5, 17, 9, 0, 0), l[-1] +print + +""" +qualifiers = [ + ("YEARLY", {"interval" : 1}), + ("BYWEEKNO", {"values" : [20]}), + ("BYDAY", {"values" : [(1, None)]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 5, 12, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1999, 12, 24, 0, 0, 0)) +print len(l) == 3, 3, len(l) +print l[0] == (1997, 5, 12, 9, 0, 0), (1997, 5, 12, 9, 0, 0), l[0] +print l[-1] == (1999, 5, 17, 9, 0, 0), (1999, 5, 17, 9, 0, 0), l[-1] +print +""" + +qualifiers = [ + ("YEARLY", {"interval" : 1}), + ("BYMONTH", {"values" : [3]}), + ("BYDAY", {"values" : [(4, None)]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 3, 13, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1999, 12, 24, 0, 0, 0)) +print len(l) == 11, 11, len(l) +print l[0] == (1997, 3, 13, 9, 0, 0), (1997, 3, 13, 9, 0, 0), l[0] +print l[-1] == (1999, 3, 25, 9, 0, 0), (1999, 3, 25, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("YEARLY", {"interval" : 1}), + ("BYMONTH", {"values" : [6, 7, 8]}), + ("BYDAY", {"values" : [(4, None)]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 6, 5, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1999, 12, 24, 0, 0, 0)) +print len(l) == 39, 39, len(l) +print l[0] == (1997, 6, 5, 9, 0, 0), (1997, 6, 5, 9, 0, 0), l[0] +print l[-1] == (1999, 8, 26, 9, 0, 0), (1999, 8, 26, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("MONTHLY", {"interval" : 1}), + ("BYMONTHDAY", {"values" : [13]}), + ("BYDAY", {"values" : [(5, None)]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 2, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (2000, 12, 24, 0, 0, 0)) +print len(l) == 5, 5, len(l) +print l[0] == (1998, 2, 13, 9, 0, 0), (1998, 2, 13, 9, 0, 0), l[0] +print l[-1] == (2000, 10, 13, 9, 0, 0), (2000, 10, 13, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("MONTHLY", {"interval" : 1}), + ("BYMONTHDAY", {"values" : [7, 8, 9, 10, 11, 12, 13]}), + ("BYDAY", {"values" : [(6, None)]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 13, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1998, 6, 30, 0, 0, 0)) +print len(l) == 10, 10, len(l) +print l[0] == (1997, 9, 13, 9, 0, 0), (1997, 9, 13, 9, 0, 0), l[0] +print l[-1] == (1998, 6, 13, 9, 0, 0), (1998, 6, 13, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("YEARLY", {"interval" : 4}), + ("BYMONTH", {"values" : [11]}), + ("BYMONTHDAY", {"values" : [2, 3, 4, 5, 6, 7, 8]}), + ("BYDAY", {"values" : [(2, None)]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1996, 11, 5, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (2004, 12, 24, 0, 0, 0)) +print len(l) == 3, 3, len(l) +print l[0] == (1996, 11, 5, 9, 0, 0), (1996, 11, 5, 9, 0, 0), l[0] +print l[-1] == (2004, 11, 2, 9, 0, 0), (2004, 11, 2, 9, 0, 0), l[-1] +print + +qualifiers = [ + ("MONTHLY", {"interval" : 1}), + ("BYDAY", {"values" : [(2, None), (3, None), (4, None)]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 4, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1997, 12, 24, 0, 0, 0), 3, [3]) +print len(l) == 3, 3, len(l) +print l[0] == (1997, 9, 4, 9, 0, 0), (1997, 9, 4, 9, 0, 0), l[0] +print l[-1] == (1997, 11, 6, 9, 0, 0), (1997, 11, 6, 9, 0, 0), l[-1] +print + +l2 = l + +qualifiers = [ + ("MONTHLY", {"interval" : 1}), + ("BYDAY", {"values" : [(1, None), (2, None), (3, None), (4, None), (5, None)]}) + ] + +l = order_qualifiers(qualifiers) +show(l) +dt = (1997, 9, 29, 9, 0, 0) +l = get_datetime_structure(dt) +show(l) +l = combine_datetime_with_qualifiers(dt, qualifiers) +show(l) + +s = get_selector(dt, qualifiers) +l = s.materialise(dt, (1998, 4, 1, 0, 0, 0), None, [-2]) +print len(l) == 7, 7, len(l) +print l[0] == (1997, 9, 29, 9, 0, 0), (1997, 9, 29, 9, 0, 0), l[0] +print l[-1] == (1998, 3, 30, 9, 0, 0), (1998, 3, 30, 9, 0, 0), l[-1] +print + +# vim: tabstop=4 expandtab shiftwidth=4 diff -r 237e48421b7b -r 4c9993fbc5bc tests/qualifiers.py --- a/tests/qualifiers.py Sat May 14 00:56:54 2016 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,775 +0,0 @@ -#!/usr/bin/env python - -""" -Test qualifiers for recurring events. - -Copyright (C) 2014, 2015 Paul Boddie - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; either version 3 of the License, or (at your option) any later -version. - -This program is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU General Public License for more -details. - -You should have received a copy of the GNU General Public License along with -this program. If not, see . -""" - -from vRecurrence import * - -def show(l): - for x in l: - print x - print - -qualifiers = [ - ("YEARLY", {"interval" : 1}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 11, 2) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (2003, 12, 24)) -print len(l) == 7, 7, len(l) -print l[0] == (1997, 11, 2), (1997, 11, 2), l[0] -print l[-1] == (2003, 11, 2), (2003, 11, 2), l[-1] -print - -qualifiers = [ - ("YEARLY", {"interval" : 2}), - ("BYMONTH", {"values" : [1]}), - ("BYDAY", {"values" : [(6, None)]}), - ("BYHOUR", {"values" : [8, 9]}), - ("BYMINUTE", {"values" : [30]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 1, 5, 8, 30, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (2003, 12, 24, 0, 0, 0)) -print len(l) == 32, 32, len(l) -print l[0] == (1997, 1, 11, 8, 30, 0), (1997, 1, 11, 8, 30, 0), l[0] -print l[-1] == (2003, 1, 25, 9, 30, 0), (2003, 1, 25, 9, 30, 0), l[-1] -print - -qualifiers = [ - ("DAILY", {"interval" : 1}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 2, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1997, 12, 24), 10) -print len(l) == 10, 10, len(l) -print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] -print l[-1] == (1997, 9, 11, 9, 0, 0), (1997, 9, 11, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("DAILY", {"interval" : 1}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 2, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1997, 12, 24, 0, 0, 0)) -print len(l) == 113, 113, len(l) -print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] -print l[-1] == (1997, 12, 23, 9, 0, 0), (1997, 12, 23, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("DAILY", {"interval" : 2}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 2, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1997, 12, 24, 0, 0, 0)) -print len(l) == 57, 57, len(l) -print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] -print l[-1] == (1997, 12, 23, 9, 0, 0), (1997, 12, 23, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("WEEKLY", {"interval" : 1}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 2, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1997, 12, 24, 0, 0, 0)) -print len(l) == 17, 17, len(l) -print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] -print l[-1] == (1997, 12, 23, 9, 0, 0), (1997, 12, 23, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("DAILY", {"interval" : 10}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 2, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1997, 12, 24, 0, 0, 0), 5) -print len(l) == 5, 5, len(l) -print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] -print l[-1] == (1997, 10, 12, 9, 0, 0), (1997, 10, 12, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("YEARLY", {"interval" : 1}), - ("BYMONTH", {"values" : [1]}), - ("BYDAY", {"values" : [(1, None), (2, None), (3, None), (4, None), (5, None), (6, None), (7, None)]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1998, 1, 1, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (2000, 1, 31, 14, 0, 0)) -print len(l) == 93, 93, len(l) -print l[0] == (1998, 1, 1, 9, 0, 0), (1998, 1, 1, 9, 0, 0), l[0] -print l[-1] == (2000, 1, 31, 9, 0, 0), (2000, 1, 31, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("DAILY", {"interval" : 1}), - ("BYMONTH", {"values" : [1]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1998, 1, 1, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (2000, 1, 31, 14, 0, 0)) -print len(l) == 93, 93, len(l) -print l[0] == (1998, 1, 1, 9, 0, 0), (1998, 1, 1, 9, 0, 0), l[0] -print l[-1] == (2000, 1, 31, 9, 0, 0), (2000, 1, 31, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("WEEKLY", {"interval" : 1}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 2, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1997, 12, 24, 0, 0, 0), 10) -print len(l) == 10, 10, len(l) -print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] -print l[-1] == (1997, 11, 4, 9, 0, 0), (1997, 11, 4, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("WEEKLY", {"interval" : 1}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 2, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1997, 12, 24, 0, 0, 0)) -print len(l) == 17, 17, len(l) -print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] -print l[-1] == (1997, 12, 23, 9, 0, 0), (1997, 12, 23, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("WEEKLY", {"interval" : 2}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 2, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1998, 2, 20, 0, 0, 0)) -print len(l) == 13, 13, len(l) -print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] -print l[-1] == (1998, 2, 17, 9, 0, 0), (1998, 2, 17, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("WEEKLY", {"interval" : 1}), - ("BYDAY", {"values" : [(2, None), (4, None)]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 2, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1997, 10, 7, 9, 0, 0)) -print len(l) == 10, 10, len(l) -print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] -print l[-1] == (1997, 10, 2, 9, 0, 0), (1997, 10, 2, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("WEEKLY", {"interval" : 1}), - ("BYDAY", {"values" : [(2, None), (4, None)]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 2, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1997, 12, 24, 0, 0, 0), 10) -print len(l) == 10, 10, len(l) -print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] -print l[-1] == (1997, 10, 2, 9, 0, 0), (1997, 10, 2, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("WEEKLY", {"interval" : 2}), - ("BYDAY", {"values" : [(1, None), (3, None), (5, None)]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 1, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1997, 12, 24, 0, 0, 0)) -print len(l) == 25, 25, len(l) -print l[0] == (1997, 9, 1, 9, 0, 0), (1997, 9, 1, 9, 0, 0), l[0] -print l[-1] == (1997, 12, 22, 9, 0, 0), (1997, 12, 22, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("WEEKLY", {"interval" : 2}), - ("BYDAY", {"values" : [(2, None), (4, None)]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 2, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1997, 12, 24, 0, 0, 0), 8) -print len(l) == 8, 8, len(l) -print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] -print l[-1] == (1997, 10, 16, 9, 0, 0), (1997, 10, 16, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("MONTHLY", {"interval" : 1}), - ("BYDAY", {"values" : [(5, 1)]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 5, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1998, 12, 24, 0, 0, 0), 10) -print len(l) == 10, 10, len(l) -print l[0] == (1997, 9, 5, 9, 0, 0), (1997, 9, 5, 9, 0, 0), l[0] -print l[-1] == (1998, 6, 5, 9, 0, 0), (1998, 6, 5, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("MONTHLY", {"interval" : 1}), - ("BYDAY", {"values" : [(5, 1)]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 5, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1997, 12, 24, 0, 0, 0)) -print len(l) == 4, 4, len(l) -print l[0] == (1997, 9, 5, 9, 0, 0), (1997, 9, 5, 9, 0, 0), l[0] -print l[-1] == (1997, 12, 5, 9, 0, 0), (1997, 12, 5, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("MONTHLY", {"interval" : 2}), - ("BYDAY", {"values" : [(7, 1), (7, -1)]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 7, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1998, 12, 24, 0, 0, 0), 10) -print len(l) == 10, 10, len(l) -print l[0] == (1997, 9, 7, 9, 0, 0), (1997, 9, 7, 9, 0, 0), l[0] -print l[-1] == (1998, 5, 31, 9, 0, 0), (1998, 5, 31, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("MONTHLY", {"interval" : 1}), - ("BYDAY", {"values" : [(1, -2)]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 22, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1998, 12, 24, 0, 0, 0), 6) -print len(l) == 6, 6, len(l) -print l[0] == (1997, 9, 22, 9, 0, 0), (1997, 9, 22, 9, 0, 0), l[0] -print l[-1] == (1998, 2, 16, 9, 0, 0), (1998, 2, 16, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("MONTHLY", {"interval" : 1}), - ("BYMONTHDAY", {"values" : [-3]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 28, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1998, 12, 24, 0, 0, 0), 6) -print len(l) == 6, 6, len(l) -print l[0] == (1997, 9, 28, 9, 0, 0), (1997, 9, 28, 9, 0, 0), l[0] -print l[-1] == (1998, 2, 26, 9, 0, 0), (1998, 2, 26, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("MONTHLY", {"interval" : 1}), - ("BYMONTHDAY", {"values" : [2, 15]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 2, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1998, 12, 24, 0, 0, 0), 10) -print len(l) == 10, 10, len(l) -print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] -print l[-1] == (1998, 1, 15, 9, 0, 0), (1998, 1, 15, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("MONTHLY", {"interval" : 1}), - ("BYMONTHDAY", {"values" : [1, -1]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 30, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1998, 12, 24, 0, 0, 0), 10) -print len(l) == 10, 10, len(l) -print l[0] == (1997, 9, 30, 9, 0, 0), (1997, 9, 30, 9, 0, 0), l[0] -print l[-1] == (1998, 2, 1, 9, 0, 0), (1998, 2, 1, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("MONTHLY", {"interval" : 18}), - ("BYMONTHDAY", {"values" : [10, 11, 12, 13, 14, 15]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 10, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1999, 12, 24, 0, 0, 0), 10) -print len(l) == 10, 10, len(l) -print l[0] == (1997, 9, 10, 9, 0, 0), (1997, 9, 10, 9, 0, 0), l[0] -print l[-1] == (1999, 3, 13, 9, 0, 0), (1999, 3, 13, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("MONTHLY", {"interval" : 2}), - ("BYDAY", {"values" : [(2, None)]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 2, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1998, 4, 1, 0, 0, 0)) -print len(l) == 18, 18, len(l) -print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] -print l[-1] == (1998, 3, 31, 9, 0, 0), (1998, 3, 31, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("YEARLY", {"interval" : 1}), - ("BYMONTH", {"values" : [6, 7]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 6, 10, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (2001, 12, 24, 0, 0, 0), 10) -print len(l) == 10, 10, len(l) -print l[0] == (1997, 6, 10, 9, 0, 0), (1997, 6, 10, 9, 0, 0), l[0] -print l[-1] == (2001, 7, 10, 9, 0, 0), (2001, 7, 10, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("YEARLY", {"interval" : 2}), - ("BYMONTH", {"values" : [1, 2, 3]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 3, 10, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (2003, 12, 24, 0, 0, 0), 10) -print len(l) == 10, 10, len(l) -print l[0] == (1997, 3, 10, 9, 0, 0), (1997, 3, 10, 9, 0, 0), l[0] -print l[-1] == (2003, 3, 10, 9, 0, 0), (2003, 3, 10, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("YEARLY", {"interval" : 3}), - ("BYYEARDAY", {"values" : [1, 100, 200]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 1, 1, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (2006, 2, 1, 0, 0, 0), 10) -print len(l) == 10, 10, len(l) -print l[0] == (1997, 1, 1, 9, 0, 0), (1997, 1, 1, 9, 0, 0), l[0] -print l[-1] == (2006, 1, 1, 9, 0, 0), (2006, 1, 1, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("YEARLY", {"interval" : 1}), - ("BYDAY", {"values" : [(1, 20)]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 5, 19, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1999, 12, 24, 0, 0, 0)) -print len(l) == 3, 3, len(l) -print l[0] == (1997, 5, 19, 9, 0, 0), (1997, 5, 19, 9, 0, 0), l[0] -print l[-1] == (1999, 5, 17, 9, 0, 0), (1999, 5, 17, 9, 0, 0), l[-1] -print - -""" -qualifiers = [ - ("YEARLY", {"interval" : 1}), - ("BYWEEKNO", {"values" : [20]}), - ("BYDAY", {"values" : [(1, None)]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 5, 12, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1999, 12, 24, 0, 0, 0)) -print len(l) == 3, 3, len(l) -print l[0] == (1997, 5, 12, 9, 0, 0), (1997, 5, 12, 9, 0, 0), l[0] -print l[-1] == (1999, 5, 17, 9, 0, 0), (1999, 5, 17, 9, 0, 0), l[-1] -print -""" - -qualifiers = [ - ("YEARLY", {"interval" : 1}), - ("BYMONTH", {"values" : [3]}), - ("BYDAY", {"values" : [(4, None)]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 3, 13, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1999, 12, 24, 0, 0, 0)) -print len(l) == 11, 11, len(l) -print l[0] == (1997, 3, 13, 9, 0, 0), (1997, 3, 13, 9, 0, 0), l[0] -print l[-1] == (1999, 3, 25, 9, 0, 0), (1999, 3, 25, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("YEARLY", {"interval" : 1}), - ("BYMONTH", {"values" : [6, 7, 8]}), - ("BYDAY", {"values" : [(4, None)]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 6, 5, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1999, 12, 24, 0, 0, 0)) -print len(l) == 39, 39, len(l) -print l[0] == (1997, 6, 5, 9, 0, 0), (1997, 6, 5, 9, 0, 0), l[0] -print l[-1] == (1999, 8, 26, 9, 0, 0), (1999, 8, 26, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("MONTHLY", {"interval" : 1}), - ("BYMONTHDAY", {"values" : [13]}), - ("BYDAY", {"values" : [(5, None)]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 2, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (2000, 12, 24, 0, 0, 0)) -print len(l) == 5, 5, len(l) -print l[0] == (1998, 2, 13, 9, 0, 0), (1998, 2, 13, 9, 0, 0), l[0] -print l[-1] == (2000, 10, 13, 9, 0, 0), (2000, 10, 13, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("MONTHLY", {"interval" : 1}), - ("BYMONTHDAY", {"values" : [7, 8, 9, 10, 11, 12, 13]}), - ("BYDAY", {"values" : [(6, None)]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 13, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1998, 6, 30, 0, 0, 0)) -print len(l) == 10, 10, len(l) -print l[0] == (1997, 9, 13, 9, 0, 0), (1997, 9, 13, 9, 0, 0), l[0] -print l[-1] == (1998, 6, 13, 9, 0, 0), (1998, 6, 13, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("YEARLY", {"interval" : 4}), - ("BYMONTH", {"values" : [11]}), - ("BYMONTHDAY", {"values" : [2, 3, 4, 5, 6, 7, 8]}), - ("BYDAY", {"values" : [(2, None)]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1996, 11, 5, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (2004, 12, 24, 0, 0, 0)) -print len(l) == 3, 3, len(l) -print l[0] == (1996, 11, 5, 9, 0, 0), (1996, 11, 5, 9, 0, 0), l[0] -print l[-1] == (2004, 11, 2, 9, 0, 0), (2004, 11, 2, 9, 0, 0), l[-1] -print - -qualifiers = [ - ("MONTHLY", {"interval" : 1}), - ("BYDAY", {"values" : [(2, None), (3, None), (4, None)]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 4, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1997, 12, 24, 0, 0, 0), 3, [3]) -print len(l) == 3, 3, len(l) -print l[0] == (1997, 9, 4, 9, 0, 0), (1997, 9, 4, 9, 0, 0), l[0] -print l[-1] == (1997, 11, 6, 9, 0, 0), (1997, 11, 6, 9, 0, 0), l[-1] -print - -l2 = l - -qualifiers = [ - ("MONTHLY", {"interval" : 1}), - ("BYDAY", {"values" : [(1, None), (2, None), (3, None), (4, None), (5, None)]}) - ] - -l = order_qualifiers(qualifiers) -show(l) -dt = (1997, 9, 29, 9, 0, 0) -l = get_datetime_structure(dt) -show(l) -l = combine_datetime_with_qualifiers(dt, qualifiers) -show(l) - -s = get_selector(dt, qualifiers) -l = s.materialise(dt, (1998, 4, 1, 0, 0, 0), None, [-2]) -print len(l) == 7, 7, len(l) -print l[0] == (1997, 9, 29, 9, 0, 0), (1997, 9, 29, 9, 0, 0), l[0] -print l[-1] == (1998, 3, 30, 9, 0, 0), (1998, 3, 30, 9, 0, 0), l[-1] -print - -# vim: tabstop=4 expandtab shiftwidth=4