class VacationRentalsIcalAdapters::Adapters::CsvBookedDaysAdapter

CSV Booked Days response format should be similar to:

2016-12-08,2016-12-09,2016-12-15

Public Instance Methods

applicable?(body:, source:) click to toggle source
# File lib/vacation_rentals_ical_adapters/adapters/csv_booked_days_adapter.rb, line 10
def applicable?(body:, source:)
  return false if source.nil?
  source.split(".").last == "booked_days"
end
to_ical(body) click to toggle source
# File lib/vacation_rentals_ical_adapters/adapters/csv_booked_days_adapter.rb, line 15
def to_ical(body)
  events = parse_events(body)
  VacationRentalsIcalAdapters::IcalConverter.to_ical(events)
end

Private Instance Methods

extract_ranges(body) click to toggle source
# File lib/vacation_rentals_ical_adapters/adapters/csv_booked_days_adapter.rb, line 31
def extract_ranges(body)
  return [] if body.nil?

  merge_booked_days body.strip.split(",").map(&:to_date)
end
merge_booked_days(days) click to toggle source
# File lib/vacation_rentals_ical_adapters/adapters/csv_booked_days_adapter.rb, line 37
def merge_booked_days(days)
  ranges = []
  days_length = days.length

  current_start_date = nil
  previous_end_date = nil

  days.each_with_index do |day, index|
    current_start_date ||= day

    if previous_end_date && day > previous_end_date.advance(days: 1)
      ranges << { start_date: current_start_date, end_date: previous_end_date.advance(days: 1) }
      current_start_date = day
      previous_end_date = day
    else
      previous_end_date = day
    end

    if index + 1 == days_length
      ranges << { start_date: current_start_date, end_date: previous_end_date.advance(days: 1) }
    end
  end
  ranges
end
parse_events(body) click to toggle source
# File lib/vacation_rentals_ical_adapters/adapters/csv_booked_days_adapter.rb, line 22
def parse_events(body)
  extract_ranges(body).map do |range|
    VacationRentalsIcalAdapters::Event.new(
      start_date: range[:start_date].iso8601,
      end_date: range[:end_date].iso8601
    )
  end
end