earth 0.11.18 → 0.11.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. data/DEVELOPERS.markdown +19 -0
  2. data/Rakefile +2 -25
  3. data/errata/electricity/electric_market/nrel_errata.csv +1 -0
  4. data/errata/electricity/electric_utility/eia_errata.csv +1 -0
  5. data/lib/earth.rb +3 -1
  6. data/lib/earth/air/flight_segment.rb +1 -0
  7. data/lib/earth/air/flight_segment/data_miner.rb +1 -2
  8. data/lib/earth/electricity.rb +3 -0
  9. data/lib/earth/electricity/electric_market.rb +12 -0
  10. data/lib/earth/electricity/electric_market/data_miner.rb +21 -0
  11. data/lib/earth/electricity/electric_utility.rb +24 -0
  12. data/lib/earth/electricity/electric_utility/data_miner.rb +26 -0
  13. data/lib/earth/electricity/green_button_adoption.rb +20 -0
  14. data/lib/earth/electricity/green_button_adoption/data_miner.rb +19 -0
  15. data/lib/earth/locality/zip_code.rb +2 -0
  16. data/lib/earth/rail/national_transit_database_company.rb +3 -2
  17. data/lib/earth/residence/residential_energy_consumption_survey_response/data_miner.rb +1 -1
  18. data/lib/earth/version.rb +1 -1
  19. data/spec/earth/air/aircraft_spec.rb +6 -5
  20. data/spec/earth/air/airport_spec.rb +5 -6
  21. data/spec/earth/air/bts_aircraft_spec.rb +7 -6
  22. data/spec/earth/air/flight_distance_class_spec.rb +5 -6
  23. data/spec/earth/air/flight_segment_spec.rb +5 -6
  24. data/spec/earth/automobile/automobile_fuel_spec.rb +11 -4
  25. data/spec/earth/automobile/automobile_make_model_year_variant_spec.rb +1 -5
  26. data/spec/earth/automobile/automobile_make_year_fleet_spec.rb +5 -6
  27. data/spec/earth/automobile/automobile_type_fuel_year_age_spec.rb +14 -8
  28. data/spec/earth/bus/bus_fuel_control_spec.rb +13 -6
  29. data/spec/earth/bus/bus_fuel_spec.rb +23 -0
  30. data/spec/earth/bus/bus_fuel_year_control_spec.rb +16 -9
  31. data/spec/earth/electricity/electric_market_spec.rb +25 -0
  32. data/spec/earth/electricity/electric_utility_spec.rb +54 -0
  33. data/spec/earth/electricity/green_button_adoption_spec.rb +26 -0
  34. data/spec/earth/fuel/fuel_spec.rb +9 -9
  35. data/spec/earth/hospitality/commercial_building_energy_consumption_survey_response_spec.rb +4 -6
  36. data/spec/earth/hospitality/country_lodging_class_spec.rb +5 -6
  37. data/spec/earth/industry/industry_spec.rb +6 -5
  38. data/spec/earth/industry/mecs_energy_spec.rb +4 -4
  39. data/spec/earth/industry/mecs_ratio_spec.rb +4 -4
  40. data/spec/earth/industry/naics_2002_naics_2007_concordance_spec.rb +6 -5
  41. data/spec/earth/industry/naics_2002_sic_1987_concordance_spec.rb +6 -5
  42. data/spec/earth/industry/naics_2002_spec.rb +6 -5
  43. data/spec/earth/industry/naics_2007_spec.rb +6 -5
  44. data/spec/earth/industry/sic_1987_spec.rb +4 -6
  45. data/spec/earth/locality/country_spec.rb +4 -6
  46. data/spec/earth/locality/state_spec.rb +4 -6
  47. data/spec/earth/locality/zip_code_spec.rb +4 -6
  48. data/spec/earth/pet/species_spec.rb +1 -1
  49. data/spec/spec_helper.rb +2 -0
  50. metadata +216 -361
  51. data/features/automobile_fuel.feature +0 -144
  52. data/features/automobile_make.feature +0 -24
  53. data/features/automobile_make_model.feature +0 -24
  54. data/features/automobile_make_model_year.feature +0 -34
  55. data/features/automobile_make_year.feature +0 -34
  56. data/features/automobile_size_class.feature +0 -59
  57. data/features/automobile_size_class_year.feature +0 -34
  58. data/features/automobile_type_fuel_control.feature +0 -34
  59. data/features/automobile_type_fuel_year.feature +0 -124
  60. data/features/automobile_type_fuel_year_age.feature +0 -94
  61. data/features/automobile_type_fuel_year_control.feature +0 -74
  62. data/features/automobile_type_year.feature +0 -64
  63. data/features/bus_class.feature +0 -39
  64. data/features/bus_fuel.feature +0 -114
  65. data/features/carrier.feature +0 -64
  66. data/features/carrier_mode.feature +0 -64
  67. data/features/computation_carrier.feature +0 -14
  68. data/features/computation_carrier_instance_class.feature +0 -24
  69. data/features/egrid_region.feature +0 -20
  70. data/features/egrid_subregion.feature +0 -134
  71. data/features/fuel_year.feature +0 -54
  72. data/features/greenhouse_gas.feature +0 -44
  73. data/features/rail_class.feature +0 -64
  74. data/features/shipment_mode.feature +0 -34
  75. data/features/step_definitions/data_steps.rb +0 -35
  76. data/features/support/env.rb +0 -19
  77. data/spec/earth/bus/bus_class_spec.rb +0 -14
@@ -0,0 +1,19 @@
1
+ # Developer notes
2
+
3
+ ## Explicitly requiring cross-domain dependencies
4
+
5
+ Currently there's very little automatic resolution of dependencies. So, let's say you have
6
+
7
+ class ElectricMarket
8
+ belongs_to :state
9
+ end
10
+
11
+ You will need to require *locality* in 2 places:
12
+
13
+ # lib/earth/electricity/electric_market.rb
14
+ require 'earth/locality'
15
+
16
+ # lib/earth/electricity/electric_market/data_miner.rb
17
+ require 'earth/locality/data_miner'
18
+
19
+ If you don't, `State`'s data miner script will be empty when it is called by `ElectricMarket.run_data_miner_on_belongs_to_associations!`
data/Rakefile CHANGED
@@ -17,29 +17,6 @@ task :console do
17
17
  IRB.start
18
18
  end
19
19
 
20
- require 'cucumber'
21
- require 'cucumber/rake/task'
22
- desc 'Run all cucumber tests'
23
- Cucumber::Rake::Task.new(:features) do |t|
24
- if ENV['CUCUMBER_FORMAT']
25
- t.cucumber_opts = "features --format #{ENV['CUCUMBER_FORMAT']}"
26
- else
27
- t.cucumber_opts = 'features --format pretty'
28
- end
29
- end
30
-
31
- directory 'log/'
32
- task :features => 'log/'
33
-
34
- if RUBY_VERSION =~ /^1\.8/
35
- desc "Run cucumber tests with RCov"
36
- Cucumber::Rake::Task.new(:features_with_coverage) do |t|
37
- t.cucumber_opts = "features --format pretty"
38
- t.rcov = true
39
- t.rcov_opts = ['--exclude', 'features']
40
- end
41
- end
42
-
43
20
  require 'rspec/core/rake_task'
44
21
  desc "Run all examples"
45
22
  RSpec::Core::RakeTask.new(:examples) do |c|
@@ -59,11 +36,11 @@ if RUBY_VERSION =~ /^1\.8/
59
36
  end
60
37
  end
61
38
 
62
- task :test => [:features, :examples]
39
+ task :test => :examples
63
40
  task :default => :test
64
41
 
65
- require 'rake/rdoctask'
66
42
  require 'earth/version'
43
+ require 'rdoc/task'
67
44
  Rake::RDocTask.new do |rdoc|
68
45
  rdoc.rdoc_dir = 'rdoc'
69
46
  rdoc.title = "earth #{Earth::VERSION}"
@@ -0,0 +1 @@
1
+ date,name,email,type,section,action,x,y,condition,notes
@@ -0,0 +1 @@
1
+ date,name,email,type,section,action,x,y,condition,notes
data/lib/earth.rb CHANGED
@@ -72,7 +72,9 @@ module Earth
72
72
  ::Object.const_defined?(resource)
73
73
  end.each do |resource|
74
74
  resource_model = resource.constantize
75
- resource_model.data_miner_script.append_once :process, :run_data_miner_on_parent_associations!
75
+ unless options[:skip_parent_associations]
76
+ resource_model.data_miner_script.append_once :process, :run_data_miner_on_parent_associations!
77
+ end
76
78
  if options[:load_data_miner]
77
79
  resource_model.data_miner_script.prepend_once :process, :auto_upgrade!
78
80
  else
@@ -1,4 +1,5 @@
1
1
  require 'earth/locality'
2
+ require 'fuzzy_match/cached_result'
2
3
 
3
4
  class FlightSegment < ActiveRecord::Base
4
5
  self.primary_key = "row_hash"
@@ -186,8 +186,7 @@ FlightSegment.class_eval do
186
186
  process "Start from scratch" do
187
187
  delete_all
188
188
  end
189
- FlightSegment.form_data_per_month(2011..2011).each do |month, form_data|
190
- # FlightSegment.form_data_per_month(2009..::Time.now.year).each do |month, form_data|
189
+ FlightSegment.form_data_per_month(2009..::Time.now.year).each do |month, form_data|
191
190
  import "T100 flight segment data for #{month.strftime('%B %Y')}",
192
191
  :url => URL,
193
192
  :form_data => form_data,
