earth 0.3.9 → 0.3.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. data/Gemfile +5 -0
  2. data/Gemfile.lock +58 -20
  3. data/features/automobile_fuel_type.feature +44 -0
  4. data/features/automobile_make.feature +24 -0
  5. data/features/automobile_make_fleet_year.feature +44 -0
  6. data/features/automobile_make_model.feature +24 -0
  7. data/features/automobile_make_model_year.feature +34 -0
  8. data/features/automobile_make_model_year_variant.feature +46 -0
  9. data/features/automobile_make_year.feature +44 -0
  10. data/features/automobile_size_class.feature +59 -0
  11. data/features/bus_class.feature +69 -0
  12. data/features/carrier.feature +64 -0
  13. data/features/carrier_mode.feature +74 -0
  14. data/features/egrid_region.feature +14 -0
  15. data/features/egrid_subregion.feature +36 -0
  16. data/features/rail_class.feature +64 -0
  17. data/features/shipment_mode.feature +34 -0
  18. data/features/support/env.rb +7 -0
  19. data/features/support/imports/automobile_fuel_type_bad.csv +3 -0
  20. data/features/support/imports/automobile_fuel_type_good.csv +3 -0
  21. data/features/support/imports/automobile_make_bad.csv +3 -0
  22. data/features/support/imports/automobile_make_fleet_year_bad.csv +3 -0
  23. data/features/support/imports/automobile_make_fleet_year_good.csv +3 -0
  24. data/features/support/imports/automobile_make_good.csv +3 -0
  25. data/features/support/imports/automobile_make_model_bad.csv +3 -0
  26. data/features/support/imports/automobile_make_model_good.csv +3 -0
  27. data/features/support/imports/automobile_make_model_year_bad.csv +3 -0
  28. data/features/support/imports/automobile_make_model_year_good.csv +3 -0
  29. data/features/support/imports/automobile_make_model_year_variant_bad.csv +3 -0
  30. data/features/support/imports/automobile_make_model_year_variant_good.csv +3 -0
  31. data/features/support/imports/automobile_make_year_bad.csv +3 -0
  32. data/features/support/imports/automobile_make_year_good.csv +3 -0
  33. data/features/support/imports/automobile_size_class_bad.csv +3 -0
  34. data/features/support/imports/automobile_size_class_good.csv +3 -0
  35. data/features/support/imports/bus_class_bad.csv +3 -0
  36. data/features/support/imports/bus_class_good.csv +3 -0
  37. data/features/support/imports/carrier_bad.csv +3 -0
  38. data/features/support/imports/carrier_good.csv +3 -0
  39. data/features/support/imports/carrier_mode_bad.csv +3 -0
  40. data/features/support/imports/carrier_mode_good.csv +3 -0
  41. data/features/support/imports/egrid_region_bad.csv +3 -0
  42. data/features/support/imports/egrid_region_good.csv +3 -0
  43. data/features/support/imports/egrid_subregion_bad.csv +3 -0
  44. data/features/support/imports/egrid_subregion_good.csv +3 -0
  45. data/features/support/imports/rail_class_bad.csv +3 -0
  46. data/features/support/imports/rail_class_good.csv +3 -0
  47. data/features/support/imports/shipment_mode_bad.csv +3 -0
  48. data/features/support/imports/shipment_mode_good.csv +3 -0
  49. data/lib/earth/automobile/automobile_fuel_type/data_miner.rb +35 -14
  50. data/lib/earth/automobile/automobile_make/data_miner.rb +24 -9
  51. data/lib/earth/automobile/automobile_make_fleet_year/data_miner.rb +32 -1
  52. data/lib/earth/automobile/automobile_make_model/data_miner.rb +27 -5
  53. data/lib/earth/automobile/automobile_make_model_year/data_miner.rb +35 -5
  54. data/lib/earth/automobile/automobile_make_model_year_variant/data_miner.rb +80 -39
  55. data/lib/earth/automobile/automobile_make_year/data_miner.rb +32 -1
  56. data/lib/earth/automobile/automobile_size_class/data_miner.rb +67 -4
  57. data/lib/earth/bus/bus_class/data_miner.rb +73 -0
  58. data/lib/earth/locality/egrid_region/data_miner.rb +8 -0
  59. data/lib/earth/locality/egrid_subregion/data_miner.rb +26 -0
  60. data/lib/earth/rail/rail_class/data_miner.rb +51 -0
  61. data/lib/earth/shipping/carrier/data_miner.rb +47 -8
  62. data/lib/earth/shipping/carrier_mode/data_miner.rb +57 -8
  63. data/lib/earth/shipping/shipment_mode/data_miner.rb +23 -4
  64. metadata +110 -98
@@ -0,0 +1,3 @@
1
+ name,annual_distance,fuel_efficiency_city,fuel_efficiency_highway,annual_distance_units,fuel_efficiency_city_units,fuel_efficiency_highway_units,hybrid_fuel_efficiency_city_multiplier,hybrid_fuel_efficiency_highway_multiplier,conventional_fuel_efficiency_city_multiplier,conventional_fuel_efficiency_highway_multiplier
2
+ small,1000,10.0,15.0,kilometres,kilometres_per_litre,kilometres_per_litre,1.1,1.2,0.9,0.95
3
+ large,0.5,0.1,0.5,kilometres,kilometres_per_litre,kilometres_per_litre
@@ -0,0 +1,3 @@
1
+ name,distance,distance_units,passengers,speed,speed_units,diesel_intensity,diesel_intensity_units,alternative_fuels_intensity,alternative_fuels_intensity_units,air_conditioning_emission_factor,air_conditioning_emission_factor_units
2
+ transit,10,kilometres,15,20,kilometres_per_hour,0.5,litres_per_kilometre,0,litres_per_kilometre,0,kilograms_per_kilometre
3
+ regional,-10,distance_units,0,,,-2,diesel_intensity_units,-2,alternative_fuels_intensity_units
@@ -0,0 +1,3 @@
1
+ name,distance,distance_units,passengers,speed,speed_units,diesel_intensity,diesel_intensity_units,alternative_fuels_intensity,alternative_fuels_intensity_units,air_conditioning_emission_factor,air_conditioning_emission_factor_units
2
+ transit,10,kilometres,15,20,kilometres_per_hour,0.5,litres_per_kilometre,0,litres_per_kilometre,0,kilograms_per_kilometre
3
+ regional,100,kilometres,30,80,kilometres_per_hour,0.1,litres_per_kilometre,0.2,litres_per_kilometre,0.5,kilograms_per_kilometre
@@ -0,0 +1,3 @@
1
+ name,package_volume,route_inefficiency_factor,transport_emission_factor,corporate_emission_factor,transport_emission_factor_units,corporate_emission_factor_units
2
+ FedEx,100,1.0,0.1,0.1,kilograms_per_kilogram_kilometre,kilograms_per_package
3
+ UPS,0,0.5,0.0,0.0
@@ -0,0 +1,3 @@
1
+ name,package_volume,route_inefficiency_factor,transport_emission_factor,corporate_emission_factor,transport_emission_factor_units,corporate_emission_factor_units
2
+ FedEx,100,1.0,0.1,0.1,kilograms_per_kilogram_kilometre,kilograms_per_package
3
+ UPS,1000,2.0,1.5,2.0,kilograms_per_kilogram_kilometre,kilograms_per_package
@@ -0,0 +1,3 @@
1
+ name,package_volume,route_inefficiency_factor,transport_emission_factor,carrier_name,mode_name,include_in_fallbacks,transport_emission_factor_units
2
+ FedEx ground,100,1.0,1.2,FedEx,ground,1,kilograms_per_kilogram_kilometre
3
+ FedEx air,0,0.9,-2.0
@@ -0,0 +1,3 @@
1
+ name,carrier_name,mode_name,include_in_fallbacks,package_volume,route_inefficiency_factor,transport_emission_factor,transport_emission_factor_units
2
+ FedEx ground,FedEx,ground,1,100,1.0,1.2,kilograms_per_kilogram_kilometre
3
+ FedEx air,FedEx,air,0,1,2.0,4.0,kilograms_per_kilogram_kilometre
@@ -0,0 +1,3 @@
1
+ name,loss_factor
2
+ US,0.1
3
+ AK,1
@@ -0,0 +1,3 @@
1
+ name,loss_factor
2
+ US,0.1
3
+ AK,0.15
@@ -0,0 +1,3 @@
1
+ name,egrid_region_name,electricity_emission_factor,electricity_emission_factor_units
2
+ US,US,1.2,kilograms_per_kilowatt_hour
3
+ AKGD,foo,0
@@ -0,0 +1,3 @@
1
+ name,egrid_region_name,electricity_emission_factor,electricity_emission_factor_units
2
+ US,US,1.2,kilograms_per_kilowatt_hour
3
+ AKGD,AK,0.9,kilograms_per_kilowatt_hour
@@ -0,0 +1,3 @@
1
+ name,passengers,distance,distance_units,speed,speed_units,electricity_intensity,electricity_intensity_units,diesel_intensity,diesel_intensity_units
2
+ commuter,100,50,kilometres,100,kilometres_per_hour,0.7,kilowatt_hours_per_kilometre,0,litres_per_kilometre
3
+ intercity,0,-20,distance_units,-1,speed_units,,elec_intense_units,-1
@@ -0,0 +1,3 @@
1
+ name,passengers,distance,distance_units,speed,speed_units,electricity_intensity,electricity_intensity_units,diesel_intensity,diesel_intensity_units
2
+ commuter,100,50,kilometres,100,kilometres_per_hour,0.7,kilowatt_hours_per_kilometre,0,litres_per_kilometre
3
+ intercity,150,200,kilometres,150,kilometres_per_hour,0.8,kilowatt_hours_per_kilometre,0.5,litres_per_kilometre
@@ -0,0 +1,3 @@
1
+ name,route_inefficiency_factor,transport_emission_factor,transport_emission_factor_units
2
+ ground,1.0,0.1,kilograms_per_kilogram_kilometre
3
+ air,0.9,0.0
@@ -0,0 +1,3 @@
1
+ name,route_inefficiency_factor,transport_emission_factor,transport_emission_factor_units
2
+ ground,1.0,0.1,kilograms_per_kilogram_kilometre
3
+ air,1.5,1.0,kilograms_per_kilogram_kilometre
@@ -22,24 +22,45 @@ AutomobileFuelType.class_eval do
22
22
  key 'code'
