meeting 0.0.1 → 0.0.3

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.
@@ -1,8 +1,101 @@
1
1
  Feature: Meeting Committee Calculations
2
2
  The meeting model should generate correct committee calculations
3
3
 
4
- Scenario: Emission committee from fuel use and emission factor
5
- Given an meeting emitter
6
- When the "emission" committee is calculated
7
- Then the committee should have used quorum "from default"
8
- And the conclusion of the committee should be "100"
4
+ Scenario: Duration committee from default
5
+ Given a meeting emitter
6
+ When the "duration" committee is calculated
7
+ Then the committee should have used quorum "default"
8
+ And the conclusion of the committee should be "8"
9
+
10
+ Scenario: Area committee from default
11
+ Given a meeting emitter
12
+ When the "area" committee is calculated
13
+ Then the committee should have used quorum "default"
14
+ And the conclusion of the committee should be "1184.51376"
15
+
16
+ Scenario: State committee from zip code
17
+ Given a meeting emitter
18
+ And a characteristic "zip_code.name" of "94122"
19
+ When the "state" committee is calculated
20
+ Then the committee should have used quorum "from zip code"
21
+ And the conclusion of the committee should have "postal_abbreviation" of "CA"
22
+
23
+ Scenario: Census division committee from state
24
+ Given a meeting emitter
25
+ And a characteristic "state.postal_abbreviation" of "CA"
26
+ When the "census_division" committee is calculated
27
+ Then the committee should have used quorum "from state"
28
+ And the conclusion of the committee should have "number" of "9"
29
+
30
+ Scenario: District heat intensity committee from default
31
+ Given a meeting emitter
32
+ When the "district_heat_intensity" committee is calculated
33
+ Then the committee should have used quorum "default"
34
+ And the conclusion of the committee should be "3458.7"
35
+
36
+ Scenario: District heat intensity committee from census division
37
+ Given a meeting emitter
38
+ And a characteristic "census_division.number" of "9"
39
+ When the "district_heat_intensity" committee is calculated
40
+ Then the committee should have used quorum "from census division"
41
+ And the conclusion of the committee should be "1000"
42
+
43
+ Scenario: Electricity intensity committee from default
44
+ Given a meeting emitter
45
+ When the "electricity_intensity" committee is calculated
46
+ Then the committee should have used quorum "default"
47
+ And the conclusion of the committee should be "0.072444"
48
+
49
+ Scenario: Electricity intensity committee from census division
50
+ Given a meeting emitter
51
+ And a characteristic "census_division.number" of "9"
52
+ When the "electricity_intensity" committee is calculated
53
+ Then the committee should have used quorum "from census division"
54
+ And the conclusion of the committee should be "3"
55
+
56
+ Scenario: Fuel oil intensity committee from default
57
+ Given a meeting emitter
58
+ When the "fuel_oil_intensity" committee is calculated
59
+ Then the committee should have used quorum "default"
60
+ And the conclusion of the committee should be "0.0037381"
61
+
62
+ Scenario: Fuel oil intensity committee from census division
63
+ Given a meeting emitter
64
+ And a characteristic "census_division.number" of "9"
65
+ When the "fuel_oil_intensity" committee is calculated
66
+ Then the committee should have used quorum "from census division"
67
+ And the conclusion of the committee should be "2"
68
+
69
+ Scenario: Natural gas intensity committee from default
70
+ Given a meeting emitter
71
+ When the "natural_gas_intensity" committee is calculated
72
+ Then the committee should have used quorum "default"
73
+ And the conclusion of the committee should be "0.011973"
74
+
75
+ Scenario: Natural gas intensity committee from census division
76
+ Given a meeting emitter
77
+ And a characteristic "census_division.number" of "9"
78
+ When the "natural_gas_intensity" committee is calculated
79
+ Then the committee should have used quorum "from census division"
80
+ And the conclusion of the committee should be "1"
81
+
82
+ Scenario: Emission factor committee from nothing
83
+ Given a meeting emitter
84
+ When the "natural_gas_intensity" committee is calculated
85
+ And the "fuel_oil_intensity" committee is calculated
86
+ And the "electricity_intensity" committee is calculated
87
+ And the "district_heat_intensity" committee is calculated
88
+ And the "emission_factor" committee is calculated
89
+ Then the committee should have used quorum "from fuel intensities"
90
+ And the conclusion of the committee should be "0.15470"
91
+
92
+ Scenario: Emission factor committee from census division
93
+ Given a meeting emitter
94
+ And a characteristic "census_division.number" of "9"
95
+ When the "natural_gas_intensity" committee is calculated
96
+ And the "fuel_oil_intensity" committee is calculated
97
+ And the "electricity_intensity" committee is calculated
98
+ And the "district_heat_intensity" committee is calculated
99
+ And the "emission_factor" committee is calculated
100
+ Then the committee should have used quorum "from fuel intensities"
101
+ And the conclusion of the committee should be "8.50002"
@@ -2,6 +2,28 @@ Feature: Meeting Emissions Calculations
2
2
  The meeting model should generate correct emission calculations