@@ -0,0 +1,3 @@
1
+ # lib/earth/electricity.rb
2
+ require 'earth'
3
+ Earth.require_related __FILE__
@@ -0,0 +1,12 @@
1
+ require 'earth/locality'
2
+
3
+ class ElectricMarket < ActiveRecord::Base
4
+ self.primary_key = "id" # string
5
+
6
+ belongs_to :electric_utility, :foreign_key => 'electric_utility_eia_id'
7
+ belongs_to :zip_code, :foreign_key => 'zip_code_name'
8
+
9
+ col :id
10
+ col :electric_utility_eia_id, :type => :integer
11
+ col :zip_code_name
12
+ end
@@ -0,0 +1,21 @@
1
+ require 'earth/locality/data_miner'
2
+
3
+ ElectricMarket.class_eval do
4
+ data_miner do
5
+ import 'IOU markets',
6
+ :url => 'http://en.openei.org/datasets/files/899/pub/iou_zipcodes.csv',
7
+ :errata => { :url => "file://#{Earth::ERRATA_DIR}/electricity/electric_market/nrel_errata.csv" } do
8
+ key 'id', :synthesize => proc { |row| row['compid'].to_i.to_s + '-' + row['zip'] }
9
+ store 'zip_code_name', :field_name => 'zip'
10
+ store 'electric_utility_eia_id', :field_name => 'compid'
11
+ end
12
+
13
+ import 'Non-IOU markets',
14
+ :url => 'http://en.openei.org/datasets/files/899/pub/non-iou_zipcodes.csv',
15
+ :errata => { :url => "file://#{Earth::ERRATA_DIR}/electricity/electric_market/nrel_errata.csv" } do
16
+ key 'id', :synthesize => proc { |row| row['compid'].to_i.to_s + '-' + row['zip'] }
17
+ store 'zip_code_name', :field_name => 'zip'
18
+ store 'electric_utility_eia_id', :field_name => 'compid'
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,24 @@
1
+ require 'earth/locality'
2
+
3
+ class ElectricUtility < ActiveRecord::Base
4
+ self.primary_key = "eia_id"
5
+
6
+ belongs_to :state, :foreign_key => 'state_postal_abbreviation'
7
+ has_many :electric_markets
8
+ has_many :zip_codes, :through => :electric_markets
9
+
10
+ col :eia_id, :type => :integer
11
+ col :name
12
+ col :nickname
13
+ col :state_postal_abbreviation
14
+ col :nerc_region_abbreviation
15
+ col :second_nerc_region_abbreviation
16
+
17
+ def green_button_implementer?
18
+ GreenButtonAdoption.implemented? name, nickname
19
+ end
20
+
21
+ def green_button_committer?
22
+ GreenButtonAdoption.committed? name, nickname
23
+ end
24
+ end
@@ -0,0 +1,26 @@
1
+ require 'earth/locality/data_miner'
2
+
3
+ ElectricUtility.class_eval do
4
+ data_miner do
5
+ process "make sure green button adoption is populated" do
6
+ GreenButtonAdoption.run_data_miner!
7
+ end
8
+
9
+ import 'EIA Form 861 records from 2010 (revised)',
10
+ :url => 'http://www.eia.gov/Ftproot/pub/electricity/f86110.zip',
11
+ :filename => 'file1_2010.xls',
12
+ :skip => 7,
13
+ :errata => { :url => "file://#{Earth::ERRATA_DIR}/electricity/electric_utility/eia_errata.csv" } do
14
+ key 'eia_id', :field_name => 'UTILITY_ID'
15
+ store 'name', :field_name => 'UTILITY_NAME'
16
+ store 'state_postal_abbreviation', :field_name => 'MAIL_STATE', :nullify => true
17
+ store 'nerc_region_abbreviation', :synthesize => proc { |row| (first_nerc = row['NERC_LOCATION'].match(/^(\w+)/))? first_nerc.captures[0] : nil }
18
+ store 'second_nerc_region_abbreviation', :synthesize => proc { |row| (second_nerc = row['NERC_LOCATION'].match(/^\w+ ?[&,\/] ?(\w+)$/)) ? second_nerc.captures[0] : nil }
19
+ end
20
+
21
+ import 'Aliases', :url => 'https://docs.google.com/spreadsheet/pub?key=0AtyCBJLCFHlwdEM5WjVxRjBKWVJRcTJ3c1BhUnlSVXc&single=true&gid=0&output=csv' do
22
+ key 'eia_id', :field_name => 'utility_id'
23
+ store 'nickname', :field_name => 'alias'
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,20 @@
1
+ class GreenButtonAdoption < ActiveRecord::Base
2
+ self.primary_key = "electric_utility_name"
3
+
4
+ col :electric_utility_name
5
+ col :implemented, :type => :boolean
6
+ col :committed, :type => :boolean
7
+
8
+ class << self
9
+ def implemented?(*names)
10
+ names.any? do |name|
11
+ find_by_electric_utility_name(name).try :implemented?
12
+ end
13
+ end
14
+ def committed?(*names)
15
+ names.any? do |name|
16
+ find_by_electric_utility_name(name).try :committed?
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,19 @@
1
+ GreenButtonAdoption.class_eval do
2
+ data_miner do
3
+ import 'Green Button implementers',
4
+ :url => 'http://greenbuttondata.org/greenadopt.html',
5
+ :row_css => '#adopt+p+h2+table li.implemented',
6
+ :headers => %w{electric_utility_name} do
7
+ key 'electric_utility_name'
8
+ store 'implemented', :static => true
9
+ end
10
+
11
+ import 'Green Button committers',
12
+ :url => 'http://greenbuttondata.org/greenadopt.html',
13
+ :row_css => '#adopt+p+h2+table li.committed',
14
+ :headers => %w{electric_utility_name} do
15
+ key 'electric_utility_name'
16
+ store 'committed', :static => true
17
+ end
18
+ end
19
+ end
@@ -6,6 +6,8 @@ class ZipCode < ActiveRecord::Base
6
6
  belongs_to :egrid_subregion, :foreign_key => 'egrid_subregion_abbreviation'
7
7
  belongs_to :climate_division, :foreign_key => 'climate_division_name'
