aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--dateutil/__init__.py2
-rw-r--r--dateutil/rrule.py13
-rw-r--r--dateutil/zoneinfo/__init__.py2
-rw-r--r--setup.py2
-rw-r--r--test.py258
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"]
diff --git a/setup.py b/setup.py
index df1a252..cfd1f44 100644
--- a/setup.py
+++ b/setup.py
@@ -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",
diff --git a/test.py b/test.py
index b007a67..9ff1088 100644
--- a/test.py
+++ b/test.py
@@ -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,