diff options
-rw-r--r-- | dateutil/__init__.py | 2 | ||||
-rw-r--r-- | dateutil/rrule.py | 13 | ||||
-rw-r--r-- | dateutil/zoneinfo/__init__.py | 2 | ||||
-rw-r--r-- | setup.py | 2 | ||||
-rw-r--r-- | test.py | 258 |
5 files changed, 222 insertions, 55 deletions
diff --git a/dateutil/__init__.py b/dateutil/__init__.py index fc548f9..84d7c3e 100644 --- a/dateutil/__init__.py +++ b/dateutil/__init__.py @@ -4,5 +4,5 @@ Copyright (c) 2003-2005 Gustavo Niemeyer <gustavo@niemeyer.net> This module offers extensions to the standard python 2.3+ datetime module. """ -__author__ = "Gustavo Niemeyer <niemeyer@conectiva.com>" +__author__ = "Gustavo Niemeyer <gustavo@niemeyer.net>" __license__ = "PSF License" diff --git a/dateutil/rrule.py b/dateutil/rrule.py index 04e1662..108b536 100644 --- a/dateutil/rrule.py +++ b/dateutil/rrule.py @@ -448,14 +448,18 @@ class rrule(rrulebase): for i in dayset[start:end]: if ((bymonth and ii.mmask[i] not in bymonth) or (byweekno and not ii.wnomask[i]) or - (byyearday and (i%ii.yearlen)+1 not in byyearday - and -ii.yearlen+i not in byyearday) or (byweekday and ii.wdaymask[i] not in byweekday) or (ii.nwdaymask and not ii.nwdaymask[i]) or (byeaster and not ii.eastermask[i]) or ((bymonthday or bynmonthday) and ii.mdaymask[i] not in bymonthday and - ii.nmdaymask[i] not in bynmonthday)): + ii.nmdaymask[i] not in bynmonthday) or + (byyearday and + ((i < ii.yearlen and i+1 not in byyearday + and -ii.yearlen+i not in byyearday) or + (i >= ii.yearlen and i+1-ii.yearlen not in byyearday + and -ii.nextyearlen+i-ii.yearlen + not in byyearday)))): dayset[i] = None filtered = True @@ -617,7 +621,7 @@ class rrule(rrulebase): class _iterinfo(object): __slots__ = ["rrule", "lastyear", "lastmonth", - "yearlen", "yearordinal", "yearweekday", + "yearlen", "nextyearlen", "yearordinal", "yearweekday", "mmask", "mrange", "mdaymask", "nmdaymask", "wdaymask", "wnomask", "nwdaymask", "eastermask"] @@ -631,6 +635,7 @@ class _iterinfo(object): rr = self.rrule if year != self.lastyear: self.yearlen = 365+calendar.isleap(year) + self.nextyearlen = 365+calendar.isleap(year+1) firstyday = datetime.date(year, 1, 1) self.yearordinal = firstyday.toordinal() self.yearweekday = firstyday.weekday() diff --git a/dateutil/zoneinfo/__init__.py b/dateutil/zoneinfo/__init__.py index 0cba37d..856fcf1 100644 --- a/dateutil/zoneinfo/__init__.py +++ b/dateutil/zoneinfo/__init__.py @@ -8,7 +8,7 @@ from dateutil.tz import tzfile from tarfile import TarFile import os -__author__ = "Gustavo Niemeyer <niemeyer@conectiva.com>" +__author__ = "Gustavo Niemeyer <gustavo@niemeyer.net>" __license__ = "PSF License" __all__ = ["setcachesize", "gettz", "rebuild"] @@ -13,7 +13,7 @@ PYTHONLIB = join(get_python_lib(standard_lib=1, prefix=''), 'site-packages') ZONEINFO = join("dateutil", "zoneinfo") setup(name="python-dateutil", - version = "1.1", + version = "1.2", description = "Extensions to the standard python 2.3+ datetime module", author = "Gustavo Niemeyer", author_email = "gustavo@niemeyer.net", @@ -278,22 +278,45 @@ class RRuleTest(unittest.TestCase): def testYearlyByYearDay(self): self.assertEqual(list(rrule(YEARLY, - count=3, - byyearday=(1,100,200), + count=4, + byyearday=(1,100,200,365), dtstart=parse("19970902T090000"))), - [datetime(1998, 1, 1, 9, 0), + [datetime(1997, 12, 31, 9, 0), + datetime(1998, 1, 1, 9, 0), + datetime(1998, 4, 10, 9, 0), + datetime(1998, 7, 19, 9, 0)]) + + def testYearlyByYearDayNeg(self): + self.assertEqual(list(rrule(YEARLY, + count=4, + byyearday=(-365,-266,-166,-1), + dtstart=parse("19970902T090000"))), + [datetime(1997, 12, 31, 9, 0), + datetime(1998, 1, 1, 9, 0), datetime(1998, 4, 10, 9, 0), datetime(1998, 7, 19, 9, 0)]) def testYearlyByMonthAndYearDay(self): self.assertEqual(list(rrule(YEARLY, - count=3, + count=4, bymonth=(4,7), - byyearday=(1,100,200), + byyearday=(1,100,200,365), dtstart=parse("19970902T090000"))), [datetime(1998, 4, 10, 9, 0), datetime(1998, 7, 19, 9, 0), - datetime(1999, 4, 10, 9, 0)]) + datetime(1999, 4, 10, 9, 0), + datetime(1999, 7, 19, 9, 0)]) + + def testYearlyByMonthAndYearDayNeg(self): + self.assertEqual(list(rrule(YEARLY, + count=4, + bymonth=(4,7), + byyearday=(-365,-266,-166,-1), + dtstart=parse("19970902T090000"))), + [datetime(1998, 4, 10, 9, 0), + datetime(1998, 7, 19, 9, 0), + datetime(1999, 4, 10, 9, 0), + datetime(1999, 7, 19, 9, 0)]) def testYearlyByWeekNo(self): self.assertEqual(list(rrule(YEARLY, @@ -599,22 +622,46 @@ class RRuleTest(unittest.TestCase): def testMonthlyByYearDay(self): self.assertEqual(list(rrule(MONTHLY, - count=3, - byyearday=(1,100,200), + count=4, + byyearday=(1,100,200,365), dtstart=parse("19970902T090000"))), - [datetime(1998, 1, 1, 9, 0), + [datetime(1997, 12, 31, 9, 0), + datetime(1998, 1, 1, 9, 0), + datetime(1998, 4, 10, 9, 0), + datetime(1998, 7, 19, 9, 0)]) + + def testMonthlyByYearDayNeg(self): + self.assertEqual(list(rrule(MONTHLY, + count=4, + byyearday=(-365,-266,-166,-1), + dtstart=parse("19970902T090000"))), + [datetime(1997, 12, 31, 9, 0), + datetime(1998, 1, 1, 9, 0), datetime(1998, 4, 10, 9, 0), datetime(1998, 7, 19, 9, 0)]) def testMonthlyByMonthAndYearDay(self): self.assertEqual(list(rrule(MONTHLY, - count=3, + count=4, + bymonth=(4,7), + byyearday=(1,100,200,365), + dtstart=parse("19970902T090000"))), + [datetime(1998, 4, 10, 9, 0), + datetime(1998, 7, 19, 9, 0), + datetime(1999, 4, 10, 9, 0), + datetime(1999, 7, 19, 9, 0)]) + + def testMonthlyByMonthAndYearDayNeg(self): + self.assertEqual(list(rrule(MONTHLY, + count=4, bymonth=(4,7), - byyearday=(1,100,200), + byyearday=(-365,-266,-166,-1), dtstart=parse("19970902T090000"))), [datetime(1998, 4, 10, 9, 0), datetime(1998, 7, 19, 9, 0), - datetime(1999, 4, 10, 9, 0)]) + datetime(1999, 4, 10, 9, 0), + datetime(1999, 7, 19, 9, 0)]) + def testMonthlyByWeekNo(self): self.assertEqual(list(rrule(MONTHLY, @@ -893,22 +940,45 @@ class RRuleTest(unittest.TestCase): def testWeeklyByYearDay(self): self.assertEqual(list(rrule(WEEKLY, - count=3, - byyearday=(1,100,200), + count=4, + byyearday=(1,100,200,365), dtstart=parse("19970902T090000"))), - [datetime(1998, 1, 1, 9, 0), + [datetime(1997, 12, 31, 9, 0), + datetime(1998, 1, 1, 9, 0), + datetime(1998, 4, 10, 9, 0), + datetime(1998, 7, 19, 9, 0)]) + + def testWeeklyByYearDayNeg(self): + self.assertEqual(list(rrule(WEEKLY, + count=4, + byyearday=(-365,-266,-166,-1), + dtstart=parse("19970902T090000"))), + [datetime(1997, 12, 31, 9, 0), + datetime(1998, 1, 1, 9, 0), datetime(1998, 4, 10, 9, 0), datetime(1998, 7, 19, 9, 0)]) def testWeeklyByMonthAndYearDay(self): self.assertEqual(list(rrule(WEEKLY, - count=3, + count=4, bymonth=(1,7), - byyearday=(1,100,200), + byyearday=(1,100,200,365), dtstart=parse("19970902T090000"))), [datetime(1998, 1, 1, 9, 0), datetime(1998, 7, 19, 9, 0), - datetime(1999, 1, 1, 9, 0)]) + datetime(1999, 1, 1, 9, 0), + datetime(1999, 7, 19, 9, 0)]) + + def testWeeklyByMonthAndYearDayNeg(self): + self.assertEqual(list(rrule(WEEKLY, + count=4, + bymonth=(1,7), + byyearday=(-365,-266,-166,-1), + dtstart=parse("19970902T090000"))), + [datetime(1998, 1, 1, 9, 0), + datetime(1998, 7, 19, 9, 0), + datetime(1999, 1, 1, 9, 0), + datetime(1999, 7, 19, 9, 0)]) def testWeeklyByWeekNo(self): self.assertEqual(list(rrule(WEEKLY, @@ -1184,22 +1254,45 @@ class RRuleTest(unittest.TestCase): def testDailyByYearDay(self): self.assertEqual(list(rrule(DAILY, - count=3, - byyearday=(1,100,200), + count=4, + byyearday=(1,100,200,365), dtstart=parse("19970902T090000"))), - [datetime(1998, 1, 1, 9, 0), + [datetime(1997, 12, 31, 9, 0), + datetime(1998, 1, 1, 9, 0), + datetime(1998, 4, 10, 9, 0), + datetime(1998, 7, 19, 9, 0)]) + + def testDailyByYearDayNeg(self): + self.assertEqual(list(rrule(DAILY, + count=4, + byyearday=(-365,-266,-166,-1), + dtstart=parse("19970902T090000"))), + [datetime(1997, 12, 31, 9, 0), + datetime(1998, 1, 1, 9, 0), datetime(1998, 4, 10, 9, 0), datetime(1998, 7, 19, 9, 0)]) def testDailyByMonthAndYearDay(self): self.assertEqual(list(rrule(DAILY, - count=3, + count=4, + bymonth=(1,7), + byyearday=(1,100,200,365), + dtstart=parse("19970902T090000"))), + [datetime(1998, 1, 1, 9, 0), + datetime(1998, 7, 19, 9, 0), + datetime(1999, 1, 1, 9, 0), + datetime(1999, 7, 19, 9, 0)]) + + def testDailyByMonthAndYearDayNeg(self): + self.assertEqual(list(rrule(DAILY, + count=4, bymonth=(1,7), - byyearday=(1,100,200), + byyearday=(-365,-266,-166,-1), dtstart=parse("19970902T090000"))), [datetime(1998, 1, 1, 9, 0), datetime(1998, 7, 19, 9, 0), - datetime(1999, 1, 1, 9, 0)]) + datetime(1999, 1, 1, 9, 0), + datetime(1999, 7, 19, 9, 0)]) def testDailyByWeekNo(self): self.assertEqual(list(rrule(DAILY, @@ -1475,22 +1568,45 @@ class RRuleTest(unittest.TestCase): def testHourlyByYearDay(self): self.assertEqual(list(rrule(HOURLY, - count=3, - byyearday=(1,100,200), + count=4, + byyearday=(1,100,200,365), dtstart=parse("19970902T090000"))), - [datetime(1998, 1, 1, 0, 0), - datetime(1998, 1, 1, 1, 0), - datetime(1998, 1, 1, 2, 0)]) + [datetime(1997, 12, 31, 0, 0), + datetime(1997, 12, 31, 1, 0), + datetime(1997, 12, 31, 2, 0), + datetime(1997, 12, 31, 3, 0)]) + + def testHourlyByYearDayNeg(self): + self.assertEqual(list(rrule(HOURLY, + count=4, + byyearday=(-365,-266,-166,-1), + dtstart=parse("19970902T090000"))), + [datetime(1997, 12, 31, 0, 0), + datetime(1997, 12, 31, 1, 0), + datetime(1997, 12, 31, 2, 0), + datetime(1997, 12, 31, 3, 0)]) def testHourlyByMonthAndYearDay(self): self.assertEqual(list(rrule(HOURLY, - count=3, + count=4, + bymonth=(4,7), + byyearday=(1,100,200,365), + dtstart=parse("19970902T090000"))), + [datetime(1998, 4, 10, 0, 0), + datetime(1998, 4, 10, 1, 0), + datetime(1998, 4, 10, 2, 0), + datetime(1998, 4, 10, 3, 0)]) + + def testHourlyByMonthAndYearDayNeg(self): + self.assertEqual(list(rrule(HOURLY, + count=4, bymonth=(4,7), - byyearday=(1,100,200), + byyearday=(-365,-266,-166,-1), dtstart=parse("19970902T090000"))), [datetime(1998, 4, 10, 0, 0), datetime(1998, 4, 10, 1, 0), - datetime(1998, 4, 10, 2, 0)]) + datetime(1998, 4, 10, 2, 0), + datetime(1998, 4, 10, 3, 0)]) def testHourlyByWeekNo(self): self.assertEqual(list(rrule(HOURLY, @@ -1762,22 +1878,45 @@ class RRuleTest(unittest.TestCase): def testMinutelyByYearDay(self): self.assertEqual(list(rrule(MINUTELY, - count=3, - byyearday=(1,100,200), + count=4, + byyearday=(1,100,200,365), dtstart=parse("19970902T090000"))), - [datetime(1998, 1, 1, 0, 0), - datetime(1998, 1, 1, 0, 1), - datetime(1998, 1, 1, 0, 2)]) + [datetime(1997, 12, 31, 0, 0), + datetime(1997, 12, 31, 0, 1), + datetime(1997, 12, 31, 0, 2), + datetime(1997, 12, 31, 0, 3)]) + + def testMinutelyByYearDayNeg(self): + self.assertEqual(list(rrule(MINUTELY, + count=4, + byyearday=(-365,-266,-166,-1), + dtstart=parse("19970902T090000"))), + [datetime(1997, 12, 31, 0, 0), + datetime(1997, 12, 31, 0, 1), + datetime(1997, 12, 31, 0, 2), + datetime(1997, 12, 31, 0, 3)]) def testMinutelyByMonthAndYearDay(self): self.assertEqual(list(rrule(MINUTELY, - count=3, + count=4, + bymonth=(4,7), + byyearday=(1,100,200,365), + dtstart=parse("19970902T090000"))), + [datetime(1998, 4, 10, 0, 0), + datetime(1998, 4, 10, 0, 1), + datetime(1998, 4, 10, 0, 2), + datetime(1998, 4, 10, 0, 3)]) + + def testMinutelyByMonthAndYearDayNeg(self): + self.assertEqual(list(rrule(MINUTELY, + count=4, bymonth=(4,7), - byyearday=(1,100,200), + byyearday=(-365,-266,-166,-1), dtstart=parse("19970902T090000"))), [datetime(1998, 4, 10, 0, 0), datetime(1998, 4, 10, 0, 1), - datetime(1998, 4, 10, 0, 2)]) + datetime(1998, 4, 10, 0, 2), + datetime(1998, 4, 10, 0, 3)]) def testMinutelyByWeekNo(self): self.assertEqual(list(rrule(MINUTELY, @@ -2048,22 +2187,45 @@ class RRuleTest(unittest.TestCase): def testSecondlyByYearDay(self): self.assertEqual(list(rrule(SECONDLY, - count=3, - byyearday=(1,100,200), + count=4, + byyearday=(1,100,200,365), dtstart=parse("19970902T090000"))), - [datetime(1998, 1, 1, 0, 0, 0), - datetime(1998, 1, 1, 0, 0, 1), - datetime(1998, 1, 1, 0, 0, 2)]) + [datetime(1997, 12, 31, 0, 0, 0), + datetime(1997, 12, 31, 0, 0, 1), + datetime(1997, 12, 31, 0, 0, 2), + datetime(1997, 12, 31, 0, 0, 3)]) + + def testSecondlyByYearDayNeg(self): + self.assertEqual(list(rrule(SECONDLY, + count=4, + byyearday=(-365,-266,-166,-1), + dtstart=parse("19970902T090000"))), + [datetime(1997, 12, 31, 0, 0, 0), + datetime(1997, 12, 31, 0, 0, 1), + datetime(1997, 12, 31, 0, 0, 2), + datetime(1997, 12, 31, 0, 0, 3)]) def testSecondlyByMonthAndYearDay(self): self.assertEqual(list(rrule(SECONDLY, - count=3, + count=4, + bymonth=(4,7), + byyearday=(1,100,200,365), + dtstart=parse("19970902T090000"))), + [datetime(1998, 4, 10, 0, 0, 0), + datetime(1998, 4, 10, 0, 0, 1), + datetime(1998, 4, 10, 0, 0, 2), + datetime(1998, 4, 10, 0, 0, 3)]) + + def testSecondlyByMonthAndYearDayNeg(self): + self.assertEqual(list(rrule(SECONDLY, + count=4, bymonth=(4,7), - byyearday=(1,100,200), + byyearday=(-365,-266,-166,-1), dtstart=parse("19970902T090000"))), [datetime(1998, 4, 10, 0, 0, 0), datetime(1998, 4, 10, 0, 0, 1), - datetime(1998, 4, 10, 0, 0, 2)]) + datetime(1998, 4, 10, 0, 0, 2), + datetime(1998, 4, 10, 0, 0, 3)]) def testSecondlyByWeekNo(self): self.assertEqual(list(rrule(SECONDLY, |