in src/pycalendar/icalendar/recurrence.py [0:0]
def parse(self, data):
self.init_Recurrence()
# Tokenise using ''
tokens = data.split(";")
tokens.reverse()
if len(tokens) == 0:
raise ValueError("Recurrence: Invalid recurrence rule value")
while len(tokens) != 0:
# Get next token
token = tokens.pop()
try:
tname, tvalue = token.split("=")
except ValueError:
raise ValueError("Recurrence: Invalid token '%s'" % (token,))
# Determine token type
index = Recurrence.cRecurMap.get(tname, Recurrence.cUnknownIndex)
if index == Recurrence.cUnknownIndex:
raise ValueError("Recurrence: Invalid token '%s'" % (tname,))
# Parse remainder based on index
if index == definitions.eRecurrence_FREQ:
# Get the FREQ value
index = Recurrence.cFreqMap.get(tvalue, Recurrence.cUnknownIndex)
if index == Recurrence.cUnknownIndex:
raise ValueError("Recurrence: Invalid FREQ value")
self.mFreq = index
elif index == definitions.eRecurrence_UNTIL:
if self.mUseCount:
raise ValueError("Recurrence: Can't have both UNTIL and COUNT")
self.mUseUntil = True
if self.mUntil is None:
self.mUntil = DateTime()
try:
self.mUntil.parse(tvalue)
except ValueError:
raise ValueError("Recurrence: Invalid UNTIL value")
elif index == definitions.eRecurrence_COUNT:
if self.mUseUntil:
raise ValueError("Recurrence: Can't have both UNTIL and COUNT")
self.mUseCount = True
try:
self.mCount = int(tvalue)
except ValueError:
raise ValueError("Recurrence: Invalid COUNT value")
# Must not be less than one
if self.mCount < 1:
raise ValueError("Recurrence: Invalid COUNT value")
elif index == definitions.eRecurrence_INTERVAL:
try:
self.mInterval = int(tvalue)
except ValueError:
raise ValueError("Recurrence: Invalid INTERVAL value")
# Must NOT be less than one
if self.mInterval < 1:
raise ValueError("Recurrence: Invalid INTERVAL value")
elif index == definitions.eRecurrence_BYSECOND:
if self.mBySeconds is not None:
raise ValueError("Recurrence: Only one BYSECOND allowed")
self.mBySeconds = []
self.parseList(tvalue, self.mBySeconds, 0, 60, errmsg="Recurrence: Invalid BYSECOND value")
elif index == definitions.eRecurrence_BYMINUTE:
if self.mByMinutes is not None:
raise ValueError("Recurrence: Only one BYMINUTE allowed")
self.mByMinutes = []
self.parseList(tvalue, self.mByMinutes, 0, 59, errmsg="Recurrence: Invalid BYMINUTE value")
elif index == definitions.eRecurrence_BYHOUR:
if self.mByHours is not None:
raise ValueError("Recurrence: Only one BYHOUR allowed")
self.mByHours = []
self.parseList(tvalue, self.mByHours, 0, 23, errmsg="Recurrence: Invalid BYHOUR value")
elif index == definitions.eRecurrence_BYDAY:
if self.mByDay is not None:
raise ValueError("Recurrence: Only one BYDAY allowed")
self.mByDay = []
self.parseListDW(tvalue, self.mByDay, errmsg="Recurrence: Invalid BYDAY value")
elif index == definitions.eRecurrence_BYMONTHDAY:
if self.mByMonthDay is not None:
raise ValueError("Recurrence: Only one BYMONTHDAY allowed")
self.mByMonthDay = []
self.parseList(tvalue, self.mByMonthDay, 1, 31, True, errmsg="Recurrence: Invalid BYMONTHDAY value")
elif index == definitions.eRecurrence_BYYEARDAY:
if self.mByYearDay is not None:
raise ValueError("Recurrence: Only one BYYEARDAY allowed")
self.mByYearDay = []
self.parseList(tvalue, self.mByYearDay, 1, 366, True, errmsg="Recurrence: Invalid BYYEARDAY value")
elif index == definitions.eRecurrence_BYWEEKNO:
if self.mByWeekNo is not None:
raise ValueError("Recurrence: Only one BYWEEKNO allowed")
self.mByWeekNo = []
self.parseList(tvalue, self.mByWeekNo, 1, 53, True, errmsg="Recurrence: Invalid BYWEEKNO value")
elif index == definitions.eRecurrence_BYMONTH:
if self.mByMonth is not None:
raise ValueError("Recurrence: Only one BYMONTH allowed")
self.mByMonth = []
self.parseList(tvalue, self.mByMonth, 1, 12, errmsg="Recurrence: Invalid BYMONTH value")
elif index == definitions.eRecurrence_BYSETPOS:
if self.mBySetPos is not None:
raise ValueError("Recurrence: Only one BYSETPOS allowed")
self.mBySetPos = []
self.parseList(tvalue, self.mBySetPos, allowNegative=True, errmsg="Recurrence: Invalid BYSETPOS value")
elif index == definitions.eRecurrence_WKST:
index = Recurrence.cWeekdayMap.get(tvalue, Recurrence.cUnknownIndex)
if (index == Recurrence.cUnknownIndex):
raise ValueError("Recurrence: Invalid WKST value")
self.mWeekstart = index