8
8
  belongs_to :state, :foreign_key => 'state_postal_abbreviation'
9
+ has_many :electric_markets, :foreign_key => 'zip_code_name'
10
+ has_many :electric_utilities, :through => :electric_markets
9
11
 
10
12
  def country
11
13
  Country.united_states
@@ -22,11 +22,12 @@ class NationalTransitDatabaseCompany < ActiveRecord::Base
22
22
  end
23
23
 
24
24
  # Methods to look up units from from rail_records
25
+ # TODO this looks inefficient
25
26
  [:rail_passenger_distance_units, :rail_vehicle_distance_units, :rail_vehicle_time_units, :rail_electricity_units, :rail_diesel_units].each do |method|
26
27
  define_method method do
27
28
  attribute = method.to_s.split('rail_')[1].to_sym
28
- units = rail_records.map(&attribute).uniq
29
- (units.count == 1 and units[0].present?) ? units[0] : raise("Error: units missing or multiple units in #{name}'s NTD records")
29
+ units = rail_records.map(&attribute).uniq.compact
30
+ (units.length == 1 and units[0].present?) ? units[0] : raise("Error: units missing or multiple units in #{name}'s NTD records")
30
31
  end
31
32
  end
32
33
 
@@ -4,7 +4,7 @@ ResidentialEnergyConsumptionSurveyResponse.class_eval do
4
4
  # conversions are NOT performed here, since we first have to zero out legitimate skips
5
5
  # otherwise you will get values like "999 pounds = 453.138778 kilograms" (where 999 is really a legit skip)
6
6
  import 'the 2005 EIA Residential Energy Consumption Survey microdata',
7
- :url => 'http://www.eia.doe.gov/emeu/recs/recspubuse05/datafiles/RECS05alldata.csv',
7
+ :url => 'http://www.eia.gov/emeu/recs/recspubuse05/datafiles/RECS05alldata.csv',
8
8
  :headers => :upcase do
9
9
  key 'id', :field_name => 'DOEID'
10
10
 
data/lib/earth/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Earth
2
- VERSION = "0.11.18"
2
+ VERSION = "0.11.19"
3
3
  end
@@ -2,17 +2,18 @@ require 'spec_helper'
2
2
  require 'earth/air/aircraft'
3
3
 
4
4
  describe Aircraft do
5
- before :all do
6
- Aircraft.auto_upgrade!
7
- end
8
-
9
5
  describe 'import', :data_miner => true do
10
6
  before do
11
- require 'earth/air/aircraft/data_miner'
7
+ Earth.init :air, :load_data_miner => true, :skip_parent_associations => :true
12
8
  end
13
9
 
14
10
  it 'should import data' do
15
11
  Aircraft.run_data_miner!
12
+ end
13
+ end
14
+
15
+ describe "verify imported data", :sanity => true do
16
+ it "should have all the data" do
16
17
  Aircraft.all.count.should == 437
17
18
  end
18
19
  end
@@ -2,22 +2,21 @@ require 'spec_helper'
2
2
  require 'earth/air/airport'
3
3
 
4
4
  describe Airport do
5
- before :all do
6
- Airport.auto_upgrade!
7
- end
8
-
9
5
  describe "when importing data", :data_miner => true do
10
6
  before do
11
- require 'earth/air/airport/data_miner'
7
+ Earth.init :air, :load_data_miner => true, :skip_parent_associations => :true
12
8
  end
13
9
 
14
10
  it "imports all airports" do
15
11
  Airport.run_data_miner!
16
- Airport.count.should == 5324
17
12
  end
18
13
  end
19
14
 
20
15
  describe "verify imported data", :sanity => true do
16
+ it "should have all the data" do
17
+ Airport.count.should == 5324
18
+ end
19
+
21
20
  it "should have name" do
22
21
  Airport.where(:name => nil).count.should == 0
23
22
  end
@@ -2,18 +2,19 @@ require 'spec_helper'
2
2
  require 'earth/air/bts_aircraft'
