earth 0.5.0 → 0.5.2

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 (173) hide show
  1. data/Gemfile +4 -5
  2. data/README.markdown +0 -8
  3. data/Rakefile +14 -10
  4. data/bin/earth_tester.rb +12 -12
  5. data/earth.gemspec +2 -1
  6. data/features/automobile_make_fleet_year.feature +9 -19
  7. data/features/automobile_make_model_year.feature +4 -4
  8. data/features/support/env.rb +11 -7
  9. data/features/support/imports/automobile_make_fleet_year_bad.csv +1 -1
  10. data/features/support/imports/automobile_make_fleet_year_good.csv +1 -1
  11. data/features/support/imports/automobile_make_model_year_bad.csv +1 -1
  12. data/features/support/imports/automobile_make_model_year_good.csv +1 -1
  13. data/lib/earth/air/aircraft/data_miner.rb +63 -15
  14. data/lib/earth/air/aircraft.rb +0 -11
  15. data/lib/earth/air/aircraft_class/data_miner.rb +0 -13
  16. data/lib/earth/air/aircraft_class.rb +12 -3
  17. data/lib/earth/air/aircraft_fuel_use_equation/data_miner.rb +0 -13
  18. data/lib/earth/air/aircraft_fuel_use_equation.rb +12 -3
  19. data/lib/earth/air/airline/data_miner.rb +0 -7
  20. data/lib/earth/air/airline.rb +6 -3
  21. data/lib/earth/air/airport/data_miner.rb +5 -14
  22. data/lib/earth/air/airport.rb +9 -7
  23. data/lib/earth/air/bts_aircraft/data_miner.rb +0 -5
  24. data/lib/earth/air/bts_aircraft.rb +3 -3
  25. data/lib/earth/air/data_miner.rb +2 -3
  26. data/lib/earth/air/flight_distance_class/data_miner.rb +0 -6
  27. data/lib/earth/air/flight_distance_class.rb +4 -3
  28. data/lib/earth/air/flight_seat_class/data_miner.rb +0 -7
  29. data/lib/earth/air/flight_seat_class.rb +6 -3
  30. data/lib/earth/air/flight_segment/data_miner.rb +30 -112
  31. data/lib/earth/air/flight_segment.rb +47 -13
  32. data/lib/earth/air.rb +2 -1
  33. data/lib/earth/automobile/automobile_fuel/data_miner.rb +1 -25
  34. data/lib/earth/automobile/automobile_fuel.rb +24 -8
  35. data/lib/earth/automobile/automobile_make/data_miner.rb +3 -16
  36. data/lib/earth/automobile/automobile_make.rb +5 -3
  37. data/lib/earth/automobile/automobile_make_fleet_year/data_miner.rb +16 -30
  38. data/lib/earth/automobile/automobile_make_fleet_year.rb +10 -7
  39. data/lib/earth/automobile/automobile_make_model/data_miner.rb +1 -11
  40. data/lib/earth/automobile/automobile_make_model.rb +9 -7
  41. data/lib/earth/automobile/automobile_make_model_year/data_miner.rb +4 -17
  42. data/lib/earth/automobile/automobile_make_model_year.rb +11 -6
  43. data/lib/earth/automobile/automobile_make_model_year_variant/data_miner.rb +37 -65
  44. data/lib/earth/automobile/automobile_make_model_year_variant.rb +36 -6
  45. data/lib/earth/automobile/automobile_make_year/data_miner.rb +3 -15
  46. data/lib/earth/automobile/automobile_make_year.rb +8 -7
  47. data/lib/earth/automobile/automobile_size_class/data_miner.rb +0 -15
  48. data/lib/earth/automobile/automobile_size_class.rb +13 -2
  49. data/lib/earth/automobile/automobile_size_class_year/data_miner.rb +0 -11
  50. data/lib/earth/automobile/automobile_size_class_year.rb +10 -3
  51. data/lib/earth/automobile/automobile_type_fuel_age/data_miner.rb +0 -12
  52. data/lib/earth/automobile/automobile_type_fuel_age.rb +10 -2
  53. data/lib/earth/automobile/automobile_type_fuel_control/data_miner.rb +0 -11
  54. data/lib/earth/automobile/automobile_type_fuel_control.rb +9 -3
  55. data/lib/earth/automobile/automobile_type_fuel_year/data_miner.rb +1 -17
  56. data/lib/earth/automobile/automobile_type_fuel_year.rb +14 -6
  57. data/lib/earth/automobile/automobile_type_fuel_year_age/data_miner.rb +0 -13
  58. data/lib/earth/automobile/automobile_type_fuel_year_age.rb +12 -7
  59. data/lib/earth/automobile/automobile_type_fuel_year_control/data_miner.rb +0 -11
  60. data/lib/earth/automobile/automobile_type_fuel_year_control.rb +9 -6
  61. data/lib/earth/automobile/automobile_type_year/data_miner.rb +0 -10
  62. data/lib/earth/automobile/automobile_type_year.rb +9 -3
  63. data/lib/earth/bus/bus_class/data_miner.rb +0 -29
  64. data/lib/earth/bus/bus_class.rb +27 -2
  65. data/lib/earth/bus/bus_fuel/data_miner.rb +1 -16
  66. data/lib/earth/bus/bus_fuel.rb +15 -8
  67. data/lib/earth/bus/bus_fuel_control/data_miner.rb +0 -10
  68. data/lib/earth/bus/bus_fuel_control.rb +8 -3
  69. data/lib/earth/bus/bus_fuel_year_control/data_miner.rb +1 -10
  70. data/lib/earth/bus/bus_fuel_year_control.rb +8 -7
  71. data/lib/earth/bus/data_miner.rb +2 -0
  72. data/lib/earth/bus.rb +2 -0
  73. data/lib/earth/computation/computation_carrier/data_miner.rb +0 -5
  74. data/lib/earth/computation/computation_carrier.rb +3 -2
  75. data/lib/earth/computation/computation_carrier_instance_class/data_miner.rb +0 -8
  76. data/lib/earth/computation/computation_carrier_instance_class.rb +6 -6
  77. data/lib/earth/computation/computation_carrier_region/data_miner.rb +0 -7
  78. data/lib/earth/computation/computation_carrier_region.rb +6 -7
  79. data/lib/earth/computation/data_miner.rb +2 -0
  80. data/lib/earth/computation.rb +2 -0
  81. data/lib/earth/diet/diet_class/data_miner.rb +0 -16
  82. data/lib/earth/diet/diet_class.rb +16 -4
  83. data/lib/earth/diet/food_group/data_miner.rb +0 -9
  84. data/lib/earth/diet/food_group.rb +7 -2
  85. data/lib/earth/fuel/fuel/data_miner.rb +0 -16
  86. data/lib/earth/fuel/fuel.rb +14 -2
  87. data/lib/earth/fuel/fuel_price/data_miner.rb +0 -6
  88. data/lib/earth/fuel/fuel_price.rb +4 -6
  89. data/lib/earth/fuel/fuel_type/data_miner.rb +0 -14
  90. data/lib/earth/fuel/fuel_type.rb +14 -4
  91. data/lib/earth/fuel/fuel_year/data_miner.rb +0 -16
  92. data/lib/earth/fuel/fuel_year.rb +14 -2
  93. data/lib/earth/fuel/greenhouse_gas/data_miner.rb +0 -9
  94. data/lib/earth/fuel/greenhouse_gas.rb +10 -5
  95. data/lib/earth/hospitality/lodging_class/data_miner.rb +0 -12
  96. data/lib/earth/hospitality/lodging_class.rb +10 -2
  97. data/lib/earth/industry/data_miner.rb +0 -0
  98. data/lib/earth/industry/industry.rb +3 -10
  99. data/lib/earth/industry/industry_product.rb +6 -13
  100. data/lib/earth/industry/industry_product_line.rb +5 -12
  101. data/lib/earth/industry/industry_sector.rb +5 -12
  102. data/lib/earth/industry/merchant.rb +4 -11
  103. data/lib/earth/industry/merchant_category.rb +3 -10
  104. data/lib/earth/industry/merchant_category_industry.rb +5 -12
  105. data/lib/earth/industry/product_line.rb +5 -12
  106. data/lib/earth/industry/product_line_industry_product.rb +5 -12
  107. data/lib/earth/industry/sector.rb +5 -12
  108. data/lib/earth/locality/census_division/data_miner.rb +0 -23
  109. data/lib/earth/locality/census_division.rb +21 -6
  110. data/lib/earth/locality/census_region/data_miner.rb +0 -5
  111. data/lib/earth/locality/census_region.rb +3 -2
  112. data/lib/earth/locality/climate_division/data_miner.rb +0 -7
  113. data/lib/earth/locality/climate_division.rb +5 -7
  114. data/lib/earth/locality/country/data_miner.rb +16 -29
  115. data/lib/earth/locality/country.rb +15 -4
  116. data/lib/earth/locality/data_miner.rb +3 -0
  117. data/lib/earth/locality/egrid_region/data_miner.rb +0 -5
  118. data/lib/earth/locality/egrid_region.rb +5 -8
  119. data/lib/earth/locality/egrid_subregion/data_miner.rb +1 -20
  120. data/lib/earth/locality/egrid_subregion.rb +17 -6
  121. data/lib/earth/locality/petroleum_administration_for_defense_district/data_miner.rb +4 -13
  122. data/lib/earth/locality/petroleum_administration_for_defense_district.rb +8 -4
  123. data/lib/earth/locality/state/data_miner.rb +0 -8
  124. data/lib/earth/locality/state.rb +6 -7
  125. data/lib/earth/locality/urbanity/data_miner.rb +0 -4
  126. data/lib/earth/locality/urbanity.rb +2 -2
  127. data/lib/earth/locality/zip_code/data_miner.rb +0 -10
  128. data/lib/earth/locality/zip_code.rb +8 -6
  129. data/lib/earth/locality.rb +3 -0
  130. data/lib/earth/pet/breed/data_miner.rb +0 -7
  131. data/lib/earth/pet/breed.rb +5 -6
  132. data/lib/earth/pet/breed_gender/data_miner.rb +0 -8
  133. data/lib/earth/pet/breed_gender.rb +6 -6
  134. data/lib/earth/pet/gender/data_miner.rb +0 -3
  135. data/lib/earth/pet/gender.rb +2 -2
  136. data/lib/earth/pet/species/data_miner.rb +0 -17
  137. data/lib/earth/pet/species.rb +17 -4
  138. data/lib/earth/rail/rail_class/data_miner.rb +0 -14
  139. data/lib/earth/rail/rail_class.rb +12 -3
  140. data/lib/earth/residence/air_conditioner_use/data_miner.rb +0 -6
  141. data/lib/earth/residence/air_conditioner_use.rb +5 -3
  142. data/lib/earth/residence/clothes_machine_use/data_miner.rb +0 -6
  143. data/lib/earth/residence/clothes_machine_use.rb +4 -2
  144. data/lib/earth/residence/data_miner.rb +2 -0
  145. data/lib/earth/residence/dishwasher_use/data_miner.rb +0 -6
  146. data/lib/earth/residence/dishwasher_use.rb +5 -3
  147. data/lib/earth/residence/residence_appliance/data_miner.rb +0 -6
  148. data/lib/earth/residence/residence_appliance.rb +4 -2
  149. data/lib/earth/residence/residence_class/data_miner.rb +0 -4
  150. data/lib/earth/residence/residence_class.rb +2 -2
  151. data/lib/earth/residence/residence_fuel_price/data_miner.rb +0 -14
  152. data/lib/earth/residence/residence_fuel_price.rb +12 -7
  153. data/lib/earth/residence/residence_fuel_type/data_miner.rb +0 -8
  154. data/lib/earth/residence/residence_fuel_type.rb +6 -2
  155. data/lib/earth/residence/residential_energy_consumption_survey_response/data_miner.rb +0 -94
  156. data/lib/earth/residence/residential_energy_consumption_survey_response.rb +92 -6
  157. data/lib/earth/residence.rb +2 -0
  158. data/lib/earth/shipping/carrier/data_miner.rb +0 -10
  159. data/lib/earth/shipping/carrier.rb +8 -2
  160. data/lib/earth/shipping/carrier_mode/data_miner.rb +0 -10
  161. data/lib/earth/shipping/carrier_mode.rb +9 -3
  162. data/lib/earth/shipping/shipment_mode/data_miner.rb +0 -7
  163. data/lib/earth/shipping/shipment_mode.rb +5 -2
  164. data/lib/earth/version.rb +1 -1
  165. data/lib/earth.rb +92 -84
  166. data/spec/earth/air/aircraft_spec.rb +1 -1
  167. data/spec/earth_spec.rb +15 -15
  168. data/spec/spec_helper.rb +12 -9
  169. metadata +175 -171
  170. data/lib/earth/active_record_ext.rb +0 -9
  171. data/lib/earth/air/aircraft_manufacturer/data_miner.rb +0 -21
  172. data/lib/earth/air/aircraft_manufacturer.rb +0 -7
  173. data/lib/earth/base.rb +0 -7
