rail_trip 0.0.12 → 0.0.13

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,14 +1,76 @@
1
1
  Feature: Rail Trip Committee Calculations
2
2
  The rail trip model should generate correct committee calculations
3
3
 
4
- Scenario Outline: Distance committee
4
+ Scenario: Date committee from timeframe
5
5
  Given a rail trip emitter
6
- And a characteristic "rail_class.name" of "<rail_class>"
7
- And a characteristic "duration" of "<duration>"
6
+ And a characteristic "timeframe" of "2010-07-12/2010-11-28"
7
+ When the "date" committee is calculated
8
+ Then the conclusion of the committee should be "2010-07-12"
9
+
10
+ Scenario: Rail class committee from default
11
+ Given a rail trip emitter
12
+ When the "rail_class" committee is calculated
13
+ Then the conclusion of the committee should have "name" of "US average"
14
+
15
+ Scenario: Passengers committee from rail class
16
+ Given a rail trip emitter
17
+ And a characteristic "rail_class.name" of "commuter rail"
18
+ When the "passengers" committee is calculated
19
+ Then the conclusion of the committee should be "25.0"
20
+
21
+ Scenario: Speed committee from rail class
22
+ Given a rail trip emitter
23
+ And a characteristic "rail_class.name" of "commuter rail"
8
24
  When the "speed" committee is calculated
9
- And the "distance" committee is calculated
10
- Then the conclusion of the committee should be "<distance>"
11
- Examples:
12
- | rail_class | duration | distance |
13
- | commuter rail | 50 | 2542 |
14
- | light rail | 12 | 296 |
25
+ Then the conclusion of the committee should be "50.0"
26
+
27
+ Scenario: Electricity intensity committee from rail class
28
+ Given a rail trip emitter
29
+ And a characteristic "rail_class.name" of "commuter rail"
30
+ When the "electricity_intensity" committee is calculated
31
+ Then the conclusion of the committee should be "12.0"
32
+
33
+ Scenario: Diesel intensity committee from rail class
34
+ Given a rail trip emitter
35
+ And a characteristic "rail_class.name" of "commuter rail"
36
+ When the "diesel_intensity" committee is calculated
37
+ Then the conclusion of the committee should be "0.75"
38
+
39
+ Scenario: Distance committee from duration and speed
40
+ Given a rail trip emitter
41
+ And a characteristic "duration" of "2"
42
+ And a characteristic "speed" of "50"
43
+ When the "distance" committee is calculated
44
+ Then the committee should have used quorum "from duration and speed"
45
+ And the conclusion of the committee should be "100.0"
46
+
47
+ Scenario: Distance committee from rail class
48
+ Given a rail trip emitter
49
+ And a characteristic "rail_class.name" of "commuter rail"
50
+ When the "distance" committee is calculated
51
+ Then the committee should have used quorum "from rail class"
52
+ And the conclusion of the committee should be "10.0"
53
+
54
+ Scenario: Electricity consumed committee from distance and electricity intensity
55
+ Given a rail trip emitter
56
+ And a characteristic "distance" of "100"
57
+ And a characteristic "electricity_intensity" of "2"
58
+ When the "electricity_consumed" committee is calculated
59
+ Then the conclusion of the committee should be "200.0"
60
+
61
+ Scenario: Diesel consumed committee from distance and diesel intensity
62
+ Given a rail trip emitter
63
+ And a characteristic "distance" of "100"
64
+ And a characteristic "diesel_intensity" of "2"
65
+ When the "diesel_consumed" committee is calculated
66
+ Then the conclusion of the committee should be "200.0"
67
+
68
+ Scenario: Electricity emission factor from default
69
+ Given a rail trip emitter
70
+ When the "electricity_emission_factor" committee is calculated
71
+ Then the conclusion of the committee should be "1.0"
72
+
73
+ Scenario: Diesel emission factor from default
74
+ Given a rail trip emitter
75
+ When the "diesel_emission_factor" committee is calculated
76
+ Then the conclusion of the committee should be "2.0"
@@ -1,12 +1,33 @@
1
1
  Feature: Rail Trip Emissions Calculations
2
2
  The rail trip model should generate correct emission calculations
