class Car

Attributes

base_url[RW]
details_url[RW]
make[RW]
model[RW]
model_year[RW]
overview[RW]
overview_url[RW]
photo_url[RW]
specs_url[RW]
trims[RW]
trims_url[RW]

Public Class Methods

new(model_year, make, car_model) click to toggle source
# File lib/car.rb, line 5
def initialize(model_year, make, car_model)
      @make = make.capitalize
      @model = car_model
      @model_year = model_year
  @base_url = "http://autos.aol.com/cars-#{make}-#{car_model}-#{model_year}"
      @overview_url = "#{@base_url}/overview"
      @trims_url = "#{@base_url}/available-trims/"
      @specs_url = "#{@base_url}/specs"
      @mpg_url = "#{@specs_url}/mpg"
      @trims = Array.new
      
      Struct.new(
          "ExteriorStats", 
          :length,
        :body_width,
        :body_height, 
        :wheelbase, 
        :ground_clearance, 
        :curb, 
        :gross_weight
        )
        
Struct.new(
  "InteriorStats", 
        :front_head_room,
  :rear_head_room,
  :front_shoulder_room,
  :rear_shoulder_room,
  :front_hip_room,
  :rear_hip_room,
  :front_leg_room,
  :rear_leg_room,
  :luggage_capacity,
  :maximum_cargo_capacity,
  :standard_seating
  )

Struct.new(
  "PerformanceStats",
  :base_engine_size,
  :base_engine_type,
  :horsepower,
  :horsepower_rpm,
  :torque,
  :torque_rpm,
  :payload,
  :maximum_towing_capacity,
  :drive_type,
  :turning_radius
  )

Struct.new(
  "FuelEconomyStats",
  :fuel_tank_capacity,
  :epa_mileage_estimates
  )
  
      get_overview
      get_specs
      get_features
end

Public Instance Methods

find_trim_by_name(trim_name) click to toggle source
# File lib/car.rb, line 215
def find_trim_by_name(trim_name)
  @trims.select { |trim| trim_name.include? trim.trim_name   }
end
get_features() click to toggle source
# File lib/car.rb, line 201
def get_features
  car_page = Nokogiri::HTML(open(@trims_url))
  
  available_tables = car_page.xpath("//table[@class = 'availableTable']")
  available_tables.each do |table|
    trim_text  = table.xpath(".//div[@class = 'headrow']/a")[0].text
    trim = find_trim_by_name(trim_text)
  end
end
get_overview() click to toggle source
# File lib/car.rb, line 67
def get_overview
      car_page = Nokogiri::HTML(open(@overview_url))
  
  if car_page.xpath("//title").text == "Site Map - AOL Autos"
    raise ModelDoesNotExist
  end
  
  @overview = car_page.xpath("//div[@class = 'rv_box']").text
end
get_specs() click to toggle source
# File lib/car.rb, line 77
def get_specs
  car_page = Nokogiri::HTML(open(@specs_url))
  
  if car_page.xpath("//title").text == "Site Map - AOL Autos"
    raise ModelDoesNotExist
  end
  trim_list = car_page.xpath("//div[@class = 'sliding_columns_container']")

  category_name_table = car_page.xpath("//div[@class = 'ymm_data_table']/ul[@class = 'data_column']/li/span")

  i = 0    
  exterior_stats_names = []
  interior_stats_names = []
  performance_stats_names = []
  mpg_stats_names = []
  sub_category_name = ""
  category_name = category_name_table[i].text
  if category_name == "Exterior"
    i+=1
    until sub_category_name == "Interior"
      if sub_category_name != "";exterior_stats_names << sub_category_name; end
      sub_category_name = category_name_table[i].text
      i+=1
    end
    i+=1
    sub_category_name = category_name_table[i].text
    until sub_category_name == "Performance"
      interior_stats_names << sub_category_name
      sub_category_name = category_name_table[i].text
      i+=1
    end
    i+=1
    sub_category_name = category_name_table[i].text
    until sub_category_name == "MPG"
      performance_stats_names << sub_category_name
      sub_category_name = category_name_table[i].text
      i+=1
    end
    i+=1
    sub_category_name = category_name_table[i].text
    while i < category_name_table.size
      sub_category_name = category_name_table[i].text
      mpg_stats_names << sub_category_name
      i+=1
    end
  end
  
  interior_stats_names = unspacify(interior_stats_names)
  exterior_stats_names = unspacify(exterior_stats_names)
  performance_stats_names = unspacify(performance_stats_names)
  mpg_stats_names = unspacify(mpg_stats_names)
  total_stats = interior_stats_names.size + exterior_stats_names.size 
                + performance_stats_names.size + mpg_stats_names.size

  exterior = trim_list[0].xpath("./ul[@class = 'data_column']")
  num_trims = exterior.size
  
  # create array to hold all of the cars trim variations
  @trims = Array.new

  exterior.each do |ext|
    trim = Trim.new
    trim.trim_name = ext.xpath("./li[@class='header']/span/a").text
    @trims << trim
  end

  #visually track progress of fetching
  pbar = ProgressBar.new("Getting specs", total_stats * @trims.size )
  
  #exterior statistics for table
  exterior.each_with_index do |exterior_stats, index|
    stats = exterior_stats.xpath("./li/span")
    stat_index = 1
    exterior_stats_names.each do |stat_name|
      unless stat_name == ""
        @trims[index].exterior[stat_name.to_sym] = stats[stat_index].text
      end
      stat_index += 1
      pbar.inc
    end
  end

  #fetch interior statistics from table
  interior = trim_list[1].xpath("./ul[@class = 'data_column']")
  interior.each_with_index do |interior_stats, index|
    stats = interior_stats.xpath("./li/span")
    stat_index = 1
    interior_stats_names.each do |stat_name|
      unless stat_name == ""
        @trims[index].interior[stat_name.to_sym] = stats[stat_index].text
      end
      stat_index += 1
      pbar.inc
    end
  end
  
  #fetch performance data from table
  performance = trim_list[2].xpath("./ul[@class = 'data_column']")
  performance.each_with_index do |performance_stats, index|
    stats = performance_stats.xpath("./li/span")
    stat_index = 1
    performance_stats_names.each do |stat_name|
      unless stat_name == ""
        @trims[index].performance[stat_name.to_sym] = stats[stat_index].text
      end
      stat_index += 1
      pbar.inc
    end
  end
  
  #fetch fuel economy data from table
  fuel_economy = trim_list[3].xpath("./ul[@class = 'data_column']")
  fuel_economy.each_with_index do |fuel_economy_stats, index|
    stats = fuel_economy_stats.xpath("./li/span")
    @trims[index].fuel_economy.fuel_tank_capacity = stats[1].text
    @trims[index].fuel_economy.epa_mileage_estimates = stats[2].text
    pbar.inc
  end
  
  pbar.finish

end
print_trims() click to toggle source

Private Instance Methods

unspacify(string_array) click to toggle source
# File lib/car.rb, line 221
def unspacify(string_array)
  ret = Array.new
  string_array.each do |string|
    if string != nil
      ret << string.downcase.gsub(" ", "_")
    end
  end
  ret
end