[ create a new paste ] login | about

Link: http://codepad.org/1jjNNPfy    [ raw code | output | fork ]

Ruby, pasted on Feb 16:
require 'csv'

##Operations/IO

module Reader

  def self.load_hotels_csv(filename)
    hotels = {}
    CSV.foreach(filename, :headers => true, :header_converters => :symbol) do |row|
      hotels[row[:name].downcase.to_sym] = Hotel.new(row)
    end
    hotels
  end

  def self.inputs
    parameters = gets.chomp.gsub(/\W\s+|(\([a-z]*\)|,|\s)/, ' ').split(/\s/).reject!(&:empty?)
    p parameters
    # parameters = parameters.gsub(/\W\s+|(\([a-z]*\)|,|\s)/, ' ').split(/\s/)
  end

end

##Hotel

class Hotel

  attr_reader :name, :rating, :regular_weekday, :regular_weekend, :rewards_weekday, :rewards_weekend

  def initialize(hotel)
    @name            = hotel[:name]
    @rating          = hotel[:rating]
    @regular_weekday = hotel[:regular_weekday]
    @regular_weekend = hotel[:regular_weekend]
    @rewards_weekday = hotel[:rewards_weekday]
    @rewards_weekend = hotel[:rewards_weekend]
  end

  def to_hash
    hash = {}
    instance_variables.each {|var| hash[var.to_s.delete("@")] = instance_variable_get(var) }
    hash
  end

  def self.return_rates(parameters, hotels)
    if parameters[0].downcase == "regular" 
      parameters[1..-1].each do |day|
        puts weekend?(day) ? cheapest('regular_weekend', hotels) : cheapest('regular_weekday', hotels)
      end
    elsif parameters[0].downcase == "rewards"
      parameters[1..-1].each do |day|
        puts weekend?(day) ? cheapest('rewards_weekend', hotels) : cheapest('rewards_weekday', hotels) 
      end
    else
      p "invalid input"
    end
  end

  def self.weekend?(day)
    day = day.split(/(\D{3,})/).reverse
    day = Time.utc(*day)
    p day
    return day.saturday? || day.sunday?
  end

  def self.cheapest(key, hotels)

    rates = []
    hotels.each_value do |hotel|
      rates << hotel[key]
    end
    p rates.join(' ')
  end

end

module Booking
  extend Reader

  def self.run
    
    hotels = Reader.load_hotels_csv("hotels.csv").to_hash

    puts "Enter a customer type (Regular or Rewards) and desired dates (DayMonthYear format please):"
    parameters = Reader.inputs
    hotels.each_value do |hotel|
      Hotel.return_rates(parameters, hotels)
    end
    puts "Check other rates? Enter 'y' if so."
    affirm = gets.chomp
      while affirm.downcase == 'y'
        puts "Enter details:\n"
        Hotel.return_rates(Reader.inputs)
        puts "Check other rates? Enter 'y' if so."
        affirm = gets.chomp
      end
  end

    
end


Booking.run


# sample output + error thrown:


#Enter a customer type (Regular or Rewards) and desired dates (DayMonthYear format please):
#Rewards: 26Mar2009(thur), 27Mar2009(fri), 28Mar2009(sat)
#["Rewards", "26Mar2009", "27Mar2009", "28Mar2009"]
#2009-03-26 00:00:00 UTC
#reservations2.rb:69:in `block in cheapest': undefined method `[]' for #<Hotel:0x007f84db829530> (NoMethodError)
#	from reservations2.rb:68:in `each_value'
#	from reservations2.rb:68:in `cheapest'
#	from reservations2.rb:51:in `block in return_rates'
#	from reservations2.rb:50:in `each'
#	from reservations2.rb:50:in `return_rates'
#	from reservations2.rb:86:in `block in run'
#	from reservations2.rb:85:in `each_value'
#	from reservations2.rb:85:in `run'
#	from reservations2.rb:102:in `<main>'


Output:
1
2
3
4
5
6
7
/usr/lib/ruby/1.8/csv.rb:308:in `initialize': No such file or directory - hotels.csv (Errno::ENOENT)
	from /usr/lib/ruby/1.8/csv.rb:308:in `open'
	from /usr/lib/ruby/1.8/csv.rb:308:in `open_reader'
	from /usr/lib/ruby/1.8/csv.rb:94:in `foreach'
	from t.rb:9:in `load_hotels_csv'
	from t.rb:81:in `run'
	from t.rb:102


Create a new paste based on this one


Comments: