diff --git a/.rspec b/.rspec new file mode 100644 index 0000000..210a1d6 --- /dev/null +++ b/.rspec @@ -0,0 +1,2 @@ +--format documentation +--color \ No newline at end of file diff --git a/lib/item.rb b/lib/item.rb index 85bb5fd..906c24d 100644 --- a/lib/item.rb +++ b/lib/item.rb @@ -1,3 +1,8 @@ class Item + attr_reader :name, :price + def initialize(info) + @name = info[:name] + @price = info[:price] + end end diff --git a/lib/market.rb b/lib/market.rb index 0286ac1..69a8a26 100644 --- a/lib/market.rb +++ b/lib/market.rb @@ -1,3 +1,42 @@ class Market - + attr_reader :name, :vendors + + def initialize(name) + @name = name + @vendors = ([]) + end + + def add_vendor(vendor) + @vendors << vendor + end + + def vendor_names + @vendors.map { |vendor| vendor.name } + end + + def vendors_that_sell(item) + @vendors.select do |vendor| + vendor.inventory.include?(item) + end + end + + def sorted_item_list + vendors.flat_map { |vendor| vendor.inventory.keys.map(&:name)}.uniq.sort + end + + def total_inventory + all_inventory = {} + + @vendors.each do |vendor| + vendor.inventory.each do |item, quantity| + if all_inventory[item] + all_inventory[item][:quantity] += quantity + all_inventory[item][:vendors] << vendor.name unless all_inventory[item][:vendors].include?(vendor.name) + else + all_inventory[item] = {quantity: quantity, vendors: [vendor.name]} + end + end + end + all_inventory + end end diff --git a/lib/vendor.rb b/lib/vendor.rb index 6f8cc8b..9384de4 100644 --- a/lib/vendor.rb +++ b/lib/vendor.rb @@ -1,3 +1,21 @@ class Vendor - + attr_reader :name, :inventory + def initialize(name) + @inventory = {} + @name = name + end + + def check_stock(item) + @inventory[item] || 0 + end + + def stock(item, quantity) + @inventory[item] = (@inventory[item] || 0 )+ quantity + end + + def potential_revenue + @inventory.sum do |item,quantity| + item.price.gsub('$', '').to_f * quantity + end.round(2) + end end diff --git a/spec/item_spec.rb b/spec/item_spec.rb index e69de29..68fc13d 100644 --- a/spec/item_spec.rb +++ b/spec/item_spec.rb @@ -0,0 +1,23 @@ +require 'spec_helper' + +RSpec.describe Item do + before(:each) do + @item1 = Item.new({name: 'Peach', price: "$0.75"}) + @item2 = Item.new({name: 'Tomato', price: '$0.50'}) + end + + it '#exists' do + expect(@item1).to be_an_instance_of (Item) + expect(@item2).to be_an_instance_of (Item) + end + + it 'has a name' do + expect(@item1.name).to eq('Peach') + expect(@item2.name).to eq('Tomato') + end + + it 'has a price' do + expect(@item1.price).to eq('$0.75') + expect(@item2.price).to eq('$0.50') + end +end \ No newline at end of file diff --git a/spec/market_spec.rb b/spec/market_spec.rb new file mode 100644 index 0000000..f726f17 --- /dev/null +++ b/spec/market_spec.rb @@ -0,0 +1,65 @@ +require 'spec_helper' +RSpec.describe Market do + before(:each) do + @market = Market.new("South Pearl Street Farmers Market") + @vendor1 = Vendor.new("Rocky Mountain Fresh") + @vendor2 = Vendor.new("Ba-Nom-a-Nom") + @vendor3 = Vendor.new("Palisade Peach Shack") + @item1 = Item.new({name: 'Peach', price: "$0.75"}) + @item2 = Item.new({name: 'Tomato', price: '$0.50'}) + @item3 = Item.new({name: "Peach-Raspberry Nice Cream", price: "$5.30"}) + @item4 = Item.new({name: "Banana Nice Cream", price: "$4.25"}) + end + + it '#exists' do + expect(@market).to be_an_instance_of(Market) + end + + it '#has a name' do + expect(@market.name).to eq ("South Pearl Street Farmers Market") + end + + it '#has no vendors' do + expect(@market.vendors).to eq([]) + end + + it '#can have vendors' do + @market.add_vendor(@vendor1) + @market.add_vendor(@vendor2) + @market.add_vendor(@vendor3) + expect(@market.vendors).to eq([@vendor1, @vendor2, @vendor3]) + end + + it '#can tell vendor names' do + @market.add_vendor(@vendor1) + @market.add_vendor(@vendor2) + @market.add_vendor(@vendor3) + expect(@market.vendor_names).to eq(["Rocky Mountain Fresh", "Ba-Nom-a-Nom", "Palisade Peach Shack"]) + end + + it '#can show vendors that sell an item' do + @vendor1.stock(@item1, 35) + @vendor1.stock(@item2, 7) + @vendor2.stock(@item4, 50) + @vendor2.stock(@item3, 25) + @vendor3.stock(@item1, 65) + @market.add_vendor(@vendor1) + @market.add_vendor(@vendor2) + @market.add_vendor(@vendor3) + expect(@market.vendors_that_sell(@item1)).to eq([@vendor1, @vendor3]) + expect(@market.vendors_that_sell(@item4)).to eq([@vendor2]) + end + + it '#can show all items in inventory' do + @vendor1.stock(@item1, 35) + @vendor1.stock(@item2, 7) + @vendor2.stock(@item4, 50) + @vendor2.stock(@item3, 25) + @vendor3.stock(@item1, 65) + @market.add_vendor(@vendor1) + @market.add_vendor(@vendor2) + @market.add_vendor(@vendor3) + expect(@market.sorted_item_list).to eq(["Banana Nice Cream", "Peach", "Peach-Raspberry Nice Cream", "Tomato"]) + end +end + diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 0000000..2b46fb1 --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,4 @@ +require 'pry' +require './lib/item' +require './lib/vendor' +require './lib/market' \ No newline at end of file diff --git a/spec/vendor_spec.rb b/spec/vendor_spec.rb new file mode 100644 index 0000000..d2fd5e1 --- /dev/null +++ b/spec/vendor_spec.rb @@ -0,0 +1,64 @@ +require 'spec_helper' +RSpec.describe Vendor do + before(:each) do + + @vendor1 = Vendor.new("Rocky Mountain Fresh") + @vendor2 = Vendor.new("Ba-Nom-a-Nom") + @vendor3 = Vendor.new("Palisade Peach Shack") + @item1 = Item.new({name: 'Peach', price: "$0.75"}) + @item2 = Item.new({name: 'Tomato', price: '$0.50'}) + @item3 = Item.new({name: "Peach-Raspberry Nice Cream", price: "$5.30"}) + @item4 = Item.new({name: "Banana Nice Cream", price: "$4.25"}) + end + + it '#exists' do + expect(@vendor1).to be_an_instance_of(Vendor) + expect(@vendor2).to be_an_instance_of(Vendor) + expect(@vendor3).to be_an_instance_of(Vendor) + end + + it '#has a name' do + expect(@vendor1.name).to eq ("Rocky Mountain Fresh") + expect(@vendor2.name).to eq ("Ba-Nom-a-Nom") + expect(@vendor3.name).to eq ("Palisade Peach Shack") + end + + it '#has inventory' do + expect(@vendor1.inventory).to eq({}) + expect(@vendor2.inventory).to eq({}) + expect(@vendor3.inventory).to eq({}) + end + + it '#has stock' do + expect(@vendor1.check_stock(@item1)).to eq(0) + expect(@vendor2.check_stock(@item1)).to eq(0) + expect(@vendor3.check_stock(@item1)).to eq(0) + end + + it '#can stock items' do + @vendor1.stock(@item1, 30) + expect(@vendor1.check_stock(@item1)).to eq(30) + expect(@vendor1.check_stock(@item1)).to_not eq(0) + expect(@vendor2.check_stock(@item1)).to eq(0) + @vendor1.stock(@item1, 25) + expect(@vendor1.check_stock(@item1)).to eq(55) + expect(@vendor2.check_stock(@item1)).to eq(0) + end + + it '#can have items in inventory' do + @vendor1.stock(@item1, 25) + @vendor1.stock(@item2, 25) + expect(@vendor1.inventory).to eq({@item1 => 25 , @item2 => 25}) + end + + it '#can determine potential revenue for vendors' do + @vendor1.stock(@item1, 35) + @vendor1.stock(@item2, 7) + @vendor2.stock(@item4, 50) + @vendor2.stock(@item3, 25) + @vendor3.stock(@item1, 65) + expect(@vendor1.potential_revenue).to eq (29.75) + expect(@vendor2.potential_revenue).to eq (345.00) + expect(@vendor3.potential_revenue).to eq (48.75) + end +end