23
23
  store 'name'
24
24
  end
25
-
25
+
26
26
  import "a pre-calculated emission factor and average annual distance for each fuel",
27
- :url => 'http://static.brighterplanet.com/science/data/transport/automobiles/models_export/automobile_fuel_type.csv' do
28
- key 'code', :field_name => 'code'
27
+ :url => 'https://spreadsheets.google.com/pub?key=0AoQJbWqPrREqdDlqeU9vQkVkNG1NZXV4WklKTjJkU3c&hl=en&single=true&gid=0&output=csv' do
28
+ key 'code'
29
29
  store 'name'
30
- store 'annual_distance', :units => :kilometres
31
- store 'emission_factor', :units => :kilograms_per_litre
30
+ store 'annual_distance', :units_field_name => 'annual_distance_units'
31
+ store 'emission_factor', :units_field_name => 'emission_factor_units'
32
+ end
33
+
34
+ verify "Annual distance should be greater than zero" do
35
+ AutomobileFuelType.all.each do |fuel_type|
36
+ unless fuel_type.annual_distance > 0.0
37
+ raise "Invalid annual_distance for AutomobileFuelType #{fuel_type.name}: #{fuel_type.annual_distance} (should be > 0)"
38
+ end
39
+ end
32
40
  end
33
-
34
- # pull electricity emission factor from residential electricity
35
- import "a pre-calculated emission factor for electricity",
36
- :url => 'http://spreadsheets.google.com/pub?key=rukxnmuhhsOsrztTrUaFCXQ',
37
- :select => lambda { |row| row['name'] == 'electricity' } do
38
- key 'name'
39
- store 'emission_factor', :units => :kilograms_per_litre
41
+
42
+ verify "Annual distance units should never be missing" do
43
+ AutomobileFuelType.all.each do |fuel_type|
44
+ if fuel_type.annual_distance_units.nil?
45
+ raise "Missing annual distance units for AutomobileFuelType #{fuel_type.name}"
46
+ end
47
+ end
48
+ end
49
+
50
+ verify "Emission factor should be zero or more" do
51
+ AutomobileFuelType.all.each do |fuel_type|
52
+ unless fuel_type.emission_factor >= 0.0
53
+ raise "Invalid emission_factor for AutomobileFuelType #{fuel_type.name}: #{fuel_type.emission_factor} (should be >= 0)"
54
+ end
55
+ end
40
56
  end
41
57
 
