flight 0.0.0

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.
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
@@ -0,0 +1,21 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
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.
@@ -0,0 +1,17 @@
1
+ = flight
2
+
3
+ Description goes here.
4
+
5
+ == Note on Patches/Pull Requests
6
+
7
+ * Fork the project.
8
+ * Make your feature addition or bug fix.
9
+ * Add tests for it. This is important so I don't break it in a
10
+ future version unintentionally.
11
+ * Commit, do not mess with rakefile, version, or history.
12
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
13
+ * Send me a pull request. Bonus points for topic branches.
14
+
15
+ == Copyright
16
+
17
+ Copyright (c) 2010 Andy Rossmeissl. See LICENSE for details.
@@ -0,0 +1,54 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "flight"
8
+ gem.summary = %Q{A carbon model}
9
+ gem.description = %Q{A software model in Ruby for the greenhouse gas emissions of a flight}
10
+ gem.email = "andy@rossmeissl.net"
11
+ gem.homepage = "http://github.com/brighterplanet/flight"
12
+ gem.authors = ["Andy Rossmeissl", "Seamus Abshere", "Ian Hough", "Matt Kling"]
13
+ gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
14
+ gem.add_development_dependency 'leap'
15
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
16
+ end
17
+ Jeweler::GemcutterTasks.new
18
+ rescue LoadError
19
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
20
+ end
21
+
22
+ require 'rake/testtask'
23
+ Rake::TestTask.new(:test) do |test|
24
+ test.libs << 'lib' << 'test'
25
+ test.pattern = 'test/**/test_*.rb'
26
+ test.verbose = true
27
+ end
28
+
29
+ begin
30
+ require 'rcov/rcovtask'
31
+ Rcov::RcovTask.new do |test|
32
+ test.libs << 'test'
33
+ test.pattern = 'test/**/test_*.rb'
34
+ test.verbose = true
35
+ end
36
+ rescue LoadError
37
+ task :rcov do
38
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
39
+ end
40
+ end
41
+
42
+ task :test => :check_dependencies
43
+
44
+ task :default => :test
45
+
46
+ require 'rake/rdoctask'
47
+ Rake::RDocTask.new do |rdoc|
48
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
49
+
50
+ rdoc.rdoc_dir = 'rdoc'
51
+ rdoc.title = "flight #{version}"
52
+ rdoc.rdoc_files.include('README*')
53
+ rdoc.rdoc_files.include('lib/**/*.rb')
54
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.0
@@ -0,0 +1,256 @@
1
+ module BrighterPlanet
2
+ module Flight
3
+ def self.included(base)
4
+ base.extend ::Leap::Subject
5
+ base.decide :emission, :with => :characteristics do
6
+ committee :emission do
7
+ quorum 'from fuel and passengers with coefficients', :needs => [:fuel, :passengers, :seat_class_multiplier, :emission_factor, :radiative_forcing_index, :freight_share, :date] do |characteristics, timeframe|
8
+ if timeframe.include? characteristics[:date]
9
+ #( kg fuel ) * ( kg CO2 / kg fuel ) = kg CO2
10
+ (characteristics[:fuel] / characteristics[:passengers] * characteristics[:seat_class_multiplier]) * characteristics[:emission_factor] * characteristics[:radiative_forcing_index] * (1 - characteristics[:freight_share])
11
+ else
12
+ 0
13
+ end
14
+ end
15
+
16
+ quorum 'default' do
17
+ raise "The emission committee's default quorum should never be called"
18
+ end
19
+ end
20
+
21
+ committee :fuel do # returns kg fuel
22
+ quorum 'from fuel per segment and emplanements and trips', :needs => [:fuel_per_segment, :emplanements_per_trip, :trips] do |characteristics|
23
+ characteristics[:fuel_per_segment] * characteristics[:emplanements_per_trip].to_f * characteristics[:trips].to_f
24
+ end
25
+ end
26
+
27
+ committee :fuel_per_segment do # returns kg fuel
28
+ quorum 'from adjusted distance and fuel use formula and emplanements and trips', :needs => [:adjusted_distance_per_segment, :fuel_use_coefficients, :endpoint_fuel] do |characteristics|
29
+ characteristics[:fuel_use_coefficients][:m3].to_f * characteristics[:adjusted_distance_per_segment].to_f ** 3 +
30
+ characteristics[:fuel_use_coefficients][:m2].to_f * characteristics[:adjusted_distance_per_segment].to_f ** 2 +
31
+ characteristics[:fuel_use_coefficients][:m1].to_f * characteristics[:adjusted_distance_per_segment].to_f +
32
+ characteristics[:endpoint_fuel].to_f
33
+ end
34
+ end
35
+
36
+ committee :adjusted_distance_per_segment do
37
+ quorum 'from adjusted distance and emplanements', :needs => [:adjusted_distance, :emplanements_per_trip] do |characteristics|
38
+ characteristics[:adjusted_distance] / characteristics[:emplanements_per_trip]
39
+ end
40
+ end
41
+
42
+ committee :endpoint_fuel do
43
+ quorum 'from aircraft', :needs => :aircraft do |characteristics|
44
+ characteristics[:aircraft].endpoint_fuel
45
+ end
46
+
47
+ quorum 'from aircraft class', :needs => :aircraft_class do |characteristics|
48
+ characteristics[:aircraft_class].endpoint_fuel
49
+ end
50
+
51
+ quorum 'default' do
52
+ Aircraft.fallback.endpoint_fuel
53
+ end
54
+ end
55
+
56
+ committee :fuel_use_coefficients do
57
+ quorum 'from aircraft', :needs => :aircraft do |characteristics|
58
+ characteristics[:aircraft].attributes.symbolize_keys.slice(:m1, :m2, :m3)
59
+ end
60
+
61
+ quorum 'from aircraft class', :needs => :aircraft_class do |characteristics|
62
+ characteristics[:aircraft_class].attributes.symbolize_keys.slice(:m1, :m2, :m3)
63
+ end
64
+
65
+ quorum 'default' do
66
+ Aircraft.fallback.attributes.symbolize_keys.slice(:m1, :m2, :m3)
67
+ end
68
+ end
69
+
70
+ committee :passengers do
71
+ quorum 'from seats and load factor', :needs => [:seats, :load_factor] do |characteristics|
72
+ (characteristics[:seats] * characteristics[:load_factor]).round
73
+ end
74
+ end
75
+
76
+ committee :seats do
77
+ # leaving this here to explain how someday we might lookup seat count based on both airline AND aircraft
78
+ #SE quorum 'from_airline_and_aircraft', :needs => [:airline, :aircraft] do |characteristics, timeframe|
79
+ #SE if aircraft = AirlineAircraft.memoized_find_by_airline_id_and_aircraft_id(characteristics[:airline].id, characteristics[:aircraft].id)
80
+ #SE aircraft.seats
81
+ #SE end
82
+ #SE end
83
+
84
+ quorum 'from aircraft', :needs => :aircraft do |characteristics|
85
+ characteristics[:aircraft].seats
86
+ end
87
+
88
+ quorum 'from seats estimate', :needs => :seats_estimate do |characteristics|
89
+ characteristics[:seats_estimate]
90
+ end
91
+
92
+ quorum 'from cohort', :needs => :cohort do |characteristics|
93
+ seats = characteristics[:cohort].weighted_average :seats, :weighted_by => :passengers
94
+ if seats.nil? or seats.zero?
95
+ nil
96
+ else
97
+ seats
98
+ end
99
+ end
100
+
101
+ quorum 'from aircraft class', :needs => :aircraft_class do |characteristics|
102
+ characteristics[:aircraft_class].seats
103
+ end
104
+
105
+ quorum 'default' do
106
+ FlightSegment.fallback.seats
107
+ end
108
+ end
109
+
110
+ committee :load_factor do
111
+ quorum 'from cohort', :needs => :cohort do |characteristics|
112
+ characteristics[:cohort].weighted_average(:load_factor, :weighted_by => :passengers)
113
+ end
114
+
115
+ quorum 'default' do
116
+ fallback.load_factor
117
+ end
118
+ end
119
+
120
+ committee :adjusted_distance do # returns nautical miles
121
+ quorum 'from distance', :needs => [:distance, :emplanements_per_trip] do |characteristics|
122
+ characteristics[:distance] * research(:route_inefficiency_factor) * ( research(:dogleg_factor) ** (characteristics[:emplanements_per_trip] - 1) )
123
+ end
124
+ end
125
+
126
+ committee :distance do # returns nautical miles
127
+ quorum 'from airports', :needs => [:origin_airport, :destination_airport] do |characteristics|
128
+ if characteristics[:origin_airport].latitude and
129
+ characteristics[:origin_airport].longitude and
130
+ characteristics[:destination_airport].latitude and
131
+ characteristics[:destination_airport].longitude
132
+ characteristics[:origin_airport].distance_to(characteristics[:destination_airport], :units => :kms).kilometres.to :nautical_miles
133
+ end
134
+ end
135
+
136
+ quorum 'from distance estimate', :needs => :distance_estimate do |characteristics|
137
+ characteristics[:distance_estimate].kilometres.to :nautical_miles
138
+ end
139
+
140
+ quorum 'from distance class', :needs => :distance_class do |characteristics|
141
+ characteristics[:distance_class].distance.kilometres.to :nautical_miles
142
+ end
143
+
144
+ quorum 'from cohort', :needs => :cohort do |characteristics|
145
+ distance = characteristics[:cohort].weighted_average(:distance, :weighted_by => :passengers).to_f.kilometres.to(:nautical_miles)
146
+ distance > 0 ? distance : nil
147
+ end
148
+
149
+ quorum 'default' do
150
+ fallback.distance_estimate.kilometres.to :nautical_miles
151
+ end
152
+ end
153
+
154
+ committee :emplanements_per_trip do # per trip
155
+ quorum 'default' do
156
+ fallback.emplanements_per_trip_before_type_cast
157
+ end
158
+ end
159
+
160
+ committee :radiative_forcing_index do
161
+ quorum 'from fuel type', :needs => :fuel_type do |characteristics|
162
+ characteristics[:fuel_type].radiative_forcing_index
163
+ end
164
+ end
165
+
166
+ committee :emission_factor do # returns kg CO2 / kg fuel
167
+ quorum 'from fuel type', :needs => :fuel_type do |characteristics|
168
+ #( kg CO2 / litres fuel ) * ( litres fuel / kg fuel )
169
+ characteristics[:fuel_type].emission_factor * ( 1 / characteristics[:fuel_type].density).gallons.to(:litres)
170
+ end
171
+ end
172
+
173
+ committee :fuel_type do
174
+ quorum 'default' do
175
+ FlightFuelType.fallback
176
+ end
177
+ end
178
+
179
+ committee :freight_share do
180
+ quorum 'from cohort', :needs => :cohort do |characteristics|
181
+ characteristics[:cohort].weighted_average(:freight_share, :weighted_by => :passengers)
182
+ end
183
+
184
+ quorum 'default' do
185
+ FlightSegment.fallback.freight_share
186
+ end
187
+ end
188
+
189
+ committee :trips do
190
+ quorum 'default' do
191
+ fallback.trips_before_type_cast
192
+ end
193
+ end
194
+
195
+ committee :domesticity do
196
+ quorum 'from airports', :needs => [:origin_airport, :destination_airport] do |characteristics|
197
+ if [characteristics[:origin_airport], characteristics[:destination_airport]].all?(&:united_states?)
198
+ FlightDomesticity.find_by_name('domestic')
199
+ elsif [characteristics[:origin_airport], characteristics[:destination_airport]].any?(&:united_states?)
200
+ FlightDomesticity.find_by_name('international')
201
+ end
202
+ end
203
+
204
+ quorum 'from origin', :needs => :origin_airport do |characteristics|
205
+ if characteristics[:origin_airport].all_flights_from_here_domestic?
206
+ FlightDomesticity.find_by_name('domestic')
207
+ end
208
+ end
209
+
210
+ quorum 'from destination', :needs => :destination_airport do |characteristics|
211
+ if characteristics[:destination_airport].all_flights_to_here_domestic?
212
+ FlightDomesticity.find_by_name('domestic')
213
+ end
214
+ end
215
+
216
+ quorum 'from airline', :needs => :airline do |characteristics|
217
+ if characteristics[:airline].all_flights_domestic?
218
+ FlightDomesticity.find_by_name('domestic')
219
+ end
220
+ end
221
+ end
222
+
223
+ committee :seat_class_multiplier do
224
+ quorum 'from seat class', :needs => :seat_class do |characteristics|
225
+ characteristics[:seat_class].multiplier
226
+ end
227
+
228
+ quorum 'default' do
229
+ FlightSeatClass.fallback.multiplier
230
+ end
231
+ end
232
+
233
+ committee :date do
234
+ quorum 'from creation date', :needs => :creation_date do |characteristics|
235
+ characteristics[:creation_date]
236
+ end
237
+
238
+ quorum 'from timeframe' do |characteristics, timeframe|
239
+ timeframe.from
240
+ end
241
+ end
242
+
243
+ committee :cohort do
244
+ quorum 'from t100', :appreciates => FlightSegment::INPUT_CHARACTERISTICS do |characteristics|
245
+ cohort = FlightSegment.big_cohort characteristics
246
+ if cohort.any?
247
+ cohort
248
+ else
249
+ nil
250
+ end
251
+ end
252
+ end
253
+ end
254
+ end
255
+ end
256
+ end
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
7
+ require 'flight'
8
+
9
+ class Test::Unit::TestCase
10
+ end
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class TestFlight < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,98 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: flight
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 0
9
+ version: 0.0.0
10
+ platform: ruby
11
+ authors:
12
+ - Andy Rossmeissl
13
+ - Seamus Abshere
14
+ - Ian Hough
15
+ - Matt Kling
16
+ autorequire:
17
+ bindir: bin
18
+ cert_chain: []
19
+
20
+ date: 2010-06-10 00:00:00 -04:00
21
+ default_executable:
22
+ dependencies:
23
+ - !ruby/object:Gem::Dependency
24
+ name: thoughtbot-shoulda
25
+ prerelease: false
26
+ requirement: &id001 !ruby/object:Gem::Requirement
27
+ requirements:
28
+ - - ">="
29
+ - !ruby/object:Gem::Version
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :development
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: leap
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ segments:
43
+ - 0
44
+ version: "0"
45
+ type: :development
46
+ version_requirements: *id002
47
+ description: A software model in Ruby for the greenhouse gas emissions of a flight
48
+ email: andy@rossmeissl.net
49
+ executables: []
50
+
51
+ extensions: []
52
+
53
+ extra_rdoc_files:
54
+ - LICENSE
55
+ - README.rdoc
56
+ files:
57
+ - .document
58
+ - .gitignore
59
+ - LICENSE
60
+ - README.rdoc
61
+ - Rakefile
62
+ - VERSION
63
+ - lib/flight.rb
64
+ - test/helper.rb
65
+ - test/test_flight.rb
66
+ has_rdoc: true
67
+ homepage: http://github.com/brighterplanet/flight
68
+ licenses: []
69
+
70
+ post_install_message:
71
+ rdoc_options:
72
+ - --charset=UTF-8
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ segments:
80
+ - 0
81
+ version: "0"
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ segments:
87
+ - 0
88
+ version: "0"
89
+ requirements: []
90
+
91
+ rubyforge_project:
92
+ rubygems_version: 1.3.6
93
+ signing_key:
94
+ specification_version: 3
95
+ summary: A carbon model
96
+ test_files:
97
+ - test/helper.rb
98
+ - test/test_flight.rb