earth-ruby19 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +5 -0
- data/Gemfile.lock +138 -0
- data/LICENSE +20 -0
- data/README.markdown +38 -0
- data/lib/earth.rb +146 -0
- data/lib/earth/active_record_ext.rb +9 -0
- data/lib/earth/air.rb +13 -0
- data/lib/earth/air/aircraft.rb +21 -0
- data/lib/earth/air/aircraft/data_miner.rb +184 -0
- data/lib/earth/air/aircraft_class.rb +10 -0
- data/lib/earth/air/aircraft_class/data_miner.rb +42 -0
- data/lib/earth/air/aircraft_manufacturer.rb +9 -0
- data/lib/earth/air/aircraft_manufacturer/data_miner.rb +20 -0
- data/lib/earth/air/airline.rb +16 -0
- data/lib/earth/air/airline/data_miner.rb +57 -0
- data/lib/earth/air/airport.rb +44 -0
- data/lib/earth/air/airport/data_miner.rb +80 -0
- data/lib/earth/air/data_miner.rb +15 -0
- data/lib/earth/air/flight_configuration.rb +7 -0
- data/lib/earth/air/flight_configuration/data_miner.rb +16 -0
- data/lib/earth/air/flight_distance_class.rb +7 -0
- data/lib/earth/air/flight_distance_class/data_miner.rb +16 -0
- data/lib/earth/air/flight_domesticity.rb +6 -0
- data/lib/earth/air/flight_domesticity/data_miner.rb +57 -0
- data/lib/earth/air/flight_fuel_type.rb +12 -0
- data/lib/earth/air/flight_fuel_type/data_miner.rb +12 -0
- data/lib/earth/air/flight_propulsion.rb +7 -0
- data/lib/earth/air/flight_propulsion/data_miner.rb +16 -0
- data/lib/earth/air/flight_seat_class.rb +12 -0
- data/lib/earth/air/flight_seat_class/data_miner.rb +36 -0
- data/lib/earth/air/flight_segment.rb +29 -0
- data/lib/earth/air/flight_segment/data_miner.rb +330 -0
- data/lib/earth/air/flight_service.rb +7 -0
- data/lib/earth/air/flight_service/data_miner.rb +16 -0
- data/lib/earth/all.rb +11 -0
- data/lib/earth/automobile.rb +8 -0
- data/lib/earth/automobile/automobile_fuel_type.rb +18 -0
- data/lib/earth/automobile/automobile_fuel_type/data_miner.rb +45 -0
- data/lib/earth/automobile/automobile_make.rb +14 -0
- data/lib/earth/automobile/automobile_make/data_miner.rb +68 -0
- data/lib/earth/automobile/automobile_make_fleet_year.rb +15 -0
- data/lib/earth/automobile/automobile_make_fleet_year/data_miner.rb +29 -0
- data/lib/earth/automobile/automobile_make_year.rb +14 -0
- data/lib/earth/automobile/automobile_make_year/data_miner.rb +45 -0
- data/lib/earth/automobile/automobile_model.rb +14 -0
- data/lib/earth/automobile/automobile_model/data_miner.rb +38 -0
- data/lib/earth/automobile/automobile_model_year.rb +15 -0
- data/lib/earth/automobile/automobile_model_year/data_miner.rb +51 -0
- data/lib/earth/automobile/automobile_size_class.rb +14 -0
- data/lib/earth/automobile/automobile_size_class/data_miner.rb +43 -0
- data/lib/earth/automobile/automobile_variant.rb +17 -0
- data/lib/earth/automobile/automobile_variant/data_miner.rb +460 -0
- data/lib/earth/automobile/data_miner.rb +8 -0
- data/lib/earth/base.rb +7 -0
- data/lib/earth/bus.rb +1 -0
- data/lib/earth/bus/bus_class.rb +19 -0
- data/lib/earth/bus/bus_class/data_miner.rb +41 -0
- data/lib/earth/bus/data_miner.rb +1 -0
- data/lib/earth/conversions_ext.rb +45 -0
- data/lib/earth/data_miner.rb +10 -0
- data/lib/earth/diet.rb +2 -0
- data/lib/earth/diet/data_miner.rb +2 -0
- data/lib/earth/diet/diet_class.rb +15 -0
- data/lib/earth/diet/diet_class/data_miner.rb +36 -0
- data/lib/earth/diet/food_group.rb +17 -0
- data/lib/earth/diet/food_group/data_miner.rb +26 -0
- data/lib/earth/fuel.rb +2 -0
- data/lib/earth/fuel/data_miner.rb +2 -0
- data/lib/earth/fuel/fuel_price.rb +13 -0
- data/lib/earth/fuel/fuel_price/data_miner.rb +20 -0
- data/lib/earth/fuel/fuel_type.rb +18 -0
- data/lib/earth/fuel/fuel_type/data_miner.rb +37 -0
- data/lib/earth/hospitality.rb +1 -0
- data/lib/earth/hospitality/data_miner.rb +1 -0
- data/lib/earth/hospitality/lodging_class.rb +9 -0
- data/lib/earth/hospitality/lodging_class/data_miner.rb +30 -0
- data/lib/earth/industry.rb +10 -0
- data/lib/earth/industry/industry.rb +23 -0
- data/lib/earth/industry/industry_product.rb +22 -0
- data/lib/earth/industry/industry_product_line.rb +20 -0
- data/lib/earth/industry/industry_sector.rb +20 -0
- data/lib/earth/industry/merchant.rb +18 -0
- data/lib/earth/industry/merchant_category.rb +22 -0
- data/lib/earth/industry/merchant_category_industry.rb +20 -0
- data/lib/earth/industry/product_line.rb +22 -0
- data/lib/earth/industry/product_line_industry_product.rb +20 -0
- data/lib/earth/industry/sector.rb +19 -0
- data/lib/earth/inflectors.rb +9 -0
- data/lib/earth/locality.rb +10 -0
- data/lib/earth/locality/census_division.rb +22 -0
- data/lib/earth/locality/census_division/data_miner.rb +64 -0
- data/lib/earth/locality/census_region.rb +13 -0
- data/lib/earth/locality/census_region/data_miner.rb +17 -0
- data/lib/earth/locality/climate_division.rb +17 -0
- data/lib/earth/locality/climate_division/data_miner.rb +20 -0
- data/lib/earth/locality/country.rb +13 -0
- data/lib/earth/locality/country/data_miner.rb +19 -0
- data/lib/earth/locality/data_miner.rb +10 -0
- data/lib/earth/locality/egrid_region.rb +15 -0
- data/lib/earth/locality/egrid_region/data_miner.rb +35 -0
- data/lib/earth/locality/egrid_subregion.rb +16 -0
- data/lib/earth/locality/egrid_subregion/data_miner.rb +65 -0
- data/lib/earth/locality/petroleum_administration_for_defense_district.rb +13 -0
- data/lib/earth/locality/petroleum_administration_for_defense_district/data_miner.rb +21 -0
- data/lib/earth/locality/state.rb +22 -0
- data/lib/earth/locality/state/data_miner.rb +37 -0
- data/lib/earth/locality/urbanity.rb +10 -0
- data/lib/earth/locality/urbanity/data_miner.rb +15 -0
- data/lib/earth/locality/zip_code.rb +23 -0
- data/lib/earth/locality/zip_code/data_miner.rb +43 -0
- data/lib/earth/pet.rb +4 -0
- data/lib/earth/pet/breed.rb +15 -0
- data/lib/earth/pet/breed/data_miner.rb +25 -0
- data/lib/earth/pet/breed_gender.rb +14 -0
- data/lib/earth/pet/breed_gender/data_miner.rb +21 -0
- data/lib/earth/pet/data_miner.rb +4 -0
- data/lib/earth/pet/gender.rb +10 -0
- data/lib/earth/pet/gender/data_miner.rb +13 -0
- data/lib/earth/pet/species.rb +40 -0
- data/lib/earth/pet/species/data_miner.rb +42 -0
- data/lib/earth/rail.rb +1 -0
- data/lib/earth/rail/data_miner.rb +1 -0
- data/lib/earth/rail/rail_class.rb +16 -0
- data/lib/earth/rail/rail_class/data_miner.rb +36 -0
- data/lib/earth/residence.rb +8 -0
- data/lib/earth/residence/air_conditioner_use.rb +13 -0
- data/lib/earth/residence/air_conditioner_use/data_miner.rb +22 -0
- data/lib/earth/residence/clothes_machine_use.rb +10 -0
- data/lib/earth/residence/clothes_machine_use/data_miner.rb +28 -0
- data/lib/earth/residence/data_miner.rb +8 -0
- data/lib/earth/residence/dishwasher_use.rb +10 -0
- data/lib/earth/residence/dishwasher_use/data_miner.rb +28 -0
- data/lib/earth/residence/residence_appliance.rb +16 -0
- data/lib/earth/residence/residence_appliance/data_miner.rb +20 -0
- data/lib/earth/residence/residence_class.rb +16 -0
- data/lib/earth/residence/residence_class/data_miner.rb +15 -0
- data/lib/earth/residence/residence_fuel_price.rb +18 -0
- data/lib/earth/residence/residence_fuel_price/data_miner.rb +200 -0
- data/lib/earth/residence/residence_fuel_type.rb +32 -0
- data/lib/earth/residence/residence_fuel_type/data_miner.rb +18 -0
- data/lib/earth/residence/residential_energy_consumption_survey_response.rb +39 -0
- data/lib/earth/residence/residential_energy_consumption_survey_response/data_miner.rb +283 -0
- data/spec/lib/earth_spec.rb +25 -0
- data/spec/spec_helper.rb +11 -0
- data/vendor/geokit-rails/CHANGELOG.rdoc +46 -0
- data/vendor/geokit-rails/MIT-LICENSE +20 -0
- data/vendor/geokit-rails/README.markdown +561 -0
- data/vendor/geokit-rails/Rakefile +18 -0
- data/vendor/geokit-rails/about.yml +9 -0
- data/vendor/geokit-rails/assets/api_keys_template +61 -0
- data/vendor/geokit-rails/init.rb +1 -0
- data/vendor/geokit-rails/install.rb +14 -0
- data/vendor/geokit-rails/lib/geokit-rails.rb +24 -0
- data/vendor/geokit-rails/lib/geokit-rails/acts_as_mappable.rb +456 -0
- data/vendor/geokit-rails/lib/geokit-rails/adapters/abstract.rb +31 -0
- data/vendor/geokit-rails/lib/geokit-rails/adapters/mysql.rb +22 -0
- data/vendor/geokit-rails/lib/geokit-rails/adapters/postgresql.rb +22 -0
- data/vendor/geokit-rails/lib/geokit-rails/adapters/sqlserver.rb +43 -0
- data/vendor/geokit-rails/lib/geokit-rails/defaults.rb +22 -0
- data/vendor/geokit-rails/lib/geokit-rails/geocoder_control.rb +16 -0
- data/vendor/geokit-rails/lib/geokit-rails/ip_geocode_lookup.rb +46 -0
- data/vendor/geokit-rails/test/acts_as_mappable_test.rb +474 -0
- data/vendor/geokit-rails/test/boot.rb +25 -0
- data/vendor/geokit-rails/test/database.yml +20 -0
- data/vendor/geokit-rails/test/fixtures/companies.yml +7 -0
- data/vendor/geokit-rails/test/fixtures/custom_locations.yml +54 -0
- data/vendor/geokit-rails/test/fixtures/locations.yml +54 -0
- data/vendor/geokit-rails/test/fixtures/mock_addresses.yml +17 -0
- data/vendor/geokit-rails/test/fixtures/mock_families.yml +2 -0
- data/vendor/geokit-rails/test/fixtures/mock_houses.yml +9 -0
- data/vendor/geokit-rails/test/fixtures/mock_organizations.yml +5 -0
- data/vendor/geokit-rails/test/fixtures/mock_people.yml +5 -0
- data/vendor/geokit-rails/test/fixtures/stores.yml +0 -0
- data/vendor/geokit-rails/test/ip_geocode_lookup_test.rb +77 -0
- data/vendor/geokit-rails/test/models/company.rb +3 -0
- data/vendor/geokit-rails/test/models/custom_location.rb +12 -0
- data/vendor/geokit-rails/test/models/location.rb +4 -0
- data/vendor/geokit-rails/test/models/mock_address.rb +4 -0
- data/vendor/geokit-rails/test/models/mock_family.rb +3 -0
- data/vendor/geokit-rails/test/models/mock_house.rb +3 -0
- data/vendor/geokit-rails/test/models/mock_organization.rb +4 -0
- data/vendor/geokit-rails/test/models/mock_person.rb +4 -0
- data/vendor/geokit-rails/test/models/store.rb +3 -0
- data/vendor/geokit-rails/test/schema.rb +60 -0
- data/vendor/geokit-rails/test/tasks.rake +31 -0
- data/vendor/geokit-rails/test/test_helper.rb +23 -0
- metadata +476 -0
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
GData (0.0.4)
|
5
|
+
builder (>= 2.1.2)
|
6
|
+
hoe (>= 1.2.1)
|
7
|
+
activemodel (3.0.0)
|
8
|
+
activesupport (= 3.0.0)
|
9
|
+
builder (~> 2.1.2)
|
10
|
+
i18n (~> 0.4.1)
|
11
|
+
activerecord (3.0.0)
|
12
|
+
activemodel (= 3.0.0)
|
13
|
+
activesupport (= 3.0.0)
|
14
|
+
arel (~> 1.0.0)
|
15
|
+
tzinfo (~> 0.3.23)
|
16
|
+
activesupport (3.0.0)
|
17
|
+
amatch (0.2.5)
|
18
|
+
andand (1.3.1)
|
19
|
+
arel (1.0.1)
|
20
|
+
activesupport (~> 3.0.0)
|
21
|
+
blockenspiel (0.3.2)
|
22
|
+
builder (2.1.2)
|
23
|
+
cohort_scope (0.0.7)
|
24
|
+
activerecord (>= 3.0.0.beta4)
|
25
|
+
activesupport (>= 3.0.0.beta4)
|
26
|
+
conversions (1.4.5)
|
27
|
+
activesupport (>= 2.3.4)
|
28
|
+
data_miner (0.5.4)
|
29
|
+
activerecord (>= 2.3.4)
|
30
|
+
activesupport (>= 2.3.4)
|
31
|
+
andand (>= 1.3.1)
|
32
|
+
blockenspiel (= 0.3.2)
|
33
|
+
conversions (>= 1.4.4)
|
34
|
+
errata (>= 0.2.1)
|
35
|
+
escape (>= 0.0.4)
|
36
|
+
log4r (>= 1.1.7)
|
37
|
+
remote_table (>= 0.2.30)
|
38
|
+
taps (>= 0.3.11)
|
39
|
+
diff-lcs (1.1.2)
|
40
|
+
errata (0.2.3)
|
41
|
+
activesupport (>= 2.3.4)
|
42
|
+
remote_table (>= 0.2.20)
|
43
|
+
escape (0.0.4)
|
44
|
+
falls_back_on (0.0.3)
|
45
|
+
activerecord
|
46
|
+
fastercsv (1.5.3)
|
47
|
+
gemcutter (0.6.1)
|
48
|
+
geokit (1.5.0)
|
49
|
+
git (1.2.5)
|
50
|
+
hoe (2.6.2)
|
51
|
+
rake (>= 0.8.7)
|
52
|
+
rubyforge (>= 2.0.4)
|
53
|
+
hpricot (0.8.2)
|
54
|
+
i18n (0.4.1)
|
55
|
+
jeweler (1.4.0)
|
56
|
+
gemcutter (>= 0.1.0)
|
57
|
+
git (>= 1.2.5)
|
58
|
+
rubyforge (>= 2.0.0)
|
59
|
+
json_pure (1.4.6)
|
60
|
+
libxml-ruby (1.1.4)
|
61
|
+
log4r (1.1.8)
|
62
|
+
loose_tight_dictionary (0.0.8)
|
63
|
+
activesupport (>= 2.3.4)
|
64
|
+
amatch (>= 0.2.5)
|
65
|
+
andand (>= 1.3.1)
|
66
|
+
fastercsv (>= 1.5.3)
|
67
|
+
mime-types (1.16)
|
68
|
+
nokogiri (1.4.3.1)
|
69
|
+
rack (1.2.1)
|
70
|
+
rake (0.8.7)
|
71
|
+
rcov (0.9.9)
|
72
|
+
rdoc (2.5.11)
|
73
|
+
remote_table (0.2.30)
|
74
|
+
activesupport (>= 2.3.4)
|
75
|
+
escape (>= 0.0.4)
|
76
|
+
fastercsv (>= 1.5.0)
|
77
|
+
nokogiri (>= 1.4.1)
|
78
|
+
roo (= 1.3.11)
|
79
|
+
slither (>= 0.99.3)
|
80
|
+
rest-client (1.4.2)
|
81
|
+
mime-types (>= 1.16)
|
82
|
+
roo (1.3.11)
|
83
|
+
GData (>= 0.0.4)
|
84
|
+
hpricot (>= 0.6)
|
85
|
+
libxml-ruby (>= 1.1.3)
|
86
|
+
rubyzip (>= 0.9.1)
|
87
|
+
spreadsheet (>= 0.6.4)
|
88
|
+
rspec (2.0.0.beta.22)
|
89
|
+
rspec-core (= 2.0.0.beta.22)
|
90
|
+
rspec-expectations (= 2.0.0.beta.22)
|
91
|
+
rspec-mocks (= 2.0.0.beta.22)
|
92
|
+
rspec-core (2.0.0.beta.22)
|
93
|
+
rspec-expectations (2.0.0.beta.22)
|
94
|
+
diff-lcs (>= 1.1.2)
|
95
|
+
rspec-mocks (2.0.0.beta.22)
|
96
|
+
rspec-core (= 2.0.0.beta.22)
|
97
|
+
rspec-expectations (= 2.0.0.beta.22)
|
98
|
+
ruby-ole (1.2.10.1)
|
99
|
+
rubyforge (2.0.4)
|
100
|
+
json_pure (>= 1.1.7)
|
101
|
+
rubyzip (0.9.4)
|
102
|
+
sequel (3.15.0)
|
103
|
+
sinatra (1.0)
|
104
|
+
rack (>= 1.0)
|
105
|
+
slither (0.99.3)
|
106
|
+
spreadsheet (0.6.4.1)
|
107
|
+
ruby-ole
|
108
|
+
sqlite3-ruby (1.3.1)
|
109
|
+
taps (0.3.12)
|
110
|
+
json_pure (>= 1.2.0, < 1.5.0)
|
111
|
+
rack (>= 1.0.1)
|
112
|
+
rest-client (~> 1.4.0)
|
113
|
+
sequel (~> 3.15.0)
|
114
|
+
sinatra (~> 1.0.0)
|
115
|
+
sqlite3-ruby (~> 1.2)
|
116
|
+
tzinfo (0.3.23)
|
117
|
+
weighted_average (0.0.5)
|
118
|
+
activerecord (>= 3.0.0.beta2)
|
119
|
+
arel (>= 0.3.3)
|
120
|
+
|
121
|
+
PLATFORMS
|
122
|
+
ruby
|
123
|
+
|
124
|
+
DEPENDENCIES
|
125
|
+
activerecord (>= 3.0.0.beta4)
|
126
|
+
cohort_scope (>= 0.0.7)
|
127
|
+
conversions (>= 1.4.5)
|
128
|
+
data_miner (>= 0.5.3)
|
129
|
+
falls_back_on (>= 0.0.3)
|
130
|
+
geokit (>= 1.5.0)
|
131
|
+
jeweler
|
132
|
+
loose_tight_dictionary (>= 0.0.8)
|
133
|
+
rake
|
134
|
+
rcov
|
135
|
+
rdoc
|
136
|
+
rspec (>= 2.0.0.beta.17)
|
137
|
+
sqlite3-ruby (>= 1.3.0)
|
138
|
+
weighted_average (>= 0.0.4)
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2009 Andy Rossmeissl
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.markdown
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# earth
|
2
|
+
|
3
|
+
Earth is a collection of data models that represent various things found here on Earth, such as pet breeds, kinds of rail travel, zip codes, and Petroleum Administration for Defense Districts.
|
4
|
+
|
5
|
+
The data that these models represent can be pulled from http://data.brighterplanet.com
|
6
|
+
|
7
|
+
## Usage
|
8
|
+
|
9
|
+
require 'earth'
|
10
|
+
Earth.init :automobile, :locality
|
11
|
+
ft = AutomobileFuelType.first
|
12
|
+
...
|
13
|
+
|
14
|
+
You can also run data imports via the data_miner gem.
|
15
|
+
|
16
|
+
require 'earth'
|
17
|
+
Earth.init :fuel
|
18
|
+
Earth.taps_server # 'http://user:pass@data.brighterplanet.com'
|
19
|
+
|
20
|
+
DataMiner.run :resource_names #> [FuelPrice]</tt>
|
21
|
+
|
22
|
+
## Collaboration cycle
|
23
|
+
Brighter Planet vigorously encourages collaborative improvement of its emitter libraries. Collaboration requires a (free) GitHub account.
|
24
|
+
|
25
|
+
### You
|
26
|
+
1. Fork the earth repository on GitHub.
|
27
|
+
1. Write a test proving the existing implementation's inadequacy. Ensure that the test fails. Commit the test.
|
28
|
+
1. Improve the code until your new test passes and commit your changes.
|
29
|
+
1. Push your changes to your GitHub fork.
|
30
|
+
1. Submit a pull request to brighterplanet.
|
31
|
+
|
32
|
+
### Brighter Planet
|
33
|
+
1. Receive a pull request.
|
34
|
+
1. Pull changes from forked repository.
|
35
|
+
1. Ensure tests pass.
|
36
|
+
1. Review changes for scientific accuracy.
|
37
|
+
1. Merge changes to master repository and publish.
|
38
|
+
1. Direct production environment to use new emitter version.
|
data/lib/earth.rb
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
require 'active_record'
|
2
|
+
require 'cohort_scope'
|
3
|
+
require 'earth/base'
|
4
|
+
require 'earth/conversions_ext'
|
5
|
+
require 'earth/inflectors'
|
6
|
+
require 'data_miner'
|
7
|
+
require 'falls_back_on'
|
8
|
+
require 'falls_back_on/active_record_ext'
|
9
|
+
require 'weighted_average'
|
10
|
+
require 'loose_tight_dictionary'
|
11
|
+
|
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
|
+
module Earth
|
15
|
+
extend self
|
16
|
+
|
17
|
+
def taps_server
|
18
|
+
if defined?(@taps_server)
|
19
|
+
@taps_server
|
20
|
+
else
|
21
|
+
@taps_server = nil
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# taps_server is a URL. See the data_miner gem docs
|
26
|
+
def taps_server=(val)
|
27
|
+
@taps_server = val
|
28
|
+
end
|
29
|
+
|
30
|
+
# Takes argument like Earth.resource_names(['air'])
|
31
|
+
# Default is search all domains
|
32
|
+
# For example, <tt>[ 'Aircraft', 'Airline' ]</tt>
|
33
|
+
def resource_names(search_domains = nil)
|
34
|
+
(search_domains || domains).map do |domain|
|
35
|
+
Dir[File.join(Earth.gem_root, 'lib', 'earth', domain, '*.rb')]
|
36
|
+
end.flatten.uniq.map { |p| File.basename(p, '.rb').camelcase } - %w{ DataMiner }
|
37
|
+
end
|
38
|
+
|
39
|
+
def gem_root
|
40
|
+
File.expand_path File.join(File.dirname(__FILE__), '..')
|
41
|
+
end
|
42
|
+
|
43
|
+
def domains
|
44
|
+
%w{air automobile bus diet fuel locality pet rail residence}
|
45
|
+
end
|
46
|
+
|
47
|
+
# Earth.init will load any specified domains, any needed ActiveRecord plugins,
|
48
|
+
# and will apply each domain model's schema to the database if the
|
49
|
+
# :apply_schemas option is given. See Earth.domains for the list of allowable
|
50
|
+
# domains.
|
51
|
+
#
|
52
|
+
# Earth.init should be performed after a connection is made to the database and
|
53
|
+
# before any domain models are referenced.
|
54
|
+
def init(*args)
|
55
|
+
load_plugins
|
56
|
+
|
57
|
+
domains = []
|
58
|
+
options = {}
|
59
|
+
args.each do |arg|
|
60
|
+
if arg.is_a?(Hash)
|
61
|
+
options = arg
|
62
|
+
else
|
63
|
+
domains << arg
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
load_domains(domains, options)
|
68
|
+
load_schemas if options[:apply_schemas]
|
69
|
+
end
|
70
|
+
|
71
|
+
def database_options
|
72
|
+
if ActiveRecord::Base.connection.adapter_name.downcase == 'sqlite'
|
73
|
+
{}
|
74
|
+
else
|
75
|
+
{ :options => 'ENGINE=InnoDB default charset=utf8' }
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
def load_domains(domains, options)
|
81
|
+
if domains.empty? or domains.include?(:all)
|
82
|
+
# sabshere 9/16/10 why maintain this separately?
|
83
|
+
require 'earth/all'
|
84
|
+
require 'earth/data_miner' if options[:apply_schemas] or options[:load_data_miner]
|
85
|
+
elsif !domains.include?(:none)
|
86
|
+
domains.each do |domain|
|
87
|
+
require "earth/#{domain}"
|
88
|
+
if options[:apply_schemas] or options[:load_data_miner]
|
89
|
+
begin
|
90
|
+
require "earth/#{domain}/data_miner"
|
91
|
+
rescue LoadError
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def load_plugins
|
99
|
+
require 'earth/active_record_ext'
|
100
|
+
Dir[File.join(Earth.gem_root, 'vendor', '**', 'init.rb')].each do |pluginit|
|
101
|
+
$:.unshift File.join(File.dirname(pluginit), 'lib')
|
102
|
+
load pluginit
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def load_schemas
|
107
|
+
force_fallback_table
|
108
|
+
load_data_miner_schemas
|
109
|
+
end
|
110
|
+
|
111
|
+
# sabshere 9/17/10 this sucks. the falls_back_on gem sucks.
|
112
|
+
def force_fallback_table
|
113
|
+
c = ActiveRecord::Base.connection
|
114
|
+
if c.table_exists? 'fallbacks'
|
115
|
+
raise "The earth gem expects a different schema for the fallbacks table." unless c.column_exists?('fallbacks', 'name') and
|
116
|
+
c.column_exists?('fallbacks', 'values') and
|
117
|
+
c.column_exists?('fallbacks', 'created_at') and
|
118
|
+
c.column_exists?('fallbacks', 'updated_at')
|
119
|
+
else
|
120
|
+
c.create_table 'fallbacks' do |t|
|
121
|
+
t.string 'name'
|
122
|
+
t.text 'values'
|
123
|
+
t.datetime 'created_at'
|
124
|
+
t.datetime 'updated_at'
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def load_data_miner_schemas
|
130
|
+
models = Module.constants.select do |k|
|
131
|
+
const = Object.const_get(k) if Object.const_defined?(k)
|
132
|
+
if const.instance_of?(Class)
|
133
|
+
const.superclass == ActiveRecord::Base ||
|
134
|
+
const.superclass == Earth::Base
|
135
|
+
else
|
136
|
+
false
|
137
|
+
end
|
138
|
+
end
|
139
|
+
models.sort.each do |model|
|
140
|
+
klass = Object.const_get(model)
|
141
|
+
if klass.respond_to?(:execute_schema) and !klass.table_exists?
|
142
|
+
klass.execute_schema
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
data/lib/earth/air.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'earth/air/aircraft'
|
2
|
+
require 'earth/air/aircraft_class'
|
3
|
+
require 'earth/air/aircraft_manufacturer'
|
4
|
+
require 'earth/air/airline'
|
5
|
+
require 'earth/air/airport'
|
6
|
+
require 'earth/air/flight_configuration'
|
7
|
+
require 'earth/air/flight_distance_class'
|
8
|
+
require 'earth/air/flight_domesticity'
|
9
|
+
require 'earth/air/flight_fuel_type'
|
10
|
+
require 'earth/air/flight_propulsion'
|
11
|
+
require 'earth/air/flight_seat_class'
|
12
|
+
require 'earth/air/flight_segment'
|
13
|
+
require 'earth/air/flight_service'
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class Aircraft < ActiveRecord::Base
|
2
|
+
set_primary_key :icao_code
|
3
|
+
|
4
|
+
belongs_to :aircraft_class, :foreign_key => 'brighter_planet_aircraft_class_code'
|
5
|
+
belongs_to :manufacturer, :foreign_key => 'manufacturer_name', :class_name => 'AircraftManufacturer'
|
6
|
+
has_many :segments, :foreign_key => 'bts_aircraft_type_code', :class_name => "FlightSegment", :primary_key => 'bts_aircraft_type_code'
|
7
|
+
|
8
|
+
falls_back_on :m3 => lambda { weighted_average(:m3, :weighted_by => [:segments, :passengers]) }, # 9.73423082858437e-08 r7110: 8.6540464368905e-8 r6972: 8.37e-8
|
9
|
+
:m2 => lambda { weighted_average(:m2, :weighted_by => [:segments, :passengers]) }, # -0.000134350543484608 r7110: -0.00015337661447817 r6972: -4.09e-5
|
10
|
+
:m1 => lambda { weighted_average(:m1, :weighted_by => [:segments, :passengers]) }, # 6.7728101555467 r7110: 4.7781966869412 r6972: 7.85
|
11
|
+
:endpoint_fuel => lambda { weighted_average(:endpoint_fuel, :weighted_by => [:segments, :passengers]) }, # 1527.81790006167 r7110: 1065.3476555284 r6972: 1.72e3
|
12
|
+
:seats => lambda { weighted_average(:seats, :weighted_by => [:segments, :passengers]) } # 62.1741
|
13
|
+
|
14
|
+
data_miner do
|
15
|
+
tap "Brighter Planet's sanitized aircraft data", Earth.taps_server
|
16
|
+
|
17
|
+
process "pull dependencies" do
|
18
|
+
run_data_miner_on_belongs_to_associations
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,184 @@
|
|
1
|
+
Aircraft.class_eval do
|
2
|
+
|
3
|
+
# TODO use http://www.transtats.bts.gov/Download_Lookup.asp?Lookup=L_AIRCRAFT_TYPE
|
4
|
+
def self.bts_name_dictionary
|
5
|
+
@_bts_dictionary ||= LooseTightDictionary.new RemoteTable.new(:url => 'http://www.transtats.bts.gov/Download_Lookup.asp?Lookup=L_AIRCRAFT_TYPE', :select => lambda { |record| record['Code'].to_i.between?(1, 998) }),
|
6
|
+
:tightenings => RemoteTable.new(:url => 'http://spreadsheets.google.com/pub?key=tiS_6CCDDM_drNphpYwE_iw&single=true&gid=0&output=csv', :headers => false),
|
7
|
+
:identities => RemoteTable.new(:url => 'http://spreadsheets.google.com/pub?key=tiS_6CCDDM_drNphpYwE_iw&single=true&gid=3&output=csv', :headers => false),
|
8
|
+
:blockings => RemoteTable.new(:url => 'http://spreadsheets.google.com/pub?key=tiS_6CCDDM_drNphpYwE_iw&single=true&gid=4&output=csv', :headers => false),
|
9
|
+
:blocking_only => true,
|
10
|
+
:right_reader => lambda { |record| record['Description'] }
|
11
|
+
end
|
12
|
+
|
13
|
+
# warning: self-referential, assumes it will be used once first import step is done
|
14
|
+
def self.icao_name_dictionary
|
15
|
+
@_icao_dictionary ||= LooseTightDictionary.new Aircraft.all,
|
16
|
+
:tightenings => RemoteTable.new(:url => 'http://spreadsheets.google.com/pub?key=tiS_6CCDDM_drNphpYwE_iw&single=true&gid=0&output=csv', :headers => false),
|
17
|
+
:identities => RemoteTable.new(:url => 'http://spreadsheets.google.com/pub?key=tiS_6CCDDM_drNphpYwE_iw&single=true&gid=3&output=csv', :headers => false),
|
18
|
+
:blockings => RemoteTable.new(:url => 'http://spreadsheets.google.com/pub?key=tiS_6CCDDM_drNphpYwE_iw&single=true&gid=4&output=csv', :headers => false),
|
19
|
+
:right_reader => lambda { |record| record.manufacturer_name.to_s + ' ' + record.name.to_s }
|
20
|
+
end
|
21
|
+
|
22
|
+
class Aircraft::BtsMatcher
|
23
|
+
attr_reader :wants
|
24
|
+
def initialize(wants)
|
25
|
+
@wants = wants
|
26
|
+
end
|
27
|
+
def match(raw_faa_icao_record)
|
28
|
+
@_match ||= Hash.new
|
29
|
+
return @_match[raw_faa_icao_record] if @_match.has_key?(raw_faa_icao_record)
|
30
|
+
faa_icao_record = [ raw_faa_icao_record['Manufacturer'] + ' ' + raw_faa_icao_record['Model'] ]
|
31
|
+
bts_record = Aircraft.bts_name_dictionary.left_to_right faa_icao_record
|
32
|
+
retval = case wants
|
33
|
+
when :bts_aircraft_type_code
|
34
|
+
bts_record['Code']
|
35
|
+
when :bts_name
|
36
|
+
bts_record['Description']
|
37
|
+
end if bts_record
|
38
|
+
@_match[raw_faa_icao_record] = retval
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class Aircraft::FuelUseMatcher
|
43
|
+
def match(raw_fuel_use_record)
|
44
|
+
@_match ||= Hash.new
|
45
|
+
return @_match[raw_fuel_use_record] if @_match.has_key?(raw_fuel_use_record)
|
46
|
+
|
47
|
+
aircraft_record = if raw_fuel_use_record['ICAO'] =~ /\A[0-9A-Z]+\z/
|
48
|
+
Aircraft.find_by_icao_code raw_fuel_use_record['ICAO']
|
49
|
+
end
|
50
|
+
|
51
|
+
aircraft_record ||= if raw_fuel_use_record['Aircraft Name'].present?
|
52
|
+
Aircraft.icao_name_dictionary.left_to_right [ raw_fuel_use_record['Aircraft Name'] ]
|
53
|
+
end
|
54
|
+
|
55
|
+
if aircraft_record
|
56
|
+
@_match[raw_fuel_use_record] = aircraft_record.icao_code
|
57
|
+
else
|
58
|
+
raise "Didn't find a match for #{raw_fuel_use_record['Aircraft Name']} (#{raw_fuel_use_record['ICAO']}), which we found in the fuel use spreadsheet"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
class Aircraft::Guru
|
64
|
+
# for errata
|
65
|
+
def is_a_dc_plane?(row)
|
66
|
+
row['Designator'] =~ /^DC\d/i
|
67
|
+
end
|
68
|
+
|
69
|
+
# def is_a_crj_900?(row)
|
70
|
+
# row['Designator'].downcase == 'crj9'
|
71
|
+
# end
|
72
|
+
|
73
|
+
def is_a_g159?(row)
|
74
|
+
row['Designator'] =~ /^G159$/
|
75
|
+
end
|
76
|
+
|
77
|
+
def is_a_galx?(row)
|
78
|
+
row['Designator'] =~ /^GALX$/
|
79
|
+
end
|
80
|
+
|
81
|
+
def method_missing(method_id, *args, &block)
|
82
|
+
if method_id.to_s =~ /\Ais_n?o?t?_?attributed_to_([^\?]+)/
|
83
|
+
manufacturer_name = $1
|
84
|
+
manufacturer_regexp = Regexp.new(manufacturer_name.gsub('_', ' ?'), Regexp::IGNORECASE)
|
85
|
+
matches = manufacturer_regexp.match(args.first['Manufacturer']) # row['Manufacturer'] =~ /mcdonnell douglas/i
|
86
|
+
method_id.to_s.include?('not_attributed') ? matches.nil? : !matches.nil?
|
87
|
+
else
|
88
|
+
super
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
data_miner do
|
94
|
+
schema Earth.database_options do
|
95
|
+
string 'icao_code'
|
96
|
+
string 'manufacturer_name'
|
97
|
+
string 'name'
|
98
|
+
string 'bts_name'
|
99
|
+
string 'bts_aircraft_type_code'
|
100
|
+
string 'brighter_planet_aircraft_class_code'
|
101
|
+
string 'fuel_use_aircraft_name'
|
102
|
+
float 'm3'
|
103
|
+
string 'm3_units'
|
104
|
+
float 'm2'
|
105
|
+
string 'm2_units'
|
106
|
+
float 'm1'
|
107
|
+
string 'm1_units'
|
108
|
+
float 'endpoint_fuel'
|
109
|
+
string 'endpoint_fuel_units'
|
110
|
+
float 'seats'
|
111
|
+
float 'distance'
|
112
|
+
string 'distance_units'
|
113
|
+
float 'load_factor'
|
114
|
+
float 'freight_share'
|
115
|
+
float 'payload'
|
116
|
+
float 'weighting'
|
117
|
+
index 'bts_aircraft_type_code'
|
118
|
+
end
|
119
|
+
|
120
|
+
('A'..'Z').each do |letter|
|
121
|
+
# ('Z'..'Z').each do |letter|
|
122
|
+
import( "ICAO aircraft codes starting with the letter #{letter} used by the FAA",
|
123
|
+
:url => "http://www.faa.gov/air_traffic/publications/atpubs/CNT/5-2-#{letter}.htm",
|
124
|
+
:errata => Errata.new(:url => 'http://spreadsheets.google.com/pub?key=tObVAGyqOkCBtGid0tJUZrw',
|
125
|
+
:responder => Aircraft::Guru.new),
|
126
|
+
:encoding => 'windows-1252',
|
127
|
+
:row_xpath => '//table/tr[2]/td/table/tr',
|
128
|
+
:column_xpath => 'td' ) do
|
129
|
+
key 'icao_code', :field_name => 'Designator'
|
130
|
+
store 'bts_aircraft_type_code', :matcher => Aircraft::BtsMatcher.new(:bts_aircraft_type_code)
|
131
|
+
store 'bts_name', :matcher => Aircraft::BtsMatcher.new(:bts_name)
|
132
|
+
store 'manufacturer_name', :field_name => 'Manufacturer'
|
133
|
+
store 'name', :field_name => 'Model'
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
# TODO fixme need to remake aircraft classes dictionary based on ICAO codes
|
138
|
+
# sabshere 5/17/10 or maybe we can replace this with typ/weight class from FAA (?)
|
139
|
+
import "Brighter Planet's aircraft class codes",
|
140
|
+
:url => 'http://static.brighterplanet.com/science/data/transport/air/bts_aircraft_type/bts_aircraft_types-brighter_planet_aircraft_classes.csv' do
|
141
|
+
key 'bts_aircraft_type_code', :field_name => 'bts_aircraft_type'
|
142
|
+
store 'brighter_planet_aircraft_class_code'
|
143
|
+
end
|
144
|
+
|
145
|
+
# EEA
|
146
|
+
import "pre-calculated fuel use equation coefficients",
|
147
|
+
:url => 'http://static.brighterplanet.com/science/data/transport/air/fuel_use/aircraft_fuel_use_formulae.ods',
|
148
|
+
:select => lambda { |row| row['ICAO'].present? or row['Aircraft Name'].present? } do
|
149
|
+
key 'icao_code', :matcher => Aircraft::FuelUseMatcher.new
|
150
|
+
store 'fuel_use_aircraft_name', :field_name => 'Aircraft Name'
|
151
|
+
store 'm3'
|
152
|
+
store 'm2'
|
153
|
+
store 'm1'
|
154
|
+
store 'endpoint_fuel', :field_name => 'b'
|
155
|
+
end
|
156
|
+
|
157
|
+
process "Derive some average flight characteristics from flight segments" do
|
158
|
+
FlightSegment.run_data_miner!
|
159
|
+
aircraft = Aircraft.arel_table
|
160
|
+
segments = FlightSegment.arel_table
|
161
|
+
|
162
|
+
# non-working joins method
|
163
|
+
# update_all "aircraft.distance_1 = (SELECT * FROM (#{FlightSegment.joins(:aircraft).weighted_average_relation(:distance, :weighted_by => :passengers ).to_sql}) AS anonymous_1)"
|
164
|
+
# update_all "aircraft.load_factor_1 = (SELECT * FROM (#{FlightSegment.joins(:aircraft).weighted_average_relation(:load_factor, :weighted_by => :passengers ).to_sql}) AS anonymous_1)"
|
165
|
+
# execute %{
|
166
|
+
# update aircraft as t1
|
167
|
+
# set t1.distance_1 = (SELECT * FROM (#{FlightSegment.joins(:aircraft).weighted_average_relation(:distance, :weighted_by => :passengers ).where('t1.bts_aircraft_type_code = flight_segments.bts_aircraft_type_code').to_sql}) AS anonymous_1)
|
168
|
+
# }
|
169
|
+
|
170
|
+
conditional_relation = aircraft[:bts_aircraft_type_code].eq(segments[:bts_aircraft_type_code])
|
171
|
+
update_all "seats = (#{FlightSegment.weighted_average_relation(:seats, :weighted_by => :passengers ).where(conditional_relation).to_sql})"
|
172
|
+
update_all "distance = (#{FlightSegment.weighted_average_relation(:distance, :weighted_by => :passengers ).where(conditional_relation).to_sql})"
|
173
|
+
update_all "load_factor = (#{FlightSegment.weighted_average_relation(:load_factor, :weighted_by => :passengers ).where(conditional_relation).to_sql})"
|
174
|
+
update_all "freight_share = (#{FlightSegment.weighted_average_relation(:freight_share, :weighted_by => :passengers ).where(conditional_relation).to_sql})"
|
175
|
+
update_all "payload = (#{FlightSegment.weighted_average_relation(:payload, :weighted_by => :passengers, :disaggregate_by => :departures_performed).where(conditional_relation).to_sql})"
|
176
|
+
|
177
|
+
update_all "weighting = (#{segments.project(segments[:passengers].sum).where(aircraft[:bts_aircraft_type_code].eq(segments[:bts_aircraft_type_code])).to_sql})"
|
178
|
+
end
|
179
|
+
|
180
|
+
process "Synthesize AircraftManufacturer" do
|
181
|
+
AircraftManufacturer.run_data_miner!
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|