42
- # still need distance estimate for electric cars
58
+ verify "Emission factor units should never be missing" do
59
+ AutomobileFuelType.all.each do |fuel_type|
60
+ if fuel_type.emission_factor_units.nil?
61
+ raise "Missing emission factor units for AutomobileFuelType #{fuel_type.name}"
62
+ end
63
+ end
64
+ end
43
65
  end
44
66
  end
45
-
@@ -11,11 +11,11 @@ AutomobileMake.class_eval do
11
11
  string 'fuel_efficiency_units'
12
12
  end
13
13
 
14
- process "Derive automobile makes from automobile make model year variants" do
15
- AutomobileMakeModelYearVariant.run_data_miner!
14
+ process "Derive manufacturer names from automobile make fleet years" do
15
+ AutomobileMakeFleetYear.run_data_miner!
16
16
  connection.execute %{
17
17
  INSERT IGNORE INTO automobile_makes(name)
18
- SELECT automobile_make_model_year_variants.make_name FROM automobile_make_model_year_variants WHERE LENGTH(automobile_make_model_year_variants.make_name) > 0
18
+ SELECT DISTINCT automobile_make_fleet_years.make_name FROM automobile_make_fleet_years
19
19
  }
20
20
  end
21
21
 
@@ -25,15 +25,31 @@ AutomobileMake.class_eval do
25
25
  store 'major'
26
26
  end
27
27
 
28
- process "Derive average fuel efficiency from automobile makes and years" do
29
- AutomobileMakeYear.run_data_miner!
30
- make_years = AutomobileMakeYear.arel_table
28
+ process "Derive average fuel efficiency from automobile make fleet years" do
29
+ AutomobileMakeFleetYear.run_data_miner!
30
+ make_fleet_years = AutomobileMakeFleetYear.arel_table
31
31
  makes = AutomobileMake.arel_table
32
- conditional_relation = makes[:name].eq(make_years[:make_name])
33
- relation = AutomobileMakeYear.weighted_average_relation(:fuel_efficiency, :weighted_by => :volume).where(conditional_relation)
32
+ conditional_relation = makes[:name].eq(make_fleet_years[:make_name])
33
+ relation = AutomobileMakeFleetYear.weighted_average_relation(:fuel_efficiency, :weighted_by => :volume).where(conditional_relation)
34
34
  update_all "fuel_efficiency = (#{relation.to_sql})"
35
35
  update_all "fuel_efficiency_units = 'kilometres_per_litre'"
36
36
  end
37
+
38
+ verify "Fuel efficiency should be greater than zero" do
39
+ AutomobileMake.all.each do |make|
40
+ unless make.fuel_efficiency > 0
41
+ raise "Invalid fuel efficiency for AutomobileMake #{make.name}: #{make.fuel_efficiency} (should be > 0)"
42
+ end
43
+ end
44
+ end
45
+
46
+ verify "Fuel efficiency units should be kilometres per litre" do
47
+ AutomobileMake.all.each do |make|
48
+ unless make.fuel_efficiency_units == "kilometres_per_litre"
49
+ raise "Invalid fuel efficiency units for AutomobileMake #{make.name}: #{make.fuel_efficiency_units} (should be kilometres_per_litre)"
50
+ end
51
+ end
52
+ end
37
53
  end
38
54
  end
39
55
 
@@ -65,4 +81,3 @@ end
65
81
  # 'Maybach' => 'Mercedes',
66
82
  # 'Hummer' => 'GM'
67
83
  # }
68
-
@@ -24,6 +24,37 @@ AutomobileMakeFleetYear.class_eval do
24
24
  store 'fuel_efficiency', :from_units => :miles_per_gallon, :to_units => :kilometres_per_litre
25
25
  store 'volume'
26
26
  end
27
+
28
+ verify "Year should be between 1978 and 2007" do
29
+ AutomobileMakeFleetYear.all.each do |fleet_year|
30
+ unless fleet_year.year > 1977 and fleet_year.year < 2008
31
+ raise "Invalid year for AutomobileMakeFleetYear #{fleet_year.name}: #{fleet_year.year} (should be between 1978 and 2007)"
32
+ end
33
+ end
34
+ end
35
+
36
+ verify "Fuel efficiency should be greater than zero" do
37
+ AutomobileMakeFleetYear.all.each do |fleet_year|
38
+ unless fleet_year.fuel_efficiency > 0
39
+ raise "Invalid fuel efficiency for AutomobileMakeFleetYear #{fleet_year.name}: #{fleet_year.fuel_efficiency} (should be > 0)"
40
+ end
41
+ end
42
+ end
43
+
44
+ verify "Fuel efficiency units should be kilometres per litre" do
45
+ AutomobileMakeFleetYear.all.each do |fleet_year|
46
+ unless fleet_year.fuel_efficiency_units == "kilometres_per_litre"
47
+ raise "Invalid fuel efficiency units for AutomobileMakeFleetYear #{fleet_year.name}: #{fleet_year.fuel_efficiency_units} (should be kilometres_per_litre)"
48
+ end
49
+ end
50
+ end
51
+
52
+ verify "Volume should be greater than zero" do
53
+ AutomobileMakeFleetYear.all.each do |fleet_year|
54
+ unless fleet_year.volume > 0
55
+ raise "Invalid volume for AutomobileMakeFleetYear #{fleet_year.name}: #{fleet_year.volume} (should be > 0)"
56
+ end
57
+ end
58
+ end
27
59
  end
28
60
  end
29
-
@@ -24,16 +24,38 @@ AutomobileMakeModel.class_eval do
24
24
  # TODO not weighted until we get weightings on auto variants
25
25
  process "Derive average fuel economy from automobile make model year variants" do
26
26
  AutomobileMakeModelYearVariant.run_data_miner!
27
- automobile_make_models = AutomobileMakeModel.arel_table
28
- automobile_make_model_year_variants = AutomobileMakeModelYearVariant.arel_table
29
- conditional_relation = automobile_make_models[:name].eq(automobile_make_model_year_variants[:make_model_name])
27
+ models = AutomobileMakeModel.arel_table
28
+ variants = AutomobileMakeModelYearVariant.arel_table
29
+ conditional_relation = models[:name].eq(variants[:make_model_name])
30
30
  %w{ city highway }.each do |i|
31
+ null_check = variants[:"fuel_efficiency_#{i}"].not_eq(nil)
31
32
  # sabshere 12/6/10 careful, don't use AutomobileMakeModelYearVariant.where here or you will be forced into projecting *
32
- relation = automobile_make_model_year_variants.where(conditional_relation).where("`automobile_make_model_year_variants`.`fuel_efficiency_#{i}` IS NOT NULL").project("AVG(`automobile_make_model_year_variants`.`fuel_efficiency_#{i}`)")
33
+ relation = variants.project(variants[:"fuel_efficiency_#{i}"].average).where(conditional_relation).where(null_check)
33
34
  update_all "fuel_efficiency_#{i} = (#{relation.to_sql})"
34
35
  update_all "fuel_efficiency_#{i}_units = 'kilometres_per_litre'"
35
36
  end
36
37
  end
38
+
39
+ verify "Fuel efficiencies should be greater than zero" do
40
+ AutomobileMakeModel.all.each do |model|
41
+ %w{ city highway }.each do |type|
42
+ fuel_efficiency = model.send(:"fuel_efficiency_#{type}")
43
+ unless fuel_efficiency > 0
44
+ raise "Invalid fuel efficiency #{type} for AutomobileMakeModel #{model.name}: #{fuel_efficiency} (should be > 0)"
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ verify "Fuel efficiency units should be kilometres per litre" do
51
+ AutomobileMakeModel.all.each do |model|
52
+ %w{ city highway }.each do |type|
53
+ units = model.send(:"fuel_efficiency_#{type}_units")
54
+ unless units == "kilometres_per_litre"
55
+ raise "Invalid fuel efficiency #{type} units for AutomobileMakeModel #{model.name}: #{units} (should be kilometres_per_litre)"
56
+ end
57
+ end
58
+ end
59
+ end
37
60
  end
38
61
  end
39
-
@@ -32,12 +32,13 @@ AutomobileMakeModelYear.class_eval do
32
32
  # for example, 20km/l for a toyota prius 2006 vs. 13km/l if you use make years
33
33
  process "Calculate city and highway fuel efficiency from automobile make model year variants" do
34
34
  AutomobileMakeModelYearVariant.run_data_miner!