3
3
 
4
4
  Scenario: Calculations starting from nothing
5
- Given an meeting has nothing
5
+ Given a meeting has nothing
6
6
  When emissions are calculated
7
- Then the emission value should be within "0.1" kgs of "100"
7
+ Then the emission value should be within "0.1" kgs of "1465.9"
8
+
9
+ Scenario: Calculations starting from duration
10
+ Given a meeting has "duration" of "1"
11
+ When emissions are calculated
12
+ Then the emission value should be within "0.1" kgs of "183.2"
13
+
14
+ Scenario: Calculations starting from area
15
+ Given a meeting has "area" of "1000"
16
+ When emissions are calculated
17
+ Then the emission value should be within "1" kgs of "1237.6"
18
+
19
+ Scenario: Calculations starting from zip code
20
+ Given a meeting has "zip_code.name" of "94122"
21
+ When emissions are calculated
22
+ Then the emission value should be within "1" kgs of "80547"
23
+
24
+ Scenario: Calculations starting from duration, area, and zip code
25
+ Given a meeting has "duration" of "1"
26
+ And it has "area" of "1000"
27
+ And it has "zip_code.name" of "94122"
28
+ When emissions are calculated
29
+ Then the emission value should be within "0.1" kgs of "8500.0"
@@ -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__), '..', '..'), :cucumber => true
8
+ Sniff.init File.join(File.dirname(__FILE__), '..', '..'), :cucumber => true, :earth => [:locality, :fuel, :residence]
@@ -8,14 +8,105 @@ module BrighterPlanet
8
8
  base.extend ::Leap::Subject
9
9
  base.decide :emission, :with => :characteristics do
10
10
  committee :emission do # returns kg CO2e
11
- quorum 'from default' do |characteristics|
12
- 100
11
+ quorum 'from duration, area, and emission factor', :needs => [:duration, :area, :emission_factor] do |characteristics|
12
+ characteristics[:duration] * characteristics[:area] * characteristics[:emission_factor]
13
13
  end
14
14
 
15
15
  quorum 'default' do
16
16
  raise "The emission committee's default quorum should never be called"
17
17
  end
18
18
  end
19
+
20
+ committee :emission_factor do # returns kg CO2e / square metre hour
21
+ quorum 'from fuel intensities', :needs => [:natural_gas_intensity, :fuel_oil_intensity, :electricity_intensity, :district_heat_intensity] do |characteristics|
22
+ natural_gas = FuelType.find_by_name "Commercial Natural Gas"
23
+ fuel_oil = FuelType.find_by_name "Distillate Fuel Oil 2"
24
+ electricity = ResidenceFuelType.find_by_name "electricity"
25
+
26
+ # FIXME TODO won't need this once we convert emission factors to co2 / unit energy
27
+ # kg / J kg / cubic m J / cubic m
28
+ natural_gas_energy_ef = natural_gas.emission_factor / 38_339_000
29
+
30
+ # FIXME TODO won't need this once we convert emission factors to co2 / unit energy
31
+ # kg / J kg / l J / l
32
+ fuel_oil_energy_ef = fuel_oil.emission_factor / 38_655_000
33
+
34
+ # based on CA-CP calculator
35
+ # assume district heat is 50% natural gas 50% distillate fuel
36
+ # assume natural gas boilers 81.7% efficient; fuel oil boilers 84.6% efficient
37
+ # assume 5% transmission loss
38
+ district_heat_emission_factor = (((natural_gas_energy_ef / 0.817) / 2) + ((fuel_oil_energy_ef / 0.846) / 2)) / 0.95
39
+
40
+ (characteristics[:natural_gas_intensity] * natural_gas.emission_factor) +
41
+ (characteristics[:fuel_oil_intensity] * fuel_oil.emission_factor) +
42
+ (characteristics[:electricity_intensity] * electricity.emission_factor) +
43
+ (characteristics[:district_heat_intensity] * district_heat_emission_factor)
44
+ end
45
+ end
46
+
47
+ committee :natural_gas_intensity do # returns cubic metres per square metre hour
48
+ quorum 'from census division', :needs => :census_division do |characteristics|
49
+ characteristics[:census_division].meeting_building_natural_gas_intensity
50
+ end
51
+
52
+ quorum 'default' do
53
+ CensusDivision.fallback.meeting_building_natural_gas_intensity
54
+ end
55
+ end
56
+
57
+ committee :fuel_oil_intensity do # returns litres per square metre hour
58
+ quorum 'from census division', :needs => :census_division do |characteristics|
59
+ characteristics[:census_division].meeting_building_fuel_oil_intensity
60
+ end
61
+
62
+ quorum 'default' do
63
+ CensusDivision.fallback.meeting_building_fuel_oil_intensity
64
+ end
65
+ end
66
+
67
+ committee :electricity_intensity do # returns kilowatt hours per square metre hour
68
+ quorum 'from census division', :needs => :census_division do |characteristics|
69
+ characteristics[:census_division].meeting_building_electricity_intensity
70
+ end
71
+
72
+ quorum 'default' do
73
+ CensusDivision.fallback.meeting_building_electricity_intensity
74
+ end
75
+ end
76
+
77
+ committee :district_heat_intensity do # returns joules per square metre hour
78
+ quorum 'from census division', :needs => :census_division do |characteristics|
79
+ characteristics[:census_division].meeting_building_district_heat_intensity
80
+ end
81
+
82
+ quorum 'default' do
83
+ CensusDivision.fallback.meeting_building_district_heat_intensity
84
+ end
85
+ end
86
+
87
+ committee :census_division do # returns census division
88
+ quorum 'from state', :needs => :state do |characteristics|
89
+ characteristics[:state].census_division
90
+ end
91
+ end
92
+
93
+ committee :state do # returns state
94
+ quorum 'from zip code', :needs => :zip_code do |characteristics|
95
+ characteristics[:zip_code].state
96
+ end
97
+ end
98
+
99
+ committee :area do # returns square meters
100
+ quorum 'default' do
101
+ base.fallback.area
102
+ end
103
+ end
104
+
105
+ committee :duration do # returns hours
106
+ quorum 'default' do
107
+ base.fallback.duration
108
+ end
109
+ end
19
110
  end
20
111
  end
21
112
  end
@@ -6,7 +6,10 @@ module BrighterPlanet
6
6
  def self.included(base)
7
7
  base.send :include, Characterizable
8
8
  base.characterize do
9
- has :something
9
+ has :area # square metres
10
+ has :duration # hours
11
+ has :zip_code
12
+ has :state
10
13
  end
11
14
  base.add_implicit_characteristics