@@ -30,11 +30,97 @@ class ResidentialEnergyConsumptionSurveyResponse < ActiveRecord::Base
30
30
  :ownership,
31
31
  ]
32
32
 
33
- data_miner do
34
- tap "Brighter Planet's sanitized RECS 2005", Earth.taps_server
35
-
36
- process "pull dependencies" do
37
- run_data_miner_on_belongs_to_associations
38
- end
33
+ # sabshere 9/20/10 sorted with sort -d -t "'" -k 2 ~/Desktop/parts.txt
34
+ create_table do
35
+ integer 'id'
36
+ string 'air_conditioner_use_id'
37
+ float 'annual_energy_from_electricity_for_air_conditioners'
38
+ string 'annual_energy_from_electricity_for_air_conditioners_units'
39
+ float 'annual_energy_from_electricity_for_clothes_driers'
40
+ string 'annual_energy_from_electricity_for_clothes_driers_units'
41
+ float 'annual_energy_from_electricity_for_dishwashers'
42
+ string 'annual_energy_from_electricity_for_dishwashers_units'
43
+ float 'annual_energy_from_electricity_for_freezers'
44
+ string 'annual_energy_from_electricity_for_freezers_units'
45
+ float 'annual_energy_from_electricity_for_heating_space'
46
+ string 'annual_energy_from_electricity_for_heating_space_units'
47
+ float 'annual_energy_from_electricity_for_heating_water'
48
+ string 'annual_energy_from_electricity_for_heating_water_units'
49
+ float 'annual_energy_from_electricity_for_other_appliances'
50
+ string 'annual_energy_from_electricity_for_other_appliances_units'
51
+ float 'annual_energy_from_electricity_for_refrigerators'
52
+ string 'annual_energy_from_electricity_for_refrigerators_units'
53
+ float 'annual_energy_from_fuel_oil_for_appliances'
54
+ string 'annual_energy_from_fuel_oil_for_appliances_units'
55
+ float 'annual_energy_from_fuel_oil_for_heating_space'
56
+ string 'annual_energy_from_fuel_oil_for_heating_space_units'
57
+ float 'annual_energy_from_fuel_oil_for_heating_water'
58
+ string 'annual_energy_from_fuel_oil_for_heating_water_units'
59
+ float 'annual_energy_from_kerosene'
60
+ string 'annual_energy_from_kerosene_units'
61
+ float 'annual_energy_from_natural_gas_for_appliances'
62
+ string 'annual_energy_from_natural_gas_for_appliances_units'
63
+ float 'annual_energy_from_natural_gas_for_heating_space'
64
+ string 'annual_energy_from_natural_gas_for_heating_space_units'
65
+ float 'annual_energy_from_natural_gas_for_heating_water'
66
+ string 'annual_energy_from_natural_gas_for_heating_water_units'
67
+ float 'annual_energy_from_propane_for_appliances'
68
+ string 'annual_energy_from_propane_for_appliances_units'
69
+ float 'annual_energy_from_propane_for_heating_space'
70
+ string 'annual_energy_from_propane_for_heating_space_units'
71
+ float 'annual_energy_from_propane_for_heating_water'
72
+ string 'annual_energy_from_propane_for_heating_water_units'
73
+ float 'annual_energy_from_wood'
74
+ string 'annual_energy_from_wood_units'
75
+ boolean 'attached_1car_garage'
76
+ boolean 'attached_2car_garage'
77
+ boolean 'attached_3car_garage'
78
+ float 'bathrooms'
79
+ integer 'bedrooms'
80
+ string 'census_division_name'
81
+ integer 'census_division_number'
82
+ string 'census_region_name'
83
+ integer 'census_region_number'
84
+ string 'central_ac_use'
85
+ string 'clothes_dryer_use'
86
+ string 'clothes_machine_use_id'
87
+ string 'clothes_washer_use'
88
+ string 'construction_period'
89
+ date 'construction_year'
90
+ integer 'cooling_degree_days'
91
+ string 'cooling_degree_days_units'
92
+ boolean 'detached_1car_garage'
93
+ boolean 'detached_2car_garage'
94
+ boolean 'detached_3car_garage'
95
+ string 'dishwasher_use_id'
96
+ integer 'efficient_lights_on_1_to_4_hours'
97
+ integer 'efficient_lights_on_4_to_12_hours'
98
+ integer 'efficient_lights_on_over_12_hours'
99
+ float 'floorspace'
100
+ string 'floorspace_units'
101
+ integer 'freezer_count'
102
+ integer 'full_bathrooms'
103
+ integer 'half_bathrooms'
104
+ boolean 'heated_garage'
105
+ integer 'heating_degree_days'
106
+ string 'heating_degree_days_units'
107
+ float 'lighting_efficiency'
108
+ float 'lighting_use'
109
+ string 'lighting_use_units'
110
+ integer 'lights_on_1_to_4_hours'
111
+ integer 'lights_on_4_to_12_hours'
112
+ integer 'lights_on_over_12_hours'
113
+ integer 'outdoor_all_night_gas_lights'
114
+ integer 'outdoor_all_night_lights'
115
+ boolean 'ownership'
116
+ integer 'refrigerator_count'
117
+ string 'residence_class_id'
118
+ integer 'residents'
119
+ float 'rooms'
120
+ boolean 'thermostat_programmability'
121
+ integer 'total_rooms'
122
+ string 'urbanity_id'
123
+ float 'weighting'
124
+ string 'window_ac_use'
39
125
  end
