class RunIcal::Generator

Public Class Methods

generate(race_date:, program:) click to toggle source
# File lib/run_ical.rb, line 10
def self.generate(race_date:, program:)
  unless RunIcal::Data.constants.include?(program.to_sym)
    raise ArgumentError, "#{program} is unsupported"
  end
  program = program.to_sym
  new(race_date: race_date, program: program).generate
end
new(race_date:, program:) click to toggle source
# File lib/run_ical.rb, line 18
def initialize(race_date:, program:)
  @race_date = race_date
  @program = RunIcal::Data.const_get(program)
end

Public Instance Methods

generate() click to toggle source
# File lib/run_ical.rb, line 23
def generate
  description = @program.const_get(:DESCRIPTION)
  data = @program.const_get(:DATA)
  cal = Icalendar::Calendar.new
  cal.x_wr_calname = "#{description} for #{@race_date}"
  start_date_padding = @race_date.saturday? ? 2 : 1
  start_date = @race_date - (data.size - start_date_padding).days

  date_list = (start_date..@race_date).to_a
  date_list.each.with_index do |date, index|
    activity = data[index][:activity]
    if activity =~ /rest/i && @race_date.saturday? && index == date_list.size - 1
      activity = data[index + 1][:activity]
    end

    cal.event do |e|
      e.dtstart     = Icalendar::Values::Date.new(date)
      e.dtend       = Icalendar::Values::Date.new(date)
      e.summary     = activity
      e.ip_class    = "PUBLIC"

      e.alarm do |a|
        a.summary = activity
        a.trigger = "-P1DT0H0M0S" # 1 day before
      end
    end
  end

  cal.publish
  cal.to_ical
end