35
- automobile_make_model_years = AutomobileMakeModelYear.arel_table
36
- automobile_make_model_year_variants = AutomobileMakeModelYearVariant.arel_table
37
- conditional_relation = automobile_make_model_years[:name].eq(automobile_make_model_year_variants[:make_model_year_name])
35
+ model_years = AutomobileMakeModelYear.arel_table
36
+ variants = AutomobileMakeModelYearVariant.arel_table
37
+ conditional_relation = model_years[:name].eq(variants[:make_model_year_name])
38
38
  %w{ city highway }.each do |i|
39
+ null_check = variants[:"fuel_efficiency_#{i}"].not_eq(nil)
39
40
  # sabshere 12/6/10 careful, don't use AutomobileMakeModelYearVariant.where here or you will be forced into projecting *
40
- relation = automobile_make_model_year_variants.where(conditional_relation).where("`automobile_make_model_year_variants`.`fuel_efficiency_#{i}` IS NOT NULL").project("AVG(`automobile_make_model_year_variants`.`fuel_efficiency_#{i}`)")
41
+ relation = variants.project(variants[:"fuel_efficiency_#{i}"].average).where(conditional_relation).where(null_check)
41
42
  update_all "fuel_efficiency_#{i} = (#{relation.to_sql})"
42
43
  update_all "fuel_efficiency_#{i}_units = 'kilometres_per_litre'"
43
44
  end
@@ -47,6 +48,35 @@ AutomobileMakeModelYear.class_eval do
47
48
  update_all "fuel_efficiency = 1 / ((0.43 / fuel_efficiency_city) + (0.57 / fuel_efficiency_highway))"
48
49
  update_all "fuel_efficiency_units = 'kilometres_per_litre'"
49
50
  end
51
+
52
+ verify "Year should be between 1985 and 2009" do
53
+ AutomobileMakeModelYear.all.each do |model_year|
54
+ unless model_year.year > 1984 and model_year.year < 2010
55
+ raise "Invalid year for AutomobileMakeModelYear #{model_year.name}: #{model_year.year} (should be between 1985 and 2009)"
56
+ end
57
+ end
58
+ end
59
+
60
+ verify "Fuel efficiencies should be greater than zero" do
61
+ AutomobileMakeModelYear.all.each do |model_year|
62
+ %w{ city highway }.each do |type|
63
+ fuel_efficiency = model_year.send(:"fuel_efficiency_#{type}")
64
+ unless fuel_efficiency > 0
65
+ raise "Invalid fuel efficiency #{type} for AutomobileMakeModelYear #{model_year.name}: #{fuel_efficiency} (should be > 0)"
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ verify "Fuel efficiency units should be kilometres per litre" do
72
+ AutomobileMakeModelYear.all.each do |model_year|
73
+ %w{ city highway }.each do |type|
74
+ units = model_year.send(:"fuel_efficiency_#{type}_units")
75
+ unless units == "kilometres_per_litre"
76
+ raise "Invalid fuel efficiency #{type} units for AutomobileMakeModelYear #{model_year.name}: #{units} (should be kilometres_per_litre)"
77
+ end
78
+ end
79
+ end
80
+ end
50
81
  end
51
82
  end
52
-
@@ -9,7 +9,7 @@ AutomobileMakeModelYearVariant.class_eval do
9
9
  end
10
10
 
11
11
  def is_a_porsche?(row)
12
- row['make'].upcase == 'PORSCHE'
12
+ row['make'] and row['make'].upcase == 'PORSCHE'
13
13
  end
14
14
 
15
15
  def is_not_a_porsche?(row)
@@ -17,19 +17,19 @@ AutomobileMakeModelYearVariant.class_eval do
17
17
  end
18
18
 
19
19
  def is_a_mercedes_benz?(row)
20
- row['make'] =~ /MERCEDES/i
20
+ row['make'] and row['make'] =~ /MERCEDES/i
21
21
  end
22
22
 
23
23
  def is_a_lexus?(row)
24
- row['make'].upcase == 'LEXUS'
24
+ row['make'] and row['make'].upcase == 'LEXUS'
25
25
  end
26
26
 
27
27
  def is_a_bmw?(row)
28
- row['make'].upcase == 'BMW'
28
+ row['make'] and row['make'].upcase == 'BMW'
29
29
  end
30
30
 
31
31
  def is_a_ford?(row)
32
- row['make'].upcase == 'FORD'
32
+ row['make'] and row['make'].upcase == 'FORD'
33
33
  end
34
34
 
35
35
  def is_a_rolls_royce_and_model_contains_bentley?(row)