40
126
  end
@@ -6,3 +6,5 @@ require 'earth/residence/residence_class'
6
6
  require 'earth/residence/residence_fuel_price'
7
7
  require 'earth/residence/residence_fuel_type'
8
8
  require 'earth/residence/residential_energy_consumption_survey_response'
9
+
10
+ require 'earth/locality'
@@ -1,15 +1,5 @@
1
1
  Carrier.class_eval do
2
2
  data_miner do
3
- schema Earth.database_options do
4
- string 'name'
5
- float 'package_volume'
6
- float 'route_inefficiency_factor'
7
- float 'transport_emission_factor'
8
- string 'transport_emission_factor_units'
9
- float 'corporate_emission_factor'
10
- string 'corporate_emission_factor_units'
11
- end
12
-
13
3
  import "a list of shipping companies and their characteristics",
14
4
  :url => 'https://spreadsheets.google.com/pub?key=0AoQJbWqPrREqdG1ONU1HZDdZTFJNclFYVkRzR0k5Z2c&hl=en&gid=0&output=csv' do
15
5
  key 'name'
@@ -8,7 +8,13 @@ class Carrier < ActiveRecord::Base
8
8
  :transport_emission_factor => 0.0005266,
9
9
  :corporate_emission_factor => 0.221
10
10
 
