class Availabiliter::TimeFrame

A TimeFrame is an object representing several DateRange instances. It can have a start. It can have only one endless DateRange.

Attributes

date_ranges[R]
start_date[R]

Public Class Methods

new(array, start_date = nil) click to toggle source
# File lib/availabiliter/timeframe.rb, line 11
def initialize(array, start_date = nil)
  @start_date = start_date
  @date_ranges = build_date_ranges(array)

  raise ArgumentError unless valid?
end

Public Instance Methods

availabilities() click to toggle source
# File lib/availabiliter/timeframe.rb, line 18
def availabilities
  return [start_date..nil] if date_ranges.empty?
  return build_availabilities if start_date.nil?

  availabilities = build_availabilities
  start_date < first_date_range.start_date ? availabilities.unshift(first_availability) : availabilities
end

Private Instance Methods

build_availabilities() click to toggle source
# File lib/availabiliter/timeframe.rb, line 38
def build_availabilities
  furthest_date_range = first_date_range

  date_ranges.filter_map.with_index do |date_range, index|
    next_date_range = date_ranges[index + 1]

    furthest_date_range = furthest_date_range.furthest(date_range)
    furthest_date_range.next_availability(next_date_range)
  end
end
build_date_ranges(array) click to toggle source
# File lib/availabiliter/timeframe.rb, line 28
def build_date_ranges(array)
  date_range_array = array.filter_map do |range|
    next if out_of_timeframe?(range.end)

    DateRange.new(range.begin, range.end)
  end

  date_range_array.sort_by(&:start_date)
end
end_date_valid?() click to toggle source
# File lib/availabiliter/timeframe.rb, line 65
def end_date_valid?
  start_date.instance_of?(Date) || start_date.instance_of?(NilClass)
end
first_availability() click to toggle source
# File lib/availabiliter/timeframe.rb, line 53
def first_availability
  start_date..first_date_range.yesterday
end
first_date_range() click to toggle source
# File lib/availabiliter/timeframe.rb, line 57
def first_date_range
  date_ranges.first
end
out_of_timeframe?(range_end) click to toggle source
# File lib/availabiliter/timeframe.rb, line 49
def out_of_timeframe?(range_end)
  !start_date.nil? && (!range_end.nil? && range_end < start_date)
end
valid?() click to toggle source
# File lib/availabiliter/timeframe.rb, line 61
def valid?
  end_date_valid? && date_ranges.count { |date_range| date_range.end_date.nil? } <= 1
end