iCalendar Recurrence Build Status Code Climate

Adds event recurrence to the icalendar gem. This is helpful in cases where you'd like to parse an ICS and generate a series of event occurrences.

Install

Note: Works with 2.0.0beta.1 (or newer) icalendar gem. If you're using icalendar <=1.5.4, take a look at the new code before you switch over.

gem "icalendar-recurrence"

and run bundle install from your shell.

Usage

Show occurrences of event between dates

require 'date' # for parse method
require 'icalendar/recurrence'

calendars = Icalendar::Calendar.parse(File.read(path_to_ics)) # parse an ICS file
event = Array(calendars).first.events.first # retrieve the first event
event.occurrences_between(Date.parse("2014-01-01"), Date.parse("2014-02-01")) # get all occurrence for one month

Get all occurrences

To get all occurrences you can use all_occurrences. This only works when you have specified an ending using until or count in your RRULE.

Working with occurrences

An event occurrence is a simple struct object with start_time and end_time methods.

occurrence.start_time # => 2014-02-01 00:00:00 -0800
occurrence.end_time   # => 2014-02-02 00:00:00 -0800

Daily event with excluded date (inline ICS example)

require 'date' # for parse method
require 'icalendar/recurrence'

ics_string = "BEGIN:VCALENDAR\nX-WR-CALNAME:Test Public\nX-WR-CALID:f512e378-050c-4366-809a-ef471ce45b09:101165\nPRODID:Zimbra-Calendar-Provider\nVERSION:2.0\nMETHOD:PUBLISH\nBEGIN:VEVENT\nUID:efcb99ae-d540-419c-91fa-42cc2bd9d302\nRRULE:FREQ=DAILY;INTERVAL=1\nSUMMARY:Every day, except the 28th\nDTSTART;VALUE=DATE:20140101\nDTEND;VALUE=DATE:20140102\nSTATUS:CONFIRMED\nCLASS:PUBLIC\nX-MICROSOFT-CDO-ALLDAYEVENT:TRUE\nTRANSP:TRANSPARENT\nLAST-MODIFIED:20140113T200625Z\nDTSTAMP:20140113T200625Z\nSEQUENCE:0\nEXDATE;VALUE=DATE:20140128\nEND:VEVENT\nEND:VCALENDAR\n"

# An event that occurs every day, starting January 1, 2014 with one excluded 
# date. January 28, 2014 will not appear in the occurrences.
calendars = Icalendar::Calendar.parse(ics_string)
every_day_except_jan_28 = Array(calendars).first.events.first
puts "Every day except January 28, 2014, occurrences from 2014-01-01 to 2014-02-01:"
puts every_day_except_jan_28.occurrences_between(Date.parse("2014-01-01"), Date.parse("2014-02-01"))

Contributing

  1. Fork it ( http://github.com//icalendar-recurrence/fork )
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request