From 45b46398a35a65fe20a27353b98731e8a87b413e Mon Sep 17 00:00:00 2001 From: Danielle Cardona Date: Mon, 16 Sep 2024 11:12:02 -0600 Subject: [PATCH 1/3] completed through iteration 3 --- lib/item.rb | 8 ++++ lib/market.rb | 67 ++++++++++++++++++++++++++- lib/vendor.rb | 23 +++++++++- spec/item_spec.rb | 18 ++++++++ spec/market_spec.rb | 108 ++++++++++++++++++++++++++++++++++++++++++++ spec/vendor_spec.rb | 76 +++++++++++++++++++++++++++++++ 6 files changed, 298 insertions(+), 2 deletions(-) create mode 100644 spec/market_spec.rb create mode 100644 spec/vendor_spec.rb diff --git a/lib/item.rb b/lib/item.rb index 85bb5fd..8480330 100644 --- a/lib/item.rb +++ b/lib/item.rb @@ -1,3 +1,11 @@ class Item + + attr_reader :name, + :price + + def initialize(attributes) + @name = attributes[:name] + @price = attributes[:price] + end end diff --git a/lib/market.rb b/lib/market.rb index 0286ac1..cdf7337 100644 --- a/lib/market.rb +++ b/lib/market.rb @@ -1,3 +1,68 @@ class Market - + + attr_reader :name + + attr_accessor :vendors + + def initialize(name) + @name = name + @vendors = [] + end + + def add_vendor(vendor_object) + @vendors << vendor_object + end + + def vendor_names + @vendors.map do |vendor| + vendor.name + end + end + + def vendors_that_sell(item) + @vendors.select do |vendor| + vendor.check_stock(item) > 0 + end + end + + def sorted_item_list + all_items = @vendors.flat_map do |vendor| + vendor.inventory.keys + end + + all_items.uniq.sort_by do |item| + item.name + end + end + + def total_inventory + total_inventory = {} + + @vendors.each do |vendor| + vendor.inventory.each do |item, quantity| + + if total_inventory[item] + total_inventory[item][:quantity] += quantity + total_inventory[item][:vendors] << vendor unless total_inventory[item][:vendors].include?(vendor) + else + total_inventory[item] = { + quantity: quantity, + vendors: [vendor] + } + end + end + end + total_inventory + end + + def overstocked_items + overstocked_items = [] + + total_inventory.each do |item, info| + if info[:quantity] > 50 && info[:vendors].length > 1 + overstocked_items << item + end + end + overstocked_items + end end diff --git a/lib/vendor.rb b/lib/vendor.rb index 6f8cc8b..9c5c928 100644 --- a/lib/vendor.rb +++ b/lib/vendor.rb @@ -1,3 +1,24 @@ class Vendor - + + attr_reader :name, + :inventory + + def initialize(name) + @name = name + @inventory = Hash.new(0) + end + + def check_stock(item) + @inventory[item] + end + + def stock(item, amount = 0) + @inventory[item] += amount + end + + def potential_revenue + @inventory.sum do |item, quantity| + item.price.delete('$').to_f * quantity + end + end end diff --git a/spec/item_spec.rb b/spec/item_spec.rb index e69de29..df8b652 100644 --- a/spec/item_spec.rb +++ b/spec/item_spec.rb @@ -0,0 +1,18 @@ +require './lib/item' + +RSpec.describe Item do + before(:each) do + @item1 = Item.new({name: 'Peach', price: "$0.75"}) + end + + describe '#initialze' do + it "exists" do + expect(@item1).to be_instance_of(Item) + end + + it 'has a name and a price' do + expect(@item1.name).to eq("Peach") + expect(@item1.price).to eq("$0.75") + end + end +end diff --git a/spec/market_spec.rb b/spec/market_spec.rb new file mode 100644 index 0000000..bf7ea8d --- /dev/null +++ b/spec/market_spec.rb @@ -0,0 +1,108 @@ +require './lib/item' +require './lib/vendor' +require './lib/market' + +RSpec.describe Market do + before(:each) do + @vendor1 = Vendor.new("Rocky Mountain Fresh") + @vendor2 = Vendor.new("Ba-Nom-a-Nom") + @vendor3 = Vendor.new("Palisade Peach Shack") + @vendor4 = Vendor.new("Choco Monster") + @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"}) + @market = Market.new("South Pearl Street Farmers Market") + end + + describe '#initialize' do + it "exists" do + expect(@market).to be_instance_of(Market) + end + + it 'has a name' do + expect(@market.name).to eq("South Pearl Street Farmers Market") + end + + it 'starts with an empty array of vendors' do + expect(@market.vendors).to eq([]) + end + end + + describe '#vendors' do + before(:each) do + @market.add_vendor(@vendor1) + @market.add_vendor(@vendor2) + @market.add_vendor(@vendor3) + end + + it 'can add vendors' do + expect(@market.vendors).to eq([@vendor1, @vendor2, @vendor3]) + end + + it 'identifies the names of vendors' do + expect(@market.vendor_names).to eq(["Rocky Mountain Fresh", "Ba-Nom-a-Nom", "Palisade Peach Shack"]) + end + end + + describe '#stock' do + before(:each) do + @market.add_vendor(@vendor1) + @market.add_vendor(@vendor2) + @market.add_vendor(@vendor3) + @vendor1.stock(@item1, 35) + @vendor1.stock(@item2, 7) + @vendor2.stock(@item4, 50) + @vendor2.stock(@item3, 25) + @vendor3.stock(@item1, 65) + end + + it 'identifies vendors that sell items' do + expect(@market.vendors_that_sell(@item1)).to eq([@vendor1, @vendor3]) + expect(@market.vendors_that_sell(@item2)).to eq([@vendor1]) + expect(@market.vendors_that_sell(@item3)).to eq([@vendor2]) + expect(@market.vendors_that_sell(@item4)).to eq([@vendor2]) + end + + it 'identifies all items in stock, sorted alphabetically' do + expect(@market.sorted_item_list).to eq([@item4, @item1, @item3, @item2]) + end + + it 'reports total inventory' do + expected = { + @item1 => { quantity: 100, vendors: [@vendor1, @vendor3] }, + @item2 => { quantity: 7, vendors: [@vendor1] }, + @item3 => { quantity: 25, vendors: [@vendor2] }, + @item4 => { quantity: 50, vendors: [@vendor2] }, + } + + expect(@market.total_inventory).to eq(expected) + end + + it 'updates when new items are added' do + @market.add_vendor(@vendor4) + @item5 = Item.new({name: 'Chocolate Almond Butter', price: "$6.25"}) + @vendor4.stock(@item5, 14) + + expected = { + @item1 => { quantity: 100, vendors: [@vendor1, @vendor3] }, + @item2 => { quantity: 7, vendors: [@vendor1] }, + @item3 => { quantity: 25, vendors: [@vendor2] }, + @item4 => { quantity: 50, vendors: [@vendor2] }, + @item5 => { quantity: 14, vendors: [@vendor4] } + } + end + + it 'identifies overstocked items' do + expect(@market.overstocked_items).to eq([@item1]) + end + + it 'identifies more overstocked items as appropriate' do + @vendor1.stock(@item4, 75) + + expect(@market.overstocked_items).to eq([@item1, @item4]) + end + + end +end + diff --git a/spec/vendor_spec.rb b/spec/vendor_spec.rb new file mode 100644 index 0000000..ecb0c81 --- /dev/null +++ b/spec/vendor_spec.rb @@ -0,0 +1,76 @@ +require './lib/item' +require './lib/vendor' + +RSpec.describe Vendor do + before(:each) do + @vendor = Vendor.new("Rocky Mountain Fresh") + @item1 = Item.new({name: 'Peach', price: "$0.75"}) + @item2 = Item.new({name: 'Tomato', price: "$0.50"}) + end + + describe '#initialze' do + it "exists" do + expect(@vendor).to be_instance_of(Vendor) + end + + it 'has a name' do + expect(@vendor.name).to eq("Rocky Mountain Fresh") + end + end + + describe '#stock' do + it 'starts with an empty inventory hash' do + expect(@vendor.inventory).to eq({}) + end + + it 'checks inventory stock' do + expect(@vendor.check_stock(@item1)).to eq(0) + end + + it 'adds inventory' do + @vendor.stock(@item1, 30) + + expect(@vendor.check_stock(@item1)).to eq(30) + end + + it 'adds more inventory' do + @vendor.stock(@item1, 30) + @vendor.stock(@item1, 25) + @vendor.stock(@item2, 12) + + expect(@vendor.check_stock(@item1)).to eq(55) + expect(@vendor.check_stock(@item2)).to eq(12) + end + + it 'identifies items and amounts in inventory' do + @vendor.stock(@item1, 30) + @vendor.stock(@item1, 25) + @vendor.stock(@item2, 12) + + expect(@vendor.inventory).to eq({@item1 => 55, @item2 => 12}) + end + end + + describe '#revenue' do + before(:each) do + @vendor1 = Vendor.new("Rocky Mountain Fresh") + @vendor2 = Vendor.new("Ba-Nom-a-Nom") + @vendor3 = Vendor.new("Palisade Peach Shack") + @item3 = Item.new({name: 'Peach-Raspberry Nice Cream', price: "$5.30"}) + @item4 = Item.new({name: 'Banana Nice Cream', price: "$4.25"}) + + @vendor1.stock(@item1, 35) + @vendor1.stock(@item2, 7) + @vendor2.stock(@item4, 50) + @vendor2.stock(@item3, 25) + @vendor3.stock(@item1, 65) + end + + it 'calculates each vendors potential revenue' do + 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 +end + From cdd703c8d41892cf27de87774daeb7fe78afccda Mon Sep 17 00:00:00 2001 From: Danielle Cardona Date: Mon, 16 Sep 2024 11:34:32 -0600 Subject: [PATCH 2/3] add sell method --- lib/market.rb | 16 ++++++++++++++-- spec/market_spec.rb | 9 +++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/lib/market.rb b/lib/market.rb index cdf7337..e6cdd44 100644 --- a/lib/market.rb +++ b/lib/market.rb @@ -1,12 +1,15 @@ class Market - - attr_reader :name +require 'date' + + attr_reader :name, + :date attr_accessor :vendors def initialize(name) @name = name @vendors = [] + @date = Date.today.strftime('%Y/%m/%d') end def add_vendor(vendor_object) @@ -65,4 +68,13 @@ def overstocked_items end overstocked_items end + + def sell(item, quantity) + if total_inventory[item] && total_inventory[item][:quantity] >= quantity + total_inventory[item][:quantity] -= quantity + true + else + false + end + end end diff --git a/spec/market_spec.rb b/spec/market_spec.rb index bf7ea8d..13a5474 100644 --- a/spec/market_spec.rb +++ b/spec/market_spec.rb @@ -24,6 +24,10 @@ expect(@market.name).to eq("South Pearl Street Farmers Market") end + it 'has a date' do + expect(@market.date).to eq("2024/09/16") + end + it 'starts with an empty array of vendors' do expect(@market.vendors).to eq([]) end @@ -103,6 +107,11 @@ expect(@market.overstocked_items).to eq([@item1, @item4]) end + it 'indicates if it has insufficient stock' do + expect(@market.sell(@item2, 10)).to eq(false) + expect(@market.sell(@item1, 10)).to eq(true) + end + end end From d8c461009604de403b2d46008f518fa61ffd1102 Mon Sep 17 00:00:00 2001 From: Danielle Cardona Date: Mon, 16 Sep 2024 11:43:04 -0600 Subject: [PATCH 3/3] fix error in market test --- spec/market_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/market_spec.rb b/spec/market_spec.rb index 13a5474..caa280d 100644 --- a/spec/market_spec.rb +++ b/spec/market_spec.rb @@ -44,7 +44,7 @@ expect(@market.vendors).to eq([@vendor1, @vendor2, @vendor3]) end - it 'identifies the names of vendors' do + it 'stores vendor names in an array' do expect(@market.vendor_names).to eq(["Rocky Mountain Fresh", "Ba-Nom-a-Nom", "Palisade Peach Shack"]) end end