11
- data_miner do
12
- tap "Brighter Planet's shipping company data", Earth.taps_server
11
+ create_table do
12
+ string 'name'
13
+ float 'package_volume'
14
+ float 'route_inefficiency_factor'
15
+ float 'transport_emission_factor'
16
+ string 'transport_emission_factor_units'
17
+ float 'corporate_emission_factor'
18
+ string 'corporate_emission_factor_units'
13
19
  end
14
20
  end
@@ -1,15 +1,5 @@
1
1
  CarrierMode.class_eval do
2
2
  data_miner do
3
- schema Earth.database_options do
4
- string 'name'
5
- string 'carrier_name'
6
- string 'mode_name'
7
- float 'package_volume'
8
- float 'route_inefficiency_factor'
9
- float 'transport_emission_factor'
10
- string 'transport_emission_factor_units'
11
- end
12
-
13
3
  import "a list of carrier modes and their characteristics",
14
4
  :url => 'https://spreadsheets.google.com/pub?key=0AoQJbWqPrREqdGRsRkJOd0NPd0FETTI0NmpYUlBsN2c&hl=en&gid=0&output=csv' do
15
5
  key 'name'
@@ -3,8 +3,14 @@ class CarrierMode < ActiveRecord::Base
3
3
 
4
4
  belongs_to :carrier, :foreign_key => 'carrier_name', :primary_key => 'name'
