active-icalendar-events 0.1.0 → 0.1.4
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.
- checksums.yaml +4 -4
- data/lib/active-icalendar-events.rb +62 -30
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ee9cc0c47ee4498afaf37e853db464fca142261bbf29aaa17439f66508c2610c
|
4
|
+
data.tar.gz: a3e5972072dbb410c1949cc2d53a7e7db741e55d9619ed628cc97c2ed2a3d1bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4f9dbc20940280b719b5d4770e2e2de94544d5671a4b9aa1b6eceb41a126077d44e8d101eabd599f9885de7112d658000b199d8e305900d730b1f173565e94f8
|
7
|
+
data.tar.gz: f269876565330984d37d22c592dbef52102d774c387399698af734136347bb90387bea64a6dd25e6b0f64745a946e48d1efb593576966d31e7ec281d3e17cf34
|
@@ -92,13 +92,50 @@ module ActiveIcalendarEvents
|
|
92
92
|
|
93
93
|
def format_icalendar_data(icalendar_data)
|
94
94
|
icalendar_data.first.events.map { |e|
|
95
|
+
event_start = e.dtstart
|
96
|
+
if event_start.is_a?(Icalendar::Values::Date)
|
97
|
+
timezone ||= ActiveSupport::TimeZone.new(e.parent.timezones.first.tzid.to_s)
|
98
|
+
event_start = timezone.local(event_start.year, event_start.month, event_start.day)
|
99
|
+
end
|
100
|
+
|
101
|
+
event_end = e.dtend
|
102
|
+
if event_end.is_a?(Icalendar::Values::Date)
|
103
|
+
timezone ||= ActiveSupport::TimeZone.new(e.parent.timezones.first.tzid.to_s)
|
104
|
+
event_end = timezone.local(event_end.year, event_end.month, event_end.day)
|
105
|
+
end
|
106
|
+
|
107
|
+
excluding_dates = e.exdate.map { |d|
|
108
|
+
if d.is_a?(Icalendar::Values::Date)
|
109
|
+
timezone ||= ActiveSupport::TimeZone.new(e.parent.timezones.first.tzid.to_s)
|
110
|
+
timezone.local(d.year, d.month, d.day)
|
111
|
+
else
|
112
|
+
d
|
113
|
+
end
|
114
|
+
}
|
115
|
+
|
116
|
+
recurrence_dates = e.rdate.map { |d|
|
117
|
+
if d.is_a?(Icalendar::Values::Date)
|
118
|
+
timezone ||= ActiveSupport::TimeZone.new(e.parent.timezones.first.tzid.to_s)
|
119
|
+
timezone.local(d.year, d.month, d.day)
|
120
|
+
else
|
121
|
+
d
|
122
|
+
end
|
123
|
+
}
|
124
|
+
|
125
|
+
e.rrule.each { |rrule|
|
126
|
+
if !rrule.until.nil?
|
127
|
+
timezone ||= ActiveSupport::TimeZone.new(e.parent.timezones.first.tzid.to_s)
|
128
|
+
rrule.until = timezone.parse(rrule.until)
|
129
|
+
end
|
130
|
+
}
|
131
|
+
|
95
132
|
{
|
96
133
|
name: e.summary,
|
97
|
-
event_start:
|
98
|
-
event_end:
|
134
|
+
event_start: event_start,
|
135
|
+
event_end: event_end,
|
99
136
|
recurrence_rule: e.rrule,
|
100
|
-
recurrence_dates:
|
101
|
-
excluding_dates:
|
137
|
+
recurrence_dates: recurrence_dates,
|
138
|
+
excluding_dates: excluding_dates,
|
102
139
|
recurrence_id: e.recurrence_id,
|
103
140
|
uid: e.uid
|
104
141
|
}
|
@@ -138,9 +175,8 @@ module ActiveIcalendarEvents
|
|
138
175
|
!overridden_dates.include?(event_start_considered)
|
139
176
|
end
|
140
177
|
|
141
|
-
|
142
|
-
|
143
|
-
end
|
178
|
+
# We consider both active dates and excluded dates for the recurrence count
|
179
|
+
considered_count += 1
|
144
180
|
|
145
181
|
event_start_considered = event_start_considered + interval.days
|
146
182
|
event_end_considered = event_end_considered + interval.days
|
@@ -174,9 +210,8 @@ module ActiveIcalendarEvents
|
|
174
210
|
!overridden_dates.include?(event_start_considered)
|
175
211
|
end
|
176
212
|
|
177
|
-
|
178
|
-
|
179
|
-
end
|
213
|
+
# We consider both active dates and excluded dates for the recurrence count
|
214
|
+
considered_count += 1
|
180
215
|
else
|
181
216
|
week_event_start_considered =
|
182
217
|
event_start_considered.monday? ? event_start_considered :
|
@@ -199,9 +234,8 @@ module ActiveIcalendarEvents
|
|
199
234
|
!overridden_dates.include?(week_event_start_considered)
|
200
235
|
end
|
201
236
|
|
202
|
-
|
203
|
-
|
204
|
-
end
|
237
|
+
# We consider both active dates and excluded dates for the recurrence count
|
238
|
+
considered_count += 1
|
205
239
|
end
|
206
240
|
end
|
207
241
|
|
@@ -217,6 +251,11 @@ module ActiveIcalendarEvents
|
|
217
251
|
false
|
218
252
|
end
|
219
253
|
|
254
|
+
# Get the beginning of the month, maintaining the timestamp
|
255
|
+
def beginning_of_month(datetime)
|
256
|
+
datetime - (datetime.day - 1).days
|
257
|
+
end
|
258
|
+
|
220
259
|
def get_nth_day_in_month(datetime, day)
|
221
260
|
matches = day.match /^([0-9]+)([A-Z]+)$/
|
222
261
|
if matches.nil?
|
@@ -244,7 +283,7 @@ module ActiveIcalendarEvents
|
|
244
283
|
raise RuntimeError, "Unexpected day code used"
|
245
284
|
end
|
246
285
|
|
247
|
-
target_day = datetime
|
286
|
+
target_day = beginning_of_month(datetime)
|
248
287
|
|
249
288
|
if target_day.strftime("%^a").chop != day_code
|
250
289
|
target_day = target_day.next_occurring(day_label)
|
@@ -284,16 +323,15 @@ module ActiveIcalendarEvents
|
|
284
323
|
!overridden_dates.include?(event_start_considered)
|
285
324
|
end
|
286
325
|
|
287
|
-
|
288
|
-
|
289
|
-
end
|
326
|
+
# We consider both active dates and excluded dates for the recurrence count
|
327
|
+
considered_count += 1
|
290
328
|
|
291
329
|
if by_day.nil? || by_day.empty?
|
292
330
|
event_start_considered = event_start_considered + interval.month
|
293
331
|
event_end_considered = event_end_considered + interval.month
|
294
332
|
else
|
295
333
|
event_start_considered =
|
296
|
-
get_nth_day_in_month(event_start_considered
|
334
|
+
get_nth_day_in_month(beginning_of_month(event_start_considered) + interval.month,
|
297
335
|
by_day.first)
|
298
336
|
event_end_considered = event_start_considered + (event_end.to_time - event_start.to_time).seconds
|
299
337
|
end
|
@@ -322,9 +360,8 @@ module ActiveIcalendarEvents
|
|
322
360
|
!overridden_dates.include?(event_start_considered)
|
323
361
|
end
|
324
362
|
|
325
|
-
|
326
|
-
|
327
|
-
end
|
363
|
+
# We consider both active dates and excluded dates for the recurrence count
|
364
|
+
considered_count += 1
|
328
365
|
|
329
366
|
event_start_considered = event_start_considered + interval.years
|
330
367
|
event_end_considered = event_end_considered + interval.years
|
@@ -355,18 +392,13 @@ module ActiveIcalendarEvents
|
|
355
392
|
return name if is_event_active?(datetime, recurrence_event_start, recurrence_event_end)
|
356
393
|
}
|
357
394
|
|
358
|
-
until_datetime = nil
|
359
|
-
if !recurrence_rule.until.nil?
|
360
|
-
until_datetime = DateTime.parse(recurrence_rule.until)
|
361
|
-
end
|
362
|
-
|
363
395
|
case recurrence_rule.frequency
|
364
396
|
when "DAILY"
|
365
397
|
return name if is_daily_event_active_for_datetime?(
|
366
398
|
datetime,
|
367
399
|
event_start,
|
368
400
|
event_end,
|
369
|
-
|
401
|
+
recurrence_rule.until,
|
370
402
|
recurrence_rule.count,
|
371
403
|
recurrence_rule.interval.nil? ? 1 : recurrence_rule.interval,
|
372
404
|
excluding_dates,
|
@@ -377,7 +409,7 @@ module ActiveIcalendarEvents
|
|
377
409
|
datetime,
|
378
410
|
event_start,
|
379
411
|
event_end,
|
380
|
-
|
412
|
+
recurrence_rule.until,
|
381
413
|
recurrence_rule.count,
|
382
414
|
recurrence_rule.interval.nil? ? 1 : recurrence_rule.interval,
|
383
415
|
recurrence_rule.by_day,
|
@@ -389,7 +421,7 @@ module ActiveIcalendarEvents
|
|
389
421
|
datetime,
|
390
422
|
event_start,
|
391
423
|
event_end,
|
392
|
-
|
424
|
+
recurrence_rule.until,
|
393
425
|
recurrence_rule.count,
|
394
426
|
recurrence_rule.interval.nil? ? 1 : recurrence_rule.interval,
|
395
427
|
recurrence_rule.by_day,
|
@@ -402,7 +434,7 @@ module ActiveIcalendarEvents
|
|
402
434
|
datetime,
|
403
435
|
event_start,
|
404
436
|
event_end,
|
405
|
-
|
437
|
+
recurrence_rule.until,
|
406
438
|
recurrence_rule.count,
|
407
439
|
recurrence_rule.interval.nil? ? 1 : recurrence_rule.interval,
|
408
440
|
excluding_dates,
|