texel-recurrence-rule-parser 0.0.7 → 0.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|