3
3
 
4
4
  describe BtsAircraft do
5
- before :all do
6
- BtsAircraft.auto_upgrade!
7
- end
8
-
9
5
  describe 'import', :data_miner => true do
10
6
  before do
11
- require 'earth/air/bts_aircraft/data_miner'
7
+ Earth.init :air, :load_data_miner => true, :skip_parent_associations => :true
12
8
  end
13
9
 
14
10
  it 'should import data' do
15
11
  BtsAircraft.run_data_miner!
16
- BtsAircraft.all.count.should == 378
12
+ end
13
+ end
14
+
15
+ describe 'verify imported data', :sanity => true do
16
+ it 'should have all the data' do
17
+ BtsAircraft.all.count.should == 379
17
18
  end
18
19
  end
19
20
  end
@@ -2,22 +2,21 @@ require 'spec_helper'
2
2
  require 'earth/air/flight_distance_class'
3
3
 
4
4
  describe FlightDistanceClass do
5
- before :all do
6
- FlightDistanceClass.auto_upgrade!
7
- end
8
-
9
5
  describe "when importing data", :data_miner => true do
10
6
  before do
11
- require 'earth/air/flight_distance_class/data_miner'
7
+ Earth.init :air, :load_data_miner => true, :skip_parent_associations => :true
12
8
  end
13
9
 
14
10
  it "imports all naics codes" do
15
11
  FlightDistanceClass.run_data_miner!
16
- FlightDistanceClass.count.should == 2
17
12
  end
18
13
  end
19
14
 
20
15
  describe "verify imported data", :sanity => true do
16
+ it "should have all the data" do
17
+ FlightDistanceClass.count.should == 2
18
+ end
19
+
21
20
  it "should have distances > 0" do
22
21
  FlightDistanceClass.where('distance <= 0 OR distance IS NULL').count.should == 0
23
22
  end
@@ -2,22 +2,21 @@ require 'spec_helper'
2
2
  require 'earth/air/flight_segment'
3
3
 
4
4
  describe FlightSegment do
5
- before :all do
6
- FlightSegment.auto_upgrade!
7
- end
8
-
9
5
  describe 'import', :data_miner => true do
10
6
  before do
11
- require 'earth/air/flight_segment/data_miner'
7
+ Earth.init :air, :load_data_miner => true, :skip_parent_associations => :true
12
8
  end
13
9
 
14
10
  it 'should import data' do
15
11
  FlightSegment.run_data_miner!
16
- FlightSegment.all.count.should == 1_149_003
17
12
  end
18
13
  end
19
14
 
20
15
  describe "verify imported data", :sanity => true do
16
+ it "should have all the data" do
17
+ FlightSegment.all.count.should == 1_149_003
18
+ end
19
+
21
20
  it "should have year from 2009 to present" do
22
21
  FlightSegment.where("year IS NULL OR year < 2009 OR year > #{::Time.now.year}").count.should == 0
23
22
  end
@@ -1,16 +1,23 @@
1
1
  require 'spec_helper'
2
2
  require 'earth/automobile'
3
- require 'earth/automobile/data_miner'
4
3
 
5
4
  describe AutomobileFuel do
6
5
  describe 'import', :data_miner => true do
6
+ before do
7
+ Earth.init :automobile, :load_data_miner => true, :skip_parent_associations => :true
8
+ end
9
+
7
10
  it 'should import data without problems' do
8
11
  AutomobileFuel.run_data_miner!
9
- AutomobileFuel.all.count.should > 0
10
12
  end
11
-
13
+ end
14
+
15
+ describe 'verify imported data', :sanity => true do
16
+ it 'should have all the data' do
17
+ AutomobileFuel.all.count.should == 9
18
+ end
12
19
  it 'correctly assigns hfc_emission_factor' do
13
- AutomobileFuel.first.hfc_emission_factor.should == 0.0
20
+ AutomobileFuel.first.hfc_emission_factor.should == 0.124799
14
21
  end
15
22
  end
16
23
  end