12
15
  end
data/lib/meeting/data.rb CHANGED
@@ -6,9 +6,12 @@ module BrighterPlanet
6
6
  def self.included(base)
7
7
  base.data_miner do
8
8
  schema do
9
- float 'something'
9
+ float 'area'
10
+ float 'duration'
11
+ string 'zip_code_name'
12
+ string 'state_postal_abbreviation'
10
13
  end
11
-
14
+
12
15
  process :run_data_miner_on_belongs_to_associations
13
16
  end
14
17
  end
@@ -2,6 +2,9 @@ require 'sniff/database'
2
2
 
3
3
  Sniff::Database.define_schema do
4
4
  create_table "meeting_records", :force => true do |t|
5
- t.float 'something'
5
+ t.float 'duration'
6
+ t.float 'area'
7
+ t.string 'zip_code_name'
8
+ t.string 'state_postal_abbreviation'
6
9
  end
7
10
  end
@@ -6,4 +6,10 @@ require 'sniff'
6
6
  class MeetingRecord < ActiveRecord::Base
7
7
  include Sniff::Emitter
8
8
  include BrighterPlanet::Meeting
9
+
10
+ belongs_to :zip_code, :foreign_key => 'zip_code_name'
11
+ belongs_to :state, :foreign_key => 'state_postal_abbreviation'
12
+
13
+ falls_back_on :area => 12_750.square_feet.to(:square_metres), # assume median-sized meeting building
14
+ :duration => 8 # assume 1 day
9
15
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: meeting
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 25
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 3
10
+ version: 0.0.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - Andy Rossmeissl
@@ -19,14 +19,13 @@ autorequire:
19
19
  bindir: bin
20
20
  cert_chain: []
21
21
 
22
- date: 2010-09-14 00:00:00 -04:00
22
+ date: 2010-09-20 00:00:00 -07:00
23
23
  default_executable:
24
24
  dependencies:
25
25
  - !ruby/object:Gem::Dependency
26
- type: :development
27
- prerelease: false
28
26
  name: activerecord
29
- version_requirements: &id001 !ruby/object:Gem::Requirement
27
+ prerelease: false
28
+ requirement: &id001 !ruby/object:Gem::Requirement
30
29
  none: false
31
30
  requirements:
32
31
  - - ~>
@@ -37,12 +36,12 @@ dependencies:
37
36
  - 0
38
37
  - 0
39
38
  version: 3.0.0
40
- requirement: *id001
41
- - !ruby/object:Gem::Dependency
42
39
  type: :development
43
- prerelease: false
40
+ version_requirements: *id001
41
+ - !ruby/object:Gem::Dependency
44
42
  name: bundler
45
- version_requirements: &id002 !ruby/object:Gem::Requirement
43
+ prerelease: false
44
+ requirement: &id002 !ruby/object:Gem::Requirement
46
45
  none: false
47
46
  requirements:
48
47
  - - ~>
@@ -53,12 +52,12 @@ dependencies:
53
52
  - 0
54
53
  - 0
55
54
  version: 1.0.0
56
- requirement: *id002
57
- - !ruby/object:Gem::Dependency
58
55
  type: :development
59
- prerelease: false
56
+ version_requirements: *id002
57
+ - !ruby/object:Gem::Dependency
60
58
  name: cucumber
61
- version_requirements: &id003 !ruby/object:Gem::Requirement
59
+ prerelease: false
60
+ requirement: &id003 !ruby/object:Gem::Requirement
62
61
  none: false
63
62
  requirements:
64
63
  - - ~>
@@ -69,12 +68,12 @@ dependencies:
69
68
  - 8
70
69
  - 3
71
70
  version: 0.8.3
72
- requirement: *id003
73
- - !ruby/object:Gem::Dependency
74
71
  type: :development
75
- prerelease: false
72
+ version_requirements: *id003
73
+ - !ruby/object:Gem::Dependency
76
74
  name: jeweler