3
3
 
4
- Scenario Outline: Standard Calculations for rail trip
5
- Given a rail trip has "rail_class.name" of "<rail_class>"
6
- And it has "distance_estimate" of "<distance>"
4
+ Scenario: Calculations for rail trip with nothing
5
+ Given a rail trip has nothing
7
6
  When emissions are calculated
8
- Then the emission value should be within "0.1" kgs of "<emission>"
7
+ Then the emission value should be within "0.01" kgs of "3.17"
8
+
9
+ Scenario Outline: Calculations for rail trip from date and timeframe
10
+ Given a rail trip has "date" of "<date>"
11
+ And it has "timeframe" of "<timeframe>"
12
+ When emissions are calculated
13
+ Then the emission value should be within "0.01" kgs of "<emission>"
9
14
  Examples:
10
- | rail_class | distance | emission |
11
- | commuter rail | 50 | 13.9 |
12
- | light rail | 12 | 6.0 |
15
+ | date | timeframe | emission |
16
+ | 2010-07-12 | 2010-07-01/2010-07-10 | 0.0 |
17
+ | 2010-07-12 | 2010-07-01/2010-07-30 | 3.17 |
18
+ | 2010-07-12 | 2010-07-15/2010-07-30 | 0.0 |
19
+
20
+ Scenario: Calculations for rail trip from distance
21
+ Given a rail trip has "distance" of "100"
22
+ When emissions are calculated
23
+ Then the emission value should be within "0.01" kgs of "22.98"
24
+
25
+ Scenario: Calculations for rail trip from duration
26
+ Given a rail trip has "duration" of "2"
27
+ When emissions are calculated
28
+ Then the emission value should be within "0.01" kgs of "18.53"
29
+
30
+ Scenario: Calculations for rail trip from rail class
31
+ Given a rail trip has "rail_class.name" of "commuter rail"
32
+ When emissions are calculated
33
+ Then the emission value should be within "0.01" kgs of "5.40"
@@ -5,4 +5,4 @@ require 'cucumber'
5
5
  require 'cucumber/formatter/unicode'
6
6
 
7
7
  require 'sniff'
8
- Sniff.init File.join(File.dirname(__FILE__), '..', '..'), :earth => :rail, :cucumber => true
8
+ Sniff.init File.join(File.dirname(__FILE__), '..', '..'), :earth => [:rail, :fuel, :locality], :cucumber => true
@@ -2,148 +2,232 @@
2
2
  # See LICENSE for details.
3
3
  # Contact Brighter Planet for dual-license arrangements.
4
4
 
5
- # Rail trip's carbon model is implemented using a domain-specific language
6
- # provided by [Leap](http://github.com/rossmeissl/leap).
5
+ ## Rail trip carbon model
6
+ # This model is used by [Brighter Planet](http://brighterplanet.com)'s carbon emission [web service](http://carbon.brighterplanet.com) to estimate the **greenhouse gas emissions of passenger rail travel**.
7
+ #
8
+ ##### Calculations
9
+ # The final estimate is the result of the **calculations** detailed below. These calculations are performed in reverse order, starting with the last calculation listed and finishing with the emission calculation. Each calculation is named according to the `value` it returns.
10
+ #
11
+ ##### Timeframe and date
12
+ # The model estimates the emissions that occur during a particular `timeframe`. To do this it needs to know the trip's `date`. For example, if the `timeframe` is January 2010, a trip that occurred on January 11, 2010 will have emissions but a trip that occurred on Febraury 1, 2010 will not.
13
+ #
14
+ ##### Methods
15
+ # To accomodate varying client input, each calculation may have one or more **methods**. These are listed under each calculation in order from most to least preferred. Each method is named according to the `values` it requires ('default' methods do not require any values). Methods are ignored if any of the values they require are unvailable. Calculations are ignored if all of their methods are unavailable.
16
+ #
17
+ ##### Standard compliance
18
+ # Each method lists any established calculation standards with which it **complies**. When compliance with a standard is requested, all methods that do not comply with that standard are ignored. This means that any values a particular method requires will have been calculated using a compliant method or will be unavailable.
19
+ #
20
+ ##### Collaboration
21
+ # Contributions to this carbon model are actively encouraged and warmly welcomed. This library includes a comprehensive test suite to ensure that your changes do not cause regressions. All changes should include test coverage for new functionality. Please see [sniff](http://github.com/brighterplanet/sniff#readme), our emitter testing framework, for more information.
7
22
  module BrighterPlanet
