[CalendarServer-changes] [5189] CalendarServer/trunk/twext/python

source_changes at macosforge.org source_changes at macosforge.org
Tue Feb 23 13:20:05 PST 2010


Revision: 5189
          http://trac.macosforge.org/projects/calendarserver/changeset/5189
Author:   wsanchez at apple.com
Date:     2010-02-23 13:20:04 -0800 (Tue, 23 Feb 2010)
Log Message:
-----------
Switch to rich comparison, add comparison tests.

Modified Paths:
--------------
    CalendarServer/trunk/twext/python/datetime.py
    CalendarServer/trunk/twext/python/test/test_datetime.py

Modified: CalendarServer/trunk/twext/python/datetime.py
===================================================================
--- CalendarServer/trunk/twext/python/datetime.py	2010-02-23 15:17:52 UTC (rev 5188)
+++ CalendarServer/trunk/twext/python/datetime.py	2010-02-23 21:20:04 UTC (rev 5189)
@@ -30,12 +30,14 @@
 from vobject.icalendar import dateTimeToString, dateToString, utc
 
 
+# FIXME, add constants for begining/end of time
+
 class dateordatetime(object):
     def __init__(self, dateOrDatetime, defaultTZ=None):
         """
         @param dateOrDatetime: a L{date} or L{datetime}.
         """
-        assert dateOrDatetime is not None
+        assert dateOrDatetime is not None, "dateOrDatetime is None"
 
         self._dateOrDatetime = dateOrDatetime
         if isinstance(dateOrDatetime, datetime):
@@ -68,22 +70,41 @@
 
     def __eq__(self, other):
         if isinstance(other, dateordatetime):
-            other = other.dateOrDatetime
+            other = other.dateOrDatetime()
         return self._dateOrDatetime == other
 
-    def __cmp__(self, other):
-        if not isinstance(other, (date, datetime, dateordatetime)):
+    def __ne__(self, other):
+        if isinstance(other, dateordatetime):
+            other = other.dateOrDatetime
+        return self._dateOrDatetime != other
+
+    def __lt__(self, other):
+        if not isinstance(other, comparableTypes):
             return NotImplemented
+        dt1, dt2 = self._comparableDatetimes(other)
+        return dt1 < dt2
 
+    def __le__(self, other):
+        if not isinstance(other, comparableTypes):
+            return NotImplemented
         dt1, dt2 = self._comparableDatetimes(other)
+        return dt1 <= dt2
 
-        if dt1 == dt2:
-            return 0
-        elif dt1 < dt2:
-            return -1
-        else:
-            return 1
+    def __gt__(self, other):
+        if not isinstance(other, comparableTypes):
+            return NotImplemented
+        dt1, dt2 = self._comparableDatetimes(other)
+        return dt1 > dt2
 
+    def __ge__(self, other):
+        if not isinstance(other, comparableTypes):
+            return NotImplemented
+        dt1, dt2 = self._comparableDatetimes(other)
+        return dt1 >= dt2
+
+    def __hash__(self):
+        return self._dateOrDatetime.__hash__()
+
     def __sub__(self, other):
         if not isinstance(other, (date, datetime, dateordatetime)):
             return NotImplemented
@@ -126,7 +147,9 @@
     def asUTC(self):
         return self.asTimeZone(utc)
 
+comparableTypes = (date, datetime, dateordatetime)
 
+
 class timerange(object):
     def __init__(self, start=None, end=None, duration=None):
         """
@@ -135,7 +158,7 @@
         @param duration: a L{timedelta}, L{date} or L{datetime}
         @param tzinfo: a L{tzinfo}
         """
-        assert end is None or duration is None
+        assert end is None or duration is None, "end or duration must be None"
 
         if start is None or isinstance(start, dateordatetime):
             self._start = start