5
5
  belongs_to :mode, :foreign_key => 'mode_name', :primary_key => 'name', :class_name => 'ShipmentMode'
6
-
7
- data_miner do
8
- tap "Brighter Planet's carrier mode data", Earth.taps_server
6
+
7
+ create_table do
8
+ string 'name'
9
+ string 'carrier_name'
10
+ string 'mode_name'
11
+ float 'package_volume'
12
+ float 'route_inefficiency_factor'
13
+ float 'transport_emission_factor'
14
+ string 'transport_emission_factor_units'
9
15
  end
10
16
  end
@@ -1,12 +1,5 @@
1
1
  ShipmentMode.class_eval do
2
2
  data_miner do
3
- schema Earth.database_options do
4
- string 'name'
5
- float 'route_inefficiency_factor'
6
- float 'transport_emission_factor'
7
- string 'transport_emission_factor_units'
8
- end
9
-
10
3
  import "a list of shipment modes and their characteristics",
11
4
  :url => 'https://spreadsheets.google.com/pub?key=0AoQJbWqPrREqdGR2a2RYcEg2RnRKbkRQcXc0ZkQ5U0E&hl=en&gid=0&output=csv' do
12
5
  key 'name'
@@ -3,7 +3,10 @@ class ShipmentMode < ActiveRecord::Base
3
3
 
4
4
  has_many :carrier_modes, :foreign_key => 'mode_name', :primary_key => 'name'
5
5
 
6
- data_miner do
7
- tap "Brighter Planet's shipment mode data", Earth.taps_server
6
+ create_table do
7
+ string 'name'
8
+ float 'route_inefficiency_factor'
9
+ float 'transport_emission_factor'
10
+ string 'transport_emission_factor_units'
8
11
  end