8
23
  module RailTrip
9
-
10
- #### Rail trip: carbon model
11
- # This module is used by [Brighter Planet](http://brighterplanet.com)'s
12
- # [emission estimate service](http://carbon.brighterplanet.com) to provide
13
- # greenhouse gas emission estimates for rail trips.
14
- #
15
- # For more information see:
16
- #
17
- # * [API documentation](http://carbon.brighterplanet.com/rail_trips/options)
18
- # * [Source code](http://github.com/brighterplanet/rail_trip)
19
- #
20
- ##### Collaboration
21
- # Contributions to this carbon model are actively encouraged and warmly welcomed.
22
- # This library includes a comprehensive test suite to ensure that your changes
23
- # do not cause regressions. All changes shold include test coverage for new
24
- # functionality. Please see [sniff](http://github.com/brighterplanet/sniff#readme),
25
- # our emitter testing framework, for more information.
26
24
  module CarbonModel
27
25
  def self.included(base)
28
- ##### The carbon model
29
-
30
- # This `decide` block encapsulates the carbon model. The carbon model is
31
- # executed with a set of "characteristics" as input. These characteristics are
32
- # parsed from input received by the client request according to the
33
- # [characterization](characterization.html).
34
26
  base.decide :emission, :with => :characteristics do
35
-
36
- # The emission committee returns a carbon emission estimate in kilograms CO2e.
37
- committee :emission do # returns kg CO2
38
-
39
- # This calculation technique transforms amounts of diesel and electricity
40
- # consumed during the rail trip---via their current emission factors---to
41
- # an overall emission value. This value is divided by the passenger count
42
- # to obtain a per-passenger emission share.
43
- quorum 'from fuel and passengers', :needs => [:diesel_consumed, :electricity_used, :passengers] do |characteristics|
44
- #(( litres diesel ) * ( kilograms CO2 / litre diesel ) + ( kwH ) * ( kilograms CO2 / kWh ))
45
- (characteristics[:diesel_consumed] * base.research(:diesel_emission_factor) + characteristics[:electricity_used] * RailTrip.rail_trip_model.research(:electricity_emission_factor)) / characteristics[:passengers]
27
+ ### Emission calculation
28
+ # Returns the `emission` estimate (*kg CO<sub>2</sub>e*).
29
+ committee :emission do
30
+ #### From fuel and passengers
31
+ # **Complies:** GHG Protocol, ISO-140641, Climate Registry Protocol
32
+ #
33
+ # - Checks whether the trip occurred during the `timeframe`
34
+ # - Multiplies `diesel use` (*l diesel*) by the `diesel emission factor` (*kg CO<sub>2</sub>e / l diesel*) to give diesel emissions (*kg CO<sub>2</sub>e*)
35
+ # - Multiplies `electricity use` (*kWh*) by the `electricity emission factor` (*kg CO<sub>2</sub>e / kWh electricity*) to give electricity emissions (*kg CO<sub>2</sub>e*)
36
+ # - Adds diesel and electricity emissions to give total emissions (*kg CO<sub>2</sub>e*)
37
+ # - Divides by passengers to give emissions per passenger (*kg CO<sub>2</sub>e*)
38
+ # - If the trip did not occur during the `timeframe`, `emission` is zero
39
+ quorum 'from date, fuel, emission factors, and passengers', :needs => [:diesel_consumed, :diesel_emission_factor, :electricity_consumed, :electricity_emission_factor, :passengers, :date] do |characteristics, timeframe|
40
+ date = characteristics[:date].is_a?(Date) ? characteristics[:date] : Date.parse(characteristics[:date].to_s)
41
+ if timeframe.include? date
42
+ (characteristics[:diesel_consumed] * characteristics[:diesel_emission_factor] + characteristics[:electricity_consumed] * characteristics[:electricity_emission_factor]) / characteristics[:passengers]
43
+ else
44
+ 0
45
+ end
46
46
  end
