[CalendarServer-changes] [13802] PyCalendar/trunk/src/pycalendar/icalendar

source_changes at macosforge.org source_changes at macosforge.org
Tue Jul 29 11:19:07 PDT 2014


Revision: 13802
          http://trac.calendarserver.org//changeset/13802
Author:   cdaboo at apple.com
Date:     2014-07-29 11:19:07 -0700 (Tue, 29 Jul 2014)
Log Message:
-----------
Fix RRULE expansion caching issue when the cached period is extended.

Modified Paths:
--------------
    PyCalendar/trunk/src/pycalendar/icalendar/recurrence.py
    PyCalendar/trunk/src/pycalendar/icalendar/tests/test_recurrence.py

Modified: PyCalendar/trunk/src/pycalendar/icalendar/recurrence.py
===================================================================
--- PyCalendar/trunk/src/pycalendar/icalendar/recurrence.py	2014-07-29 14:59:53 UTC (rev 13801)
+++ PyCalendar/trunk/src/pycalendar/icalendar/recurrence.py	2014-07-29 18:19:07 UTC (rev 13802)
@@ -894,24 +894,21 @@
         if self.mCached and (start != self.mCacheStart):
             self.mCached = False
             self.mFullyCached = False
-            self.mRecurrences = []
 
         # Is the current cache complete or does it extend past the requested
         # range end
         if not self.mCached or not self.mFullyCached \
                 and (self.mCacheUpto is None or self.mCacheUpto < range.getEnd()):
-            cache_range = range.duplicate()
 
-            # If partially cached just cache from previous cache end up to new
-            # end
-            if self.mCached:
-                cache_range = Period(self.mCacheUpto, range.getEnd())
+            # Always wipe the existing cached items as we always start from the very first instance
+            # so we can properly track the count limit
+            self.mRecurrences = []
 
             # Simple expansion is one where there is no BYXXX rule part
             if not self.hasBy():
-                self.mFullyCached = self.simpleExpand(start, cache_range, self.mRecurrences, float_offset)
+                self.mFullyCached = self.simpleExpand(start, range, self.mRecurrences, float_offset)
             else:
-                self.mFullyCached = self.complexExpand(start, cache_range, self.mRecurrences, float_offset)
+                self.mFullyCached = self.complexExpand(start, range, self.mRecurrences, float_offset)
 
             # Set cache values
             self.mCached = True

Modified: PyCalendar/trunk/src/pycalendar/icalendar/tests/test_recurrence.py
===================================================================
--- PyCalendar/trunk/src/pycalendar/icalendar/tests/test_recurrence.py	2014-07-29 14:59:53 UTC (rev 13801)
+++ PyCalendar/trunk/src/pycalendar/icalendar/tests/test_recurrence.py	2014-07-29 18:19:07 UTC (rev 13802)
@@ -167,6 +167,48 @@
         )
 
 
+    def testWeeklyTwice(self):
+
+        recur = Recurrence()
+        recur.parse("FREQ=WEEKLY")
+        start = DateTime(2014, 1, 1, 12, 0, 0, tzid=Timezone(utc=True))
+        end = DateTime(2014, 2, 1, 0, 0, 0, tzid=Timezone(utc=True))
+        items = []
+        range = Period(start, end)
+        recur.expand(DateTime(2014, 1, 1, 12, 0, 0, tzid=Timezone(tzid="America/New_York")), range, items)
+        self.assertEqual(
+            items,
+            [
+                DateTime(2014, 1, 1, 12, 0, 0, tzid=Timezone(tzid="America/New_York")),
+                DateTime(2014, 1, 8, 12, 0, 0, tzid=Timezone(tzid="America/New_York")),
+                DateTime(2014, 1, 15, 12, 0, 0, tzid=Timezone(tzid="America/New_York")),
+                DateTime(2014, 1, 22, 12, 0, 0, tzid=Timezone(tzid="America/New_York")),
+                DateTime(2014, 1, 29, 12, 0, 0, tzid=Timezone(tzid="America/New_York")),
+
+            ],
+        )
+
+        start = DateTime(2014, 1, 1, 12, 0, 0, tzid=Timezone(utc=True))
+        end = DateTime(2014, 3, 1, 0, 0, 0, tzid=Timezone(utc=True))
+        items = []
+        range = Period(start, end)
+        recur.expand(DateTime(2014, 1, 1, 12, 0, 0, tzid=Timezone(tzid="America/New_York")), range, items)
+        self.assertEqual(
+            items,
+            [
+                DateTime(2014, 1, 1, 12, 0, 0, tzid=Timezone(tzid="America/New_York")),
+                DateTime(2014, 1, 8, 12, 0, 0, tzid=Timezone(tzid="America/New_York")),
+                DateTime(2014, 1, 15, 12, 0, 0, tzid=Timezone(tzid="America/New_York")),
+                DateTime(2014, 1, 22, 12, 0, 0, tzid=Timezone(tzid="America/New_York")),
+                DateTime(2014, 1, 29, 12, 0, 0, tzid=Timezone(tzid="America/New_York")),
+                DateTime(2014, 2, 5, 12, 0, 0, tzid=Timezone(tzid="America/New_York")),
+                DateTime(2014, 2, 12, 12, 0, 0, tzid=Timezone(tzid="America/New_York")),
+                DateTime(2014, 2, 19, 12, 0, 0, tzid=Timezone(tzid="America/New_York")),
+                DateTime(2014, 2, 26, 12, 0, 0, tzid=Timezone(tzid="America/New_York")),
+            ],
+        )
+
+
     def testMonthlyInUTC(self):
 
         recur = Recurrence()
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20140729/c856667e/attachment-0001.html>


More information about the calendarserver-changes mailing list