# HG changeset patch # User Paul Boddie # Date 1515782117 -3600 # Node ID 857aae8d5942678c7e1d23645d7d86360b33029c # Parent 8b0c1cf12f174101fd8a60c63f34aa867a13d3ee Override frequency qualifiers incompatible with yearday selectors. Added support for serialising selectors, producing RRULE-compatible output. diff -r 8b0c1cf12f17 -r 857aae8d5942 tests/internal/qualifiers.py --- a/tests/internal/qualifiers.py Fri Jan 12 19:33:18 2018 +0100 +++ b/tests/internal/qualifiers.py Fri Jan 12 19:35:17 2018 +0100 @@ -40,6 +40,14 @@ show(csel) return s +def show_result(tests): + result = True + for test, expected, obtained in tests: + result = result and test + print test, expected, obtained + print + return result + def test1(): qualifiers = [ ("YEARLY", {"interval" : 1}) @@ -48,10 +56,9 @@ s = select(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 + return show_result([(len(l) == 7, 7, len(l)), + (l[0] == (1997, 11, 2), (1997, 11, 2), l[0]), + (l[-1] == (2003, 11, 2), (2003, 11, 2), l[-1])]) def test2(): qualifiers = [ @@ -65,10 +72,9 @@ s = select(dt, qualifiers) l = s.materialise(dt, (2003, 12, 24, 0, 0, 0)) - print len(l) == 34, 34, len(l) - print l[0] == (1997, 1, 5, 8, 30, 0), (1997, 1, 5, 8, 30, 0), l[0] - print l[-1] == (2003, 1, 26, 9, 30, 0), (2003, 1, 26, 9, 30, 0), l[-1] - print + return show_result([(len(l) == 34, 34, len(l)), + (l[0] == (1997, 1, 5, 8, 30, 0), (1997, 1, 5, 8, 30, 0), l[0]), + (l[-1] == (2003, 1, 26, 9, 30, 0), (2003, 1, 26, 9, 30, 0), l[-1])]) def test3(): qualifiers = [ @@ -79,10 +85,9 @@ s = select(dt, qualifiers) l = s.materialise(dt, (1997, 12, 24)) - 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 + return show_result([(len(l) == 10, 10, len(l)), + (l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0]), + (l[-1] == (1997, 9, 11, 9, 0, 0), (1997, 9, 11, 9, 0, 0), l[-1])]) def test4(): qualifiers = [ @@ -92,10 +97,9 @@ s = select(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 + return show_result([(len(l) == 113, 113, len(l)), + (l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0]), + (l[-1] == (1997, 12, 23, 9, 0, 0), (1997, 12, 23, 9, 0, 0), l[-1])]) def test5(): qualifiers = get_qualifiers(["FREQ=DAILY", "UNTIL=19971224T000000Z"]) @@ -103,10 +107,9 @@ s = select(dt, qualifiers) l = s.materialise(dt, (1997, 12, 25, 0, 0, 0), True) - 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 + return show_result([(len(l) == 113, 113, len(l)), + (l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0]), + (l[-1] == (1997, 12, 23, 9, 0, 0), (1997, 12, 23, 9, 0, 0), l[-1])]) # See also test43. @@ -118,10 +121,9 @@ s = select(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 + return show_result([(len(l) == 57, 57, len(l)), + (l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0]), + (l[-1] == (1997, 12, 23, 9, 0, 0), (1997, 12, 23, 9, 0, 0), l[-1])]) def test7(): qualifiers = [ @@ -131,10 +133,9 @@ s = select(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 + return show_result([(len(l) == 17, 17, len(l)), + (l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0]), + (l[-1] == (1997, 12, 23, 9, 0, 0), (1997, 12, 23, 9, 0, 0), l[-1])]) def test8(): qualifiers = [ @@ -145,10 +146,9 @@ s = select(dt, qualifiers) l = s.materialise(dt, (1997, 12, 24, 0, 0, 0)) - 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 + return show_result([(len(l) == 5, 5, len(l)), + (l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0]), + (l[-1] == (1997, 10, 12, 9, 0, 0), (1997, 10, 12, 9, 0, 0), l[-1])]) def test9(): qualifiers = [ @@ -160,10 +160,9 @@ s = select(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 + return show_result([(len(l) == 93, 93, len(l)), + (l[0] == (1998, 1, 1, 9, 0, 0), (1998, 1, 1, 9, 0, 0), l[0]), + (l[-1] == (2000, 1, 31, 9, 0, 0), (2000, 1, 31, 9, 0, 0), l[-1])]) def test10(): qualifiers = [ @@ -174,10 +173,9 @@ s = select(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 + return show_result([(len(l) == 93, 93, len(l)), + (l[0] == (1998, 1, 1, 9, 0, 0), (1998, 1, 1, 9, 0, 0), l[0]), + (l[-1] == (2000, 1, 31, 9, 0, 0), (2000, 1, 31, 9, 0, 0), l[-1])]) def test11(): qualifiers = [ @@ -188,10 +186,9 @@ s = select(dt, qualifiers) l = s.materialise(dt, (1997, 12, 24, 0, 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, 11, 4, 9, 0, 0), (1997, 11, 4, 9, 0, 0), l[-1] - print + return show_result([(len(l) == 10, 10, len(l)), + (l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0]), + (l[-1] == (1997, 11, 4, 9, 0, 0), (1997, 11, 4, 9, 0, 0), l[-1])]) def test12(): qualifiers = [ @@ -201,10 +198,9 @@ s = select(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 + return show_result([(len(l) == 17, 17, len(l)), + (l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0]), + (l[-1] == (1997, 12, 23, 9, 0, 0), (1997, 12, 23, 9, 0, 0), l[-1])]) def test13(): qualifiers = [ @@ -214,10 +210,9 @@ s = select(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), (1997, 9, 2), l[0] - print l[-1] == (1997, 12, 23), (1997, 12, 23), l[-1] - print + return show_result([(len(l) == 17, 17, len(l)), + (l[0] == (1997, 9, 2), (1997, 9, 2), l[0]), + (l[-1] == (1997, 12, 23), (1997, 12, 23), l[-1])]) def test14(): qualifiers = [ @@ -227,10 +222,9 @@ s = select(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 + return show_result([(len(l) == 13, 13, len(l)), + (l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0]), + (l[-1] == (1998, 2, 17, 9, 0, 0), (1998, 2, 17, 9, 0, 0), l[-1])]) def test15(): qualifiers = [ @@ -241,10 +235,9 @@ s = select(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 + return show_result([(len(l) == 10, 10, len(l)), + (l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0]), + (l[-1] == (1997, 10, 2, 9, 0, 0), (1997, 10, 2, 9, 0, 0), l[-1])]) def test16(): qualifiers = [ @@ -256,10 +249,9 @@ s = select(dt, qualifiers) l = s.materialise(dt, (1997, 12, 24, 0, 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 + return show_result([(len(l) == 10, 10, len(l)), + (l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0]), + (l[-1] == (1997, 10, 2, 9, 0, 0), (1997, 10, 2, 9, 0, 0), l[-1])]) def test17(): qualifiers = [ @@ -270,10 +262,9 @@ s = select(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 + return show_result([(len(l) == 25, 25, len(l)), + (l[0] == (1997, 9, 1, 9, 0, 0), (1997, 9, 1, 9, 0, 0), l[0]), + (l[-1] == (1997, 12, 22, 9, 0, 0), (1997, 12, 22, 9, 0, 0), l[-1])]) def test18(): qualifiers = [ @@ -285,10 +276,9 @@ s = select(dt, qualifiers) l = s.materialise(dt, (1997, 12, 24, 0, 0, 0)) - 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 + return show_result([(len(l) == 8, 8, len(l)), + (l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0]), + (l[-1] == (1997, 10, 16, 9, 0, 0), (1997, 10, 16, 9, 0, 0), l[-1])]) def test19(): qualifiers = [ @@ -300,10 +290,9 @@ s = select(dt, qualifiers) l = s.materialise(dt, (1998, 12, 24, 0, 0, 0)) - 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 + return show_result([(len(l) == 10, 10, len(l)), + (l[0] == (1997, 9, 5, 9, 0, 0), (1997, 9, 5, 9, 0, 0), l[0]), + (l[-1] == (1998, 6, 5, 9, 0, 0), (1998, 6, 5, 9, 0, 0), l[-1])]) def test20(): qualifiers = [ @@ -314,10 +303,9 @@ s = select(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 + return show_result([(len(l) == 4, 4, len(l)), + (l[0] == (1997, 9, 5, 9, 0, 0), (1997, 9, 5, 9, 0, 0), l[0]), + (l[-1] == (1997, 12, 5, 9, 0, 0), (1997, 12, 5, 9, 0, 0), l[-1])]) def test21(): qualifiers = [ @@ -329,10 +317,9 @@ s = select(dt, qualifiers) l = s.materialise(dt, (1998, 12, 24, 0, 0, 0)) - 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 + return show_result([(len(l) == 10, 10, len(l)), + (l[0] == (1997, 9, 7, 9, 0, 0), (1997, 9, 7, 9, 0, 0), l[0]), + (l[-1] == (1998, 5, 31, 9, 0, 0), (1998, 5, 31, 9, 0, 0), l[-1])]) def test22(): qualifiers = [ @@ -344,10 +331,9 @@ s = select(dt, qualifiers) l = s.materialise(dt, (1998, 12, 24, 0, 0, 0)) - 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 + return show_result([(len(l) == 6, 6, len(l)), + (l[0] == (1997, 9, 22, 9, 0, 0), (1997, 9, 22, 9, 0, 0), l[0]), + (l[-1] == (1998, 2, 16, 9, 0, 0), (1998, 2, 16, 9, 0, 0), l[-1])]) def test23(): qualifiers = [ @@ -359,10 +345,9 @@ s = select(dt, qualifiers) l = s.materialise(dt, (1998, 12, 24, 0, 0, 0)) - 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 + return show_result([(len(l) == 6, 6, len(l)), + (l[0] == (1997, 9, 28, 9, 0, 0), (1997, 9, 28, 9, 0, 0), l[0]), + (l[-1] == (1998, 2, 26, 9, 0, 0), (1998, 2, 26, 9, 0, 0), l[-1])]) def test24(): qualifiers = [ @@ -374,10 +359,9 @@ s = select(dt, qualifiers) l = s.materialise(dt, (1998, 12, 24, 0, 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] == (1998, 1, 15, 9, 0, 0), (1998, 1, 15, 9, 0, 0), l[-1] - print + return show_result([(len(l) == 10, 10, len(l)), + (l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0]), + (l[-1] == (1998, 1, 15, 9, 0, 0), (1998, 1, 15, 9, 0, 0), l[-1])]) def test25(): qualifiers = [ @@ -389,10 +373,9 @@ s = select(dt, qualifiers) l = s.materialise(dt, (1998, 12, 24, 0, 0, 0)) - 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 + return show_result([(len(l) == 10, 10, len(l)), + (l[0] == (1997, 9, 30, 9, 0, 0), (1997, 9, 30, 9, 0, 0), l[0]), + (l[-1] == (1998, 2, 1, 9, 0, 0), (1998, 2, 1, 9, 0, 0), l[-1])]) def test26(): qualifiers = [ @@ -404,10 +387,9 @@ s = select(dt, qualifiers) l = s.materialise(dt, (1999, 12, 24, 0, 0, 0)) - 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 + return show_result([(len(l) == 10, 10, len(l)), + (l[0] == (1997, 9, 10, 9, 0, 0), (1997, 9, 10, 9, 0, 0), l[0]), + (l[-1] == (1999, 3, 13, 9, 0, 0), (1999, 3, 13, 9, 0, 0), l[-1])]) def test27(): qualifiers = [ @@ -418,10 +400,9 @@ s = select(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 + return show_result([(len(l) == 18, 18, len(l)), + (l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0]), + (l[-1] == (1998, 3, 31, 9, 0, 0), (1998, 3, 31, 9, 0, 0), l[-1])]) def test28(): qualifiers = [ @@ -433,10 +414,9 @@ s = select(dt, qualifiers) l = s.materialise(dt, (2001, 12, 24, 0, 0, 0)) - 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 + return show_result([(len(l) == 10, 10, len(l)), + (l[0] == (1997, 6, 10, 9, 0, 0), (1997, 6, 10, 9, 0, 0), l[0]), + (l[-1] == (2001, 7, 10, 9, 0, 0), (2001, 7, 10, 9, 0, 0), l[-1])]) def test29(): qualifiers = [ @@ -448,10 +428,9 @@ s = select(dt, qualifiers) l = s.materialise(dt, (2003, 12, 24, 0, 0, 0)) - 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 + return show_result([(len(l) == 10, 10, len(l)), + (l[0] == (1997, 3, 10, 9, 0, 0), (1997, 3, 10, 9, 0, 0), l[0]), + (l[-1] == (2003, 3, 10, 9, 0, 0), (2003, 3, 10, 9, 0, 0), l[-1])]) def test30(): qualifiers = [ @@ -463,10 +442,9 @@ s = select(dt, qualifiers) l = s.materialise(dt, (2006, 2, 1, 0, 0, 0)) - 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 + return show_result([(len(l) == 10, 10, len(l)), + (l[0] == (1997, 1, 1, 9, 0, 0), (1997, 1, 1, 9, 0, 0), l[0]), + (l[-1] == (2006, 1, 1, 9, 0, 0), (2006, 1, 1, 9, 0, 0), l[-1])]) def test31(): qualifiers = [ @@ -477,10 +455,9 @@ s = select(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 + return show_result([(len(l) == 3, 3, len(l)), + (l[0] == (1997, 5, 19, 9, 0, 0), (1997, 5, 19, 9, 0, 0), l[0]), + (l[-1] == (1999, 5, 17, 9, 0, 0), (1999, 5, 17, 9, 0, 0), l[-1])]) def test32(): qualifiers = [ @@ -493,10 +470,9 @@ """ 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 + return show_result([(len(l) == 3, 3, len(l)), + (l[0] == (1997, 5, 12, 9, 0, 0), (1997, 5, 12, 9, 0, 0), l[0]), + (l[-1] == (1999, 5, 17, 9, 0, 0), (1999, 5, 17, 9, 0, 0), l[-1])]) """ def test33(): @@ -509,10 +485,9 @@ s = select(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 + return show_result([(len(l) == 11, 11, len(l)), + (l[0] == (1997, 3, 13, 9, 0, 0), (1997, 3, 13, 9, 0, 0), l[0]), + (l[-1] == (1999, 3, 25, 9, 0, 0), (1999, 3, 25, 9, 0, 0), l[-1])]) def test34(): qualifiers = [ @@ -524,10 +499,9 @@ s = select(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 + return show_result([(len(l) == 39, 39, len(l)), + (l[0] == (1997, 6, 5, 9, 0, 0), (1997, 6, 5, 9, 0, 0), l[0]), + (l[-1] == (1999, 8, 26, 9, 0, 0), (1999, 8, 26, 9, 0, 0), l[-1])]) def test35(): qualifiers = [ @@ -539,10 +513,9 @@ s = select(dt, qualifiers) l = s.materialise(dt, (2000, 12, 24, 0, 0, 0)) - print len(l) == 6, 6, len(l) - print l[1] == (1998, 2, 13, 9, 0, 0), (1998, 2, 13, 9, 0, 0), l[1] - print l[-1] == (2000, 10, 13, 9, 0, 0), (2000, 10, 13, 9, 0, 0), l[-1] - print + return show_result([(len(l) == 6, 6, len(l)), + (l[1] == (1998, 2, 13, 9, 0, 0), (1998, 2, 13, 9, 0, 0), l[1]), + (l[-1] == (2000, 10, 13, 9, 0, 0), (2000, 10, 13, 9, 0, 0), l[-1])]) def test36(): qualifiers = [ @@ -554,10 +527,9 @@ s = select(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 + return show_result([(len(l) == 10, 10, len(l)), + (l[0] == (1997, 9, 13, 9, 0, 0), (1997, 9, 13, 9, 0, 0), l[0]), + (l[-1] == (1998, 6, 13, 9, 0, 0), (1998, 6, 13, 9, 0, 0), l[-1])]) def test37(): qualifiers = [ @@ -570,10 +542,9 @@ s = select(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 + return show_result([(len(l) == 3, 3, len(l)), + (l[0] == (1996, 11, 5, 9, 0, 0), (1996, 11, 5, 9, 0, 0), l[0]), + (l[-1] == (2004, 11, 2, 9, 0, 0), (2004, 11, 2, 9, 0, 0), l[-1])]) def test38(): qualifiers = [ @@ -586,10 +557,9 @@ s = select(dt, qualifiers) l = s.materialise(dt, (1997, 12, 24, 0, 0, 0)) - 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 + return show_result([(len(l) == 3, 3, len(l)), + (l[0] == (1997, 9, 4, 9, 0, 0), (1997, 9, 4, 9, 0, 0), l[0]), + (l[-1] == (1997, 11, 6, 9, 0, 0), (1997, 11, 6, 9, 0, 0), l[-1])]) def test39(): qualifiers = [ @@ -601,10 +571,9 @@ s = select(dt, qualifiers) l = s.materialise(dt, (1998, 4, 1, 0, 0, 0)) - 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 + return show_result([(len(l) == 7, 7, len(l)), + (l[0] == (1997, 9, 29, 9, 0, 0), (1997, 9, 29, 9, 0, 0), l[0]), + (l[-1] == (1998, 3, 30, 9, 0, 0), (1998, 3, 30, 9, 0, 0), l[-1])]) def test40(): qualifiers = get_qualifiers(["BYMONTHDAY=5", "FREQ=HOURLY", "INTERVAL=12"]) @@ -612,10 +581,9 @@ s = select(dt, qualifiers) l = s.materialise(dt, (2019, 1, 1)) - print len(l) == 37, 37, len(l) - print l[1] == (2017, 7, 5, 0), (2017, 7, 5, 0), l[1] - print l[-1] == (2018, 12, 5, 12), (2018, 12, 5, 12), l[-1] - print + return show_result([(len(l) == 37, 37, len(l)), + (l[1] == (2017, 7, 5, 0), (2017, 7, 5, 0), l[1]), + (l[-1] == (2018, 12, 5, 12), (2018, 12, 5, 12), l[-1])]) def test41(): qualifiers = get_qualifiers(["FREQ=DAILY", "BYMONTH=1"]) @@ -623,10 +591,9 @@ s = select(dt, qualifiers) l = s.materialise(dt, (2019, 1, 1)) - print len(l) == 32, 32, len(l) - print l[1] == (2018, 1, 1), (2018, 1, 1), l[1] - print l[-1] == (2018, 1, 31), (2018, 1, 31), l[-1] - print + return show_result([(len(l) == 32, 32, len(l)), + (l[1] == (2018, 1, 1), (2018, 1, 1), l[1]), + (l[-1] == (2018, 1, 31), (2018, 1, 31), l[-1])]) def test42(): qualifiers = get_qualifiers(["FREQ=MONTHLY", "BYDAY=WE,1FR,2MO,2FR"]) @@ -634,10 +601,9 @@ s = select(dt, qualifiers) l = s.materialise(dt, (2018, 1, 1)) - print len(l) == 18, 18, len(l) - print l[1] == (2017, 10, 18), (2017, 10, 18), l[1] - print l[-1] == (2017, 12, 27), (2017, 12, 27), l[-1] - print + return show_result([(len(l) == 18, 18, len(l)), + (l[1] == (2017, 10, 18), (2017, 10, 18), l[1]), + (l[-1] == (2017, 12, 27), (2017, 12, 27), l[-1])]) def test43(): qualifiers = get_qualifiers(["FREQ=DAILY", "UNTIL=19971224T090000Z"]) @@ -645,13 +611,36 @@ s = select(dt, qualifiers) l = s.materialise(dt, (1997, 12, 25, 0, 0, 0), True) - print len(l) == 114, 114, len(l) - print l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0] - print l[-1] == (1997, 12, 24, 9, 0, 0), (1997, 12, 24, 9, 0, 0), l[-1] - print + return show_result([(len(l) == 114, 114, len(l)), + (l[0] == (1997, 9, 2, 9, 0, 0), (1997, 9, 2, 9, 0, 0), l[0]), + (l[-1] == (1997, 12, 24, 9, 0, 0), (1997, 12, 24, 9, 0, 0), l[-1])]) # See also test5. +def test44(): + qualifiers = get_qualifiers(["FREQ=MONTHLY", "BYDAY=WE,1FR,2MO,2FR"]) + dt = (2017, 10, 15, 9, 30, 0) + s = select(dt, qualifiers) + + l = s.materialise(dt, (2018, 1, 1)) + return show_result([(len(l) == 18, 18, len(l)), + (l[1] == (2017, 10, 18, 9, 30, 0), (2017, 10, 18, 9, 30, 0), l[1]), + (l[-1] == (2017, 12, 27, 9, 30, 0), (2017, 12, 27, 9, 30, 0), l[-1])]) + + # See also test42. + +def test45(): + qualifiers = get_qualifiers(["BYYEARDAY=1,100,200", "COUNT=10"]) + dt = (1997, 1, 1, 9, 0, 0) + s = select(dt, qualifiers) + + l = s.materialise(dt, (2006, 2, 1, 0, 0, 0)) + return show_result([(len(l) == 10, 10, len(l)), + (l[0] == (1997, 1, 1, 9, 0, 0), (1997, 1, 1, 9, 0, 0), l[0]), + (l[-1] == (2006, 1, 1, 9, 0, 0), (2006, 1, 1, 9, 0, 0), l[-1])]) + + # See also test30. + test0 = lambda: 0 # started at 1 above tests = [ @@ -659,7 +648,7 @@ test10, test11, test12, test13, test14, test15, test16, test17, test18, test19, test20, test21, test22, test23, test24, test25, test26, test27, test28, test29, test30, test31, test32, test33, test34, test35, test36, test37, test38, test39, - test40, test41, test42, test43 + test40, test41, test42, test43, test44, test45 ] if __name__ == "__main__": diff -r 8b0c1cf12f17 -r 857aae8d5942 vRecurrence.py --- a/vRecurrence.py Fri Jan 12 19:33:18 2018 +0100 +++ b/vRecurrence.py Fri Jan 12 19:35:17 2018 +0100 @@ -165,6 +165,7 @@ qualifiers = [] frequency = None + have_yearday = False interval = 1 keys = set() @@ -198,6 +199,9 @@ # Accept result set selection, truncation and enumerators as qualifiers. elif key in ("BYSETPOS", "COUNT") or enum.has_key(key): + if key == "BYYEARDAY": + have_yearday = True + values = get_qualifier_values(key, value) # Ignore bad qualifier values. @@ -213,21 +217,7 @@ elif key == "UNTIL": try: - # YYYYMMDD - - if len(value) == 8: - end = map(int, (value[:4], value[4:6], value[6:])) - - # YYYYMMDDTHHMMSS[Z] - - elif len(value) in (15, 16): - end = map(int, (value[:4], value[4:6], value[6:8], value[9:11], value[11:13], value[13:15])) - - else: - continue - - qualifier = (key, {"end" : tuple(end)}) - + qualifier = (key, {"end" : string_to_tuple(value)}) except ValueError: continue @@ -238,6 +228,13 @@ qualifiers.append(qualifier) + # Forbid certain qualifiers with certain frequencies, coercing to + # appropriate frequencies. + + if have_yearday and frequency and frequency[0] in ("WEEKLY", "DAILY"): + i = qualifiers.index(frequency) + del qualifiers[i] + # Parameterise any frequency qualifier with the interval. if frequency: @@ -588,7 +585,10 @@ "Return whether 'from_sel' can be restricted using datetime information." - return not isinstance(from_sel, Pattern) and from_sel.qualifier != "BYDAY" + # Patterns are not restricted by higher-scale datetime information. + # BYDAY qualifiers are also not restricted by such information. + + return not isinstance(from_sel, Pattern) and from_sel.qualifier not in ("BYDAY", "BYYEARDAY") def add_initial_selector(from_sel, level, l): @@ -843,6 +843,33 @@ else: return last_day - timedelta(last_weekday - weekday) +def tuple_to_string(t): + + "Return datetime or date tuple 't' as a string." + + if len(t) >= 6: + return "%04d%02d%02dT%02d%02d%02d" % t + elif len(t) >= 3: + return "%04d%02d%02d" % t + else: + return None + +def string_to_tuple(s): + + "Return 's' as a datetime or date tuple." + + # YYYYMMDD + + if len(s) == 8: + return tuple(map(int, (s[:4], s[4:6], s[6:]))) + + # YYYYMMDDTHHMMSS[Z] + + elif len(s) in (15, 16): + return tuple(map(int, (s[:4], s[4:6], s[6:8], s[9:11], s[11:13], s[13:15]))) + + raise ValueError + # Value expansion and sorting. def sort_values(values, limit=None): @@ -1046,6 +1073,14 @@ def as_tuple(self): return self.level, self.args, self.qualifier, self.selecting, self.first + # Serialisation support. + + def to_property(self): + return ("FREQ=%s" % self.qualifier, "INTERVAL=%d" % self.get_interval()) + + def to_string(self): + return ";".join(self.to_property()) + class Enum(Selector): "A generic value selector." @@ -1061,6 +1096,11 @@ def get_values(self, limit=None): return sort_values(self.args["values"], limit) + # Serialisation support. + + def to_property(self): + return ("%s=%s" % (self.qualifier, ",".join(map(str, self.get_values()))), ) + class WeekDayFilter(Enum): "A selector of instances specified in terms of day numbers." @@ -1113,6 +1153,14 @@ values.append(value) return values + # Serialisation support. + + def to_property(self): + values = [] + for (value, index) in self.get_values(): + values.append("%d%s" % (index, weekday_values[value - 1])) + return ("%s=%s" % (self.qualifier, ",".join(values)), ) + class MonthDayFilter(Enum): "A selector of month days." @@ -1145,6 +1193,11 @@ def set_limit(self, limit): self.args["values"] = [limit] + # Serialisation support. + + def to_property(self): + return ("%s=%d" % (self.qualifier, self.get_limit()), ) + class PositionSelector(Selector): "A result set position selector." @@ -1170,6 +1223,11 @@ def set_positions(self, positions): self.args["values"] = positions + # Serialisation support. + + def to_property(self): + return ("%s=%s" % (self.qualifier, ",".join(self.get_positions())), ) + class StartSelector(Selector): "A selector ensuring that the start occurrence is included." @@ -1181,6 +1239,11 @@ def get_start(self): return self.args["start"] + # Serialisation support. + + def to_property(self): + return ("%s=%s" % (self.qualifier, tuple_to_string(self.get_start())), ) + class UntilSelector(Selector): "A selector ensuring that the until datetime is not passed." @@ -1192,6 +1255,11 @@ def get_end(self): return self.args["end"] + # Serialisation support. + + def to_property(self): + return ("%s=%s" % (self.qualifier, tuple_to_string(self.get_end())), ) + special_enum_levels = { "BYDAY" : WeekDayFilter, "BYMONTHDAY" : MonthDayFilter, @@ -1666,4 +1734,24 @@ else: return [selector] +def to_property(selectors): + + "Return a list of qualifier assignments for 'selectors'." + + if isinstance(selectors, Selector): + selectors = get_selectors_from_selector(selectors) + + t = () + + for selector in selectors: + t += selector.to_property() + + return t + +def to_string(selectors): + + "Return a string representation of 'selectors'." + + return ";".join(to_property(selectors)) + # vim: tabstop=4 expandtab shiftwidth=4