- Fixed support for negative byyearday in rrule.
- New tests for negative byyearday.
- Fixed some email references.
- Updating version to 1.2.
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 @@
 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 @@
             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 _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 @@
         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 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 @@
 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 @@
 
     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 @@
 
     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),
+                              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 testMonthlyByMonthAndYearDayNeg(self):
+        self.assertEqual(list(rrule(MONTHLY,
+                              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 testMonthlyByWeekNo(self):
         self.assertEqual(list(rrule(MONTHLY,
@@ -893,22 +940,45 @@
 
     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 @@
 
     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),
+                              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 testDailyByMonthAndYearDayNeg(self):
+        self.assertEqual(list(rrule(DAILY,
+                              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 testDailyByWeekNo(self):
         self.assertEqual(list(rrule(DAILY,
@@ -1475,22 +1568,45 @@
 
     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),
+                              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, 2, 0),
+                          datetime(1998, 4, 10, 3, 0)])
+
+    def testHourlyByMonthAndYearDayNeg(self):
+        self.assertEqual(list(rrule(HOURLY,
+                              count=4,
+                              bymonth=(4,7),
+                              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, 3, 0)])
 
     def testHourlyByWeekNo(self):
         self.assertEqual(list(rrule(HOURLY,
@@ -1762,22 +1878,45 @@
 
     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),
+                              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, 2),
+                          datetime(1998, 4, 10, 0, 3)])
+
+    def testMinutelyByMonthAndYearDayNeg(self):
+        self.assertEqual(list(rrule(MINUTELY,
+                              count=4,
+                              bymonth=(4,7),
+                              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, 3)])
 
     def testMinutelyByWeekNo(self):
         self.assertEqual(list(rrule(MINUTELY,
@@ -2048,22 +2187,45 @@
 
     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),
+                              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, 2),
+                          datetime(1998, 4, 10, 0, 0, 3)])
+
+    def testSecondlyByMonthAndYearDayNeg(self):
+        self.assertEqual(list(rrule(SECONDLY,
+                              count=4,
+                              bymonth=(4,7),
+                              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, 3)])
 
     def testSecondlyByWeekNo(self):
         self.assertEqual(list(rrule(SECONDLY,