diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..404abb22 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +coverage/ diff --git a/Rakefile b/Rakefile new file mode 100644 index 00000000..82e5a661 --- /dev/null +++ b/Rakefile @@ -0,0 +1,7 @@ +require 'rake/testtask' + +Rake::TestTask.new do |t| + t.test_files = FileList['specs/*_spec.rb'] + end + +task default: :test diff --git a/far_mar.rb b/far_mar.rb new file mode 100644 index 00000000..b3aad961 --- /dev/null +++ b/far_mar.rb @@ -0,0 +1,7 @@ +require 'csv' +require './lib/farmar_market' +require './lib/farmar_product' +require './lib/farmar_sale' +require './lib/farmar_vendor' +require 'chronic' +module FarMar; end diff --git a/lib/farmar_market.rb b/lib/farmar_market.rb new file mode 100644 index 00000000..ca5fec34 --- /dev/null +++ b/lib/farmar_market.rb @@ -0,0 +1,51 @@ +require 'csv' + +module FarMar + class Market + attr_reader :id, :name, :address, :city, :state + def initialize (id, name, address, city, county, state, zip) + @id = id + @name = name + @address = address + @city = city + @county = county + @state = state + @zip = zip + end + + def self.all + markets = {} + farm_mrkt = [] + CSV.open('support/markets.csv', 'r'). each do |place| + markets[place[0]] = place[1..6] + id = place[0].to_i + name = place[1] + address = place[2] + city = place[3] + county = place[4] + state = place[5] + zip = place[6] + farm_mrkt << self.new(id, name, address, city, county, state, zip) + end + return farm_mrkt + end + def self.find(id) + id_find = self.all + id_find.each do |i| + if i.id == id + return i + end + end + end + def vendors + FarMar::Vendor.by_market(@id) + end + def products + products = [] + vendors.each do |x| + products << FarMar::Product.by_vendor(x.vend_id) + end + products.flatten! + end + end +end diff --git a/lib/farmar_product.rb b/lib/farmar_product.rb new file mode 100644 index 00000000..b7729ec2 --- /dev/null +++ b/lib/farmar_product.rb @@ -0,0 +1,51 @@ +class FarMar::Product + attr_reader :id, :name, :vend_id + def initialize (id, name, vend_id) + @id = id + @name = name + @vend_id = vend_id + end + def self.all + products = {} + merch = [] + CSV.open('support/products.csv', 'r').each do |line| + products[line[0]] = line[1..2] + id = line[0].to_i + name = line[1] + vend = line[2].to_i + merch << self.new(id, name, vend) + end + return merch + end + + def self.find(id) + find_id = self.all + find_id.each do |i| + if i.id == id + return i + end + end + end + + def vendor + FarMar::Vendor.find(@vend_id) + end + + def self.by_vendor(vendor_id) + prod_search = self.all + prod_search.find_all do |i| + i.vend_id == vendor_id + end + end + + def sales + FarMar::Sale.all.find_all do |i| + i.prod_id == @id + end + end + + def number_of_sales + sales.count + end + +end diff --git a/lib/farmar_sale.rb b/lib/farmar_sale.rb new file mode 100644 index 00000000..ee639e00 --- /dev/null +++ b/lib/farmar_sale.rb @@ -0,0 +1,55 @@ + +class FarMar::Sale + attr_reader :id, :amount, :purch_time, :vend_id, :prod_id + def initialize(id, amount, purch_time, vend, prod) + @id = id + @amount = amount + @purch_time = purch_time + @vend_id = vend + @prod_id = prod + end + + def self.all + sales = {} + discount = [] + CSV.open('support/sales.csv', 'r').each do |line| + sales[line[0]] = line[1..4] + id = line[0].to_i + amount = line[1].to_i + purch_time = line[2] + vend = line[3].to_i + prod = line[4].to_i + discount << self.new(id, amount, purch_time, vend, prod) + end + return discount + end + + def self.find(id) + find_id = self.all + find_id.each do |i| + if i.id == id + return i + end + end + end + + def vendor + FarMar::Vendor.find(@vend_id) + end + def product + FarMar::Product.find(@prod_id) + end + + def self.between(begin_time, end_time) + times = [] + time = Time.now + start = Chronic.parse(begin_time) + fin = Chronic.parse(end_time) + all.each do |i| + time = Chronic.parse(i.purch_time) + if start < time && time < fin + times << i + end + end + end +end diff --git a/lib/farmar_vendor.rb b/lib/farmar_vendor.rb new file mode 100644 index 00000000..fcc6adac --- /dev/null +++ b/lib/farmar_vendor.rb @@ -0,0 +1,59 @@ +class FarMar::Vendor + attr_reader :vend_id, :name, :num, :market_id + def initialize(id, name, num, market_id) + @vend_id = id + @name = name + @empl_num = num + @market_id = market_id + end + + def self.all + vendors = {} + farm_vend = [] + CSV.open('support/vendors.csv', 'r').each do |vend| + vendors[vend[0]] = vend[1..3] + id = vend[0].to_i + name = vend[1] + num = vend[2] + market_id = vend[3].to_i + farm_vend << self.new(id, name, num, market_id) + end + return farm_vend + end + + def self.find(id) + find_id = self.all + find_id.each do |i| + if i.vend_id == id + return i + end + end + end + def self.by_market(market_id) + + vend_search = self.all + vend_search.find_all do |i| + i.market_id == market_id + end + end + def market + FarMar::Market.find(@market_id) + end + + def products + FarMar::Product.by_vendor(@vend_id) + end + def sales + sales = FarMar::Sale.all + sales.find_all do |x| + x.vend_id == @vend_id + end + end + def revenue + sale = [] + sales.map! do |a| + sale << a.amount + end + sale.reduce(:+) + end +end diff --git a/specs/market_spec.rb b/specs/market_spec.rb new file mode 100644 index 00000000..c929f455 --- /dev/null +++ b/specs/market_spec.rb @@ -0,0 +1,50 @@ +require_relative 'spec_helper' + + +describe FarMar::Market do + let(:cap_hill) {FarMar::Market.new( 1, "Judy", "723 Herman ave", "Skokie", "Cook", "Il", "60076")} + describe "#initialize" do + it "can create a new instance of Market" do + cap_hill.must_be_instance_of(FarMar::Market) + end + + it "should have an id property" do + cap_hill.must_respond_to(:id) + end + + end + describe "self.all" do + it "should return an array" do + FarMar::Market.all.must_be_kind_of(Array) + end + end + + describe "self.find(id)" do + it "should return the id that was passed through" do + FarMar::Market.find(1).id.must_equal(1) + end + + it "should return the state the corresponds to the id" do + FarMar::Market.find(290).state.must_equal("North Carolina") + end + end + describe "vendors" do + it "should return an array" do + + cap_hill.vendors.must_be_kind_of(Array) + end + it "should be an instance of vendor" do + vendor = cap_hill.vendors + + vendor[0].must_be_instance_of(FarMar::Vendor) + end + end + describe "#products" do + it "should return a collection of FarMar:: Product instances" do + cap_hill.products.each do |x| + x.must_be_instance_of(FarMar::Product) + end + end + end + +end diff --git a/specs/product_spec.rb b/specs/product_spec.rb new file mode 100644 index 00000000..0ac7e2db --- /dev/null +++ b/specs/product_spec.rb @@ -0,0 +1,43 @@ +require_relative 'spec_helper' + +describe FarMar::Product do + let(:sam) {FarMar::Product.new(58, "Jane", 19)} + describe "#initialize" do + it "can create a new instance of Product" do + sam.must_be_instance_of(FarMar::Product) + end + end + describe "self.all" do + it "should return an array" do + FarMar::Product.all.must_be_kind_of(Array) + end + end + describe "self.find(id)" do + it "should return the id that was passed through" do + FarMar::Product.find(1).id.must_equal(1) + end + end + describe "#vendor" do + it "returns an instance of FarMar ::Vendor" do + sam.vendor.must_be_instance_of(FarMar::Vendor) + end + end + describe "self.by_vendor(vendor_id)" do + it "returns the vendors of a given vendor id" do + + FarMar::Product.by_vendor(19).each do |x| + x.vend_id.must_equal(19) + end + end + end + describe "#sales" do + it "will return a collection of sales instances based on the product id" do + sam.sales.must_be_kind_of(Object) + end + end + describe "#number_of_sales" do + it "can return the number of times a product has been sold" do + sam.number_of_sales.must_equal(5) + end + end +end diff --git a/specs/sale_spec.rb b/specs/sale_spec.rb new file mode 100644 index 00000000..797f997a --- /dev/null +++ b/specs/sale_spec.rb @@ -0,0 +1,45 @@ +require_relative 'spec_helper' + +describe FarMar::Sale do + let(:sam){FarMar::Sale.new(19, 15, "2013-11-06 20:44:00", 19, 58)} + describe "#initialize" do + + it "can create a new instance of Sale" do + sam.must_be_instance_of(FarMar::Sale) + end + end + + describe "self.all" do + it "should return an array" do + FarMar::Sale.all.must_be_kind_of(Array) + end + end + describe "self.find(id)" do + it "should return the id that was passed through" do + FarMar::Sale.find(1).id.must_equal(1) + end + end + describe "#vendor" do + it "will return an instance of Farm::Vendor" do + sam.vendor.must_be_instance_of(FarMar::Vendor) + end + end + describe "#product" do + it "returns an instance of FarMar::Product" do + sam.product.must_be_instance_of(FarMar::Product) + end + end + describe "self.between(begin_time, end_time)" do + it "will return FarMar:Sale instances" do + FarMar::Sale.between("2013-11-11 11:29:52 -0800", "2013-11-11 12:00:00 -0800").must_be_kind_of(Object) + end + it "will not include dates outside of the range" do + FarMar::Sale.between("2013-11-11 11:29:52 -0800", "2013-11-11 12:00:00 -0800") + sam.purch_time.wont_include("2013-11-13 01:48:15 -0800") + end + it "will not include dates outside of the range" do + FarMar::Sale.between("2013-11-11 11:29:52 -0800", "2013-11-11 12:00:00 -0800") + sam.purch_time.wont_include("2013-11-07 04:34:56 -0800") + end + end +end diff --git a/specs/spec_helper.rb b/specs/spec_helper.rb new file mode 100644 index 00000000..ad471a2d --- /dev/null +++ b/specs/spec_helper.rb @@ -0,0 +1,13 @@ +require 'simplecov' + +SimpleCov.start + +require 'minitest' +require 'minitest/spec' +require "minitest/autorun" +require "minitest/reporters" +require 'minitest/pride' +#These are all the things about mini test that we are using +Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new + +require_relative '../far_mar' diff --git a/specs/vendor_spec.rb b/specs/vendor_spec.rb new file mode 100644 index 00000000..277daad0 --- /dev/null +++ b/specs/vendor_spec.rb @@ -0,0 +1,65 @@ +require_relative 'spec_helper' + +describe FarMar::Vendor do + let(:sam){FarMar::Vendor.new(19, "Betty", 8, 1)} + describe "#initialize" do + it "can create a new instance of Vendor" do + sam.must_be_instance_of(FarMar::Vendor) + end + end + describe "self.all" do + it "should return an array" do + FarMar::Vendor.all.must_be_kind_of(Array) + + end + end + describe "self.find" do + it "should return the id that was passed through" do + + FarMar::Vendor.find(1).vend_id.must_equal(1) + end + end + describe "self.by_market" do + it "should return vendors with a given market id" do + FarMar::Vendor.by_market(1).must_be_kind_of(Array) + end + end + describe "#market" do + it "will return instances of FarMar::Market" do + sam.market.must_be_instance_of(FarMar::Market) + end + it "will return an array of the market" do + + sam.market.must_be_kind_of(Object) + end + it "will return the market that matches the market ID" do + sam.market.id.must_equal(1) + end + end + describe "#products" do + it "can return products associated by the vendor ID " do + + sam.products.each do |x| + x.vend_id.must_equal(19) + end + end + describe "#sales" do + it "returns an array of values" do + + sam.sales.must_be_kind_of(Array) + end + end + describe "#revenue" do + it "returns a Fixnum" do + + sam.revenue.must_be_kind_of(Fixnum) + end + it "won't be zero" do + sam.revenue.wont_equal(0) + end + it "it will return the revenue in cents based on vendor" do + sam.revenue.must_equal(25722) + end + end + end +end