-
-
Save mstruve/f44196c4f58cb38ff3e3aafbbbda69a1 to your computer and use it in GitHub Desktop.
Restaurant Reservation TakeHome problem
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# To run: irb -r <path to file>/reservation.rb | |
# Load gems and install if necessary | |
begin | |
gem "highline" | |
gem "table_print" | |
rescue LoadError | |
system("sudo gem install highline") | |
Gem.clear_paths | |
end | |
require 'highline/import' | |
require 'table_print' | |
class Restaurant | |
attr_accessor :name, :tables | |
def initialize(name) | |
self.name = name | |
self.tables = create_tables | |
end | |
def make_reservation(customer_name, party_size, time) | |
table = find_table(party_size, time) | |
Reservation.new(customer_name, time, table) | |
puts "You have successfully created a reservation!" | |
rescue TableNotAvailableError | |
puts "Uh oh! There are no tables available. Maybe try another time." | |
rescue TableSizeError | |
puts "Im sorry, we can't handle a party your size." | |
end | |
def create_tables | |
# I choose to randomly create tables for a restaurant | |
# You could change this to create_table(size) if you | |
# wanted control over creating your own tables. | |
(1..5).map{|i| Table.new(i, rand(2..8)) } | |
end | |
def find_table(party_size, time) | |
raise TableSizeError if tables.map{|t| t.size}.max < party_size | |
available_table = tables_available(time).sort{|t1, t2| t1.size <=> t2.size}.detect{|t| t.size >= party_size} | |
raise TableNotAvailableError unless available_table | |
available_table | |
end | |
def tables_available(time) | |
tables.select{|t| t.available?(time)} | |
end | |
def reservations | |
tables.collect{|t| t.reservations}.flatten | |
end | |
class Table | |
attr_accessor :number, :size, :reservations | |
def initialize(number, size) | |
self.number = number | |
self.size = size | |
self.reservations = [] | |
end | |
def available?(time) | |
reservations.none?{|r| r.time == time} | |
end | |
end | |
class Reservation | |
attr_accessor :name, :table, :time | |
def initialize(name, time, table) | |
self.name = name | |
self.time = time | |
self.table = table | |
reserve_table | |
end | |
def reserve_table | |
table.reservations << self | |
end | |
end | |
class TableSizeError < StandardError; end | |
class TableNotAvailableError < StandardError; end | |
end | |
r = Restaurant.new("Risky Business") | |
make_a_reservation = "Y" | |
puts "The restaurant Risky Business has #{r.tables.count} tables:" | |
tp r.tables, "number", "size" | |
puts "There are currently no reservations." | |
while make_a_reservation == "Y" do | |
make_a_reservation = ask "Do you want to make a reservation? (Y/N) " | |
next if make_a_reservation == "N" | |
time = ask "What time do you want to go? (ex. 7PM)" | |
party_size = ask("How many people?", Integer) | |
name = ask "What is the name for the reservation?" | |
r.make_reservation(name, party_size, time) | |
puts "Reservations for the evening" | |
tp r.reservations, "name", "table.number", "time" | |
end | |
puts "Have a nice day!" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment