earth 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +9 -21
- data/data/rail/ntd_companies.csv +1 -0
- data/data/rail/ntd_fuel_consumption.csv +1 -0
- data/data/rail/ntd_modes.csv +1 -0
- data/data/rail/ntd_service.csv +1 -0
- data/errata/flight_segment/bts_errata.csv +6 -0
- data/lib/earth.rb +1 -0
- data/lib/earth/air/aircraft.rb +3 -5
- data/lib/earth/air/airline.rb +2 -3
- data/lib/earth/air/airport.rb +4 -5
- data/lib/earth/air/bts_aircraft.rb +1 -1
- data/lib/earth/air/flight_distance_class.rb +0 -1
- data/lib/earth/air/flight_distance_class/data_miner.rb +0 -4
- data/lib/earth/air/flight_distance_class_seat_class.rb +0 -1
- data/lib/earth/air/flight_segment.rb +12 -13
- data/lib/earth/air/flight_segment/data_miner.rb +13 -0
- data/lib/earth/automobile/automobile_activity_year.rb +0 -1
- data/lib/earth/automobile/automobile_activity_year_type.rb +4 -4
- data/lib/earth/automobile/automobile_activity_year_type_fuel.rb +1 -2
- data/lib/earth/automobile/automobile_fuel.rb +1 -2
- data/lib/earth/automobile/automobile_make.rb +0 -1
- data/lib/earth/automobile/automobile_make/data_miner.rb +2 -0
- data/lib/earth/automobile/automobile_make_model.rb +1 -2
- data/lib/earth/automobile/automobile_make_model_year_variant.rb +0 -1
- data/lib/earth/automobile/automobile_make_model_year_variant/data_miner.rb +2 -223
- data/lib/earth/automobile/automobile_make_model_year_variant/parser.rb +224 -0
- data/lib/earth/automobile/automobile_make_year_fleet.rb +0 -1
- data/lib/earth/automobile/automobile_model.rb +0 -1
- data/lib/earth/automobile/automobile_size_class.rb +0 -1
- data/lib/earth/automobile/automobile_type_fuel.rb +0 -1
- data/lib/earth/automobile/automobile_type_fuel_control.rb +0 -1
- data/lib/earth/automobile/automobile_type_fuel_year.rb +4 -4
- data/lib/earth/automobile/automobile_type_fuel_year_control.rb +7 -15
- data/lib/earth/automobile/automobile_year.rb +0 -1
- data/lib/earth/bus/bus_class.rb +0 -1
- data/lib/earth/bus/bus_fuel.rb +1 -72
- data/lib/earth/bus/bus_fuel_control.rb +0 -1
- data/lib/earth/bus/bus_fuel_control/data_miner.rb +0 -2
- data/lib/earth/bus/bus_fuel_year_control.rb +0 -1
- data/lib/earth/bus/bus_fuel_year_control/data_miner.rb +0 -2
- data/lib/earth/computation/computation_carrier.rb +1 -11
- data/lib/earth/computation/computation_carrier_instance_class.rb +4 -25
- data/lib/earth/computation/computation_carrier_region.rb +0 -1
- data/lib/earth/computation/computation_carrier_region/data_miner.rb +0 -3
- data/lib/earth/diet/diet_class.rb +0 -1
- data/lib/earth/diet/food_group.rb +1 -1
- data/lib/earth/electricity/electric_market.rb +2 -0
- data/lib/earth/electricity/electric_utility.rb +11 -4
- data/lib/earth/electricity/electric_utility/data_miner.rb +2 -8
- data/lib/earth/electricity/green_button_adoption.rb +2 -1
- data/lib/earth/fuel/fuel.rb +20 -81
- data/lib/earth/fuel/fuel_year.rb +0 -44
- data/lib/earth/fuel/greenhouse_gas.rb +0 -40
- data/lib/earth/hospitality/lodging_class.rb +0 -1
- data/lib/earth/industry/cbecs_energy_intensity.rb +25 -29
- data/lib/earth/industry/cbecs_energy_intensity/data_miner.rb +1 -1
- data/lib/earth/industry/industry.rb +1 -2
- data/lib/earth/industry/mecs_energy.rb +9 -10
- data/lib/earth/industry/mecs_ratio.rb +2 -1
- data/lib/earth/industry/merchant_category.rb +1 -0
- data/lib/earth/industry/naics_2002.rb +2 -0
- data/lib/earth/industry/naics_2002_naics_2007_concordance.rb +1 -0
- data/lib/earth/industry/naics_2002_sic_1987_concordance.rb +1 -0
- data/lib/earth/industry/naics_2007.rb +1 -0
- data/lib/earth/industry/sic_1987.rb +1 -0
- data/lib/earth/locality/census_division.rb +1 -3
- data/lib/earth/locality/climate_division.rb +0 -1
- data/lib/earth/locality/country.rb +1 -2
- data/lib/earth/locality/country/data_miner.rb +4 -0
- data/lib/earth/locality/egrid_country.rb +0 -1
- data/lib/earth/locality/egrid_region.rb +1 -3
- data/lib/earth/locality/egrid_subregion.rb +1 -3
- data/lib/earth/locality/electricity_mix.rb +2 -4
- data/lib/earth/locality/petroleum_administration_for_defense_district.rb +0 -1
- data/lib/earth/locality/state.rb +0 -1
- data/lib/earth/locality/zip_code.rb +0 -1
- data/lib/earth/model.rb +1 -1
- data/lib/earth/pet/breed.rb +0 -1
- data/lib/earth/pet/breed_gender.rb +0 -1
- data/lib/earth/pet/gender.rb +0 -1
- data/lib/earth/pet/species.rb +1 -3
- data/lib/earth/rail/country_rail_class.rb +0 -1
- data/lib/earth/rail/country_rail_traction.rb +0 -1
- data/lib/earth/rail/country_rail_traction_class.rb +0 -1
- data/lib/earth/rail/national_transit_database_company.rb +1 -3
- data/lib/earth/rail/national_transit_database_company/data_miner.rb +1 -1
- data/lib/earth/rail/national_transit_database_mode.rb +0 -1
- data/lib/earth/rail/national_transit_database_mode/data_miner.rb +1 -1
- data/lib/earth/rail/national_transit_database_record.rb +0 -1
- data/lib/earth/rail/national_transit_database_record/data_miner.rb +2 -2
- data/lib/earth/rail/rail_class.rb +0 -1
- data/lib/earth/rail/rail_class/data_miner.rb +5 -4
- data/lib/earth/rail/rail_company.rb +0 -1
- data/lib/earth/rail/rail_fuel.rb +0 -1
- data/lib/earth/rail/rail_traction.rb +0 -1
- data/lib/earth/rail/rail_traction/data_miner.rb +2 -8
- data/lib/earth/residence/air_conditioner_use.rb +0 -1
- data/lib/earth/residence/clothes_machine_use.rb +0 -1
- data/lib/earth/residence/dishwasher_use.rb +0 -1
- data/lib/earth/residence/residence_appliance.rb +0 -1
- data/lib/earth/residence/residence_class.rb +0 -1
- data/lib/earth/residence/residence_fuel_price.rb +1 -2
- data/lib/earth/residence/urbanity.rb +0 -1
- data/lib/earth/shipping/carrier.rb +1 -52
- data/lib/earth/shipping/carrier_mode.rb +0 -34
- data/lib/earth/shipping/shipment_mode.rb +0 -26
- data/lib/earth/tasks.rb +14 -4
- data/lib/earth/version.rb +1 -1
- data/spec/earth/air/aircraft_spec.rb +9 -1
- data/spec/earth/air/airline_spec.rb +2 -2
- data/spec/earth/air/airport_spec.rb +1 -2
- data/spec/earth/air/bts_aircraft_spec.rb +2 -2
- data/spec/earth/air/flight_distance_class_seat_class_spec.rb +22 -0
- data/spec/earth/air/flight_distance_class_spec.rb +26 -18
- data/spec/earth/air/flight_seat_class_spec.rb +12 -0
- data/spec/earth/air/flight_segment_spec.rb +38 -33
- data/spec/earth/automobile/automobile_activity_year_spec.rb +20 -14
- data/spec/earth/automobile/automobile_activity_year_type_fuel_spec.rb +14 -10
- data/spec/earth/automobile/automobile_activity_year_type_spec.rb +28 -20
- data/spec/earth/automobile/automobile_fuel_spec.rb +106 -52
- data/spec/earth/automobile/automobile_make_model_spec.rb +103 -62
- data/spec/earth/automobile/automobile_make_model_year_spec.rb +69 -46
- data/spec/earth/automobile/automobile_make_model_year_variant_spec.rb +108 -109
- data/spec/earth/automobile/automobile_make_spec.rb +8 -8
- data/spec/earth/automobile/automobile_make_year_fleet_spec.rb +10 -6
- data/spec/earth/automobile/automobile_make_year_spec.rb +10 -9
- data/spec/earth/automobile/automobile_model_spec.rb +3 -0
- data/spec/earth/automobile/automobile_size_class_spec.rb +12 -11
- data/spec/earth/automobile/automobile_type_fuel_control_spec.rb +9 -9
- data/spec/earth/automobile/automobile_type_fuel_spec.rb +23 -18
- data/spec/earth/automobile/automobile_type_fuel_year_control_spec.rb +37 -29
- data/spec/earth/automobile/automobile_type_fuel_year_spec.rb +35 -36
- data/spec/earth/automobile/automobile_year_spec.rb +4 -2
- data/spec/earth/bus/bus_class_spec.rb +10 -0
- data/spec/earth/bus/bus_fuel_control_spec.rb +3 -5
- data/spec/earth/bus/bus_fuel_spec.rb +16 -8
- data/spec/earth/bus/bus_fuel_year_control_spec.rb +7 -7
- data/spec/earth/computation/computation_carrrier_instance_class_spec.rb +17 -0
- data/spec/earth/computation/computation_carrrier_region_spec.rb +10 -0
- data/spec/earth/computation/computation_carrrier_spec.rb +17 -0
- data/spec/earth/diet/diet_class_spec.rb +14 -0
- data/spec/earth/diet/food_group_spec.rb +26 -0
- data/spec/earth/electricity/electric_market_spec.rb +4 -5
- data/spec/earth/electricity/electric_utility_spec.rb +30 -19
- data/spec/earth/electricity/green_button_adoption_spec.rb +29 -7
- data/spec/earth/fuel/fuel_spec.rb +88 -14
- data/spec/earth/fuel/fuel_year_spec.rb +21 -0
- data/spec/earth/fuel/greenhouse_gas_spec.rb +23 -0
- data/spec/earth/hospitality/commercial_building_energy_consumption_survey_response_spec.rb +13 -10
- data/spec/earth/hospitality/lodging_class_spec.rb +1 -1
- data/spec/earth/industry/cbecs_energy_intensity_spec.rb +72 -72
- data/spec/earth/industry/industry_spec.rb +16 -9
- data/spec/earth/industry/mecs_energy_spec.rb +76 -72
- data/spec/earth/industry/mecs_ratio_spec.rb +35 -31
- data/spec/earth/industry/merchant_category_spec.rb +7 -5
- data/spec/earth/industry/naics_2002_naics_2007_concordance_spec.rb +10 -19
- data/spec/earth/industry/naics_2002_sic_1987_concordance_spec.rb +9 -19
- data/spec/earth/industry/naics_2002_spec.rb +1 -11
- data/spec/earth/industry/naics_2007_spec.rb +2 -11
- data/spec/earth/industry/sic_1987_spec.rb +3 -14
- data/spec/earth/locality/census_division_spec.rb +25 -0
- data/spec/earth/locality/census_region_spec.rb +8 -0
- data/spec/earth/locality/climate_division_spec.rb +13 -0
- data/spec/earth/locality/country_spec.rb +24 -23
- data/spec/earth/locality/egrid_country_spec.rb +7 -6
- data/spec/earth/locality/egrid_region_spec.rb +6 -6
- data/spec/earth/locality/egrid_subregion_spec.rb +14 -14
- data/spec/earth/locality/electricity_mix_spec.rb +17 -17
- data/spec/earth/locality/padd_spec.rb +21 -0
- data/spec/earth/locality/state_spec.rb +8 -11
- data/spec/earth/locality/zip_code_spec.rb +29 -22
- data/spec/earth/pet/breed_gender_spec.rb +8 -0
- data/spec/earth/pet/breed_spec.rb +8 -0
- data/spec/earth/pet/gender_spec.rb +8 -0
- data/spec/earth/pet/species_spec.rb +11 -5
- data/spec/earth/rail/country_rail_class_spec.rb +16 -0
- data/spec/earth/rail/country_rail_traction_class_spec.rb +14 -0
- data/spec/earth/rail/country_rail_traction_spec.rb +14 -0
- data/spec/earth/rail/national_transit_database_company_spec.rb +103 -0
- data/spec/earth/rail/national_transit_database_mode_spec.rb +21 -0
- data/spec/earth/rail/national_transit_database_record_spec.rb +31 -0
- data/spec/earth/rail/rail_class_spec.rb +8 -0
- data/spec/earth/rail/rail_company_spec.rb +20 -0
- data/spec/earth/rail/rail_fuel_spec.rb +19 -0
- data/spec/earth/rail/rail_traction_spec.rb +8 -0
- data/spec/earth/residence/air_conditioner_use_spec.rb +17 -0
- data/spec/earth/residence/clothes_machine_use_spec.rb +11 -0
- data/spec/earth/residence/dishwasher_use_spec.rb +11 -0
- data/spec/earth/residence/residence_appliance_spec.rb +19 -0
- data/spec/earth/residence/residence_class_spec.rb +15 -0
- data/spec/earth/residence/residence_fuel_price_spec.rb +12 -0
- data/spec/earth/residence/residence_fuel_type_spec.rb +18 -0
- data/spec/earth/residence/residential_energy_consumption_survey_response_spec.rb +13 -0
- data/spec/earth/residence/urbanity_spec.rb +8 -0
- data/spec/earth/shipping/carrier_mode_spec.rb +18 -0
- data/spec/earth/shipping/carrier_spec.rb +27 -0
- data/spec/earth/shipping/shipment_mode_spec.rb +16 -0
- data/spec/earth_spec.rb +1 -1
- data/spec/factories/airline.rb +0 -1
- data/spec/factories/airport.rb +0 -1
- data/spec/factories/automobile_activity_year.rb +8 -0
- data/spec/factories/automobile_activity_year_type.rb +8 -0
- data/spec/factories/automobile_activity_year_type_fuel.rb +9 -0
- data/spec/factories/automobile_fuel.rb +15 -0
- data/spec/factories/automobile_make.rb +9 -0
- data/spec/factories/automobile_make_model.rb +10 -0
- data/spec/factories/automobile_make_model_year.rb +9 -0
- data/spec/factories/automobile_model.rb +9 -0
- data/spec/factories/automobile_type_fuel.rb +7 -0
- data/spec/factories/automobile_type_fuel_control.rb +16 -0
- data/spec/factories/automobile_type_fuel_year.rb +9 -0
- data/spec/factories/automobile_type_fuel_year_control.rb +11 -0
- data/spec/factories/bus_fuel.rb +7 -0
- data/spec/factories/bus_fuel_year_control.rb +9 -0
- data/spec/factories/cbecs_energy_intensity.rb +15 -0
- data/spec/factories/commercial_building_energy_consumption_survey_response.rb +10 -0
- data/spec/factories/electric_utility.rb +8 -0
- data/spec/factories/flight_distance_class.rb +8 -0
- data/spec/factories/flight_segment.rb +0 -1
- data/spec/factories/food_group.rb +8 -0
- data/spec/factories/fuel.rb +8 -0
- data/spec/factories/fuel_year.rb +8 -0
- data/spec/factories/green_button_adoption.rb +8 -0
- data/spec/factories/greenhouse_gas.rb +7 -0
- data/spec/factories/industry.rb +9 -0
- data/spec/factories/mecs_energy.rb +15 -0
- data/spec/factories/mecs_ratio.rb +15 -0
- data/spec/factories/national_transit_database_company.rb +8 -0
- data/spec/factories/national_transit_database_mode.rb +8 -0
- data/spec/factories/national_transit_database_record.rb +9 -0
- data/spec/factories/residence_appliance.rb +7 -0
- data/spec/factories/zip_code.rb +9 -0
- data/spec/spec_helper.rb +36 -19
- metadata +346 -66
- data/lib/earth/acronyms.rb +0 -12
- data/lib/earth/rail/rail_company_traction.rb +0 -24
- data/lib/earth/rail/rail_company_traction/data_miner.rb +0 -4
- data/lib/earth/rail/rail_company_traction_class.rb +0 -26
- data/lib/earth/rail/rail_company_traction_class/data_miner.rb +0 -4
data/Rakefile
CHANGED
@@ -5,32 +5,22 @@ Bundler::GemHelper.install_tasks
|
|
5
5
|
require 'bueller'
|
6
6
|
Bueller::Tasks.new
|
7
7
|
|
8
|
-
desc "Load a console
|
8
|
+
desc "Load a console"
|
9
9
|
task :console do
|
10
|
+
ENV['EARTH_ENV'] ||= 'test'
|
10
11
|
require 'earth'
|
11
|
-
|
12
|
-
DataMiner.logger = ActiveRecord::Base.logger =
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
username = 'root'
|
18
|
-
password = 'password'
|
19
|
-
else
|
20
|
-
adapter = 'postgresql'
|
21
|
-
username = nil
|
22
|
-
password = nil
|
23
|
-
end
|
24
|
-
ActiveRecord::Base.establish_connection :adapter => adapter, :username => username, :password => password, :database => 'test_earth'
|
25
|
-
Earth.init :all
|
26
|
-
|
12
|
+
|
13
|
+
DataMiner.logger = ActiveRecord::Base.logger = Logger.new('log/test.log')
|
14
|
+
DataMiner.unit_converter = :conversions
|
15
|
+
|
16
|
+
Earth.init :all, :connect => true
|
17
|
+
|
27
18
|
require 'irb'
|
28
19
|
ARGV.clear
|
29
20
|
IRB.start
|
30
21
|
end
|
31
22
|
|
32
23
|
require 'rspec/core/rake_task'
|
33
|
-
desc "Run all examples"
|
34
24
|
RSpec::Core::RakeTask.new(:examples) do |c|
|
35
25
|
if ENV['RSPEC_FORMAT']
|
36
26
|
c.rspec_opts = "-Ispec --format #{ENV['RSPEC_FORMAT']}"
|
@@ -48,10 +38,8 @@ if RUBY_VERSION =~ /^1\.8/
|
|
48
38
|
end
|
49
39
|
end
|
50
40
|
|
51
|
-
desc "Run tests with RSpec"
|
41
|
+
desc "Run tests with RSpec - see spec/spec_helper for configuration options e.g. data sanity-checking"
|
52
42
|
task :test => :examples
|
53
|
-
|
54
|
-
desc "Run tests with RSpec"
|
55
43
|
task :default => :test
|
56
44
|
|
57
45
|
require 'earth/version'
|
@@ -0,0 +1 @@
|
|
1
|
+
trs_id,name,acronym,zip_code_name,duns_number,source,source_url
|
@@ -0,0 +1 @@
|
|
1
|
+
trs_id,mode_code,service_code,electricity_kwh,battery_kwh,diesel_gallons,gasoline_gallons,lpg_gallons,lng_gallons,cng_gallons,kerosene_gallons,biodiesel_gallons,other_fuel,other_fuel_description,source,source_url
|
@@ -0,0 +1 @@
|
|
1
|
+
code,name,rail_mode,source,source_url
|
@@ -0,0 +1 @@
|
|
1
|
+
trs_id,mode_code,service_code,vehicle_or_train_revenue_miles,vehicle_or_train_revenue_hours,passenger_car_revenue_miles,passenger_car_revenue_hours,passengers,passenger_miles,source,source_url
|
@@ -2,3 +2,9 @@ date,name,email,type,section,action,x,y,condition,notes
|
|
2
2
|
6/7/11,Ian Hough,ian@brighterplanet.com,meta,Intended use,,http://www.transtats.bts.gov/DL_SelectFields.asp?Table_ID=293
|
3
3
|
6/7/11,Ian Hough,ian@brighterplanet.com,technical,UNIQUE_CARRIER,replace,/^$/i,0OQ,in may 2009,unique carrier code for OpenSkies is missing in May 2009
|
4
4
|
6/7/11,Ian Hough,ian@brighterplanet.com,technical,UNIQUE_CARRIER,replace,/^$/i,0OQ,in july 2009,unique carrier code for OpenSkies is missing in July 2009
|
5
|
+
8/6/12,Ian Hough,ian@brighterplanet.com,technical,ORIGIN_COUNTRY,replace,/^an$/i,CW,origin iata CUR,deal with netherlands antilles
|
6
|
+
8/6/12,Ian Hough,ian@brighterplanet.com,technical,ORIGIN_COUNTRY,replace,/^an$/i,NL,origin iata BON,deal with netherlands antilles
|
7
|
+
8/6/12,Ian Hough,ian@brighterplanet.com,technical,ORIGIN_COUNTRY,replace,/^an$/i,SX,origin iata SXM,deal with netherlands antilles
|
8
|
+
8/6/12,Ian Hough,ian@brighterplanet.com,technical,DEST_COUNTRY,replace,/^an$/i,CW,destination iata CUR,deal with netherlands antilles
|
9
|
+
8/6/12,Ian Hough,ian@brighterplanet.com,technical,DEST_COUNTRY,replace,/^an$/i,NL,destination iata BON,deal with netherlands antilles
|
10
|
+
8/6/12,Ian Hough,ian@brighterplanet.com,technical,DEST_COUNTRY,replace,/^an$/i,SX,destination iata SXM,deal with netherlands antilles
|
data/lib/earth.rb
CHANGED
@@ -20,6 +20,7 @@ module Earth
|
|
20
20
|
LIB_DIR = ::File.expand_path '../earth', __FILE__
|
21
21
|
DATA_DIR = ::File.expand_path '../../data', __FILE__
|
22
22
|
ERRATA_DIR = ::File.expand_path '../../errata', __FILE__
|
23
|
+
FACTORY_DIR = ::File.expand_path '../../spec/factories', __FILE__
|
23
24
|
|
24
25
|
mattr_accessor :mine_original_sources
|
25
26
|
mattr_accessor :database_configurations
|
data/lib/earth/air/aircraft.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
require 'fuzzy_match/cached_result'
|
2
|
-
require 'falls_back_on'
|
3
|
-
|
4
1
|
require 'earth/model'
|
2
|
+
require 'falls_back_on'
|
3
|
+
require 'fuzzy_match/cached_result'
|
5
4
|
|
6
5
|
require 'earth/air/flight_segment'
|
7
6
|
|
@@ -159,7 +158,6 @@ EOS
|
|
159
158
|
:m1_units => 'kilograms_per_nautical_mile',
|
160
159
|
:b_units => 'kilograms'
|
161
160
|
|
162
|
-
|
163
161
|
warn_if_nulls_except(
|
164
162
|
:passengers,
|
165
163
|
:seats,
|
@@ -174,6 +172,6 @@ EOS
|
|
174
172
|
:b_units,
|
175
173
|
:fuel_use_specificity
|
176
174
|
)
|
177
|
-
|
175
|
+
|
178
176
|
warn_unless_size 437
|
179
177
|
end
|
data/lib/earth/air/airline.rb
CHANGED
@@ -19,11 +19,10 @@ CREATE TABLE airlines
|
|
19
19
|
EOS
|
20
20
|
|
21
21
|
self.primary_key = "name"
|
22
|
-
|
22
|
+
|
23
23
|
has_many :flight_segments,
|
24
24
|
:primary_key => :bts_code,
|
25
25
|
:foreign_key => :airline_bts_code
|
26
26
|
|
27
|
-
|
28
|
-
warn_unless_size 1523 # note: this is overridden in data1, which imports extra airlines from proprietary data
|
27
|
+
warn_unless_size 1524 # this is overridden in data1, which imports extra airlines from proprietary data
|
29
28
|
end
|
data/lib/earth/air/airport.rb
CHANGED
@@ -22,23 +22,22 @@ CREATE TABLE airports
|
|
22
22
|
);
|
23
23
|
|
24
24
|
EOS
|
25
|
-
|
25
|
+
|
26
26
|
self.primary_key = "iata_code"
|
27
27
|
|
28
28
|
belongs_to :country,
|
29
29
|
:foreign_key => 'country_iso_3166_code',
|
30
30
|
:primary_key => 'iso_3166_code'
|
31
|
-
has_many :departing_flight_segments,
|
31
|
+
has_many :departing_flight_segments, # FIXME TODO consider replacing with a method that also matches ICAO segments by city
|
32
32
|
:class_name => 'FlightSegment',
|
33
33
|
:foreign_key => :origin_airport_iata_code
|
34
|
-
has_many :arriving_flight_segments,
|
34
|
+
has_many :arriving_flight_segments, # FIXME TODO consider replacing with a method that also matches ICAO segments by city
|
35
35
|
:class_name => 'FlightSegment',
|
36
36
|
:foreign_key => :destination_airport_iata_code
|
37
37
|
|
38
38
|
acts_as_mappable :default_units => :nms,
|
39
39
|
:lat_column_name => :latitude,
|
40
40
|
:lng_column_name => :longitude
|
41
|
-
|
42
|
-
|
41
|
+
|
43
42
|
warn_unless_size 5324
|
44
43
|
end
|
@@ -7,9 +7,5 @@ FlightDistanceClass.class_eval do
|
|
7
7
|
store 'min_distance', :units_field_name => 'min_distance_units', :nullify => true
|
8
8
|
store 'max_distance', :units_field_name => 'max_distance_units', :nullify => true
|
9
9
|
end
|
10
|
-
|
11
|
-
# FIXME TODO verify that min_distance >= 0
|
12
|
-
# FIXME TODO verify that max_distance > 0
|
13
|
-
# FIXME TODO verify that distance class distance bounds don't overlap
|
14
10
|
end
|
15
11
|
end
|
@@ -1,8 +1,7 @@
|
|
1
|
+
require 'earth/model'
|
1
2
|
require 'falls_back_on'
|
2
3
|
require 'fuzzy_match/cached_result'
|
3
4
|
|
4
|
-
require 'earth/model'
|
5
|
-
|
6
5
|
require 'earth/air/aircraft'
|
7
6
|
require 'earth/air/airline'
|
8
7
|
|
@@ -78,6 +77,14 @@ EOS
|
|
78
77
|
end
|
79
78
|
end
|
80
79
|
|
80
|
+
def airline
|
81
|
+
if airline_bts_code
|
82
|
+
Airline.where(:bts_code => airline_bts_code).first
|
83
|
+
else
|
84
|
+
Airline.where(:icao_code => airline_icao_code).first
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
81
88
|
falls_back_on :distance => lambda { weighted_average(:distance, :weighted_by => :passengers) }, # 2077.1205 data1 10-12-2010
|
82
89
|
:seats_per_flight => lambda { weighted_average(:seats_per_flight, :weighted_by => :passengers) }, # 144.15653537046 data1 10-12-2010
|
83
90
|
:load_factor => lambda { weighted_average(:load_factor, :weighted_by => :passengers) }, # 0.78073233770097 data1 10-12-2010
|
@@ -85,7 +92,7 @@ EOS
|
|
85
92
|
|
86
93
|
# FIXME remove this - wherever you're trying to create a flight segment, just don't use mass-assignment for the primary key
|
87
94
|
attr_accessible :row_hash
|
88
|
-
|
95
|
+
|
89
96
|
warn_if_nulls_except(
|
90
97
|
:origin_airport_city,
|
91
98
|
:destination_airport_city,
|
@@ -93,14 +100,6 @@ EOS
|
|
93
100
|
:load_factor,
|
94
101
|
:freight_share
|
95
102
|
)
|
96
|
-
|
97
|
-
warn_unless_size
|
98
|
-
|
99
|
-
def airline
|
100
|
-
if airline_bts_code
|
101
|
-
Airline.where(:bts_code => airline_bts_code).first
|
102
|
-
else
|
103
|
-
Airline.where(:icao_code => airline_icao_code).first
|
104
|
-
end
|
105
|
-
end
|
103
|
+
|
104
|
+
warn_unless_size 1_288_493
|
106
105
|
end
|
@@ -14,6 +14,19 @@ FlightSegment.class_eval do
|
|
14
14
|
def in_july_2009?(row)
|
15
15
|
row ['MONTH'].to_i == 7 and row['YEAR'].to_i == 2009
|
16
16
|
end
|
17
|
+
|
18
|
+
def method_missing(method_id, *args, &block)
|
19
|
+
if method_id.to_s =~ /^(origin|destination)_iata_([a-z]{3})\?$/
|
20
|
+
regexp = Regexp.new($2, Regexp::IGNORECASE)
|
21
|
+
if $1 == "origin"
|
22
|
+
args.first['ORIGIN'] =~ regexp
|
23
|
+
else
|
24
|
+
args.first['DEST'] =~ regexp
|
25
|
+
end
|
26
|
+
else
|
27
|
+
super
|
28
|
+
end
|
29
|
+
end
|
17
30
|
end
|
18
31
|
|
19
32
|
URL = 'http://www.transtats.bts.gov/DownLoad_Table.asp'
|
@@ -24,10 +24,11 @@ EOS
|
|
24
24
|
|
25
25
|
# Used by Automobile and AutomobileTrip
|
26
26
|
def self.find_by_type_name_and_closest_year(type_name, year)
|
27
|
-
|
28
|
-
|
27
|
+
candidates = where(:type_name => type_name)
|
28
|
+
if year > (max_year = candidates.maximum(:activity_year))
|
29
|
+
candidates.where(:activity_year => max_year).first
|
29
30
|
else
|
30
|
-
where(:
|
31
|
+
candidates.where(:activity_year => [year, candidates.minimum(:activity_year)].max).first
|
31
32
|
end
|
32
33
|
end
|
33
34
|
|
@@ -36,6 +37,5 @@ EOS
|
|
36
37
|
AutomobileActivityYearTypeFuel.where(:activity_year => activity_year, :type_name => type_name)
|
37
38
|
end
|
38
39
|
|
39
|
-
|
40
40
|
warn_unless_size 30
|
41
41
|
end
|
@@ -43,7 +43,7 @@ EOS
|
|
43
43
|
end
|
44
44
|
|
45
45
|
# use original model name if fuel suffix didn't help
|
46
|
-
make_model ? make_model :
|
46
|
+
make_model ? make_model : find_by_make_name_and_model_name(characteristics[:make].name, characteristics[:model].name)
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
@@ -52,7 +52,6 @@ EOS
|
|
52
52
|
AutomobileMakeModelYear.where(:make_name => make_name, :model_name => model_name)
|
53
53
|
end
|
54
54
|
|
55
|
-
|
56
55
|
warn_unless_size 2353
|
57
56
|
warn_if_nulls_except :alt_fuel_code
|
58
57
|
warn_if_nulls /alt_fuel_efficiency/, :conditions => 'alt_fuel_code IS NOT NULL'
|
@@ -51,7 +51,6 @@ EOS
|
|
51
51
|
# because it will be a bunch of work to include all the columns and the names will be really long and obtuse
|
52
52
|
# -Ian 10/18/2011
|
53
53
|
|
54
|
-
|
55
54
|
warn_unless_size 28433
|
56
55
|
warn_unless_size 1152, :conditions => { :year => 1985 }
|
57
56
|
warn_unless_size 1183, :conditions => { :year => 1986 }
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'earth/automobile/automobile_make_model_year_variant/parser'
|
2
|
+
|
1
3
|
AutomobileMakeModelYearVariant.class_eval do
|
2
4
|
# For errata
|
3
5
|
class AutomobileMakeModelYearVariant::Guru
|
@@ -79,229 +81,6 @@ AutomobileMakeModelYearVariant.class_eval do
|
|
79
81
|
end
|
80
82
|
end
|
81
83
|
|
82
|
-
# To parse the FEG files
|
83
|
-
class AutomobileMakeModelYearVariant::Parser
|
84
|
-
attr_reader :year
|
85
|
-
|
86
|
-
TRANSMISSIONS = {
|
87
|
-
'A' => 'Automatic',
|
88
|
-
'L' => 'Automatic',
|
89
|
-
'M' => 'Manual',
|
90
|
-
'S' => 'Semi-Automatic',
|
91
|
-
'C' => 'Continuously Variable',
|
92
|
-
'AM' => 'Automated Manual',
|
93
|
-
'SA' => 'Semi-Automatic',
|
94
|
-
'CVT' => 'Continuously Variable',
|
95
|
-
'SCV' => 'Selectable Continuously Variable',
|
96
|
-
'OT' => 'Other'
|
97
|
-
}
|
98
|
-
|
99
|
-
ENGINE_TYPES = {
|
100
|
-
'(GUZZLER)' => nil, # "gas guzzler"
|
101
|
-
'(POLICE)' => nil, # police automobile_variant
|
102
|
-
'(MPFI)' => 'injection',
|
103
|
-
'(MPI*)' => 'injection',
|
104
|
-
'(SPFI)' => 'injection',
|
105
|
-
'(FFS)' => nil, # doesn't necessarily mean fuel injection
|
106
|
-
'(TURBO)' => 'turbo',
|
107
|
-
'(TRBO)' => 'turbo',
|
108
|
-
'(TC*)' => 'turbo',
|
109
|
-
'(FFS,TRBO)' => 'turbo',
|
110
|
-
'(S-CHARGE)' => 'supercharger',
|
111
|
-
'(SC*)' => 'supercharger',
|
112
|
-
'(DIESEL)' => nil, # diesel
|
113
|
-
'(DSL)' => nil, # diesel
|
114
|
-
'(ROTARY)' => nil, # rotary
|
115
|
-
'(VARIABLE)' => nil, # variable displacement
|
116
|
-
'(NO-CAT)' => nil, # no catalytic converter
|
117
|
-
'(OHC)' => nil, # overhead camshaft
|
118
|
-
'(OHV)' => nil, # overhead valves
|
119
|
-
'(16-VALVE)' => nil, # 16V
|
120
|
-
'(305)' => nil, # 305 cubic inch displacement
|
121
|
-
'(307)' => nil, # 307 cubic inch displacement
|
122
|
-
'(M-ENG)' => nil,
|
123
|
-
'(W-ENG)' => nil,
|
124
|
-
'(GM-BUICK)' => nil,
|
125
|
-
'(GM-CHEV)' => nil,
|
126
|
-
'(GM-OLDS)' => nil,
|
127
|
-
'(GM-PONT)' => nil
|
128
|
-
}
|
129
|
-
|
130
|
-
FUEL_CODES = {
|
131
|
-
'BE' => 'EL', # battery electric
|
132
|
-
'CNG' => 'C', # CNG
|
133
|
-
'DU' => 'D', # diesel (ultra-low sulphur)
|
134
|
-
'E' => 'E', # ethanol
|
135
|
-
'EL' => 'EL', # electric
|
136
|
-
'G' => 'R', # regular gasoline
|
137
|
-
'GP' => 'P', # premium gasoline recommended
|
138
|
-
'GPR' => 'P', # premium gasoline required
|
139
|
-
'GM' => 'P', # midgrade gasoline recommended
|
140
|
-
'H' => 'H', # hydrogen
|
141
|
-
'PE' => 'EL' # plug-in electric
|
142
|
-
}
|
143
|
-
|
144
|
-
CLASS_CODES = {
|
145
|
-
'1' => 'Two seaters',
|
146
|
-
'2' => 'Minicompact cars',
|
147
|
-
'3' => 'Subcompact cars',
|
148
|
-
'4' => 'Compact cars',
|
149
|
-
'5' => 'Midsize cars',
|
150
|
-
'6' => 'Large cars',
|
151
|
-
'7' => 'Small station wagons',
|
152
|
-
'8' => 'Midsize station wagons',
|
153
|
-
'9' => 'Large station wagons',
|
154
|
-
'10' => 'Small pickup trucks 2WD',
|
155
|
-
'11' => 'Small pickup trucks 4WD',
|
156
|
-
'12' => 'Standard pickup trucks 2WD',
|
157
|
-
'13' => 'Standard pickup trucks 4WD',
|
158
|
-
'14' => 'Cargo vans',
|
159
|
-
'15' => 'Passenger vans',
|
160
|
-
'16' => nil,
|
161
|
-
'17' => 'Special purpose vehicles 2WD',
|
162
|
-
'18' => 'Special purpose vehicles 4WD',
|
163
|
-
'19' => 'Special purpose vehicles'
|
164
|
-
}
|
165
|
-
|
166
|
-
def initialize(options = {})
|
167
|
-
options = options.stringify_keys
|
168
|
-
@year = options['year']
|
169
|
-
end
|
170
|
-
|
171
|
-
def apply(row)
|
172
|
-
# Pre-2010 fuel efficiencies need to be adjusted downwards to reflect real-world driving
|
173
|
-
# We do this by applying equations to the *unadjusted* city and highway fuel efficiency
|
174
|
-
# Source for the equations is EPA Fuel Economy Trends report Appendix A
|
175
|
-
# Starting in 2008 we could use the *adjusted* values from the FEG but this would require writing a new case for 2008 and 2009
|
176
|
-
# Starting in 2010 we use the *adjusted* fuel efficiencies from the FEG
|
177
|
-
case year
|
178
|
-
when (1985..1997)
|
179
|
-
row.merge!({
|
180
|
-
'make_name' => row['carline_mfr_name'],
|
181
|
-
'model_name' => row['carline_name'],
|
182
|
-
'year' => year,
|
183
|
-
'transmission' => TRANSMISSIONS[row['model_trans'][0,1].to_s],
|
184
|
-
'speeds' => (row['model_trans'][1,1] == 'V') ? 'variable' : row['model_trans'][1,1],
|
185
|
-
'drive' => row['drive_system'],
|
186
|
-
'fuel_code' => row['fuel_type'],
|
187
|
-
'fuel_efficiency_city' => 1.0 / (0.003259 + (1.1805 / row['unadj_city_mpg'].to_f)), # adjust for real-world driving
|
188
|
-
'fuel_efficiency_highway' => 1.0 / (0.001376 + (1.3466 / row['unadj_hwy_mpg'].to_f)), # adjust for real-world driving
|
189
|
-
'cylinders' => row['no_cyl'],
|
190
|
-
'displacement' => _displacement(row),
|
191
|
-
'turbo' => _turbo(row),
|
192
|
-
'supercharger' => [ENGINE_TYPES[row['engine_desc1'].to_s], ENGINE_TYPES[row['engine_desc2'].to_s]].flatten.include?('supercharger'),
|
193
|
-
'injection' => (row['fuel_system'] == 'FI') ? true : false,
|
194
|
-
'size_class' => CLASS_CODES[row['size_class']]
|
195
|
-
})
|
196
|
-
when (1998..2009)
|
197
|
-
row.merge!({
|
198
|
-
'make_name' => row['Manufacturer'] || row['MFR'],
|
199
|
-
'model_name' => (row['carline name'] || row['CAR LINE']).upcase,
|
200
|
-
'year' => year,
|
201
|
-
'transmission' => TRANSMISSIONS[(row['trans'] || row['TRANS'])[-3,1]],
|
202
|
-
'speeds' => ((row['trans'] || row['TRANS'])[-2,1] == 'V') ? 'variable' : (row['trans'] || row['TRANS'])[-2,1],
|
203
|
-
'drive' => ((row['drv'] || row['DRIVE SYS']) + 'WD').gsub('.0', ''),
|
204
|
-
'fuel_code' => row['fl'] || row['FUEL TYPE'],
|
205
|
-
'fuel_efficiency_city' => 1.0 / (0.003259 + (1.1805 / (row['ucty'] || row['UNRND CITY (EPA)']).to_f)), # adjust for real-world driving
|
206
|
-
'fuel_efficiency_highway' => 1.0 / (0.001376 + (1.3466 / (row['uhwy'] || row['UNRND HWY (EPA)']).to_f)), # adjust for real-world driving
|
207
|
-
'cylinders' => row['cyl'] || row['NUMB CYL'],
|
208
|
-
'displacement' => row['displ'] || row['DISPLACEMENT'],
|
209
|
-
'turbo' => ((row['T'] || row['TURBO']) == 'T' || (row['carline name'] || row['CAR LINE']).downcase.include?('turbo')) ? true : false,
|
210
|
-
'supercharger' => (row['S'] || row['SPCHGR']) == 'S',
|
211
|
-
'injection' => true,
|
212
|
-
'size_class' => row['Class'] || row['CLASS']
|
213
|
-
})
|
214
|
-
else # 2010..present
|
215
|
-
row.merge!({
|
216
|
-
'make_name' => row['Division'],
|
217
|
-
'model_name' => row['Carline'].upcase,
|
218
|
-
'year' => year,
|
219
|
-
'transmission' => TRANSMISSIONS[row['Trans']],
|
220
|
-
'speeds' => row['# Gears'].to_i,
|
221
|
-
'drive' => row['Drive Sys'] + 'WD',
|
222
|
-
'fuel_code' => FUEL_CODES[row['Fuel Usage - Conventional Fuel']],
|
223
|
-
'fuel_efficiency_city' => row['City FE (Guide) - Conventional Fuel'],
|
224
|
-
'fuel_efficiency_highway' => row['Hwy FE (Guide) - Conventional Fuel'],
|
225
|
-
'alt_fuel_code' => FUEL_CODES[row[' Fuel2 Usage - Alternative Fuel']],
|
226
|
-
'alt_fuel_efficiency_city' => row['City2 FE (Guide) - Alternative Fuel'],
|
227
|
-
'alt_fuel_efficiency_highway' => row['Hwy2 Fuel FE (Guide) - Alternative Fuel'],
|
228
|
-
'cylinders' => row['# Cyl'],
|
229
|
-
'displacement' => row['Eng Displ'],
|
230
|
-
'turbo' => row['Air Aspir Method'] == 'TC',
|
231
|
-
'supercharger' => row['Air Aspir Method'] == 'SC',
|
232
|
-
'injection' => row['# Cyl'].present? ? true : false,
|
233
|
-
'size_class' => row['Carline Class Desc']
|
234
|
-
})
|
235
|
-
end
|
236
|
-
end
|
237
|
-
|
238
|
-
def _displacement(row)
|
239
|
-
optional_displacement = row['opt_disp'].gsub(/[\(\)]/, '').strip.to_s
|
240
|
-
if optional_displacement =~ /^(\d\.\d)L$/
|
241
|
-
$1.to_f
|
242
|
-
elsif optional_displacement =~ /^(\d{4})CC$/
|
243
|
-
($1.to_f / 1000).round(1)
|
244
|
-
else
|
245
|
-
row['disp_cub_in'].to_f.cubic_inches.to(:litres).round(1)
|
246
|
-
end
|
247
|
-
end
|
248
|
-
|
249
|
-
def _turbo(row)
|
250
|
-
engine_types = [ENGINE_TYPES[row['engine_desc1'].to_s], ENGINE_TYPES[row['engine_desc2'].to_s]]
|
251
|
-
engine_types << (row['model_name'].to_s.downcase.include?('turbo') ? 'turbo' : nil)
|
252
|
-
engine_types.flatten.include?('turbo')
|
253
|
-
end
|
254
|
-
|
255
|
-
# for the 1985-1997 fuel economy guides
|
256
|
-
::FixedWidth.define :fuel_economy_guide do |d|
|
257
|
-
d.rows do |row|
|
258
|
-
row.trap { true } # there's only one section
|
259
|
-
row.column 'active_year', 4, :type => :integer # ACTIVE YEAR
|
260
|
-
row.column 'state_code', 1, :type => :string # STATE CODE: F=49-STATE,C=CALIFORNIA
|
261
|
-
row.column 'size_class', 2, :type => :integer # CARLINE CLASS CODE
|
262
|
-
row.column 'carline_mfr_code', 3, :type => :integer # CARLINE MANUFACTURER CODE
|
263
|
-
row.column 'carline_name', 28, :type => :string # CARLINE NAME
|
264
|
-
row.column 'disp_cub_in', 4, :type => :integer # DISP CUBIC INCHES
|
265
|
-
row.column 'fuel_system', 2, :type => :string # FUEL SYSTEM: 'FI' FOR FUEL INJECTION, 2-DIGIT INTEGER VALUE FOR #OF VENTURIES IF CARBURETOR SYSTEM.
|
266
|
-
row.column 'model_trans', 6, :type => :string # TRANSMISSION TYPE
|
267
|
-
row.column 'no_cyl', 2, :type => :integer # NUMBER OF ENGINE CYLINDERS
|
268
|
-
row.column 'date_time', 12, :type => :string # DATE AND TIME RECORD ENTERED -YYMMDDHHMMSS (YEAR, MONTH, DAY, HOUR, MINUTE, SECOND)
|
269
|
-
row.column 'release_date', 6, :type => :string # RELEASE DATE - YYMMDD (YEAR, MONTH, DAY)
|
270
|
-
row.column 'vi_mfr_code', 3, :type => :integer # VI MANUFACTURER CODE
|
271
|
-
row.column 'carline_code', 5, :type => :integer # CARLINE CODE
|
272
|
-
row.column 'basic_eng_id', 5, :type => :integer # BASIC ENGINE INDEX
|
273
|
-
row.column 'carline_mfr_name', 32, :type => :string # CARLINE MANUFACTURER NAME
|
274
|
-
row.column 'suppress_code', 1, :type => :integer # SUPPRESSION CODE (NO SUPPRESSED RECORD IF FOR PUBLIC ACCESS)
|
275
|
-
row.column 'city_mpg', 3, :type => :integer # ESTIMATED (CITY) MILES PER GALLON - 90% OF UNADJUSTED VALUE
|
276
|
-
row.spacer 2
|
277
|
-
row.column 'highway_mpg', 3, :type => :integer # ESTIMATED (HWY) MILES PER GALLON - 78% OF UNADJUSTED VALUE
|
278
|
-
row.spacer 2
|
279
|
-
row.column 'combined_mpg', 3, :type => :integer # COMBINED MILES PER GALLON
|
280
|
-
row.spacer 2
|
281
|
-
row.column 'unadj_city_mpg', 3, :type => :integer # UNADJUSTED CITY MILES PER GALLON
|
282
|
-
row.spacer 2
|
283
|
-
row.column 'unadj_hwy_mpg', 3, :type => :integer # UNADJUSTED HIGHWAY MILES PER GALLON
|
284
|
-
row.spacer 2
|
285
|
-
row.column 'unadj_comb_mpg', 3, :type => :integer # UNADJUSTED COMBINED MILES PER GALLON
|
286
|
-
row.spacer 2
|
287
|
-
row.column 'ave_anl_fuel', 6, :type => :integer # "$" in col 147, Annual Fuel Cost starting col 148 in I5
|
288
|
-
row.column 'opt_disp', 8, :type => :string # OPTIONAL DISPLACEMENT
|
289
|
-
row.column 'engine_desc1', 10, :type => :string # ENGINE DESCRIPTION 1
|
290
|
-
row.column 'engine_desc2', 10, :type => :string # ENGINE DESCRIPTION 2
|
291
|
-
row.column 'engine_desc3', 10, :type => :string # ENGINE DESCRIPTION 3
|
292
|
-
row.column 'body_type_2d', 10, :type => :string # BODY TYPE 2 DOOR - IF THE BODY TYPE APPLIES IT WILL TAKE THE FORM '2DR-PPP/LL' WHERE PPP=PASSENGER INTERIOR VOLUME AND LL=LUGGAGE INTERIOR VOLUME.
|
293
|
-
row.column 'body_type_4d', 10, :type => :string # BODY TYPE 4 DOOR - IF THE BODY TYPE APPLIES IT WILL TAKE THE FORM '4DR-PPP/LL' WHERE PPP=PASSENGER INTERIOR VOLUME AND LL=LUGGAGE INTERIOR VOLUME.
|
294
|
-
row.column 'body_type_hbk', 10, :type => :string # BODY TYPE HBK - IF THE BODY TYPE APPLIES IT WILL TAKE THE FORM 'HBK-PPP/LL' WHERE PPP=PASSENGER INTERIOR VOLUME AND LL=LUGGAGE INTERIOR VOLUME.
|
295
|
-
row.column 'puerto_rico', 1, :type => :string # '*' IF FOR PUERTO RICO SALES ONLY
|
296
|
-
row.column 'overdrive', 4, :type => :string # OVERDRIVE: ' OD ' FOR OVERDRIVE, 'EOD ' FOR ELECTRICALLY OPERATED OVERDRIVE AND 'AEOD' FOR AUTOMATIC OVERDRIVE
|
297
|
-
row.column 'drive_system', 3, :type => :string # FWD=FRONT WHEEL DRIVE, RWD=REAR, 4WD=4-WHEEL
|
298
|
-
row.column 'filler', 1, :type => :string # NOT USED
|
299
|
-
row.column 'fuel_type', 1, :type => :string # R=REGULAR(UNLEADED), P=PREMIUM, D=DIESEL
|
300
|
-
row.column 'trans_desc', 15, :type => :string # TRANSMISSION DESCRIPTORS
|
301
|
-
end
|
302
|
-
end
|
303
|
-
end
|
304
|
-
|
305
84
|
data_miner do
|
306
85
|
fuel_economy_guides = (1985..1997).inject({}) do |memo, year|
|
307
86
|
yy = year.to_s[2..3]
|