47
47
  end
48
48
 
49
- # Generally the client will not know the exact amount of diesel consumed
50
- # during the rail trip, so it must be calculated.
51
- committee :diesel_consumed do # returns litres diesel
52
-
53
- # This technique uses trip distance and fuel efficiency to determine diesel
54
- # consumption.
49
+ ### Diesel emission factor calculation
50
+ # Returns the `diesel emission factor` (*kg CO<sub>2</sub>e / l*).
51
+ committee :diesel_emission_factor do
52
+ #### Default diesel emission factor
53
+ # **Complies:** GHG Protocol, ISO 14064-1, Climate Registry Protocol
54
+ #
55
+ # Looks up [Distillate Fuel Oil 2](http://data.brighterplanet.com/fuel_types)'s `emission factor` (*kg CO<sub>2</sub>e / l*).
56
+ quorum 'default' do
57
+ diesel = FuelType.find_by_name "Distillate Fuel Oil 2"
58
+ diesel.emission_factor
59
+ end
60
+ end
61
+
62
+ ### Electricity emission factor calculation
63
+ # Returns the `electricity emission factor` (*kg CO<sub>2</sub>e / kWh*).
64
+ committee :electricity_emission_factor do
65
+ #### Default electricity emission factor
66
+ # **Complies:** GHG Protocol, ISO 14064-1, Climate Registry Protocol
67
+ #
68
+ # - Looks up the [U.S. Average](http://data.brighterplanet.com/egrid_subregions) `electricity emission factor` (*kg CO<sub>2</sub>e / l*)
69
+ # - Looks up the [U.S. Average](http://data.brighterplanet.com/egrid_regions) grid region `loss factor`
70
+ # - Divides the `electricity emission factor` by (1 - `loss factor`) to account for transmission and distribution losses
71
+ quorum 'default' do
72
+ subregion = EgridSubregion.find_by_abbreviation "US"
73
+ region = subregion.egrid_region
74
+ emission_factor = subregion.electricity_emission_factor / (1 - region.loss_factor)
75
+ emission_factor
76
+ end
77
+ end
78
+
79
+ ### Diesel consumed calculation
80
+ # Returns the `diesel use` (*l*).
81
+ committee :diesel_consumed do
82
+ #### From distance and diesel intensity
83
+ # **Complies:** GHG Protocol, ISO-140641, Climate Registry Protocol
84
+ #
85
+ # Multiplies `distance` (*km*) by `diesel intensity` (*l / km*) to give *l*.
55
86
  quorum 'from distance and diesel intensity', :needs => [:distance, :diesel_intensity] do |characteristics|
56
- #( kilometres ) * ( litres diesel / kilometre )
57
87
  characteristics[:distance] * characteristics[:diesel_intensity]
58
88
  end
59
89
  end
60
90
 
61
- # Similarly, electricity consumption will typically be computed here.
62
- committee :electricity_used do # returns kWh
63
-
64
- # As with diesel consumption, we calculate electricity use by multiplying
65
- # distance by "electric intensity"--- an analogue of fuel efficiency.
91
+ ### Electricity consumed calculation
92
+ # Returns the `electricity use` (*kWh*).
93
+ committee :electricity_consumed do
94
+ #### From distance and electricity intensity
95
+ # **Complies:** GHG Protocol, ISO-140641, Climate Registry Protocol
96
+ #
97
+ # Multiplies `distance` (*km*) by `electricity intensity` (*kWh / km*) to give *kWh*.
66
98
  quorum 'from distance and electricity intensity', :needs => [:distance, :electricity_intensity] do |characteristics|
67
- #( kilometres ) * ( kWh / kilometre )
68
99
  characteristics[:distance] * characteristics[:electricity_intensity]
69
100
  end
70
101
  end
71
102
 
72
- # The distance of the rail trip is necessary to perform each of the above
73
- # calculations and can be calculated using several methods.
74
- committee :distance do # returns kilometres
75
-
76
- # The primary distance-calculation method is directly accepting an estimate from
77
- # the client.
78
- quorum 'from distance estimate', :needs => :distance_estimate do |characteristics|
79
- characteristics[:distance_estimate]
80
- end
103
+ ### Distance calculation
104
+ # Returns the `distance` traveled (*km*).
105
+ committee :distance do
106
+ #### Distance from client input
107
+ # **Complies:** All
108
+ #
109
+ # Uses the client-input `distance` (*km*).
81
110
 
82
- # Alternatively we can calculate distance by combining an estimate of trip
83
- # duration with the train's average speed.
84
- quorum 'from duration', :needs => [:duration, :speed] do |characteristics|
85
- #( hours ) * ( kph )
111
+ #### Distance from duration and speed
112
+ # **Complies:** GHG Protocol, ISO-140641, Climate Registry Protocol
113
+ #
114
+ # Multiplies the `duration` (*hours*) by the `speed` (*km / hour*) to give *km*.
115
+ quorum 'from duration and speed', :needs => [:duration, :speed] do |characteristics|
86
116
  characteristics[:duration] * characteristics[:speed]
87
117
  end
88
118
 
89
- # Finally, we can assume the trip covered an average distance, scoped by
90
- # its rail class (subway vs. intercity, for example).
119
+ #### Distance from rail class
120
+ # **Complies:** GHG Protocol, ISO-140641, Climate Registry Protocol
121
+ #
122
+ # Looks up the [rail class](http://data.brighterplanet.com/rail_classes) `distance`.
91
123
  quorum 'from rail class', :needs => :rail_class do |characteristics|
92
124
  characteristics[:rail_class].distance
93
125
  end
94
126
  end
95
127
 
96
- # Diesel intensity is analogous to fuel efficiency (mpg), but are expressed
97
- # in units of fuel per unit of distance.
98
- committee :diesel_intensity do # returns litres diesel / vehicle kilometre
99
-
100
- # Brighter Planet has pre-calculated intensities for popular rail classes.
128
+ ### Duration calculation
129
+ # Returns the trip's `duration` (*hours*).
130
+ #### Duration from client input
131
+ # **Complies:** All
132
+ #
133
+ # Uses the client-input `duration` (*hours*).
134
+
135
+ ### Diesel intensity calculation
136
+ # Returns the `diesel intensity` (*l / km*).
137
+ committee :diesel_intensity do
138
+ #### Diesel intensity from rail class
139
+ # **Complies:** GHG Protocol, ISO-140641, Climate Registry Protocol
140
+ #
141
+ # Looks up the [rail class](http://data.brighterplanet.com/rail_classes) `diesel intensity`.
101
142
  quorum 'from rail class', :needs => :rail_class do |characteristics|
102
143
  characteristics[:rail_class].diesel_intensity
103
144
  end
104
145
  end
105
146
 
106
- # Electricity intensity describes the amount of electric power consumed per
107
- # unit of train travel distance.
108
- committee :electricity_intensity do # returns kWh / vehicle kilometre
109
-
110
- # Again, intensities have been pre-calculated for popular rail classes.
147
+ ### Electricity intensity calculation
148
+ # Returns the `electricity intensity` (*kWh / km*).
149
+ committee :electricity_intensity do
150
+ #### Electricity intensity from rail class
151
+ # **Complies:** GHG Protocol, ISO-140641, Climate Registry Protocol
152
+ #
153
+ # Looks up the [rail class](http://data.brighterplanet.com/rail_classes) `electricity intensity`.
111
154
  quorum 'from rail class', :needs => :rail_class do |characteristics|
112
155
  characteristics[:rail_class].electricity_intensity
113
156
  end
114
157
  end
115
158
 
116
- # Speed is only necessary when used in combination with trip (temporal)
117
- # duration to determine distance.
118
- committee :speed do # returns kph
119
-
120
- # Rail classes provide average speed.
121
- quorum 'from rail class', :needs => :rail_class do |characteristics|
159
+ ### Speed calculation
160
+ # Returns the average `speed` (*km / hour*).
161
+ committee :speed do
162
+ #### Speed from rail class
163
+ # **Complies:** GHG Protocol, ISO-140641, Climate Registry Protocol
164
+ #
165
+ # Looks up the [rail class](http://data.brighterplanet.com/rail_classes) `speed`.
166
+ quorum 'from rail class', :needs => :rail_class, :complies => [:ghg_protocol, :iso, :tcr] do |characteristics|
122
167
  characteristics[:rail_class].speed
123
168
  end
124
169
  end
125
170
 
126
- # Each passenger is responsible for a share of the train trip's total
127
- # footprint.
171
+ ### Passengers calculation
172
+ # Returns the total number of `passengers`.
128
173
  committee :passengers do
129
-
130
- # A passenger count can be gleaned from popular rail classes.
131
- quorum 'from rail class', :needs => :rail_class do |characteristics|
174
+ #### Passengers from rail class
175
+ # **Complies:** GHG Protocol, ISO-140641, Climate Registry Protocol
176
+ #
177
+ # Looks up the [rail class](http://data.brighterplanet.com/rail_classes) `passengers`.
178
+ quorum 'from rail class', :needs => :rail_class, :complies => [:ghg_protocol, :iso, :tcr] do |characteristics|
132
179
  characteristics[:rail_class].passengers
133
180
  end
134
181
  end
135
182
 
136
- # The vehicle used for a rail trip can be meaningfully assigned to one
137
- # of a list of categories called classes, including subways, intercity
138
- # rail, and commuter rail, for example.
183
+ ### Rail class calculation
184
+ # Returns the [rail class](http://data.brighterplanet.com/rail_classes).
185
+ # This is the type of rail the trip used.
139
186
  committee :rail_class do
187
+ #### Rail class from client input
188
+ # **Complies:** All
189
+ #
190
+ # Uses the client-input [rail class](http://data.brighterplanet.com/rail_classes).
140
191
 
141
- # If the client does not provide a rail class, we use an artificial
142
- # rail class, constructed using a weighted average approach.
143
- quorum 'default' do
144
- RailClass.fallback
192
+ #### Default rail class
193
+ # **Complies:** GHG Protocol, ISO 14064-1, Climate Registry Protocol
194
+ #
195
+ # Uses an artificial [rail class](http://data.brighterplanet.com/rail_classes) representing the U.S. average.
196
+ quorum 'default', :complies => [:ghg_protocol, :iso, :tcr] do
197
+ RailClass.find_by_name "US average"
145
198
  end
146
199
  end
200
+
201
+ ### Date calculation
202
+ # Returns the `date` on which the trip occurred.
203
+ committee :date do
204
+ #### Date from client input
205
+ # **Complies:** All
206
+ #
207
+ # Uses the client-input `date`.
208
+
209
+ #### Date from timeframe
210
+ # **Complies:** GHG Protocol, ISO-14064-1, Climate Registry Protocol
211
+ #
212
+ # Assumes the trip occurred on the first day of the `timeframe`.
213
+ quorum 'from timeframe', :complies => [:ghg_protocol, :iso, :tcr] do |characteristics, timeframe|
214
+ timeframe.from
215
+ end
216
+ end
217
+
218
+ ### Timeframe calculation
219
+ # Returns the `timeframe`.
220
+ # This is the period during which to calculate emissions.
221
+
222
+ #### Timeframe from client input
223
+ # **Complies:** All
224
+ #
225
+ # Uses the client-input `timeframe`.
226
+
227
+ #### Default timeframe
228
+ # **Complies:** All
229
+ #
230
+ # Uses the current calendar year.
147
231
  end
148
232
  end
149
233
  end
@@ -24,7 +24,8 @@ module BrighterPlanet
24
24
  base.characterize do
25
25
  has :rail_class
26
26
  has :duration, :measures => :time
27
- has :distance_estimate, :trumps => :duration, :measures => :length
27
+ has :distance, :measures => :length
28
+ has :date
28
29
  end
29
30
 
30
31
  # Additional characteristics are gleaned from the carbon model.
@@ -19,11 +19,10 @@ module BrighterPlanet
19
19
  base.data_miner do
20
20
  # This `schema` block encapsulates the persistence schema.
21
21
  schema do
22
- string 'name'
23
- date 'date'
22
+ string 'rail_class_name'
24
23
  float 'duration'
25
- float 'distance_estimate'
26
- string 'rail_class_id'
24
+ float 'distance'
25
+ date 'date'
27
26
  end
28
27
 
29
28
  # This `process` block indicates that RailTrip's associated classes
@@ -20,7 +20,7 @@ module BrighterPlanet
20
20
  # This `summarize` block encapsulates the summarization strategy, including
21
21
  # terminology and inflection preference.
22
22
  base.summarize do |has|
23
- has.adjective lambda { |rail_trip| "#{rail_trip.distance_estimate_in_miles.adaptive_round(1)}-mile" }, :if => :distance_estimate
23
+ has.adjective lambda { |rail_trip| "#{rail_trip.distance_in_miles.adaptive_round(1)}-mile" }, :if => :distance
24
24
  has.adjective lambda { |rail_trip| "#{rail_trip.duration}-hour" }, :if => :duration
25
25
  has.identity 'rail trip'
26
26
  has.verb :take
@@ -5,22 +5,5 @@ class RailTripRecord < ActiveRecord::Base
5
5
  include BrighterPlanet::RailTrip
6
6
  belongs_to :rail_class
7
7
 
8
- conversion_accessor :distance_estimate, :external => :miles, :internal => :kilometres
9
-
10
- falls_back_on
11
-
12
- class << self
13
- def research(key)
14
- case key
15
- when :diesel_emission_factor
16
- 22.59.pounds_per_gallon.to(:kilograms_per_litre) # CO2 / diesel https://brighterplanet.sifterapp.com/projects/30/issues/455
17
- when :electricity_emission_factor
18
- 1.36.pounds.to(:kilograms) # CO2 / kWh https://brighterplanet.sifterapp.com/projects/30/issues/455
19
- end
20
- end
21
- end
22
-
23
- def emission_date
24
- created_at.to_date #FIXME we should add a date characteristic for this emitter
25
- end
8
+ conversion_accessor :distance, :external => :miles, :internal => :kilometres
26
9
  end
metadata CHANGED
@@ -1,12 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rail_trip
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 5
4
5
  prerelease: false
5
6
  segments:
6
7
  - 0
7
8
  - 0
8
- - 12
9
- version: 0.0.12
9
+ - 13
10
+ version: 0.0.13
10
11
  platform: ruby
11
12
  authors:
12
13
  - Andy Rossmeissl
@@ -18,141 +19,141 @@ autorequire:
18
19
  bindir: bin
19
20
  cert_chain: []
20
21
 
21
- date: 2010-10-19 00:00:00 -04:00
22
+ date: 2010-12-02 00:00:00 -05:00
22
23
  default_executable:
23
24
  dependencies:
24
25
  - !ruby/object:Gem::Dependency
25
26
  name: activerecord
27
+ prerelease: false
26
28
  requirement: &id001 !ruby/object:Gem::Requirement
27
29
  none: false
28
30
  requirements:
29
31
  - - ~>
30
32
  - !ruby/object:Gem::Version
33
+ hash: 5
31
34
  segments:
32
35
  - 3
33
- - 0
34
- - 0
35
- version: 3.0.0
36
+ version: "3"
36
37
  type: :development
37
- prerelease: false
38
38
  version_requirements: *id001
39
39
  - !ruby/object:Gem::Dependency
40
40
  name: bundler
41
+ prerelease: false
41
42
  requirement: &id002 !ruby/object:Gem::Requirement
42
43
  none: false
43
44
  requirements:
44
45
  - - ~>
45
46
  - !ruby/object:Gem::Version
47
+ hash: 23
46
48
  segments:
47
49
  - 1
48
50
  - 0
49
51
  - 0
50
52
  version: 1.0.0
51
53
  type: :development
52
- prerelease: false
53
54
  version_requirements: *id002
54
55
  - !ruby/object:Gem::Dependency
55
56
  name: cucumber
57
+ prerelease: false
56
58
  requirement: &id003 !ruby/object:Gem::Requirement
57
59
  none: false
58
60
  requirements:
59
- - - "="
61
+ - - ~>
60
62
  - !ruby/object:Gem::Version
63
+ hash: 57
61
64
  segments:
62
65
  - 0
63
66
  - 8
64
67
  - 3
65
68
  version: 0.8.3
66
69
  type: :development
67
- prerelease: false
68
70
  version_requirements: *id003
69
71
  - !ruby/object:Gem::Dependency
70
72
  name: jeweler
73
+ prerelease: false
71
74
  requirement: &id004 !ruby/object:Gem::Requirement
72
75
  none: false
73
76
  requirements:
74
- - - "="
77
+ - - ~>
75
78
  - !ruby/object:Gem::Version
79
+ hash: 7
76
80
  segments:
77
81
  - 1
78
82
  - 4
79
83
  - 0
80
84
  version: 1.4.0
81
85
  type: :development
82
- prerelease: false
83
86
  version_requirements: *id004
84
87
  - !ruby/object:Gem::Dependency
85
88
  name: rake
89
+ prerelease: false
86
90
  requirement: &id005 !ruby/object:Gem::Requirement
87
91
  none: false
88
92
  requirements:
89
93
  - - ">="
90
94
  - !ruby/object:Gem::Version
95
+ hash: 3
91
96
  segments:
92
97
  - 0
93
98
  version: "0"
94
99
  type: :development
95
- prerelease: false
96
100
  version_requirements: *id005
97
101
  - !ruby/object:Gem::Dependency
98
102
  name: rdoc
103
+ prerelease: false
99
104
  requirement: &id006 !ruby/object:Gem::Requirement
100
105
  none: false
101
106
  requirements:
102
107
  - - ">="
103
108
  - !ruby/object:Gem::Version
109
+ hash: 3
104
110
  segments:
105
111
  - 0
106
112
  version: "0"
107
113
  type: :development
108
- prerelease: false
109
114
  version_requirements: *id006
110
115
  - !ruby/object:Gem::Dependency
111
116
  name: rspec
117
+ prerelease: false
112
118
  requirement: &id007 !ruby/object:Gem::Requirement
113
119
  none: false
114
120
  requirements:
115
- - - "="
121
+ - - ~>
116
122
  - !ruby/object:Gem::Version
123
+ hash: 7
117
124
  segments:
118
125
  - 2
119
- - 0
120
- - 0
121
- - beta
122
- - 17
123
- version: 2.0.0.beta.17
126
+ version: "2"
124
127
  type: :development
125
- prerelease: false
126
128
  version_requirements: *id007
127
129
  - !ruby/object:Gem::Dependency
128
130
  name: sniff
131
+ prerelease: false
129
132
  requirement: &id008 !ruby/object:Gem::Requirement
130
133
  none: false
131
134
  requirements:
132
- - - ~>
135
+ - - ">="
133
136
  - !ruby/object:Gem::Version
137
+ hash: 3
134
138
  segments:
135
139
  - 0
136
- - 2
137
- - 0
138
- version: 0.2.0
140
+ version: "0"
139
141
  type: :development
140
- prerelease: false
141
142
  version_requirements: *id008
142
143
  - !ruby/object:Gem::Dependency
143
144
  name: emitter
145
+ prerelease: false
144
146
  requirement: &id009 !ruby/object:Gem::Requirement
145
147
  none: false
146
148
  requirements:
147
149
  - - ~>
148
150
  - !ruby/object:Gem::Version
151
+ hash: 13
149
152
  segments:
150
153
  - 0
151
- - 1
152
- - 7
153
- version: 0.1.7
154
+ - 3
155
+ version: "0.3"
154
156
  type: :runtime
155
- prerelease: false
156
157
  version_requirements: *id009
157
158
  description: A software model in Ruby for the greenhouse gas emissions of an rail_trip
158
159
  email: andy@rossmeissl.net
@@ -189,7 +190,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
189
190
  requirements:
190
191
  - - ">="
191
192
  - !ruby/object:Gem::Version
192
- hash: 3563871160626263325
193
+ hash: 3
193
194
  segments:
194
195
  - 0
195
196
  version: "0"
@@ -198,6 +199,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
198
199
  requirements:
199
200
  - - ">="
200
201
  - !ruby/object:Gem::Version
202
+ hash: 3
201
203
  segments:
202
204
  - 0
203
205
  version: "0"