9
12
  end
data/lib/earth/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Earth
2
- VERSION = "0.5.0"
2
+ VERSION = "0.5.2"
3
3
  end
data/lib/earth.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  require 'active_record'
2
2
  require 'cohort_scope'
3
- require 'earth/base'
4
3
  require 'earth/conversions_ext'
5
4
  require 'earth/inflectors'
6
5
  require 'data_miner'
@@ -8,31 +7,36 @@ require 'falls_back_on'
8
7
  require 'weighted_average'
9
8
  require 'fixed_width'
10
9
  require 'errata'
10
+ require 'create_table'
11
+ require 'loose_tight_dictionary'
12
+ require 'loose_tight_dictionary/cached_result'
11
13
 
12
- # The earth module is an interface for establishing a taps server (used to fetch
13
- # data) and for loading data models from various domains.
14
+ # hackety hack
15
+ def INSERT_IGNORE(cmd)
16
+ if ActiveRecord::Base.connection.adapter_name.downcase == 'sqlite'
17
+ prefix = 'INSERT'
18
+ else
19
+ prefix = 'INSERT IGNORE'
20
+ end
21
+ ActiveRecord::Base.connection.execute "#{prefix} #{cmd}"
22
+ end
23
+
24
+ # The earth module is an interface for loading data models from various domains.
14
25
  module Earth
15
26
  extend self
16
27
 
17
- def taps_server
18
- @taps_server || 'http://carbon:neutral@data.brighterplanet.com:5000'
19
- end
20
-
21
- # taps_server is a URL. See the data_miner gem docs
22
- def taps_server=(val)
23
- @taps_server = val
24
- end
25
-
26
- # Takes argument like Earth.resource_names(['air'])
28
+ # Takes argument like Earth.search(['air'])
27
29
  # Default is search all domains
28
30
  # For example, <tt>[ 'Aircraft', 'Airline' ]</tt>
29
- def resource_names(search_domains = nil)
30
- if search_domains.nil?
31
- resources.keys
31
+ def search(*search_domains)
32
+ search_domains = search_domains.empty? ? [:all] : search_domains.flatten.map(&:to_sym)
33
+ if search_domains.include? :all
34
+ resources
32
35
  else
33
- resources.inject([]) do |list, (name, data)|
34
- list << name if search_domains.include? data[:domain]
35
- list
36
+ resource_map.select do |resource, domain|
37
+ search_domains.include? domain.to_sym
38
+ end.map do |resource, domain|
39
+ resource
36
40
  end
37
41
  end
38
42
  end
@@ -42,21 +46,24 @@ module Earth
42
46
  end
43
47
 
44
48
  def domains
45
- @domains ||= resources.map { |(name, data)| data[:domain] }.uniq.sort
49
+ resource_map.values.uniq.sort
46
50
  end
47
-
51
+
48
52
  def resources
49
- return @resources unless @resources.nil?
50
- earth_files = Dir[File.join(Earth.gem_root, 'lib', 'earth', '*')]
51
- domain_dirs = earth_files.find_all { |f| File.directory?(f) }
52
- @resources = domain_dirs.inject({}) do |hsh, domain_dir|
53
- Dir[File.join(domain_dir, '*.rb')].each do |resource_file|
54
- resource_camel = File.basename(resource_file, '.rb').camelcase
55
- unless resource_camel == 'DataMiner'
56
- hsh[resource_camel] = { :domain => File.basename(domain_dir) }
53
+ resource_map.keys.sort
54
+ end
55
+
56
+ def resource_map
57
+ @resource_map ||= Dir[File.join(gem_root, 'lib', 'earth', '*')].select do |path|
58
+ File.directory? path
59
+ end.inject({}) do |memo, domain_path|
60
+ Dir[File.join(domain_path, '*.rb')].each do |resource_path|
61
+ resource = File.basename(resource_path, '.rb').camelcase
62
+ unless resource == 'DataMiner'
63
+ memo[resource] = File.basename domain_path
57
64
  end
58
65
  end
59
- hsh
66
+ memo
60
67
  end
61
68
  end
62
69
 
@@ -68,85 +75,86 @@ module Earth
68
75
  # Earth.init should be performed after a connection is made to the database and
69
76
  # before any domain models are referenced.
70
77
  def init(*args)
