carbon 1.1.3 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. data/.gitignore +4 -22
  2. data/CHANGELOG +11 -0
  3. data/Gemfile +10 -1
  4. data/README.markdown +185 -0
  5. data/Rakefile +13 -26
  6. data/bin/carbon +3 -3
  7. data/carbon.gemspec +17 -23
  8. data/developer_notes/MULTI.markdown +25 -0
  9. data/developer_notes/REDUCE_HTTP_CONNECTIONS.markdown +46 -0
  10. data/features/shell.feature +1 -1
  11. data/features/support/env.rb +3 -4
  12. data/lib/carbon.rb +242 -96
  13. data/lib/carbon/registry.rb +50 -0
  14. data/lib/carbon/shell.rb +14 -8
  15. data/lib/carbon/shell/emitter.rb +33 -29
  16. data/lib/carbon/version.rb +1 -1
  17. data/test/carbon_test.rb +167 -0
  18. metadata +128 -182
  19. data/MIT-LICENSE.txt +0 -19
  20. data/README.rdoc +0 -266
  21. data/doc/INTEGRATION_GUIDE.rdoc +0 -1002
  22. data/doc/examining-response-with-jsonview.png +0 -0
  23. data/doc/shell_example +0 -43
  24. data/doc/timeout-error.png +0 -0
  25. data/doc/with-committee-reports.png +0 -0
  26. data/doc/without-committee-reports.png +0 -0
  27. data/lib/carbon/base.rb +0 -62
  28. data/lib/carbon/emission_estimate.rb +0 -165
  29. data/lib/carbon/emission_estimate/request.rb +0 -100
  30. data/lib/carbon/emission_estimate/response.rb +0 -61
  31. data/lib/carbon/emission_estimate/storage.rb +0 -33
  32. data/spec/fixtures/vcr_cassettes/flight.yml +0 -47
  33. data/spec/fixtures/vcr_cassettes/residence.yml +0 -44
  34. data/spec/lib/carbon/emission_estimate/request_spec.rb +0 -41
  35. data/spec/lib/carbon/emission_estimate/response_spec.rb +0 -33
  36. data/spec/lib/carbon/emission_estimate_spec.rb +0 -32
  37. data/spec/lib/carbon_spec.rb +0 -384
  38. data/spec/spec_helper.rb +0 -60
  39. data/spec/specwatchr +0 -60
@@ -1,21 +1,26 @@
1
+ require 'uri'
2
+ require 'net/http'
3
+ require 'conversions'
4
+
1
5
  module Carbon
2
6
  class Shell
7
+ # @private
3
8
  class Emitter < Bombshell::Environment
4
9
  include Bombshell::Shell
5
10
  include Carbon
6
11
 
12
+ # @private
7
13
  def initialize(name, input = {})
8
- @emitter = name
14
+ @emitter = name.to_s.singularize.camelcase
9
15
  @input = input
10
- characteristics_url = "http://carbon.brighterplanet.com/#{@emitter.to_s.pluralize}/options.json"
11
- response = REST.get(characteristics_url)
12
- if response.ok?
13
- @characteristics = ActiveSupport::JSON.decode response.body
16
+ response = ::Net::HTTP.get_response(::URI.parse("http://impact.brighterplanet.com/#{@emitter.underscore.pluralize}/options.json"))
17
+ if (200..299).include?(response.code.to_i)
18
+ @characteristics = ::MultiJson.decode response.body
14
19
  @characteristics.keys.each do |characteristic|
15
20
  instance_eval <<-meth
16
21
  def #{characteristic}(arg = nil)
17
22
  if arg
