texel-recurrence-rule-parser 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/rrule_parser.rb +35 -15
- data/spec/lib/rrule_parser_spec.rb +0 -15
- metadata +1 -1
data/lib/rrule_parser.rb
CHANGED
@@ -24,22 +24,29 @@ class RruleParser
|
|
24
24
|
|
25
25
|
attr_accessor :event
|
26
26
|
attr_accessor :rules, :exceptions
|
27
|
-
|
27
|
+
|
28
28
|
def initialize(event)
|
29
|
+
self.event = event
|
30
|
+
self.setup
|
31
|
+
end
|
32
|
+
|
33
|
+
def setup
|
29
34
|
@expressions = []
|
30
35
|
@count = 0
|
31
36
|
self.rules = {}
|
32
|
-
self.event = event
|
33
37
|
self.parse_rules
|
34
38
|
self.parse_exceptions
|
35
39
|
parse_count
|
40
|
+
self
|
36
41
|
end
|
37
42
|
|
43
|
+
alias :reload :setup
|
44
|
+
|
38
45
|
# Parse rules, output temporal expressions
|
39
46
|
def expressions
|
40
47
|
@expressions = []
|
41
48
|
@expressions << parse_frequency_and_interval
|
42
|
-
@expressions << send(:"parse_#{self.rules[:freq].downcase}")
|
49
|
+
@expressions << send(:"parse_#{self.rules[:freq].downcase}") if self.rules[:freq]
|
43
50
|
@expressions << parse_start
|
44
51
|
@expressions << parse_until
|
45
52
|
@expressions.compact!
|
@@ -71,39 +78,52 @@ class RruleParser
|
|
71
78
|
dates.flatten.uniq - self.exceptions
|
72
79
|
end
|
73
80
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
self.rules = {}
|
78
|
-
rrules = self.event.recurrence_rules
|
81
|
+
def self.parse_rules(rrules)
|
82
|
+
rules = {}
|
83
|
+
|
79
84
|
rrules.each do |rule|
|
80
85
|
pairs = rule.split(";")
|
81
86
|
pairs.each do |pair|
|
82
87
|
array = pair.split('=')
|
83
|
-
|
88
|
+
rules[array[0].downcase.to_sym] = array[1]
|
84
89
|
end
|
85
90
|
end
|
86
|
-
|
91
|
+
|
87
92
|
# Parse comma separated lists.
|
88
|
-
|
93
|
+
rules.each do |key, rule|
|
89
94
|
if rule =~ /,/
|
90
95
|
rules[key] = rule.split(',')
|
91
96
|
end
|
92
97
|
end
|
93
|
-
|
98
|
+
|
94
99
|
# Override rules to_s
|
95
|
-
|
100
|
+
rules.instance_eval do
|
96
101
|
def to_s
|
97
102
|
self.map do |key, value|
|
98
103
|
"#{key.to_s.upcase}=#{value.map.join(',')}"
|
99
104
|
end.join(";")
|
100
105
|
end
|
101
106
|
end
|
107
|
+
|
108
|
+
rules
|
109
|
+
end
|
110
|
+
|
111
|
+
protected
|
112
|
+
|
113
|
+
def parse_rules
|
114
|
+
self.rules = RruleParser.parse_rules(self.event.recurrence_rules)
|
102
115
|
end
|
103
116
|
|
104
117
|
def parse_exceptions
|
105
|
-
|
106
|
-
|
118
|
+
# Exception dates are a bit of a misnomer. They should be stored
|
119
|
+
# as Times instead. Right now we are going to assume all exdates
|
120
|
+
# are stored as UTC. We can support time zone conversion later.
|
121
|
+
self.exceptions = self.event.exception_dates.map do |exception_time|
|
122
|
+
if exception_time.is_a?(Time)
|
123
|
+
exception_time
|
124
|
+
else
|
125
|
+
Time.parse(exception_time)
|
126
|
+
end
|
107
127
|
end
|
108
128
|
end
|
109
129
|
|
@@ -162,21 +162,6 @@ describe RruleParser do
|
|
162
162
|
it "should return 32 dates" do
|
163
163
|
@parser.dates(@range).size.should == 32
|
164
164
|
end
|
165
|
-
|
166
|
-
context "with an exception on 12/5/2008" do
|
167
|
-
before(:each) do
|
168
|
-
@event.exception_dates = ['EXDATE;TZID=US/Pacific:20081205T150000']
|
169
|
-
create_parser(@event)
|
170
|
-
end
|
171
|
-
|
172
|
-
it "should return 31 dates" do
|
173
|
-
@parser.dates(@range).size.should == 31
|
174
|
-
end
|
175
|
-
|
176
|
-
it "should not return a date on 12/5/2008" do
|
177
|
-
@parser.dates(@range).should_not include(Date.parse('12/5/2008'))
|
178
|
-
end
|
179
|
-
end
|
180
165
|
end
|
181
166
|
|
182
167
|
context "recurring every 2 days" do
|