[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