CarrierMode.class_eval do data_miner do schema Earth.database_options do string 'name' string 'carrier_name' string 'mode_name' float 'package_volume' float 'route_inefficiency_factor' float 'transport_emission_factor' string 'transport_emission_factor_units' end import "a list of carrier modes and their characteristics", :url => 'https://spreadsheets.google.com/pub?key=0AoQJbWqPrREqdGRsRkJOd0NPd0FETTI0NmpYUlBsN2c&hl=en&gid=0&output=csv' do key 'name' store 'carrier_name' store 'mode_name' store 'package_volume' store 'route_inefficiency_factor' store 'transport_emission_factor', :units_field_name => 'transport_emission_factor_units' end # Don't need to check that carrier_name appears in carriers b/c carriers is derived from carrier_modes.carrier_name # Don't need to check that mode_name appears in shipment_modes b/c shipment_modes is derived from carrier_modes.mode_name # FIXME TODO test for valid transport_emission_factor_units %w{carrier_name mode_name transport_emission_factor_units}.each do |attribute| verify "#{attribute.humanize} should never be missing" do CarrierMode.all.each do |carrier_mode| value = carrier_mode.send(:"#{attribute}") unless value.present? raise "Missing #{attribute.humanize.downcase} for CarrierMode #{carrier_mode.name}" end end end end %w{package_volume transport_emission_factor}.each do |attribute| verify "#{attribute.humanize} should be greater than zero" do CarrierMode.all.each do |carrier_mode| value = carrier_mode.send(:"#{attribute}") unless value > 0 raise "Invalid #{attribute.humanize.downcase} for CarrierMode #{carrier_mode.name}: #{value} (should be > 0)" end end end end verify "Route inefficiency factor should be one or more" do CarrierMode.all.each do |carrier_mode| unless carrier_mode.route_inefficiency_factor >= 1.0 raise "Invalid route inefficiency factor for CarrierMode #{carrier_mode.name}: #{carrier_mode.route_inefficiency_factor} (should be >= 1.0)" end end end end end