Sha256: 04b4204ca8c8c5af3dfabd5efaf8043b94db4463276e4153247d45b76759daf6

Contents?: true

Size: 1.59 KB

Versions: 2

Compression:

Stored size: 1.59 KB

Contents

require 'vrbo/class_methods'

module VRBO
  class Calendar
    extend ClassMethods

    attr_accessor :id, :available_dates, :days

    def initialize(calendar_id = nil)
      @id = calendar_id || VRBO.config.calendar_id
      @days = {}
      @available_dates = []
    end

    def available?(arrival, depart, my_dates = nil)
      dates = my_dates || available_dates
      available = dates.any?
      arrival.upto(depart - 1).each do |date|
        available = false unless dates.include?(date.to_s)
      end
      available
    end

    def find_available_dates
      today = Date.today
      @available_dates = today.upto(today + 365).map { |date| date_if_available(date) }.compact
    end

    def url(protocol = 'http')
      if id
        "#{protocol}://www.vrbo.com/#{id}/calendar"
      else
        raise ArgumentError, 'You must provide a calendar id'
      end
    end

    alias :find_all_available_dates :find_available_dates

    private

    def date_if_available(date)
      m = date.month.to_s
      days[m] ||= collect_days_for_month(date)
      date.to_s if days[m].include?(date.day.to_s)
    end

    def collect_days_for_month(date)
      scrape_table_for(date).map { |cell| cell.children.to_s.strip }
    end

    def scrape_table_for(date)
      calendar.search('.cal-month').at(table_xpath(date)).search('td:not(.strike)')
    end

    def calendar
      @calendar ||= agent.get(url)
    end

    def agent
      @agent ||= Mechanize.new
    end

    # e.g. March 2014
    def table_xpath(date)
      "//b[contains(text(), '#{date.strftime('%B %Y')}')]/following-sibling::table"
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
vrbo-1.1.0 lib/vrbo/calendar.rb
vrbo-1.0.0 lib/vrbo/calendar.rb