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