18
- @input[:#{characteristic}] = arg
23
+ @input[:#{characteristic}] = arg.to_s.strip
19
24
  emission
20
25
  else
21
26
  @input[:#{characteristic}]
@@ -23,19 +28,17 @@ module Carbon
23
28
  end
24
29
  meth
25
30
  end
26
- if self.class.carbon_base && self.class.carbon_base.translation_table.any?
27
- self.class.carbon_base.reset_translation_table!
28
- end
29
31
  provisions = @characteristics.keys.map { |k| "provide :#{k}"}.join('; ')
30
32
  emit_as_block = "emit_as(:#{name}) { #{provisions} }"
31
33
  self.class.class_eval emit_as_block
32
34
  emission
33
35
  else
34
- puts " => Sorry, characteristics couldn't be retrieved for #{@emitter.to_s.pluralize} (via #{url})"
36
+ puts " => Sorry, characteristics couldn't be retrieved for #{@emitter.underscore.pluralize} (via #{url})"
35
37
  done
36
38
  end
37
39
  end
38
40
 
41
+ # @private
39
42
  def timeframe(t = nil)
40
43
  if t
41
44
  @timeframe = t
@@ -47,23 +50,28 @@ module Carbon
47
50
  end
48
51
  end
49
52
 
53
+ # @private
50
54
  def emission
51
55
  puts " => #{emission_in_kilograms} kg CO2e"
52
56
  end
53
57
 
58
+ # @private
54
59
  def emission_in_kilograms
55
- ::Carbon::EmissionEstimate.new(self, :timeframe => @timeframe).to_f
60
+ impact(:timeframe => @timeframe).decisions.carbon.object.value
56
61
  end
57
62
 
63
+ # @private
58
64
  def lbs
59
65
  puts " => #{emission_in_kilograms.kilograms.to :pounds} lbs CO2e"
60
66
  end
61
67
  alias :pounds :lbs
62
68
 
69
+ # @private
63
70
  def tons
64
71
  puts " => #{emission_in_kilograms.kilograms.to :tons} lbs CO2e"
65
72
  end
66
73
 
74
+ # @private
67
75
  def characteristics
68
76
  if @input.empty?
69
77
  puts " => (none)"
@@ -80,42 +88,40 @@ module Carbon
80
88
  end
81
89
  end
82
90
 
91
+ # @private
83
92
  def url
84
- request = ::Carbon::EmissionEstimate.new(self, :timeframe => @timeframe).request
85
- url = request.url
86
- if request.body.present?
87
- url << '?'
88
- url << request.body
89
- end
90
- puts " => #{url}"
93
+ puts " => #{impact(:timeframe => @timeframe).methodology}"
91
94
  end
92
95
 
96
+ # @private
93
97
  def methodology
94
98
  first = true
95
- ::Carbon::EmissionEstimate.new(self, :timeframe => @timeframe).reports.each do |report|
99
+ impact(:timeframe => @timeframe).decisions.each do |name, report|
96
100
  if first
97
101
  w = ' => '
98
102
  first = false
99
103
  else
100
104
  w = ' '
101
105
  end
102
- puts w + "#{report['committee']['name']}: #{report['quorum']['name']}"
106
+ puts w + "#{name}: #{report.methodology}"
103
107
  end
104
108
  end
105
109
 
110
+ # @private
106
111
  def reports
107
112
  first = true
108
- ::Carbon::EmissionEstimate.new(self, @timeframe => :timeframe).reports.each do |report|
113
+ impact(:timeframe => @timeframe).decisions.each do |name, report|
109
114
  if first
110
115
  w = ' => '
111
116
  first = false
112
117
  else
113
118
  w = ' '
114
119
  end
115
- puts w + "#{report['committee']['name']}: #{report['conclusion'].inspect}"
120
+ puts w + "#{name}: #{report.object.inspect}"
116
121
  end
117
122
  end
118
123
 
124
+ # @private
119
125
  def help
120
126
  puts " => #{@characteristics.keys.join ', '}"
121
127
  end
@@ -128,30 +134,28 @@ module Carbon
128
134
  end
129
135
  end
130
136
 
137
+ # @private
131
138
  def _name
132
139
  @emitter
133
140
  end
134
141
 
142
+ # @private
135
143
  def _timeframe
136
144
  @timeframe
137
145
  end
138
146
 
147
+ # @private
139
148
  def inspect
140
- "<Emitter[#{@emitter}]: #{@input.inspect}>"
149
+ "#<Emitter[#{@emitter}]: #{@input.inspect}>"
141
150
  end
142
151
 
152
+ # @private
143
153
  def done
144
154
  $emitters[@emitter] ||= []
145
155
  $emitters[@emitter] << @input
146
156
  puts " => Saved as #{@emitter} ##{$emitters[@emitter].length - 1}"
147
157
  quit
148
158
  end
149
-
150
- class << self
151
- def emitter_name
152
- @name
153
- end
154
- end
155
159
  end
156
160
  end
157
161
  end
@@ -1,3 +1,3 @@
1
1
  module Carbon
2
- VERSION = '1.1.3'
2
+ VERSION = "2.0.0"
3
3
  end
@@ -0,0 +1,167 @@
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'benchmark'
4
+ require 'webmock/minitest'
5
+ WebMock.disable!
6
+ def with_web_mock
7
+ WebMock.enable!
8
+ WebMock.disable_net_connect!
9
+ yield
10
+ ensure
11
+ WebMock.disable!
12
+ end
13
+ require 'minitest/spec'
14
+ require 'minitest/autorun'
15
+ require 'minitest/reporters'
16
+ MiniTest::Unit.runner = MiniTest::SuiteRunner.new
17
+ MiniTest::Unit.runner.reporters << MiniTest::Reporters::SpecReporter.new
18
+ require 'timeframe'
19
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
20
+ require 'carbon'
21
+
22
+ Carbon.key = 'carbon_test'
23
+
24
+ class MyNissan
25
+ def name
26
+ 'Nissan'
27
+ end
28
+ def to_s
29
+ raise "Not fair!"
30
+ end
31
+ alias :inspect :to_s
32
+ end
33
+
34
+ class MyNissanAltima
35
+ class << self
36
+ def all(options)
37
+ raise unless options == { :order => :year }
38
+ [ new(2000), new(2001), new(2002), new(2003), new(2004) ]
39
+ end
40
+ end
41
+ def initialize(model_year)
42
+ @model_year = model_year
43
+ end
44
+ def make; MyNissan.new end
45
+ def model; 'Altima' end
46
+ def model_year; @model_year end # what BP knows as "year"
47
+ def fuel_type; 'R' end # what BP knows as "automobile_fuel" and keys on "code"
48
+ include Carbon
49
+ emit_as 'Automobile' do
50
+ provide(:make) { |my_nissan_altima| my_nissan_altima.make.name }
51
+ provide :model
52
+ provide :model_year, :as => :year
53
+ provide :fuel_type, :as => :automobile_fuel, :key => :code
54
+ end
55
+ end
56
+
57
+ describe Carbon do
58
+ # args could be mmm(:post, 'http://impact.brighterplanet.com/monkeys.json').to_return(:status => 500, :body => 'too many monkeys')
59
+ describe :query do
60
+ it "calculates flight impact" do
61
+ response = Carbon.query('Flight', :origin_airport => 'LAX', :destination_airport => 'SFO', :segments_per_trip => 1, :trips => 1)
62
+ response.decisions.carbon.object.value.must_be_close_to 200, 50
63
+ end
64
+ it "gets back characteristics" do
65
+ response = Carbon.query('Flight', :origin_airport => 'LAX', :destination_airport => 'SFO', :segments_per_trip => 1, :trips => 1)
66
+ response.characteristics.origin_airport.description.must_match %r{lax}i
67
+ end
68
+ it "tells you if the query is successful" do
69
+ response = Carbon.query('Flight')
70
+ response.success.must_equal true
71
+ end
72
+ it "is gentle about errors" do
73
+ response = Carbon.query('Monkey')
74
+ response.success.must_equal false
75
+ end
76
+ it "sends timeframe properly" do
77
+ response = Carbon.query('Flight', :timeframe => Timeframe.new(:year => 2009))
78
+ response.timeframe.startDate.must_equal '2009-01-01'
79
+ response.timeframe.endDate.must_equal '2010-01-01'
80
+ end
81
+ it "sends key properly" do
82
+ with_web_mock do
83
+ WebMock.stub_request(:post, 'http://impact.brighterplanet.com/flights.json').with(:key => 'carbon_test').to_return(:status => 500, :body => 'Good job')
84
+ response = Carbon.query('Flight')
85
+ response.error_body.must_equal 'Good job'
86
+ end
87
+ end
88
+ end
89
+ unless ENV['SKIP_MULTI'] == 'true'
90
+ describe :multi do
91
+ before do
92
+ @queries = []
93
+ 10.times do
94
+ @queries << ['Flight', {:origin_airport => 'LAX', :destination_airport => 'SFO', :segments_per_trip => 1, :trips => 1}]
95
+ @queries << ['RailTrip', {:distance => 25}]
96
+ @queries << ['AutomobileTrip', {:make => 'Nissan', :model => 'Altima'}]
97
+ @queries << ['Residence']
98
+ @queries << ['Monkey']
99
+ end
100
+ @queries = @queries.sort_by { rand }
101
+ end
102
+ it "runs multiple queries at once" do
103
+ responses = Carbon.multi(@queries)
104
+ error_count = 0
105
+ responses.each do |response|
106
+ if response.success
107
+ response.decisions.carbon.object.value.must_be :>, 0
108
+ response.decisions.carbon.object.value.must_be :<, 10_000
109
+ else
110
+ error_count += 1
111
+ end
112
+ end
113
+ error_count.must_equal 10
114
+ @queries.each_with_index do |query, i|
115
+ reference_response = Carbon.query(*query)
116
+ if reference_response.success
117
+ responses[i].decisions.must_equal reference_response.decisions
118
+ end
119
+ end
120
+ end
121
+ it "is faster than just calling #query over and over" do
122
+ # dry run
123
+ @queries.each { |query| Carbon.query(*query) }
124
+ # --
125
+ single_threaded_time = ::Benchmark.realtime do
126
+ @queries.each { |query| Carbon.query(*query) }
127
+ end
128
+ multi_threaded_time = ::Benchmark.realtime do
129
+ Carbon.multi(@queries)
130
+ end
131
+ # Carbon::#multi
132
+ # PASS test_0001_runs_multiple_queries_at_once (12.10s)
133
+ # Multi-threaded was 95% faster
134
+ # PASS test_0002_is_faster_than_just_calling_query_over_and_over (23.73s)
135
+ $stderr.puts " Multi-threaded was #{((single_threaded_time - multi_threaded_time) / single_threaded_time * 100).round}% faster"
136
+ multi_threaded_time.must_be :<, single_threaded_time
137
+ end
138
+ end
139
+ end
140
+ describe "mixin" do
141
+ describe :emit_as do
142
+ it "overwrites old emit_as blocks" do
143
+ eval %{class MyFoo; include Carbon; end}
144
+ MyFoo.emit_as('Automobile') { provide(:make) }
145
+ Carbon::Registry.instance['MyFoo'].characteristics.keys.must_equal [:make]
146
+ MyFoo.emit_as('Automobile') { provide(:model) }
147
+ Carbon::Registry.instance['MyFoo'].characteristics.keys.must_equal [:model]
148
+ end
149
+ end
150
+ describe '#impact' do
151
+ it "works" do
152
+ impact = MyNissanAltima.new(2006).impact
153
+ impact.decisions.carbon.object.value.must_be :>, 0
154
+ impact.characteristics.make.description.must_match %r{Nissan}i
155
+ impact.characteristics.model.description.must_match %r{Altima}i
156
+ impact.characteristics.year.description.to_i.must_equal 2006
157
+ impact.characteristics.automobile_fuel.description.must_match %r{regular gasoline}
158
+ end
159
+ it "takes timeframe" do
160
+ impact_2010 = MyNissanAltima.new(2006).impact(:timeframe => Timeframe.new(:year => 2010))
161
+ impact_2011 = MyNissanAltima.new(2006).impact(:timeframe => Timeframe.new(:year => 2011))
162
+ impact_2010.timeframe.startDate.must_equal '2010-01-01'
163
+ impact_2011.timeframe.startDate.must_equal '2011-01-01'
164
+ end
165
+ end
166
+ end
167
+ end
metadata CHANGED
@@ -1,238 +1,184 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: carbon
3
- version: !ruby/object:Gem::Version
4
- version: 1.1.3
3
+ version: !ruby/object:Gem::Version
4
+ hash: 15
5
5
  prerelease:
6
+ segments:
7
+ - 2
8
+ - 0
9
+ - 0
10
+ version: 2.0.0
6
11
  platform: ruby
7
- authors:
8
- - Derek Kastner
12
+ authors:
9
13
  - Seamus Abshere
10
- - Andy Rossmeissl
11
14
  autorequire:
12
15
  bindir: bin
13
16
  cert_chain: []
14
- date: 2011-11-17 00:00:00.000000000Z
15
- dependencies:
16
- - !ruby/object:Gem::Dependency
17
- name: activesupport
18
- requirement: &2167482440 !ruby/object:Gem::Requirement
19
- none: false
20
- requirements:
21
- - - ! '>='
22
- - !ruby/object:Gem::Version
23
- version: 2.3.5
24
- type: :runtime
17
+
18
+ date: 2012-03-09 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: em-http-request
25
22
  prerelease: false
26
- version_requirements: *2167482440
27
- - !ruby/object:Gem::Dependency
28
- name: i18n
29
- requirement: &2167482000 !ruby/object:Gem::Requirement
23
+ requirement: &id001 !ruby/object:Gem::Requirement
30
24
  none: false
31
- requirements:
32
- - - ! '>='
33
- - !ruby/object:Gem::Version
34
- version: '0'
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ hash: 3
29
+ segments:
30
+ - 0
31
+ version: "0"
35
32
  type: :runtime
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: activesupport
36
36
  prerelease: false
37
- version_requirements: *2167482000
38
- - !ruby/object:Gem::Dependency
39
- name: nap
40
- requirement: &2167481360 !ruby/object:Gem::Requirement
37
+ requirement: &id002 !ruby/object:Gem::Requirement
41
38
  none: false
42
- requirements:
43
- - - ! '>='
44
- - !ruby/object:Gem::Version
45
- version: '0'
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 3
43
+ segments:
44
+ - 0
45
+ version: "0"
46
46
  type: :runtime
47
+ version_requirements: *id002
48
+ - !ruby/object:Gem::Dependency
49
+ name: multi_json
47
50
  prerelease: false
48
- version_requirements: *2167481360
49
- - !ruby/object:Gem::Dependency
50
- name: timeframe
51
- requirement: &2167480700 !ruby/object:Gem::Requirement
51
+ requirement: &id003 !ruby/object:Gem::Requirement
52
52
  none: false
53
- requirements:
54
- - - ! '>='
55
- - !ruby/object:Gem::Version
56
- version: '0'
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 0
59
+ version: "0"
57
60
  type: :runtime
61
+ version_requirements: *id003
62
+ - !ruby/object:Gem::Dependency
63
+ name: hashie
58
64
  prerelease: false
59
- version_requirements: *2167480700
60
- - !ruby/object:Gem::Dependency
61
- name: blockenspiel
62
- requirement: &2167480040 !ruby/object:Gem::Requirement
65
+ requirement: &id004 !ruby/object:Gem::Requirement
63
66
  none: false
64
- requirements:
65
- - - ! '>='
66
- - !ruby/object:Gem::Version
67
- version: '0'
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ hash: 3
71
+ segments:
72
+ - 0
73
+ version: "0"
68
74
  type: :runtime
75
+ version_requirements: *id004
76
+ - !ruby/object:Gem::Dependency
77
+ name: bombshell
69
78
  prerelease: false
70
- version_requirements: *2167480040
71
- - !ruby/object:Gem::Dependency
72
- name: conversions
73
- requirement: &2167479540 !ruby/object:Gem::Requirement
79
+ requirement: &id005 !ruby/object:Gem::Requirement
74
80
  none: false
75
- requirements:
76
- - - ! '>='
77
- - !ruby/object:Gem::Version
78
- version: '0'
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ hash: 3
85
+ segments:
86
+ - 0
87
+ version: "0"
79
88
  type: :runtime
89
+ version_requirements: *id005
90
+ - !ruby/object:Gem::Dependency
91
+ name: conversions
80
92
  prerelease: false
81
- version_requirements: *2167479540
82
- - !ruby/object:Gem::Dependency
83
- name: brighter_planet_metadata
84
- requirement: &2167479120 !ruby/object:Gem::Requirement
93
+ requirement: &id006 !ruby/object:Gem::Requirement
85
94
  none: false
86
- requirements:
87
- - - ! '>='
88
- - !ruby/object:Gem::Version
89
- version: '0'
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ hash: 3
99
+ segments:
100
+ - 0
101
+ version: "0"
90
102
  type: :runtime
103
+ version_requirements: *id006
104
+ - !ruby/object:Gem::Dependency
105
+ name: brighter_planet_metadata
91
106
  prerelease: false
92
- version_requirements: *2167479120
93
- - !ruby/object:Gem::Dependency
94
- name: bombshell
95
- requirement: &2167478680 !ruby/object:Gem::Requirement
107
+ requirement: &id007 !ruby/object:Gem::Requirement
96
108
  none: false
97
- requirements:
98
- - - ! '>='
99
- - !ruby/object:Gem::Version
100
- version: '0'
109
+ requirements:
110
+ - - ">="
111
+ - !ruby/object:Gem::Version
112
+ hash: 3
113
+ segments:
114
+ - 0
115
+ version: "0"
101
116
  type: :runtime
102
- prerelease: false
103
- version_requirements: *2167478680
104
- - !ruby/object:Gem::Dependency
105
- name: fakeweb
106
- requirement: &2167478180 !ruby/object:Gem::Requirement
107
- none: false
108
- requirements:
109
- - - ! '>='
110
- - !ruby/object:Gem::Version
111
- version: '0'
112
- type: :development
113
- prerelease: false
114
- version_requirements: *2167478180
115
- - !ruby/object:Gem::Dependency
116
- name: rspec
117
- requirement: &2167477600 !ruby/object:Gem::Requirement
118
- none: false
119
- requirements:
120
- - - ! '>='
121
- - !ruby/object:Gem::Version
122
- version: '0'
123
- type: :development
124
- prerelease: false
125
- version_requirements: *2167477600
126
- - !ruby/object:Gem::Dependency
127
- name: aruba
128
- requirement: &2167476940 !ruby/object:Gem::Requirement
129
- none: false
130
- requirements:
131
- - - ! '>='
132
- - !ruby/object:Gem::Version
133
- version: '0'
134
- type: :development
135
- prerelease: false
136
- version_requirements: *2167476940
137
- - !ruby/object:Gem::Dependency
138
- name: rake
139
- requirement: &2167475940 !ruby/object:Gem::Requirement
140
- none: false
141
- requirements:
142
- - - ! '>='
143
- - !ruby/object:Gem::Version
144
- version: '0'
145
- type: :development
146
- prerelease: false
147
- version_requirements: *2167475940
148
- - !ruby/object:Gem::Dependency
149
- name: vcr
150
- requirement: &2167475060 !ruby/object:Gem::Requirement
151
- none: false
152
- requirements:
153
- - - ! '>='
154
- - !ruby/object:Gem::Version
155
- version: '0'
156
- type: :development
157
- prerelease: false
158
- version_requirements: *2167475060
159
- description: Carbon is a Ruby API wrapper for the Brighter Planet emission estimate
160
- web service (http://carbon.brighterplanet.com). By querying the web service, it
161
- can estimate the carbon emissions of many real-life objects, such as cars and houses,
162
- based on particular attributes that they may have.
163
- email:
164
- - derek.kastner@brighterplanet.com
165
- executables:
117
+ version_requirements: *id007
118
+ description: Brighter Planet API client for Ruby
119
+ email:
120
+ - seamus@abshere.net
121
+ - dkastner@gmail.com
122
+ - andy@rossmeissl.net
123
+ executables:
166
124
  - carbon
167
125
  extensions: []
126
+
168
127
  extra_rdoc_files: []
169
- files:
128
+
129
+ files:
170
130
  - .gitignore
131
+ - CHANGELOG
171
132
  - Gemfile
172
- - MIT-LICENSE.txt
173
- - README.rdoc
133
+ - README.markdown
174
134
  - Rakefile
175
135
  - bin/carbon
176
136
  - carbon.gemspec
177
- - doc/INTEGRATION_GUIDE.rdoc
178
- - doc/examining-response-with-jsonview.png
179
- - doc/shell_example
180
- - doc/timeout-error.png
181
- - doc/with-committee-reports.png
182
- - doc/without-committee-reports.png
137
+ - developer_notes/MULTI.markdown
138
+ - developer_notes/REDUCE_HTTP_CONNECTIONS.markdown
183
139
  - features/shell.feature
184
140
  - features/support/env.rb
185
141
  - lib/carbon.rb
186
- - lib/carbon/base.rb
187
- - lib/carbon/emission_estimate.rb
188
- - lib/carbon/emission_estimate/request.rb
189
- - lib/carbon/emission_estimate/response.rb
190
- - lib/carbon/emission_estimate/storage.rb
191
142
  - lib/carbon/registry.rb
192
143
  - lib/carbon/shell.rb
193
144
  - lib/carbon/shell/emitter.rb
194
145
  - lib/carbon/version.rb
195
- - spec/fixtures/vcr_cassettes/flight.yml
196
- - spec/fixtures/vcr_cassettes/residence.yml
197
- - spec/lib/carbon/emission_estimate/request_spec.rb
198
- - spec/lib/carbon/emission_estimate/response_spec.rb
199
- - spec/lib/carbon/emission_estimate_spec.rb
200
- - spec/lib/carbon_spec.rb
201
- - spec/spec_helper.rb
202
- - spec/specwatchr
146
+ - test/carbon_test.rb
203
147
  homepage: https://github.com/brighterplanet/carbon
204
148
  licenses: []
149
+
205
150
  post_install_message:
206
151
  rdoc_options: []
207
- require_paths:
152
+
153
+ require_paths:
208
154
  - lib
209
- required_ruby_version: !ruby/object:Gem::Requirement
155
+ required_ruby_version: !ruby/object:Gem::Requirement
210
156
  none: false
211
- requirements:
212
- - - ! '>='
213
- - !ruby/object:Gem::Version
214
- version: '0'
215
- required_rubygems_version: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - ">="
159
+ - !ruby/object:Gem::Version
160
+ hash: 3
161
+ segments:
162
+ - 0
163
+ version: "0"
164
+ required_rubygems_version: !ruby/object:Gem::Requirement
216
165
  none: false
217
- requirements:
218
- - - ! '>='
219
- - !ruby/object:Gem::Version
220
- version: '0'
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ hash: 3
170
+ segments:
171
+ - 0
172
+ version: "0"
221
173
  requirements: []
174
+
222
175
  rubyforge_project:
223
- rubygems_version: 1.8.11
176
+ rubygems_version: 1.8.17
224
177
  signing_key:
225
178
  specification_version: 3
226
- summary: Carbon is a Ruby API wrapper for the Brighter Planet emission estimate web
227
- service (http://carbon.brighterplanet.com).
228
- test_files:
179
+ summary: Brighter Planet API client for Ruby
180
+ test_files:
229
181
  - features/shell.feature
230
182
  - features/support/env.rb
231
- - spec/fixtures/vcr_cassettes/flight.yml
232
- - spec/fixtures/vcr_cassettes/residence.yml
233
- - spec/lib/carbon/emission_estimate/request_spec.rb
234
- - spec/lib/carbon/emission_estimate/response_spec.rb
235
- - spec/lib/carbon/emission_estimate_spec.rb
236
- - spec/lib/carbon_spec.rb
237
- - spec/spec_helper.rb
238
- - spec/specwatchr
183
+ - test/carbon_test.rb
184
+ has_rdoc: