diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..9b7605e1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,36 @@ +*.gem +*.rbc +/.config +/coverage/ +coverage +/InstalledFiles +/pkg/ +/spec/reports/ +/test/tmp/ +/test/version_tmp/ +/tmp/ + +## Specific to RubyMotion: +.dat* +.repl_history +build/ + +## Documentation cache and generated files: +/.yardoc/ +/_yardoc/ +/doc/ +/rdoc/ + +## Environment normalisation: +/.bundle/ +/vendor/bundle +/lib/bundler/man/ + +# for a library or gem, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# Gemfile.lock +# .ruby-version +# .ruby-gemset + +# unless supporting rvm < 1.11.0 or doing something fancy, ignore this: +.rvmrc 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..014742a8 --- /dev/null +++ b/far_mar.rb @@ -0,0 +1,8 @@ +require 'csv' + +module FarMar; end + +require_relative 'lib/farmar_market' +require_relative 'lib/farmar_vendor' +require_relative 'lib/farmar_product' +require_relative 'lib/farmar_sale' diff --git a/lib/farmar_market.rb b/lib/farmar_market.rb new file mode 100644 index 00000000..2d7efd5d --- /dev/null +++ b/lib/farmar_market.rb @@ -0,0 +1,40 @@ +# require 'csv' +# require_relative 'farmar_vendor' + +module FarMar + class Market + + attr_reader :id, :name, :address, :city, :county, :state, :zip + + def initialize(market_hash) + @id = market_hash[:id] + @name = market_hash[:name] + @address = market_hash[:address] + @city = market_hash[:city] + @county = market_hash[:county] + @state = market_hash[:state] + @zip = market_hash[:zip] + end + + def self.all + CSV.open('./support/markets.csv', 'r').map do |line| + self.new({id: line[0].to_i, + name: line[1], + address:line[2], + city: line[3], + county: line[4], + state: line[5], + zip: line[6]}) + end + end + + def self.find(num) + self.all.find {|market| market.id == num} + end + + def vendors + return FarMar::Vendor.by_market(@id) + end + + end +end diff --git a/lib/farmar_product.rb b/lib/farmar_product.rb new file mode 100644 index 00000000..f96d1b48 --- /dev/null +++ b/lib/farmar_product.rb @@ -0,0 +1,44 @@ +require 'csv' + + +module FarMar + class Product + attr_reader :id, :name, :vendor_id + + def initialize(product_hash) + @id = product_hash[:id] + @name = product_hash[:name] + @vendor_id = product_hash[:vendor_id] + end + + def self.all + CSV.open('./support/products.csv', 'r').map do |line| + self.new({id: line[0].to_i, + name: line[1], + vendor_id:line[2].to_i + }) + end + end + + def self.find(num) + self.all.find {|product| product.id == num} + end + + def self.by_vendor(vendor_id) + self.all.select {|product| product.vendor_id == vendor_id} + end + + def vendor + FarMar::Vendor.find(@vendor_id) + end + + def sales + FarMar::Sale.all.select {|sale| sale.product_id == @id} + end + + def number_of_sales + sales.length + end + + end +end diff --git a/lib/farmar_sale.rb b/lib/farmar_sale.rb new file mode 100644 index 00000000..b5aa26e3 --- /dev/null +++ b/lib/farmar_sale.rb @@ -0,0 +1,52 @@ +require 'csv' +require 'date' + +module FarMar + class Sale + + attr_reader :id, :amount, :purchase_time, :vendor_id, :product_id + + def initialize(sale_hash) + @id = sale_hash[:id] + @amount = sale_hash[:amount] + @purchase_time = sale_hash[:purchase_time] + @vendor_id = sale_hash[:vendor_id] + @product_id = sale_hash[:product_id] + end + + def self.all + CSV.open('./support/sales.csv', 'r').map do |line| + self.new({id: line[0].to_i, + amount: line[1].to_i, + purchase_time: (DateTime.strptime(line[2], '%Y-%m-%d %H:%M:%S %z')), + vendor_id: line[3].to_i, + product_id: line[4].to_i + }) + + end + end + + def self.between(start_time, end_time) + self.all.each.select do |sale| + (start_time < sale.purchase_time) && (sale.purchase_time < end_time) + end + end + + def self.find (num) + self.all.find {|sale| sale.id == num} + end + + def vendor + FarMar::Vendor.find(@vendor_id) + end + + def product + FarMar::Product.find(@product_id) + end + + end +end + +# start_time = DateTime.new(2013, 11, 8, 12, 0, 0, "-8") +# end_time = DateTime.new(2013, 11, 8, 12, 59, 59, "-8") +# FarMar::Sale.between(start_time, end_time) diff --git a/lib/farmar_vendor.rb b/lib/farmar_vendor.rb new file mode 100644 index 00000000..36641196 --- /dev/null +++ b/lib/farmar_vendor.rb @@ -0,0 +1,52 @@ +# require 'csv' +# require_relative 'farmar_market' + +module FarMar + class Vendor + attr_reader :id, :name, :employees, :market_id + + def initialize(vendor_hash) + + @id = vendor_hash[:id] + @name = vendor_hash[:name] + @employees = vendor_hash[:employees] + @market_id = vendor_hash[:market_id] + + end + + def self.all + CSV.open('./support/vendors.csv', 'r').map do |line| + self.new({id: line[0].to_i, + name: line[1], + employees:line[2].to_i, + market_id: line[3].to_i + }) + end + end + + def self.find(num) + self.all.find {|vendor| vendor.id == num} + end + + def market + FarMar::Market.find(@market_id) + end + + def self.by_market(market_id) + self.all.select {|vendor| vendor.market_id == market_id} + end + + def products + return FarMar::Product.by_vendor(@id) + end + + def sales + FarMar::Sale.all.select {|sale| sale.vendor_id == @id} + end + + def revenue + sales.map(&:amount).reduce(:+) + end + + end +end diff --git a/specs/market_spec.rb b/specs/market_spec.rb new file mode 100644 index 00000000..1ae6922a --- /dev/null +++ b/specs/market_spec.rb @@ -0,0 +1,53 @@ +require_relative 'spec_helper' +# require_relative '../lib/farmar_market' + +describe FarMar::Market do + let (:my_market) {FarMar::Market.new({})} + describe "#initialize" do + + it "must create a Market object" do + my_market.must_be_instance_of(FarMar::Market) + end + + it "must respond to id attribute" do + my_market.must_respond_to(:id) + end + + end + + describe "self.all" do + + it "must return an array" do + FarMar::Market.all.must_be_instance_of(Array) + end + + it "contains elements that are Markets that have IDs" do + FarMar::Market.all[0].id.must_equal 1 + end + + end + + describe "self.find" do + + it "returns a Market instance" do + FarMar::Market.find(123).must_be_instance_of(FarMar::Market) + end + + it "can find a specific market by ID" do + FarMar::Market.find(10).name.must_equal("Saratoga Farmers' Market") + end + + end + + describe "#vendors" do + another_market = FarMar::Market.new(id: 37) + it "returns an Array" do + another_market.vendors.must_be_instance_of(Array) + end + + it "contains information about the market" do + another_market.vendors[0].name.must_equal("Sipes Group") + end + + end +end diff --git a/specs/product_spec.rb b/specs/product_spec.rb new file mode 100644 index 00000000..22f3497a --- /dev/null +++ b/specs/product_spec.rb @@ -0,0 +1,81 @@ +require_relative 'spec_helper' + +describe FarMar::Product do + + describe "#initialize" do + + let (:my_product) {FarMar::Product.new({})} + it "must create a Product object" do + my_product.must_be_instance_of(FarMar::Product) + end + + it "has a name" do + my_product.must_respond_to :name + end + + end + + describe "self.all" do + + it "must return an array" do + FarMar::Product.all.must_be_instance_of(Array) + end + + it "has a Product as its first element" do + FarMar::Product.all[0].must_be_instance_of(FarMar::Product) + end + + end + + describe "self.find" do + + it "returns a Market instance" do + FarMar::Product.find(123).must_be_instance_of(FarMar::Product) + end + + end + + describe "self.by_vendor" do + # I am assuming at this point that my code is tightly linked to the data + # files, so I feel OK writing a test that uses the actual data file. + # Not sure if that is good test writing. + it "returns an array of Products" do + FarMar::Product.by_vendor(37).must_be_instance_of Array + FarMar::Product.by_vendor(37)[0].must_be_instance_of FarMar::Product + FarMar::Product.by_vendor(34)[0].name.must_equal "Nutty Pretzel" + end + + end + + describe "#vendor" do + + new_product = FarMar::Product.new({vendor_id: 4}) + it "returns the vendor given by product's vendor id" do + new_product.vendor.id.must_equal 4 + new_product.vendor.must_be_instance_of FarMar::Vendor + end + + end + + describe "#sales" do + + new_product = FarMar::Product.new({id:45}) + it "must return an array of Sales" do + new_product.sales.must_be_instance_of Array + if new_product.sales.length > 0 + new_product.sales[0].must_be_instance_of FarMar::Sale + end + end + + end + + describe "#number_of_sales" do + + product = FarMar::Product.new({id:1}) + it "must return a Fixnum amount" do + product.number_of_sales.must_be_instance_of Fixnum + product.number_of_sales.must_equal 7 + end + + end +end diff --git a/specs/sale_spec.rb b/specs/sale_spec.rb new file mode 100644 index 00000000..73641a17 --- /dev/null +++ b/specs/sale_spec.rb @@ -0,0 +1,78 @@ +require_relative 'spec_helper' +require 'date' + +describe FarMar::Sale do + describe "#initialize" do + my_hash = {id: 37, + amount: 100, + purchase_time: DateTime.new(2016, 2,2,2,2,2), + vendor_id: 15, + product_id: 12, + } + let (:my_sale) {FarMar::Sale.new(my_hash)} + + it "must create a Sale object" do + my_sale.must_be_instance_of(FarMar::Sale) + end + + it "has a purchase time" do + my_sale.purchase_time.must_be_instance_of DateTime + end + + end + + describe "self.all" do + + it "must return an array" do + FarMar::Sale.all.must_be_instance_of(Array) + end + + it "has a Sale as its first element" do + FarMar::Sale.all[0].must_be_instance_of(FarMar::Sale) + end + + it "turns the time into DateTime object" do + FarMar::Sale.all[2].purchase_time.must_be_instance_of DateTime + end + + end + + describe "self.find" do + + it "returns a Sale instance" do + FarMar::Sale.find(14).must_be_instance_of(FarMar::Sale) + end + + end + + describe "#vendor" do + + new_sale = FarMar::Sale.new({vendor_id: 4}) + it "returns the vendor given by sale's vendor id" do + new_sale.vendor.id.must_equal 4 + new_sale.vendor.must_be_instance_of FarMar::Vendor + end + end + + describe "#product" do + + new_sale = FarMar::Sale.new({product_id: 4}) + it "returns the product given by sale's product id" do + new_sale.product.id.must_equal 4 + new_sale.product.must_be_instance_of FarMar::Product + end + + end + + describe "self.between" do + + it "must return an Array of Sales" do + start_time = DateTime.new(2013, 11, 01, 0, 0, 0, "-8") + end_time = DateTime.new(2013, 11, 30, 23, 59, 59, "-8") + + FarMar::Sale.between(start_time, end_time).must_be_instance_of Array + FarMar::Sale.between(start_time, end_time)[0].must_respond_to(:purchase_time) + end + + end +end diff --git a/specs/spec_helper.rb b/specs/spec_helper.rb new file mode 100644 index 00000000..2973a8be --- /dev/null +++ b/specs/spec_helper.rb @@ -0,0 +1,11 @@ +require_relative '../far_mar' +require 'simplecov' +SimpleCov.start + +require 'minitest' +require 'minitest/spec' +require "minitest/autorun" +require "minitest/reporters" +require 'minitest/pride' + +Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new diff --git a/specs/vendor_spec.rb b/specs/vendor_spec.rb new file mode 100644 index 00000000..a128c9e8 --- /dev/null +++ b/specs/vendor_spec.rb @@ -0,0 +1,91 @@ +require_relative 'spec_helper' + +describe FarMar::Vendor do + describe "#initialize" do + + let (:my_vendor) {FarMar::Vendor.new({})} + it "must respond to vendor id attribute" do + my_vendor.must_respond_to(:id) + end + + it "must respond to market id attribute" do + my_vendor.must_respond_to(:market_id) + end + + end + + describe "self.all" do + + it "must return an array" do + FarMar::Vendor.all.must_be_instance_of(Array) + end + + it "has a Vendor as its first element" do + FarMar::Vendor.all[0].must_be_instance_of(FarMar::Vendor) + end + + end + + describe "self.find" do + + it "returns a Vendor instance" do + FarMar::Vendor.find(123).must_be_instance_of(FarMar::Vendor) + end + + end + + + describe "#market" do + + it "must return a Market object"do + another_vendor = FarMar::Vendor.new({market_id:10}) + another_vendor.market.must_be_instance_of FarMar::Market + another_vendor.market.name.must_equal "Saratoga Farmers' Market" + end + + end + + describe "self.by_market" do + + it "returns an array of Vendors" do + FarMar::Vendor.by_market(37).must_be_instance_of Array + FarMar::Vendor.by_market(37)[0].must_be_instance_of FarMar::Vendor + FarMar::Vendor.by_market(34)[0].name.must_equal "Weissnat LLC" + end + + end + + describe "#products" do + + new_vendor = FarMar::Vendor.new({id:10}) + it "must return an array of Products" do + new_vendor.products.must_be_instance_of Array + if new_vendor.products.length > 0 + new_vendor.products[0].must_be_instance_of FarMar::Product + end + end + + end + + describe "#sales" do + + new_vendor = FarMar::Vendor.new({id:45}) + it "must return an array of Sales" do + new_vendor.sales.must_be_instance_of Array + if new_vendor.sales.length > 0 + new_vendor.sales[0].must_be_instance_of FarMar::Sale + end + end + + end + + describe "#revenue" do + + vendor = FarMar::Vendor.new({id:4}) + it "returns the amount of revenue from allsales in pennies, a Fixnum" do + vendor.revenue.must_be_instance_of Fixnum + vendor.revenue.must_equal 26866 + end + + end +end