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