wingo - in flumotion/trunk: . flumotion/component/base
flumotion/test
flumotion-commit at lists.fluendo.com
flumotion-commit at lists.fluendo.com
Tue Jun 5 18:22:32 CEST 2007
Author: wingo
Date: Tue Jun 5 18:22:29 2007
New Revision: 5100
Modified:
flumotion/trunk/ChangeLog
flumotion/trunk/flumotion/component/base/scheduler.py
flumotion/trunk/flumotion/test/test_component_base_scheduler.py
Log:
2007-06-05 Andy Wingo <wingo at pobox.com>
* flumotion/component/base/scheduler.py (LocalTimezone): New
class, based on documentation of datetime.tzinfo.
(now): New function, like datetime.now() but returns a datetime
qualified against the local timezone.
(Event.__init__): Make a datetime against the local timezone. If
start or end times lack timezone info, log and interpret them as
being against the local timezone.
(Scheduler.addEvent, Scheduler.replaceEvents)
(Scheduler._reschedule): Make datetimes against the local
timezone.
* flumotion/test/test_component_base_scheduler.py
(EventTest.testSimple, EventTest.testUpdateRecurring)
(EventTest.testComparison, SchedulerTest.testSimple): Use the new
scheduler.now(), which returns a datetime against the local
timezone.
(EventTest.testTimeZones): New test, tests that dates without
timezones are treated as local times.
Modified: flumotion/trunk/ChangeLog
==============================================================================
--- flumotion/trunk/ChangeLog (original)
+++ flumotion/trunk/ChangeLog Tue Jun 5 18:22:29 2007
@@ -1,3 +1,24 @@
+2007-06-05 Andy Wingo <wingo at pobox.com>
+
+ * flumotion/component/base/scheduler.py (LocalTimezone): New
+ class, based on documentation of datetime.tzinfo.
+ (now): New function, like datetime.now() but returns a datetime
+ qualified against the local timezone.
+ (Event.__init__): Make a datetime against the local timezone. If
+ start or end times lack timezone info, log and interpret them as
+ being against the local timezone.
+ (Scheduler.addEvent, Scheduler.replaceEvents)
+ (Scheduler._reschedule): Make datetimes against the local
+ timezone.
+
+ * flumotion/test/test_component_base_scheduler.py
+ (EventTest.testSimple, EventTest.testUpdateRecurring)
+ (EventTest.testComparison, SchedulerTest.testSimple): Use the new
+ scheduler.now(), which returns a datetime against the local
+ timezone.
+ (EventTest.testTimeZones): New test, tests that dates without
+ timezones are treated as local times.
+
2007-06-04 Zaheer Abbas Merali <zaheerabbas at merali dot org>
* flumotion/component/misc/httpfile/httpfile.py:
Modified: flumotion/trunk/flumotion/component/base/scheduler.py
==============================================================================
--- flumotion/trunk/flumotion/component/base/scheduler.py (original)
+++ flumotion/trunk/flumotion/component/base/scheduler.py Tue Jun 5 18:22:29 2007
@@ -20,7 +20,8 @@
# Headers in this file shall remain intact.
-from datetime import datetime
+import time
+from datetime import datetime, timedelta, tzinfo
from twisted.internet import reactor
@@ -28,6 +29,44 @@
from flumotion.component.base import watcher
+# A class capturing the platform's idea of local time, from the
+# documentation of datetime.tzinfo.
+class LocalTimezone(tzinfo):
+ STDOFFSET = timedelta(seconds=-time.timezone)
+ if time.daylight:
+ DSTOFFSET = timedelta(seconds=-time.altzone)
+ else:
+ DSTOFFSET = STDOFFSET
+ DSTDIFF = DSTOFFSET - STDOFFSET
+ ZERO = timedelta(0)
+
+ def utcoffset(self, dt):
+ if self._isdst(dt):
+ return self.DSTOFFSET
+ else:
+ return self.STDOFFSET
+
+ def dst(self, dt):
+ if self._isdst(dt):
+ return self.DSTDIFF
+ else:
+ return self.ZERO
+
+ def tzname(self, dt):
+ return time.tzname[self._isdst(dt)]
+
+ def _isdst(self, dt):
+ tt = (dt.year, dt.month, dt.day,
+ dt.hour, dt.minute, dt.second,
+ dt.weekday(), 0, -1)
+ return time.localtime(time.mktime(tt)).tm_isdst > 0
+LOCAL = LocalTimezone()
+
+
+def now(tz=LOCAL):
+ return datetime.now(tz)
+
+
class Event(log.Loggable):
"""
I am an event. I have a start and stop time and a "content" that can
@@ -43,13 +82,22 @@
startRecurRule = rrule.rrulestr(recur, dtstart=start)
endRecurRule = rrule.rrulestr(recur, dtstart=end)
if now is None:
- now = datetime.now()
+ now = datetime.now(LOCAL)
if end < now:
end = endRecurRule.after(now)
start = startRecurRule.before(end)
self.debug("adjusting start and end times to %r, %r",
start, end)
+ if not start.tzinfo:
+ self.info('event starting at %r does not have timezone '
+ 'info; using local time zone', start)
+ start = start.replace(tzinfo=LOCAL)
+ if not end.tzinfo:
+ self.info('event ending at %r does not have timezone '
+ 'info; using local time zone', end)
+ end = end.replace(tzinfo=LOCAL)
+
self.start = start
self.end = end
self.content = content
@@ -107,7 +155,7 @@
automatically when it stops.
"""
if now is None:
- now = datetime.now()
+ now = datetime.now(LOCAL)
event = Event(start, end, content, recur, now)
if event.end < now:
self.warning('attempted to schedule event in the past: %r',
@@ -160,7 +208,7 @@
@param events: the new events
@type events: a sequence of Event
"""
- now = datetime.now()
+ now = datetime.now(LOCAL)
self.events = avltree.AVLTree(events)
current = []
for event in self.events:
@@ -250,7 +298,7 @@
start = _getNextStart()
stop = _getNextStop()
- now = datetime.now()
+ now = datetime.now(LOCAL)
def toSeconds(td):
return max(td.days*24*3600 + td.seconds + td.microseconds/1e6, 0)
Modified: flumotion/trunk/flumotion/test/test_component_base_scheduler.py
==============================================================================
--- flumotion/trunk/flumotion/test/test_component_base_scheduler.py (original)
+++ flumotion/trunk/flumotion/test/test_component_base_scheduler.py Tue Jun 5 18:22:29 2007
@@ -29,7 +29,7 @@
class EventTest(unittest.TestCase):
def testSimple(self):
- now = datetime.now()
+ now = scheduler.now()
start = now - timedelta(hours=1)
end = now + timedelta(minutes=1)
e = scheduler.Event(start, end, 'foo')
@@ -39,7 +39,7 @@
self.assertEquals(e.recur, None)
def testUpdateRecurring(self):
- now = datetime.now()
+ now = scheduler.now()
now = now.replace(microsecond=0) # recurring adjustments lose precision
start = now - timedelta(hours=1)
end = now - timedelta(minutes=1)
@@ -65,7 +65,7 @@
self.assertEquals(e.recur, recur)
def testComparison(self):
- now = datetime.now()
+ now = scheduler.now()
hour = timedelta(hours=1)
self.failUnless(scheduler.Event(now, now+hour, 'foo') <
@@ -75,6 +75,15 @@
self.failUnless(scheduler.Event(now+hour, now+2*hour, 'foo') >
scheduler.Event(now, now+hour, 'foo'))
+ def testTimeZones(self):
+ now = datetime.now()
+ hour = timedelta(hours=1)
+
+ self.assertEquals(now.tzinfo, None)
+
+ event = scheduler.Event(now, now+hour, 'foo')
+ self.assertEquals(event.start.tzinfo, scheduler.LOCAL)
+ self.assertEquals(event.start, now.replace(tzinfo=scheduler.LOCAL))
class SchedulerTest(unittest.TestCase):
@@ -82,7 +91,7 @@
scheduler.Scheduler()
def testSimple(self):
- now = datetime.now()
+ now = scheduler.now()
start = now - timedelta(hours=1)
end = now + timedelta(minutes=1)
More information about the flumotion-commit
mailing list