71
- load_plugins
72
-
73
- domains = []
74
- options = {}
75
- args.each do |arg|
76
- if arg.is_a?(Hash)
77
- options = arg
78
- else
79
- domains << arg
80
- end
81
- end
82
-
83
- load_domains(domains, options)
84
- load_schemas(options) if options[:apply_schemas]
85
- end
78
+ options = args.last.is_a?(Hash) ? args.pop.symbolize_keys : {}
79
+ domains = args.empty? ? [ :all ] : args.map(&:to_sym)
86
80
 
87
- def database_options
88
- if ActiveRecord::Base.connection.adapter_name.downcase == 'sqlite'
89
- {}
90
- else
91
- { :options => 'ENGINE=InnoDB default charset=utf8 collate=utf8_general_ci' }
92
- end
81
+ _load_plugins
82
+ _load_domains domains, options
83
+ _decorate_resources options
84
+ _load_schemas search(domains), options
93
85
  end
94
86
 
95
- private
96
- def load_domains(domains, options)
87
+ private
88
+
89
+ # TODO sabshere don't use directories to specify domains
90
+ # * you have 20 million data_miner.rb files which are easy to confuse
91
+ # * you have to go all over the filesystem to figure things out
92
+ def _load_domains(domains, options)
93
+ return if domains.include? :none
97
94
  if domains.empty? or domains.include?(:all)
98
95
  # sabshere 9/16/10 why maintain this separately?
99
96
  require 'earth/all'
100
97
  require 'earth/data_miner' if options[:apply_schemas] or options[:load_data_miner]
101
- elsif !domains.include?(:none)
98
+ else
102
99
  domains.each do |domain|
103
100
  require "earth/#{domain}"
104
- if options[:apply_schemas] or options[:load_data_miner]
105
- begin
106
- require "earth/#{domain}/data_miner"
107
- rescue LoadError
108
- end
109
- end
101
+ require "earth/#{domain}/data_miner" if options[:apply_schemas] or options[:load_data_miner]
110
102
  end
111
103
  end
112
104
  end
113
105
 
114
- def load_plugins
115
- require 'earth/active_record_ext'
106
+ def _load_plugins
116
107
  Dir[File.join(Earth.gem_root, 'vendor', '**', 'init.rb')].each do |pluginit|
117
108
  $:.unshift File.join(File.dirname(pluginit), 'lib')
118
109
  load pluginit
119
110
  end
120
111
  end
112
+
113
+ def _append_pull_dependencies_step_to_data_miner(resource)
114
+ resource_model = resource.constantize
115
+ return if resource_model.data_miner_config.steps.any? { |step| step.description == :run_data_miner_on_parent_associations! }
121
116
 
122
- def load_schemas(options = {})
123
- load_data_miner_schemas(options)
117
+ pull_dependencies_step = DataMiner::Process.new resource_model.data_miner_config, :run_data_miner_on_parent_associations!
118
+
119
+ resource_model.data_miner_config.steps.push pull_dependencies_step
124
120
  end
121
+
122
+ def _prepend_create_table_step_to_data_miner(resource)
123
+ resource_model = resource.constantize
124
+ return if resource_model.data_miner_config.steps.any? { |step| step.description == :create_table! }
125
+
126
+ create_table_step = DataMiner::Process.new resource_model.data_miner_config, :create_table!
125
127
 
126
- def load_data_miner_schemas(options = {})
127
- models = Module.constants.select do |k|
128
- const = Object.const_get(k) if Object.const_defined?(k)
129
- if const.instance_of?(Class)
130
- const.superclass == ActiveRecord::Base ||
131
- const.superclass == Earth::Base
128
+ resource_model.data_miner_config.steps.unshift create_table_step
129
+ end
130
+
131
+ TAPS_STEP = 'Tap the Brighter Planet data server'
132
+ TAPS_SOURCE = 'http://carbon:neutral@data.brighterplanet.com'
133
+ def _prepend_taps_step_to_data_miner(resource)
134
+ resource_model = resource.constantize
135
+ return if resource_model.data_miner_config.steps.any? { |step| step.description == TAPS_STEP }
136
+
137
+ taps_step = DataMiner::Tap.new resource_model.data_miner_config, TAPS_STEP, TAPS_SOURCE
138
+
139
+ resource_model.data_miner_config.steps.unshift taps_step
140
+ end
141
+
142
+ def _decorate_resources(options)
143
+ resources.each do |resource|
144
+ next unless ::Object.const_defined?(resource)
145
+ _append_pull_dependencies_step_to_data_miner resource
146
+ if options[:apply_schemas] or options[:load_data_miner]
147
+ _prepend_create_table_step_to_data_miner resource
132
148
  else
133
- false
134
- end
135
- end
136
- models.sort.each do |model|
137
- klass = Object.const_get(model)
138
- if klass.respond_to?(:execute_schema) and (!klass.table_exists? || options[:force_schema])
139
- klass.execute_schema
149
+ _prepend_taps_step_to_data_miner resource
140
150
  end