Modified: CalendarServer/trunk/twext/python/test/test_datetime.py
===================================================================
--- CalendarServer/trunk/twext/python/test/test_datetime.py	2010-02-23 15:17:52 UTC (rev 5188)
+++ CalendarServer/trunk/twext/python/test/test_datetime.py	2010-02-23 21:20:04 UTC (rev 5189)
@@ -21,7 +21,7 @@
 from twistedcaldav.test.util import TestCase, testUnimplemented
 
 
-class DateTimeTests(TestCase):
+class DatetimeTests(TestCase):
     def test_date_date(self):
         d = date.today()
         dodt = dateordatetime(d)
@@ -57,6 +57,60 @@
         dodt = dateordatetime(dt, defaultTZ=utc)
         self.assertEquals(dodt.datetime(), dt)
 
+    def test_compare_datetime(self):
+        now = datetime.now()
+
+        first  = dateordatetime(now + timedelta(seconds=8*0))
+        second = dateordatetime(now + timedelta(seconds=8*1))
+        third  = dateordatetime(now + timedelta(seconds=8*2))
+
+        #
+        # date & datetime's comparators do not correctly return
+        # NotImplemented when they should, which breaks comparison
+        # operators if date/datetime is first.  Boo.  Seriously weak.
+        #
+
+        self.assertTrue (first             == first.datetime() )
+       #self.assertTrue (first.datetime()  == first            ) # Bug in datetime
+        self.assertTrue (first             == first.datetime() )
+        self.assertTrue (first             != second.datetime())
+        self.assertTrue (first.datetime()  != second           )
+        self.assertTrue (first             != second           )
+        self.assertTrue (first             <  second           )
+        self.assertTrue (second            <  third            )
+        self.assertTrue (first             <  second.datetime())
+       #self.assertTrue (second.datetime() <  third            ) # Bug in datetime
+        self.assertTrue (first             <  second           )
+        self.assertTrue (second            <  third            )
+       #self.assertTrue (first.datetime()  <  second           )
+        self.assertTrue (second            <  third.datetime() ) # Bug in datetime
+        self.assertTrue (first             <= second           )
+        self.assertTrue (second            <= third            )
+        self.assertTrue (first             <= second.datetime())
+       #self.assertTrue (second.datetime() <= third            ) # Bug in datetime
+        self.assertTrue (first             <= second.datetime())
+       #self.assertTrue (second.datetime() <= third            ) # Bug in datetime
+        self.assertTrue (first             <= second           )
+        self.assertTrue (second            <= third            )
+       #self.assertTrue (first.datetime()  <= second           ) # Bug in datetime
+        self.assertTrue (second            <= third.datetime() )
+        self.assertFalse(first             >  second           )
+        self.assertFalse(second            >  third            )
+        self.assertFalse(first             >  second.datetime())
+       #self.assertFalse(second.datetime() >  third            ) # Bug in datetime
+        self.assertFalse(first             >  second           )
+        self.assertFalse(second            >  third            )
+       #self.assertFalse(first.datetime()  >  second           ) # Bug in datetime
+        self.assertFalse(second            >  third.datetime() )
+        self.assertFalse(first             >= second           )
+        self.assertFalse(second            >= third            )
+        self.assertFalse(first             >= second.datetime())
+       #self.assertFalse(second.datetime() >= third            ) # Bug in datetime
+        self.assertFalse(first             >= second           )
+        self.assertFalse(second            >= third            )
+       #self.assertFalse(first.datetime()  >= second           ) # Bug in datetime
+        self.assertFalse(second            >= third.datetime() )
+
     def test_date_iCalendarString(self):
         d = date(2010, 2, 22)
         dodt = dateordatetime(d)
@@ -85,7 +139,7 @@
     def test_asUTC(self):
         raise NotImplementedError()
 
-class TimeRangeTests(TestCase):
+class TimerangeTests(TestCase):
     def test_start(self):
         start = datetime.now()
         tr = timerange(start=start)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20100223/00c8c126/attachment-0001.html>


More information about the calendarserver-changes mailing list