77
- version_requirements: &id004 !ruby/object:Gem::Requirement
75
+ prerelease: false
76
+ requirement: &id004 !ruby/object:Gem::Requirement
78
77
  none: false
79
78
  requirements:
80
79
  - - ~>
@@ -85,12 +84,12 @@ dependencies:
85
84
  - 4
86
85
  - 0
87
86
  version: 1.4.0
88
- requirement: *id004
89
- - !ruby/object:Gem::Dependency
90
87
  type: :development
91
- prerelease: false
88
+ version_requirements: *id004
89
+ - !ruby/object:Gem::Dependency
92
90
  name: rake
93
- version_requirements: &id005 !ruby/object:Gem::Requirement
91
+ prerelease: false
92
+ requirement: &id005 !ruby/object:Gem::Requirement
94
93
  none: false
95
94
  requirements:
96
95
  - - ">="
@@ -99,12 +98,12 @@ dependencies:
99
98
  segments:
100
99
  - 0
101
100
  version: "0"
102
- requirement: *id005
103
- - !ruby/object:Gem::Dependency
104
101
  type: :development
105
- prerelease: false
102
+ version_requirements: *id005
103
+ - !ruby/object:Gem::Dependency
106
104
  name: rdoc
107
- version_requirements: &id006 !ruby/object:Gem::Requirement
105
+ prerelease: false
106
+ requirement: &id006 !ruby/object:Gem::Requirement
108
107
  none: false
109
108
  requirements:
110
109
  - - ">="
@@ -113,12 +112,12 @@ dependencies:
113
112
  segments:
114
113
  - 0
115
114
  version: "0"
116
- requirement: *id006
117
- - !ruby/object:Gem::Dependency
118
115
  type: :development
119
- prerelease: false
116
+ version_requirements: *id006
117
+ - !ruby/object:Gem::Dependency
120
118
  name: rspec
121
- version_requirements: &id007 !ruby/object:Gem::Requirement
119
+ prerelease: false
120
+ requirement: &id007 !ruby/object:Gem::Requirement
122
121
  none: false
123
122
  requirements:
124
123
  - - ~>
@@ -131,12 +130,12 @@ dependencies:
131
130
  - beta
132
131
  - 17
133
132
  version: 2.0.0.beta.17
134
- requirement: *id007
135
- - !ruby/object:Gem::Dependency
136
133
  type: :development
137
- prerelease: false
134
+ version_requirements: *id007
135
+ - !ruby/object:Gem::Dependency
138
136
  name: sniff
139
- version_requirements: &id008 !ruby/object:Gem::Requirement
137
+ prerelease: false
138
+ requirement: &id008 !ruby/object:Gem::Requirement
140
139
  none: false
141
140
  requirements:
142
141
  - - ~>
@@ -147,23 +146,24 @@ dependencies:
147
146
  - 1
148
147
  - 12
149
148
  version: 0.1.12
150
- requirement: *id008
149
+ type: :development
150
+ version_requirements: *id008
151
151
  - !ruby/object:Gem::Dependency
152
- type: :runtime
153
- prerelease: false
154
152
  name: emitter
155
- version_requirements: &id009 !ruby/object:Gem::Requirement
153
+ prerelease: false
154
+ requirement: &id009 !ruby/object:Gem::Requirement
156
155
  none: false
157
156
  requirements:
158
157
  - - ~>
159
158
  - !ruby/object:Gem::Version
160
- hash: 9
159
+ hash: 7
161
160
  segments:
162
161
  - 0
163
162
  - 0
164
- - 11
165
- version: 0.0.11
166
- requirement: *id009
163
+ - 12
164
+ version: 0.0.12
165
+ type: :runtime
166
+ version_requirements: *id009
167
167
  description: A software model in Ruby for the greenhouse gas emissions of a meeting
168
168
  email: andy@rossmeissl.net
169
169
  executables: []