lib/vrbo/calendar.rb in vrbo-0.1.1 vs lib/vrbo/calendar.rb in vrbo-0.2.0

- old
+ new

@@ -2,15 +2,15 @@ module VRBO class Calendar extend ClassMethods - attr_accessor :id, :available_dates, :cells + attr_accessor :id, :available_dates, :days def initialize(calendar_id = nil) @id = calendar_id || VRBO.config.calendar_id - @cells = {} + @days = {} @available_dates = [] end def available?(arrival, depart, my_dates = nil) dates = my_dates || available_dates @@ -21,33 +21,40 @@ available end def find_all_available_dates today = Date.today - @available_dates = today.upto(today + 365).map { |date| availability_for(date) }.compact + @available_dates = today.upto(today + 365).map { |date| date_if_available(date) }.compact end - def availability_for(date) + def date_if_available(date) m = date.month.to_s - cells[m] ||= find_cells_for(date).map { |cell| cell.children.to_s.strip } + days[m] ||= collect_days_for_month(date) + date.to_s if days[m].include?(date.day.to_s) + end - if cells[m].include?(date.day.to_s) - date.to_s - else - nil - end + def collect_days_for_month(date) + scrape_table_for(date).map { |cell| cell.children.to_s.strip } end - def find_cells_for(date) + def scrape_table_for(date) calendar.search('.cal-month').at(table_xpath(date)).search('td:not(.strike)') end def calendar - @calendar ||= agent.get("http://www.vrbo.com/#{id}/calendar") + @calendar ||= agent.get(calendar_url) end def agent @agent ||= Mechanize.new + end + + def calendar_url + if id + "http://www.vrbo.com/#{id}/calendar" + else + raise ArgumentError, 'You must provide a calendar id' + end end # March 2014 def table_xpath(date) "//b[contains(text(), '#{date.strftime('%B %Y')}')]/following-sibling::table" \ No newline at end of file