carbon 0.2.7 → 0.3.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.
- data/Rakefile +1 -0
- data/VERSION +1 -1
- data/bin/carbon +17 -0
- data/carbon.gemspec +14 -2
- data/doc/shell_example +43 -0
- data/lib/carbon.rb +1 -1
- data/lib/carbon/base.rb +4 -0
- data/lib/carbon/cli.rb +21 -0
- data/lib/carbon/cli/emitter.rb +126 -0
- data/lib/carbon/cli/environment.rb +16 -0
- data/lib/carbon/cli/irb.rb +32 -0
- data/lib/carbon/cli/shell.rb +42 -0
- data/lib/carbon/emission_estimate.rb +4 -0
- metadata +33 -12
data/Rakefile
CHANGED
@@ -16,6 +16,7 @@ begin
|
|
16
16
|
# This is still only on Rubyforge
|
17
17
|
gemspec.add_dependency 'SystemTimer', '>=1.2'
|
18
18
|
gemspec.add_dependency 'blockenspiel', '>=0.3.2'
|
19
|
+
gemspec.add_dependency 'conversions', '~>1'
|
19
20
|
|
20
21
|
gemspec.add_development_dependency 'fakeweb', '>=1.2.8'
|
21
22
|
# sabshere 7/16/10 if you're having trouble running specs, try "rspec spec" and/or "sudo gem install rspec --pre"
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/bin/carbon
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$:.unshift(File.dirname(__FILE__) + '/../lib') unless $:.include?(File.dirname(__FILE__) + '/../lib')
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'carbon'
|
6
|
+
require 'carbon/cli'
|
7
|
+
begin
|
8
|
+
# The dup is to keep ARGV intact, so that tools like ruby-debug can respawn.
|
9
|
+
failure = Carbon::Cli.execute(ARGV.dup)
|
10
|
+
Kernel.exit(failure ? 1 : 0)
|
11
|
+
rescue SystemExit => e
|
12
|
+
Kernel.exit(e.status)
|
13
|
+
rescue Exception => e
|
14
|
+
STDERR.puts("#{e.message} (#{e.class})")
|
15
|
+
STDERR.puts(e.backtrace.join("\n"))
|
16
|
+
Kernel.exit(1)
|
17
|
+
end
|
data/carbon.gemspec
CHANGED
@@ -5,13 +5,15 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{carbon}
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.3.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Derek Kastner", "Seamus Abshere", "Andy Rossmeissl"]
|
12
|
-
s.date = %q{2010-
|
12
|
+
s.date = %q{2010-10-01}
|
13
|
+
s.default_executable = %q{carbon}
|
13
14
|
s.description = %q{Carbon is a Ruby API wrapper for the Brighter Planet emission estimate web service (http://carbon.brighterplanet.com). By querying the web service, it can estimate the carbon emissions of many real-life objects, such as cars and houses, based on particular attributes that they may have.}
|
14
15
|
s.email = %q{derek.kastner@brighterplanet.com}
|
16
|
+
s.executables = ["carbon"]
|
15
17
|
s.extra_rdoc_files = [
|
16
18
|
"README.rdoc"
|
17
19
|
]
|
@@ -21,14 +23,21 @@ Gem::Specification.new do |s|
|
|
21
23
|
"README.rdoc",
|
22
24
|
"Rakefile",
|
23
25
|
"VERSION",
|
26
|
+
"bin/carbon",
|
24
27
|
"carbon.gemspec",
|
25
28
|
"doc/INTEGRATION_GUIDE.rdoc",
|
26
29
|
"doc/examining-response-with-jsonview.png",
|
30
|
+
"doc/shell_example",
|
27
31
|
"doc/timeout-error.png",
|
28
32
|
"doc/with-committee-reports.png",
|
29
33
|
"doc/without-committee-reports.png",
|
30
34
|
"lib/carbon.rb",
|
31
35
|
"lib/carbon/base.rb",
|
36
|
+
"lib/carbon/cli.rb",
|
37
|
+
"lib/carbon/cli/emitter.rb",
|
38
|
+
"lib/carbon/cli/environment.rb",
|
39
|
+
"lib/carbon/cli/irb.rb",
|
40
|
+
"lib/carbon/cli/shell.rb",
|
32
41
|
"lib/carbon/emission_estimate.rb",
|
33
42
|
"lib/carbon/emission_estimate/request.rb",
|
34
43
|
"lib/carbon/emission_estimate/response.rb",
|
@@ -59,6 +68,7 @@ Gem::Specification.new do |s|
|
|
59
68
|
s.add_runtime_dependency(%q<timeframe>, [">= 0.0.7"])
|
60
69
|
s.add_runtime_dependency(%q<SystemTimer>, [">= 1.2"])
|
61
70
|
s.add_runtime_dependency(%q<blockenspiel>, [">= 0.3.2"])
|
71
|
+
s.add_runtime_dependency(%q<conversions>, ["~> 1"])
|
62
72
|
s.add_development_dependency(%q<fakeweb>, [">= 1.2.8"])
|
63
73
|
s.add_development_dependency(%q<rspec>, [">= 2.0.0.beta.17"])
|
64
74
|
else
|
@@ -67,6 +77,7 @@ Gem::Specification.new do |s|
|
|
67
77
|
s.add_dependency(%q<timeframe>, [">= 0.0.7"])
|
68
78
|
s.add_dependency(%q<SystemTimer>, [">= 1.2"])
|
69
79
|
s.add_dependency(%q<blockenspiel>, [">= 0.3.2"])
|
80
|
+
s.add_dependency(%q<conversions>, ["~> 1"])
|
70
81
|
s.add_dependency(%q<fakeweb>, [">= 1.2.8"])
|
71
82
|
s.add_dependency(%q<rspec>, [">= 2.0.0.beta.17"])
|
72
83
|
end
|
@@ -76,6 +87,7 @@ Gem::Specification.new do |s|
|
|
76
87
|
s.add_dependency(%q<timeframe>, [">= 0.0.7"])
|
77
88
|
s.add_dependency(%q<SystemTimer>, [">= 1.2"])
|
78
89
|
s.add_dependency(%q<blockenspiel>, [">= 0.3.2"])
|
90
|
+
s.add_dependency(%q<conversions>, ["~> 1"])
|
79
91
|
s.add_dependency(%q<fakeweb>, [">= 1.2.8"])
|
80
92
|
s.add_dependency(%q<rspec>, [">= 2.0.0.beta.17"])
|
81
93
|
end
|
data/doc/shell_example
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
carbon> key '123abc'
|
2
|
+
=> Using key 123abc
|
3
|
+
carbon> help
|
4
|
+
=> flight, automobile, ...
|
5
|
+
carbon> flight
|
6
|
+
=> 974 kg CO2e
|
7
|
+
flight> lbs
|
8
|
+
=> 123 lbs CO2e
|
9
|
+
flight> tons
|
10
|
+
=> 1 ton CO2e
|
11
|
+
flight> help
|
12
|
+
=> origin_airport, destination_airport . . .
|
13
|
+
flight> origin_airport 'lax'
|
14
|
+
=> 1123 kg CO2e
|
15
|
+
flight> destination_airport 'jfk'
|
16
|
+
=> 1375 kg CO2e
|
17
|
+
flight> characteristics
|
18
|
+
=> Origin airport: JFK
|
19
|
+
Destination airport: JFK
|
20
|
+
flight> methodology
|
21
|
+
=> Emission: from foo and bar
|
22
|
+
Foo: from baz
|
23
|
+
Bar: default
|
24
|
+
flight> url
|
25
|
+
=> http://carbon.brighterplanet.com/flights?key=123abc&origin_airport[iata_code]=lax&destination_airport[iata_code]=jfk
|
26
|
+
flight> done
|
27
|
+
=> Origin airport: JFK
|
28
|
+
Destination airport: JFK
|
29
|
+
1375 kg CO2e
|
30
|
+
http://carbon.brighterplanet.com/flights?key=123abc&origin_airport[iata_code]=lax&destination_airport[iata_code]=jfk
|
31
|
+
Saved as flight #1
|
32
|
+
carbon> flight 1
|
33
|
+
=> Origin airport: JFK
|
34
|
+
Destination airport: JFK
|
35
|
+
1375 kg CO2e
|
36
|
+
flight> done
|
37
|
+
=> Origin airport: JFK
|
38
|
+
Destination airport: JFK
|
39
|
+
1375 kg CO2e
|
40
|
+
http://carbon.brighterplanet.com/flights?key=123abc&origin_airport[iata_code]=lax&destination_airport[iata_code]=jfk
|
41
|
+
Saved as flight #1
|
42
|
+
carbon> exit
|
43
|
+
$
|
data/lib/carbon.rb
CHANGED
@@ -75,7 +75,7 @@ module Carbon
|
|
75
75
|
# provide :make
|
76
76
|
# end
|
77
77
|
def emit_as(emitter_common_name, &block)
|
78
|
-
self.carbon_base
|
78
|
+
self.carbon_base = ::Carbon::Base.new self, emitter_common_name
|
79
79
|
::Blockenspiel.invoke block, carbon_base
|
80
80
|
end
|
81
81
|
# Third-person singular preferred.
|
data/lib/carbon/base.rb
CHANGED
data/lib/carbon/cli.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
module Carbon
|
2
|
+
module Cli
|
3
|
+
def execute(*)
|
4
|
+
$emitters = {}
|
5
|
+
IRB.start_session(Shell.new.get_binding)
|
6
|
+
end
|
7
|
+
module_function :execute
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
require 'carbon/cli/environment'
|
12
|
+
require 'carbon/cli/shell'
|
13
|
+
require 'carbon/cli/emitter'
|
14
|
+
require 'carbon/cli/irb'
|
15
|
+
require 'conversions'
|
16
|
+
|
17
|
+
if File.exist?(dotfile = File.join(ENV['HOME'], '.carbon_middleware'))
|
18
|
+
if (key = IO.read(dotfile).strip).present?
|
19
|
+
::Carbon.key = key
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
module Carbon
|
2
|
+
module Cli
|
3
|
+
class Emitter < Environment
|
4
|
+
include Carbon
|
5
|
+
def initialize(name, input = {})
|
6
|
+
@emitter = name
|
7
|
+
@input = input
|
8
|
+
characteristics_url = "http://carbon.brighterplanet.com/#{@emitter.to_s.pluralize}/options.json"
|
9
|
+
response = REST.get(characteristics_url)
|
10
|
+
if response.ok?
|
11
|
+
@characteristics = JSON.parse(response.body)
|
12
|
+
@characteristics.keys.each do |characteristic|
|
13
|
+
instance_eval <<-meth
|
14
|
+
def #{characteristic}(arg = nil)
|
15
|
+
if arg
|
16
|
+
@input[:#{characteristic}] = arg
|
17
|
+
emission
|
18
|
+
else
|
19
|
+
@input[:#{characteristic}]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
meth
|
23
|
+
end
|
24
|
+
if self.class.carbon_base && self.class.carbon_base.translation_table.any?
|
25
|
+
self.class.carbon_base.reset_translation_table!
|
26
|
+
end
|
27
|
+
provisions = @characteristics.keys.map { |k| "provide :#{k}"}.join('; ')
|
28
|
+
emit_as_block = "emit_as(:#{name}) { #{provisions} }"
|
29
|
+
self.class.class_eval emit_as_block
|
30
|
+
emission
|
31
|
+
else
|
32
|
+
puts " => Sorry, characteristics couldn't be retrieved for #{@emitter.to_s.pluralize} (via #{url})"
|
33
|
+
done
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def emission
|
38
|
+
puts " => #{emission_in_kilograms} kg CO2e"
|
39
|
+
end
|
40
|
+
|
41
|
+
def emission_in_kilograms
|
42
|
+
::Carbon::EmissionEstimate.new(self).to_f
|
43
|
+
end
|
44
|
+
|
45
|
+
def lbs
|
46
|
+
puts " => #{emission_in_kilograms.kilograms.to :pounds} lbs CO2e"
|
47
|
+
end
|
48
|
+
alias :pounds :lbs
|
49
|
+
|
50
|
+
def tons
|
51
|
+
puts " => #{emission_in_kilograms.kilograms.to :tons} lbs CO2e"
|
52
|
+
end
|
53
|
+
|
54
|
+
def characteristics
|
55
|
+
if @input.empty?
|
56
|
+
puts " => (none)"
|
57
|
+
else
|
58
|
+
first = true
|
59
|
+
@input.each_pair do |key, value|
|
60
|
+
if first
|
61
|
+
puts " => #{key}: #{value}"
|
62
|
+
first = false
|
63
|
+
else
|
64
|
+
puts " #{key}: #{value}"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def url
|
71
|
+
request = ::Carbon::EmissionEstimate.new(self).request
|
72
|
+
url = request.url
|
73
|
+
if request.body.present?
|
74
|
+
url << '?'
|
75
|
+
url << request.body
|
76
|
+
end
|
77
|
+
puts " => #{url}"
|
78
|
+
end
|
79
|
+
|
80
|
+
def methodology
|
81
|
+
first = true
|
82
|
+
::Carbon::EmissionEstimate.new(self).reports.each do |report|
|
83
|
+
if first
|
84
|
+
w = ' => '
|
85
|
+
first = false
|
86
|
+
else
|
87
|
+
w = ' '
|
88
|
+
end
|
89
|
+
puts w + "#{report['committee']['name']}: #{report['quorum']['name']}"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def reports
|
94
|
+
first = true
|
95
|
+
::Carbon::EmissionEstimate.new(self).reports.each do |report|
|
96
|
+
if first
|
97
|
+
w = ' => '
|
98
|
+
first = false
|
99
|
+
else
|
100
|
+
w = ' '
|
101
|
+
end
|
102
|
+
puts w + "#{report['committee']['name']}: #{report['conclusion'].inspect}"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def help
|
107
|
+
puts " => #{@characteristics.keys.join ', '}"
|
108
|
+
end
|
109
|
+
|
110
|
+
def to_s
|
111
|
+
"#{@emitter}*"
|
112
|
+
end
|
113
|
+
|
114
|
+
def inspect
|
115
|
+
"<Emitter[#{@emitter}]: #{@input.inspect}>"
|
116
|
+
end
|
117
|
+
|
118
|
+
def done
|
119
|
+
$emitters[@emitter] ||= []
|
120
|
+
$emitters[@emitter] << @input
|
121
|
+
puts " => Saved as #{@emitter} ##{$emitters[@emitter].length - 1}"
|
122
|
+
throw :IRB_EXIT
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Carbon
|
2
|
+
module Cli
|
3
|
+
class Environment
|
4
|
+
instance_methods.each do |m|
|
5
|
+
undef_method(m) if m.to_s !~ /(?:^__|^nil\?$|^send$|^instance_eval$|^define_method$|^class$|^object_id$)/
|
6
|
+
end
|
7
|
+
|
8
|
+
def get_binding() binding end
|
9
|
+
|
10
|
+
def method_missing(*args)
|
11
|
+
return if [:extend, :respond_to?].include? args.first
|
12
|
+
puts "Unknown command #{args.first}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'irb'
|
2
|
+
|
3
|
+
module IRB # :nodoc:
|
4
|
+
def self.start_session(binding)
|
5
|
+
unless @__initialized
|
6
|
+
args = ARGV
|
7
|
+
ARGV.replace(ARGV.dup)
|
8
|
+
IRB.setup(nil)
|
9
|
+
ARGV.replace(args)
|
10
|
+
@__initialized = true
|
11
|
+
end
|
12
|
+
|
13
|
+
workspace = WorkSpace.new(binding)
|
14
|
+
|
15
|
+
@CONF[:PROMPT][:CARBON] = {
|
16
|
+
:PROMPT_I => "%m> ",
|
17
|
+
:PROMPT_S => "%m\"> ",
|
18
|
+
:PROMPT_C => "%m…>",
|
19
|
+
:PROMPT_N => "%m→>",
|
20
|
+
:RETURN => ''
|
21
|
+
}
|
22
|
+
@CONF[:PROMPT_MODE] = :CARBON
|
23
|
+
|
24
|
+
irb = Irb.new(workspace)
|
25
|
+
|
26
|
+
@CONF[:IRB_RC].call(irb.context) if @CONF[:IRB_RC]
|
27
|
+
@CONF[:MAIN_CONTEXT] = irb.context
|
28
|
+
catch(:IRB_EXIT) do
|
29
|
+
irb.eval_input
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Carbon
|
2
|
+
module Cli
|
3
|
+
class Shell < Environment
|
4
|
+
cattr_accessor :emitters
|
5
|
+
|
6
|
+
emitters_url = "http://carbon.brighterplanet.com/models.json"
|
7
|
+
response = REST.get(emitters_url)
|
8
|
+
if true || response.ok?
|
9
|
+
self.emitters = JSON.parse(response.body)
|
10
|
+
emitters.each do |e|
|
11
|
+
define_method e.to_sym do |*args|
|
12
|
+
if args.any? and num = args.first and saved = $emitters[e.to_sym][num]
|
13
|
+
emitter e.to_sym, saved
|
14
|
+
else
|
15
|
+
emitter e.to_sym
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
else
|
20
|
+
puts " => Sorry, emitter types couldn't be retrieved (via #{emitters_url})"
|
21
|
+
done
|
22
|
+
end
|
23
|
+
|
24
|
+
def help
|
25
|
+
puts " => #{self.class.emitters.join ', '}"
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_s
|
29
|
+
'carbon-'
|
30
|
+
end
|
31
|
+
|
32
|
+
def key(k)
|
33
|
+
::Carbon.key = k
|
34
|
+
puts " => Using key #{::Carbon.key}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def emitter(e, saved = {})
|
38
|
+
::IRB.start_session(Emitter.new(e, saved).get_binding)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: carbon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Derek Kastner
|
@@ -17,8 +17,8 @@ autorequire:
|
|
17
17
|
bindir: bin
|
18
18
|
cert_chain: []
|
19
19
|
|
20
|
-
date: 2010-
|
21
|
-
default_executable:
|
20
|
+
date: 2010-10-01 00:00:00 -05:00
|
21
|
+
default_executable: carbon
|
22
22
|
dependencies:
|
23
23
|
- !ruby/object:Gem::Dependency
|
24
24
|
name: activesupport
|
@@ -99,9 +99,23 @@ dependencies:
|
|
99
99
|
type: :runtime
|
100
100
|
version_requirements: *id005
|
101
101
|
- !ruby/object:Gem::Dependency
|
102
|
-
name:
|
102
|
+
name: conversions
|
103
103
|
prerelease: false
|
104
104
|
requirement: &id006 !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
hash: 1
|
110
|
+
segments:
|
111
|
+
- 1
|
112
|
+
version: "1"
|
113
|
+
type: :runtime
|
114
|
+
version_requirements: *id006
|
115
|
+
- !ruby/object:Gem::Dependency
|
116
|
+
name: fakeweb
|
117
|
+
prerelease: false
|
118
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
105
119
|
none: false
|
106
120
|
requirements:
|
107
121
|
- - ">="
|
@@ -113,11 +127,11 @@ dependencies:
|
|
113
127
|
- 8
|
114
128
|
version: 1.2.8
|
115
129
|
type: :development
|
116
|
-
version_requirements: *
|
130
|
+
version_requirements: *id007
|
117
131
|
- !ruby/object:Gem::Dependency
|
118
132
|
name: rspec
|
119
133
|
prerelease: false
|
120
|
-
requirement: &
|
134
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
121
135
|
none: false
|
122
136
|
requirements:
|
123
137
|
- - ">="
|
@@ -131,11 +145,11 @@ dependencies:
|
|
131
145
|
- 17
|
132
146
|
version: 2.0.0.beta.17
|
133
147
|
type: :development
|
134
|
-
version_requirements: *
|
148
|
+
version_requirements: *id008
|
135
149
|
description: Carbon is a Ruby API wrapper for the Brighter Planet emission estimate web service (http://carbon.brighterplanet.com). By querying the web service, it can estimate the carbon emissions of many real-life objects, such as cars and houses, based on particular attributes that they may have.
|
136
150
|
email: derek.kastner@brighterplanet.com
|
137
|
-
executables:
|
138
|
-
|
151
|
+
executables:
|
152
|
+
- carbon
|
139
153
|
extensions: []
|
140
154
|
|
141
155
|
extra_rdoc_files:
|
@@ -146,14 +160,21 @@ files:
|
|
146
160
|
- README.rdoc
|
147
161
|
- Rakefile
|
148
162
|
- VERSION
|
163
|
+
- bin/carbon
|
149
164
|
- carbon.gemspec
|
150
165
|
- doc/INTEGRATION_GUIDE.rdoc
|
151
166
|
- doc/examining-response-with-jsonview.png
|
167
|
+
- doc/shell_example
|
152
168
|
- doc/timeout-error.png
|
153
169
|
- doc/with-committee-reports.png
|
154
170
|
- doc/without-committee-reports.png
|
155
171
|
- lib/carbon.rb
|
156
172
|
- lib/carbon/base.rb
|
173
|
+
- lib/carbon/cli.rb
|
174
|
+
- lib/carbon/cli/emitter.rb
|
175
|
+
- lib/carbon/cli/environment.rb
|
176
|
+
- lib/carbon/cli/irb.rb
|
177
|
+
- lib/carbon/cli/shell.rb
|
157
178
|
- lib/carbon/emission_estimate.rb
|
158
179
|
- lib/carbon/emission_estimate/request.rb
|
159
180
|
- lib/carbon/emission_estimate/response.rb
|