diff --git a/Dans-Game/controller.rb b/Dans-Game/controller.rb new file mode 100644 index 0000000..9735aa8 --- /dev/null +++ b/Dans-Game/controller.rb @@ -0,0 +1,68 @@ +require_relative 'view' +require_relative 'model' + +class Controller + include View + + def initialize + @beerList = List.new + end + + def add_beer + @beerList.add_beer Print::serialize_add_beer + end + + def edit_beer + id = Print::get_input("\nEnter the id of the beer you want to EDIT:").to_i + b = @beerList.find_beer id + fail "No beer matching id #{id}" unless b + @beerList.edit_beer(Print::serialize_edit_beer(b.name, b.brewer, b.rating), id) + end + + def delete_beer + id = Print::get_input "\nEnter the id of the beer you want to DELETE:" + @beerList.delete_beer id.to_i + end + + def sort_list + cmd = Print::get_input "\nEnter the sort method (N)ame/(B)rewer/(R)ating/(I)d:" + case cmd.upcase + when 'N' + @beerList.sort_by_name! + when 'B' + @beerList.sort_by_brewer! + when 'R' + @beerList.sort_by_rating! + else + @beerList.sort_by_id! + end + end + + def run! + Print::run_spinner + Print::title_screen + + loop do + Print::menu + case Print::get_input.upcase + when "V" + Print::print_list(@beerList.beers) + when "A" + add_beer + when "E" + edit_beer + when "D" + delete_beer + when "S" + sort_list + when "Q" + puts "Cheers!" + exit + else + Print::error_message + end + end + end +end + +Controller.new.run! diff --git a/Dans-Game/model.rb b/Dans-Game/model.rb new file mode 100644 index 0000000..e06aa5e --- /dev/null +++ b/Dans-Game/model.rb @@ -0,0 +1,81 @@ +class Beer + attr_reader :id, :name, :brewer, :rating + + def initialize args + @id = args[:id] + @name = args[:name] + @brewer = args[:brewer] + @rating = args[:rating] + end + + def edit input + @name = input[:name] + @brewer = input[:brewer] + @rating = input[:rating] + end + + def to_s + "##{@id} #{@name} - #{@brewer} (#{@rating} / 100)" + end +end + +class List + attr_reader :beers + + def initialize + @id = 0 + @beers = [] + populate + end + + def add_beer input + @beers << Beer.new(input.merge(generate_id)) + end + + def delete_beer id + @beers.delete_if { |b| b.id == id } + end + + def edit_beer input, id + b = find_beer id + fail "No beer matching id #{id}" unless b + b.edit input + end + + def find_beer id + @beers.find { |b| b.id == id } + end + + def sort_by_brewer! + @beers.sort_by! { |b| b.brewer } + end + + def sort_by_id! + @beers.sort_by! { |b| b.id } + end + + def sort_by_name! + @beers.sort_by! { |b| b.name } + end + + def sort_by_rating! + @beers.sort_by! { |b| 100 - b.rating } + end + + private + + def generate_id + { id: @id += 1 } + end + + def populate + list = [ + { name: "Dortmunder Gold", brewer: "Great Lakes", rating: 95 }, + { name: "Fat Tire", brewer: "New Belgium", rating: 78 }, + { name: "Ohio Native Lager", brewer: "Sibling Revelry", rating: 83 }, + { name: "Inverness", brewer: "Columbus Brewing Company", rating: 72 }, + { name: "Black & Tan", brewer: "Yuengling", rating: 80 }, + ] + list.each { |b| add_beer(b) } + end +end diff --git a/Dans-Game/view.rb b/Dans-Game/view.rb new file mode 100644 index 0000000..cd9fd0d --- /dev/null +++ b/Dans-Game/view.rb @@ -0,0 +1,98 @@ +module View + + module Print + + class << self + def run_spinner + print "Loading (please wait) " + 5.times { print "."; sleep 0.5; } + print "\n" + end + + def error_message + puts "That's not a command key. Try again!" + end + + def title_screen + title = < " + gets.chomp + end + + def get_input_or_default default, question=nil + puts question if question + print "> " + input = gets.chomp + input == "" ? default : input + end + end + end +end