diff --git a/dateutil/relativedelta.py b/dateutil/relativedelta.py index 9735819..47cc1ab 100644 --- a/dateutil/relativedelta.py +++ b/dateutil/relativedelta.py @@ -400,6 +400,7 @@ def __eq__(self, other): self.hours == other.hours and self.minutes == other.minutes and self.seconds == other.seconds and + self.microseconds == other.microseconds and self.leapdays == other.leapdays and self.year == other.year and self.month == other.month and @@ -412,6 +413,46 @@ def __eq__(self, other): def __ne__(self, other): return not self.__eq__(other) + def _has_relative_fields(self): + return self.years != 0 \ + or self.months != 0 + + def _has_nonrelative_fields(self): + return self.days != 0 \ + or self.hours != 0 \ + or self.minutes != 0 \ + or self.seconds != 0 \ + or self.microseconds != 0 + + def _as_months(self): + if self._has_nonrelative_fields(): + raise ValueError, 'Cannot convert nonrelative fields to ms' + return 12 * self.years + self.months + + def _as_ms(self): + if self._has_relative_fields(): + raise ValueError, 'Cannot convert relative fields to ms' + return 24*60 * 60 * 1000 * self.days \ + + 60 * 60 * 1000 * self.hours \ + + 60 * 1000 * self.minutes \ + + 1000 * self.seconds \ + + self.microseconds + + def __cmp__(self, other): + if self == other: + return 0 + + if (self._has_relative_fields() and other._has_nonrelative_fields()) \ + or (self._has_nonrelative_fields() and other._has_relative_fields()): + raise ValueError, 'Cannot compare relativedeltas relative and non relative fields' + + if self._has_relative_fields(): + return self._as_months() - other._as_months() + else: + return self._as_ms() - other._as_ms() + + return 0 + def __div__(self, other): return self.__mul__(1/float(other)) diff --git a/test.py b/test.py index 00e8da6..4a348a7 100755 --- a/test.py +++ b/test.py @@ -154,6 +154,63 @@ def testNonLeapYearDay(self): self.assertEqual(self.today+relativedelta(yearday=261), date(2003, 9, 18)) + def testEqual(self): + self.assertEqual(relativedelta(years=1), relativedelta(years=1)) + self.assertEqual(relativedelta(months=1), relativedelta(months=1)) + self.assertEqual(relativedelta(days=1), relativedelta(days=1)) + self.assertEqual(relativedelta(hours=1), relativedelta(hours=1)) + self.assertEqual(relativedelta(minutes=1), relativedelta(minutes=1)) + self.assertEqual(relativedelta(seconds=1), relativedelta(seconds=1)) + self.assertEqual(relativedelta(microseconds=1), relativedelta(microseconds=1)) + + def testNotEqual(self): + self.assertNotEqual(relativedelta(years=2), relativedelta(years=1)) + self.assertNotEqual(relativedelta(months=2), relativedelta(months=1)) + self.assertNotEqual(relativedelta(days=2), relativedelta(days=1)) + self.assertNotEqual(relativedelta(hours=2), relativedelta(hours=1)) + self.assertNotEqual(relativedelta(minutes=2), relativedelta(minutes=1)) + self.assertNotEqual(relativedelta(seconds=2), relativedelta(seconds=1)) + self.assertNotEqual(relativedelta(microseconds=2), relativedelta(microseconds=1)) + + + def testCompare(self): + self.assertTrue(relativedelta(days=1) > relativedelta(days=0)) + self.assertTrue(relativedelta(days=2) > relativedelta(days=1)) + self.assertTrue(relativedelta(days=1) > relativedelta(days=-1)) + self.assertTrue(relativedelta(days=0) > relativedelta(days=-1)) + self.assertTrue(relativedelta(days=1) > relativedelta(seconds=-24*60*60)) + self.assertTrue(relativedelta(seconds=2*24*60*60) > relativedelta(days=1)) + self.assertTrue(relativedelta(years=1) > relativedelta(months=11)) + self.assertTrue(relativedelta(months=13) > relativedelta(years=1)) + + self.assertTrue(relativedelta(days=0) < relativedelta(days=1)) + self.assertTrue(relativedelta(days=1) < relativedelta(days=2)) + self.assertTrue(relativedelta(days=-1) < relativedelta(days=1)) + self.assertTrue(relativedelta(days=-1) < relativedelta(days=0)) + self.assertTrue(relativedelta(days=1) <= relativedelta(seconds=2*86400)) + + self.assertTrue(relativedelta(days=1) >= relativedelta(days=0)) + self.assertTrue(relativedelta(days=2) >= relativedelta(days=1)) + self.assertTrue(relativedelta(days=1) >= relativedelta(days=-1)) + self.assertTrue(relativedelta(days=0) >= relativedelta(days=-1)) + self.assertTrue(relativedelta(days=0) >= relativedelta(days=0)) + self.assertTrue(relativedelta(days=2) >= relativedelta(seconds=1)) + self.assertTrue(relativedelta(days=2) <= relativedelta(seconds=2*86400)) + + self.assertTrue(relativedelta(days=0) <= relativedelta(days=0)) + self.assertTrue(relativedelta(days=1) <= relativedelta(days=2)) + self.assertTrue(relativedelta(days=-1) <= relativedelta(days=1)) + self.assertTrue(relativedelta(days=-1) <= relativedelta(days=0)) + self.assertTrue(relativedelta(days=0) <= relativedelta(days=0)) + self.assertTrue(relativedelta(days=0) <= relativedelta(days=0)) + self.assertTrue(relativedelta(days=-1) <= relativedelta(days=-1)) + + def testCannotCompare(self): + self.assertRaises(ValueError, relativedelta(days=1).__cmp__, relativedelta(months=1)) + self.assertRaises(ValueError, relativedelta(days=1).__cmp__, relativedelta(years=1)) + self.assertRaises(ValueError, relativedelta(months=1).__cmp__, relativedelta(days=1)) + self.assertRaises(ValueError, relativedelta(years=1).__cmp__, relativedelta(days=1)) + class RRuleTest(unittest.TestCase): def testYearly(self):