| 
     | 
    @@ -0,0 +1,67 @@ | 
  
    
     | 
     | 
  
    require 'rubygems' | 
    
     | 
     | 
  
    require 'mechanize' | 
    
     | 
     | 
  
    
  | 
    
     | 
     | 
  
    FIRST_NAME = 'FIRST_NAME' | 
    
     | 
     | 
  
    LAST_NAME = 'LAST_NAME' | 
    
     | 
     | 
  
    PHONE = 'PHONE' | 
    
     | 
     | 
  
    EMAIL = '[email protected]' | 
    
     | 
     | 
  
    
  | 
    
     | 
     | 
  
    PARTY_SIZE = 2 | 
    
     | 
     | 
  
    SCHEDULE_RANGE = { :start_time => '19:00', :end_time => '20:30' } | 
    
     | 
     | 
  
    
  | 
    
     | 
     | 
  
    def start_url(restaurant=2086) | 
    
     | 
     | 
  
      return "http://rez.urbanspoon.com/reservation/start/#{restaurant}" | 
    
     | 
     | 
  
    end | 
    
     | 
     | 
  
    
  | 
    
     | 
     | 
  
    def to_minutes(time) | 
    
     | 
     | 
  
    	hour, minutes = time.split(':') | 
    
     | 
     | 
  
    	raise "Malformed time: #{time}. Should be in the HH:MM format." if hour.nil? || minutes.nil? | 
    
     | 
     | 
  
    	return (hour.to_i * 60) + minutes.to_i | 
    
     | 
     | 
  
    end | 
    
     | 
     | 
  
    
  | 
    
     | 
     | 
  
    url = start_url() | 
    
     | 
     | 
  
    agent = Mechanize.new { |agent| | 
    
     | 
     | 
  
      agent.user_agent_alias = 'Mac Safari' | 
    
     | 
     | 
  
    } | 
    
     | 
     | 
  
    
  | 
    
     | 
     | 
  
    # Get the start page | 
    
     | 
     | 
  
    start_page = agent.get(url) | 
    
     | 
     | 
  
    
  | 
    
     | 
     | 
  
    # Bail if there are no reservations | 
    
     | 
     | 
  
    exit if start_page.forms.count != 1 | 
    
     | 
     | 
  
    
  | 
    
     | 
     | 
  
    # Fill in the details for the reservation | 
    
     | 
     | 
  
    start_form = start_page.forms.first | 
    
     | 
     | 
  
    start_form.size = PARTY_SIZE | 
    
     | 
     | 
  
    
  | 
    
     | 
     | 
  
    # Verify if the available times are in the allowed range | 
    
     | 
     | 
  
    available_times = start_form.field_with(:name => 'seating_time').options | 
    
     | 
     | 
  
    
  | 
    
     | 
     | 
  
    possible_times = available_times.select do |time| | 
    
     | 
     | 
  
    	(to_minutes(SCHEDULE_RANGE[:start_time])..to_minutes(SCHEDULE_RANGE[:end_time])).member?(time.value.to_i) | 
    
     | 
     | 
  
    end | 
    
     | 
     | 
  
    
  | 
    
     | 
     | 
  
    # Select the first of the possible times for the reservation | 
    
     | 
     | 
  
    start_form.seating_time = possible_times.first | 
    
     | 
     | 
  
    
  | 
    
     | 
     | 
  
    # Submit the details and get back the contact form | 
    
     | 
     | 
  
    contact_info_page = start_form.submit | 
    
     | 
     | 
  
    
  | 
    
     | 
     | 
  
    # Check for the existence and get the contact form | 
    
     | 
     | 
  
    exit if contact_info_page.forms.count != 1 | 
    
     | 
     | 
  
    contact_form = contact_info_page.forms.first | 
    
     | 
     | 
  
    
  | 
    
     | 
     | 
  
    # Fill in the contact details | 
    
     | 
     | 
  
    contact_form["user[first_name]"] = FIRST_NAME | 
    
     | 
     | 
  
    contact_form["user[last_name]"] = LAST_NAME | 
    
     | 
     | 
  
    contact_form["user[phone]"] = PHONE | 
    
     | 
     | 
  
    contact_form["user[email]"] = EMAIL | 
    
     | 
     | 
  
    
  | 
    
     | 
     | 
  
    # Submit the contact details and get confirmation page | 
    
     | 
     | 
  
    confirmation_page = contact_form.submit | 
    
     | 
     | 
  
    
  | 
    
     | 
     | 
  
    # Confirm the reservation | 
    
     | 
     | 
  
    exit if confirmation_page.forms.count != 1 | 
    
     | 
     | 
  
    confirmation_form = confirmation_page.forms.first | 
    
     | 
     | 
  
    final_page = confirmation_form.submit | 
    
     | 
     | 
  
    puts "Got reservation for: #{start_form.seating_time}" |