@@ -37,11 +37,11 @@ AutomobileMakeModelYearVariant.class_eval do
37
37
  end
38
38
 
39
39
  def is_a_bentley?(row)
40
- row['make'].upcase == 'BENTLEY'
40
+ row['make'] and row['make'].upcase == 'BENTLEY'
41
41
  end
42
42
 
43
43
  def is_a_rolls_royce?(row)
44
- row['make'] =~ /ROLLS/i
44
+ row['make'] and row['make'] =~ /ROLLS/i
45
45
  end
46
46
 
47
47
  def is_a_turbo_brooklands?(row)
@@ -139,7 +139,9 @@ AutomobileMakeModelYearVariant.class_eval do
139
139
  bus[:format] = :fixed_width
140
140
  bus[:cut] = '13-' if year == 1995
141
141
  bus[:schema_name] = :fuel_economy_guide_b
142
- bus[:select] = lambda { |row| row['suppress_code'].blank? and row['state_code'] == 'F' }
142
+ bus[:select] = lambda do |row|
143
+ (row['suppress_code'].blank? or row['suppress_code'].to_i == 0) and row['state_code'] == 'F'
144
+ end
143
145
  Slither.define :fuel_economy_guide_b do |d|
144
146
  d.rows do |row|
145
147
  row.trap { true } # there's only one section
@@ -309,7 +311,7 @@ AutomobileMakeModelYearVariant.class_eval do
309
311
  index 'make_model_year_name'
310
312
  end
311
313
 
312
- # # 1985---1997
314
+ # 1985---1997
313
315
  (85..97).each do |yy|
314
316
  filename = (yy == 96) ? "#{yy}MFGUI.ASC" : "#{yy}MFGUI.DAT"