141
151
  end
142
152
  end
143
- end
144
153
 
145
- def INSERT_IGNORE(cmd)
146
- if ActiveRecord::Base.connection.adapter_name.downcase == 'sqlite'
147
- prefix = 'INSERT'
148
- else
149
- prefix = 'INSERT IGNORE'
154
+ def _load_schemas(selected_resources, options)
155
+ return unless options[:apply_schemas]
156
+ selected_resources.each do |resource|
157
+ resource.constantize.create_table!
158
+ end
150
159
  end
151
- ActiveRecord::Base.connection.execute "#{prefix} #{cmd}"
152
160
  end
@@ -5,7 +5,7 @@ require 'earth/air/aircraft/data_miner'
5
5
  describe Aircraft do
6
6
  describe 'import', :slow => true do
7
7
  it 'should treat empty cells as null' do
8
- Aircraft.execute_schema
8
+ Aircraft.create_table!
9
9
  Aircraft.run_data_miner!
10
10
  Aircraft.count.should > 1
11
11
  Aircraft.where(:brighter_planet_aircraft_class_code => nil).should_not be_empty
data/spec/earth_spec.rb CHANGED
@@ -8,38 +8,38 @@ describe Earth do
8
8
 
9
9
  it 'should require all Earth models' do
10
10
  lambda do
11
- Earth.resource_names.each { |k| k.constantize }
11
+ Earth.resources.each { |k| k.constantize }
12
12
  end.should_not raise_error(NameError)
13
13
  end
14
14
 
15
15
  it 'should include data_miner definitions' do
16
16
  lambda do
17
- Earth.resource_names.each { |k| k.constantize.should_receive(:data_miner) }
17
+ Earth.resources.each { |k| k.constantize.should_receive(:data_miner) }
18
18
  end
19
19
  require 'earth/data_miner'
20
20
  end
21
21
  end
22
22
 
23
- describe '.resources' do
24
- it 'should get a list of resources' do
25
- resources = Earth.resources
26
- resources.keys.count.should == 76
27
- resources['FuelType'][:domain].should == 'fuel'
23
+ describe '.resource_map' do
24
+ it 'should get a list of resource_map' do
25
+ resource_map = Earth.resource_map
26
+ resource_map.keys.count.should == 75
27
+ resource_map['FuelType'].should == 'fuel'
28
28
  end
29
29
  it 'should exclude data_miner files' do
30
- Earth.resources.keys.should_not include('DataMiner')
30
+ Earth.resource_map.keys.should_not include('DataMiner')
31
31
  end
32
32
  end
33
33
 
34
- describe '.resource_names' do
34
+ describe '.search' do
35
35
  it 'should get a list of all resource names' do
36
- Earth.resource_names.count.should == 76
37
- Earth.resource_names.should include('Aircraft')
38
- Earth.resource_names.should include('Industry')
36
+ Earth.search.length.should == 75
37
+ Earth.search.should include('Aircraft')
38
+ Earth.search.should include('Industry')
39
39
  end
40
- it 'should filter resources by domain' do
41
- Earth.resource_names(['fuel']).count.should == 5
42
- Earth.resource_names(['fuel']).should include('FuelType')
40
+ it 'should filter resource_map by domain' do
41
+ Earth.search('fuel').length.should == 5
42
+ Earth.search('fuel').should include('FuelType')
43
43
  end
44
44
  end
45
45
 
data/spec/spec_helper.rb CHANGED
@@ -1,18 +1,21 @@
1
1
  require 'rubygems'
2
2
  require 'bundler'
3
3
  Bundler.setup
4
-
4
+ require 'logger'
5
5
  require 'active_record'
6
- require 'sqlite3'
7
- ActiveRecord::Base.establish_connection :adapter => 'sqlite3',
8
- :database => ':memory:'
6
+ require 'data_miner'
7
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
8
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
9
+ require 'earth'
9
10
 
10
- $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
11
- require 'earth' # we do require Earth to live
11
+ logger = Logger.new 'log/test.log'
12
+ logger.level = Logger::DEBUG
12
13
 
13
- require 'data_miner'
14
- require 'logger'
15
- DataMiner.logger = Logger.new(nil)
14
+ ActiveRecord::Base.establish_connection :adapter => 'sqlite3', :database => ':memory:'
15
+
16
+ ActiveRecord::Base.logger = logger
17
+
18
+ DataMiner.logger = logger
16
19
 
17
20
  RSpec.configure do |c|
18
21
  c.filter_run_excluding :slow => true