Skip to content

Commit 79514ea

Browse files
Merge pull request jazzband#103 from noamkush/master
Fix various issues with deserializing bad recurrence rules
2 parents fedad8b + 6efd253 commit 79514ea

2 files changed

Lines changed: 53 additions & 8 deletions

File tree

recurrence/base.py

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,9 +1002,8 @@ def deserialize_dt(text):
10021002
for label, param_text in tokens:
10031003
if not param_text:
10041004
raise exceptions.DeserializationError('empty property: %r' % label)
1005-
if u'=' not in param_text:
1006-
params = param_text
1007-
else:
1005+
1006+
if label in (u'RRULE', u'EXRULE'):
10081007
params = {}
10091008
param_tokens = filter(lambda p: p, param_text.split(u';'))
10101009
for item in param_tokens:
@@ -1017,7 +1016,6 @@ def deserialize_dt(text):
10171016
params[param_name] = list(map(
10181017
lambda i: i.strip(), param_value.split(u',')))
10191018

1020-
if label in (u'RRULE', u'EXRULE'):
10211019
kwargs = {}
10221020
for key, value in params.items():
10231021
if key == u'FREQ':
@@ -1075,13 +1073,13 @@ def deserialize_dt(text):
10751073
else:
10761074
exrules.append(Rule(**kwargs))
10771075
elif label == u'DTSTART':
1078-
dtstart = deserialize_dt(params)
1076+
dtstart = deserialize_dt(param_text)
10791077
elif label == u'DTEND':
1080-
dtend = deserialize_dt(params)
1078+
dtend = deserialize_dt(param_text)
10811079
elif label == u'RDATE':
1082-
rdates.append(deserialize_dt(params))
1080+
rdates.append(deserialize_dt(param_text))
10831081
elif label == u'EXDATE':
1084-
exdates.append(deserialize_dt(params))
1082+
exdates.append(deserialize_dt(param_text))
10851083

10861084
return Recurrence(dtstart, dtend, rrules, exrules, rdates, exdates, include_dtstart)
10871085

tests/test_serialization.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from datetime import datetime
22
from recurrence import Recurrence, Rule
3+
from recurrence.exceptions import DeserializationError
4+
import pytest
35
import recurrence
46

57

@@ -13,6 +15,51 @@ def test_rule_serialization():
1315
assert recurrence.deserialize(serialized) == Recurrence(rrules=[rule])
1416

1517

18+
def test_no_equal_sign():
19+
with pytest.raises(DeserializationError):
20+
recurrence.deserialize('RRULE:A')
21+
22+
23+
def test_no_value():
24+
with pytest.raises(DeserializationError):
25+
recurrence.deserialize('RRULE:A=')
26+
27+
28+
def test_unknown_key():
29+
with pytest.raises(DeserializationError):
30+
recurrence.deserialize('RRULE:A=X')
31+
32+
33+
def test_bad_freq():
34+
with pytest.raises(DeserializationError):
35+
recurrence.deserialize('RRULE:FREQ=X')
36+
37+
38+
def test_bad_interval():
39+
with pytest.raises(DeserializationError):
40+
recurrence.deserialize('RRULE:INTERVAL=X')
41+
42+
43+
def test_bad_wkst():
44+
with pytest.raises(DeserializationError):
45+
recurrence.deserialize('RRULE:WKST=X')
46+
47+
48+
def test_bad_count():
49+
with pytest.raises(DeserializationError):
50+
recurrence.deserialize('RRULE:COUNT=X')
51+
52+
53+
def test_bad_byday():
54+
with pytest.raises(DeserializationError):
55+
recurrence.deserialize('RRULE:BYDAY=X')
56+
57+
58+
def test_bad_BYMONTH():
59+
with pytest.raises(DeserializationError):
60+
recurrence.deserialize('RRULE:BYMONTH=X')
61+
62+
1663
def test_complex_rule_serialization():
1764
rule = Rule(
1865
recurrence.WEEKLY,

0 commit comments

Comments
 (0)