315
317
  import("19#{ yy } Fuel Economy Guide",
@@ -410,34 +412,33 @@ AutomobileMakeModelYearVariant.class_eval do
410
412
  end
411
413
 
412
414
  # 2010--?
413
- # sabshere 5/17/10 apparently needs update
414
- # {
415
- # 2010 => { :url => 'http://www.fueleconomy.gov/FEG/epadata/10data.zip', :filename => '2010FEguide-for DOE-rel dates before 10-16-09-no-sales10-8-09public.xls' }
416
- # }.sort { |a, b| a.first <=> b.first }.each do |year, options|
417
- # import "#{ year } Fuel Economy Guide",
418
- # options.merge(:transform => { :class => AutomobileVariant::ParserE, :year => year },
419
- # :errata => 'http://static.brighterplanet.com/science/data/transport/automobiles/fuel_economy_guide/errata.csv') do
420
- # key 'row_hash'
421
- # store 'name', :field_name => 'model'
422
- # store 'make_name', :field_name => 'make'
423
- # store 'fuel_type_code'
424
- # store 'fuel_efficiency_highway', :static => nil, :units => :kilometres_per_litre
425
- # store 'fuel_efficiency_city', :static => nil, :units => :kilometres_per_litre
426
- # store 'raw_fuel_efficiency_highway', :field_name => 'Hwy Unadj FE - Conventional Fuel', :from_units => :miles_per_gallon, :to_units => :kilometres_per_litre
427
- # store 'raw_fuel_efficiency_city', :field_name => 'City Unadj FE - Conventional Fuel', :from_units => :miles_per_gallon, :to_units => :kilometres_per_litre
428
- # store 'cylinders', :field_name => '# Cyl'
429
- # store 'displacement', :field_name => 'Eng Displ'
430
- # store 'carline_class_code', :field_name => 'Carline Class'
431
- # store 'carline_class_name', :field_name => 'Carline Class Desc'
432
- # store 'year'
433
- # store 'transmission'
434
- # store 'speeds'
435
- # store 'turbo'
436
- # store 'supercharger'
437
- # store 'injection'
438
- # store 'drive'
439
- # end
440
- # end
415
+ {
416
+ 2010 => { :url => 'http://www.fueleconomy.gov/FEG/epadata/10data.zip', :filename => '2010FE Guide for DOE-all rel dates-no-sales 4-9-10public.xls' }
417
+ }.sort { |a, b| a.first <=> b.first }.each do |year, options|
418
+ import "#{ year } Fuel Economy Guide",
419
+ options.merge(:transform => { :class => AutomobileMakeModelYearVariant::ParserE, :year => year },
420
+ :errata => 'http://static.brighterplanet.com/science/data/transport/automobiles/fuel_economy_guide/errata.csv') do
421
+ key 'row_hash'
422
+ store 'name', :field_name => 'model'
423
+ store 'make_name', :field_name => 'make'
424
+ store 'fuel_type_code'
425
+ store 'fuel_efficiency_highway', :static => nil, :units => :kilometres_per_litre
426
+ store 'fuel_efficiency_city', :static => nil, :units => :kilometres_per_litre
427
+ store 'raw_fuel_efficiency_highway', :field_name => 'Hwy Unadj FE - Conventional Fuel', :from_units => :miles_per_gallon, :to_units => :kilometres_per_litre
428
+ store 'raw_fuel_efficiency_city', :field_name => 'City Unadj FE - Conventional Fuel', :from_units => :miles_per_gallon, :to_units => :kilometres_per_litre
429
+ store 'cylinders', :field_name => '# Cyl'
430
+ store 'displacement', :field_name => 'Eng Displ'
431
+ store 'carline_class_code', :field_name => 'Carline Class'
432
+ store 'carline_class_name', :field_name => 'Carline Class Desc'
433
+ store 'year'
434
+ store 'transmission'
435
+ store 'speeds'
436
+ store 'turbo'
437
+ store 'supercharger'
438
+ store 'injection'
439
+ store 'drive'
440
+ end
441
+ end
441
442
 
442
443
  process "Derive model and model year names" do
443
444
  update_all "make_model_name = CONCAT(make_name, ' ', name)"
@@ -450,11 +451,51 @@ AutomobileMakeModelYearVariant.class_eval do
450
451
  update_all 'fuel_efficiency_highway = 1 / ((0.001376 / 0.425143707) + (1.3466 / raw_fuel_efficiency_highway))'
451
452
  end
452
453
 
453
- %w{ AutomobileMake AutomobileMakeModelYear AutomobileMakeModel }.each do |synthetic_resource|
454
+ %w{ AutomobileMakeModelYear AutomobileMakeModel }.each do |synthetic_resource|
454
455
  process "Synthesize #{synthetic_resource}" do
455
456
  synthetic_resource.constantize.run_data_miner!
456
457
  end
457
458
  end
459
+
460
+ verify "Year should be between 1985 and 2009" do
461
+ AutomobileMakeModelYearVariant.all.each do |variant|
462
+ unless variant.year > 1984 and variant.year < 2010
463
+ raise "Invalid year for AutomobileMakeModelYearVariant #{variant.row_hash}: #{variant.year} (should be between 1985 and 2009)"
464
+ end
465
+ end
466
+ end
467
+
468
+ # FIXME TODO
469
+ # verify "Fuel type code should be found in AutomobileFuelType" do
470
+ # valid_codes = AutomobileFuelType.all.map(&:code)
471
+ # puts valid_codes
472
+ # AutomobileMakeModelVariant.all.each do |variant|
473
+ # unless valid_codes.include? variant.fuel_type_code
474
+ # raise "Invalid fuel type code for AutomobileMakeModelYearVariant #{variant.row_hash}: #{variant.fuel_type_code} (should be found in AutomobileFuelType)"
475
+ # end
476
+ # end
477
+ # end
478
+ #
479
+ verify "Fuel efficiencies should be greater than zero" do
480
+ AutomobileMakeModelYearVariant.all.each do |variant|
481
+ %w{ city highway }.each do |type|
482
+ fuel_efficiency = variant.send(:"fuel_efficiency_#{type}")
483
+ unless fuel_efficiency > 0
484
+ raise "Invalid fuel efficiency #{type} for AutomobileMakeModelYearVariant #{variant.row_hash}: #{fuel_efficiency} (should be < 0)"
485
+ end
486
+ end
487
+ end
488
+ end
489
+
490
+ verify "Fuel efficiency units should be kilometres per litre" do
491
+ AutomobileMakeModelYearVariant.all.each do |variant|
492
+ %w{ city highway }.each do |type|
493
+ units = variant.send(:"fuel_efficiency_#{type}_units")
494
+ unless units == "kilometres_per_litre"
495
+ raise "Invalid fuel efficiency #{type} units for AutomobileMakeModelYearVariant #{variant.row_hash}: #{units} (should be kilometres_per_litre)"
496
+ end
497
+ end
498
+ end
499
+ end
458
500
  end
459
501
  end
460
-