carbon 2.0.0 → 2.0.1

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/.gitignore CHANGED
@@ -3,3 +3,4 @@ Gemfile.lock
3
3
  .rvmrc
4
4
  .yardoc/
5
5
  doc/
6
+ *.gem
data/CHANGELOG CHANGED
@@ -1,3 +1,13 @@
1
+ 2.0.1 / 2012-03-12
2
+
3
+ * Bug fixes
4
+
5
+ * Don't send blank (incl. nil) characteristics
6
+
7
+ * Documentation changes
8
+
9
+ * Recommend people use Object#try when passing a block to #provide
10
+
1
11
  2.0.0 / 2012-03-09
2
12
 
3
13
  * Breaking changes
data/README.markdown CHANGED
@@ -82,7 +82,38 @@ For more, see the "Console" section below.
82
82
 
83
83
  Carbon works by extending any Ruby class to be an emission source. You `include Carbon` and then use the `emit_as` DSL...
84
84
 
85
- {render:Carbon::ClassMethods#emit_as}
85
+ # see Carbon::ClassMethods#emit_as for more details
86
+ class MyFlight
87
+ def airline
88
+ # ... => MyAirline(:name, :icao_code, ...)
89
+ end
90
+ def aircraft
91
+ # ... => MyAircraft(:name, :icao_code, ...)
92
+ end
93
+ def origin
94
+ # ... => String
95
+ end
96
+ def destination
97
+ # ... => String
98
+ end
99
+ def segments_per_trip
100
+ # ... => Integer
101
+ end
102
+ def trips
103
+ # ... => Integer
104
+ end
105
+ include Carbon
106
+ emit_as 'Flight' do
107
+ provide :segments_per_trip
108
+ provide :trips
109
+ provide :origin, :as => :origin_airport, :key => :iata_code
110
+ provide :destination, :as => :destination_airport, :key => :iata_code
111
+ provide(:airline, :key => :iata_code) { |f| f.airline.try(:iata_code) }
112
+ provide(:aircraft, :key => :icao_code) { { |f| f.aircraft.try(:icao_code) }
113
+ end
114
+ end
115
+
116
+ See [RDoc on `Carbon::ClassMethods#emit_as`](http://rdoc.info/github/brighterplanet/carbon/Carbon/ClassMethods#emit_as-instance_method) for all the details.
86
117
 
87
118
  The final URL will be something like
88
119
 
@@ -90,7 +121,18 @@ The final URL will be something like
90
121
 
91
122
  When you want to calculate impacts, simply call `MyFlight#impact`.
92
123
 
93
- {render:Carbon#impact}
124
+ ?> my_flight = MyFlight.new([...])
125
+ => #<MyFlight [...]>
126
+ ?> my_impact = my_flight.impact(:timeframe => Timeframe.new(:year => 2009))
127
+ => #<Hashie::Mash [...]>
128
+ ?> my_impact.decisions.carbon.object.value
129
+ => 1014.92
130
+ ?> my_impact.decisions.carbon.object.units
131
+ => "kilograms"
132
+ ?> my_impact.methodology
133
+ => "http://impact.brighterplanet.com/flights?[...]"
134
+
135
+ See [RDoc on `Carbon#impact`](http://rdoc.info/github/brighterplanet/carbon/Carbon#impact-instance_method) for all the details.
94
136
 
95
137
  ## API keys
96
138
 
data/lib/carbon.rb CHANGED
@@ -169,8 +169,8 @@ module Carbon
169
169
  # provide :trips
170
170
  # provide :origin, :as => :origin_airport, :key => :iata_code
171
171
  # provide :destination, :as => :destination_airport, :key => :iata_code
172
- # provide(:airline, :key => :iata_code) { |f| f.airline.iata_code }
173
- # provide(:aircraft, :key => :icao_code) { { |f| f.aircraft.icao_code }
172
+ # provide(:airline, :key => :iata_code) { |f| f.airline.try(:iata_code) }
173
+ # provide(:aircraft, :key => :icao_code) { { |f| f.aircraft.try(:icao_code) }
174
174
  # end
175
175
  # end
176
176
  def emit_as(emitter, &blk)
@@ -194,7 +194,9 @@ module Carbon
194
194
  else
195
195
  send method_id
196
196
  end
197
- memo[k] = v
197
+ if v.present?
198
+ memo[k] = v
199
+ end
198
200
  memo
199
201
  end
200
202
  end
@@ -2,17 +2,16 @@ require 'singleton'
2
2
 
3
3
  module Carbon
4
4
  # Used internally to hold the information about how each class that has called `emit_as`.
5
- # @private
6
5
  class Registry < ::Hash
7
6
  include ::Singleton
8
7
 
9
8
  # Used internally to record the emitter and parameters (characteristics) provided by a class that has called `emit_as`.
9
+ # Can't use my magic sprinkles (::Struct) because of yardoc
10
10
  # @private
11
- class Registration < ::Struct.new(:emitter, :characteristics)
11
+ class Registration < Struct.new(:emitter, :characteristics)
12
12
  end
13
13
 
14
- # Used internally when instance-eval'ing the `emit_as` DSL.
15
- # @private
14
+ # Used internally when instance-eval'ing the +emit_as+ DSL.
16
15
  class Registrar
17
16
  # @private
18
17
  def initialize(klass, emitter)
@@ -29,16 +28,20 @@ module Carbon
29
28
  # @option translation_options [Symbol] :as (name of the method) If your method name does not match the Brighter Planet characteristic name.
30
29
  # @option translation_options [Symbol] :key (a number of columns) What you are keying on. By default, we do a fuzzy match against a number of fields, including full names and various codes.
31
30
  #
31
+ # @return [nil]
32
+ #
33
+ # @note It's suggested that you use {http://api.rubyonrails.org/classes/Object.html#method-i-try Object#try} to cheaply avoid +undefined method `iata_code` for nil:NilClass+. It will be available because this class includes +active_support/core_ext+ anyway.
34
+ #
32
35
  # @yield [] Pass a block for the common use case of calling a method on a object.
33
36
  #
34
37
  # @example Your method is named one thing but should be sent +:as+ something else.
35
38
  # provide :my_distance, :as => :distance
36
39
  #
37
40
  # @example You are keying on something well-known like {http://en.wikipedia.org/wiki/Airline_codes IATA airline codes}.
38
- # provide(:airline, :key => :iata_code) { |f| f.airline.iata_code }
41
+ # provide(:airline, :key => :iata_code) { |f| f.airline.try(:iata_code) }
39
42
  #
40
43
  # @example Better to use a block
41
- # provide(:airline, :key => :iata_code) { |f| f.airline.iata_code }
44
+ # provide(:airline, :key => :iata_code) { |f| f.airline.try(:iata_code) }
42
45
  # # is equivalent to
43
46
  # def airline_iata_code
44
47
  # airline.iata_code
@@ -1,3 +1,3 @@
1
1
  module Carbon
2
- VERSION = "2.0.0"
2
+ VERSION = "2.0.1"
3
3
  end
data/test/carbon_test.rb CHANGED
@@ -45,12 +45,17 @@ class MyNissanAltima
45
45
  def model; 'Altima' end
46
46
  def model_year; @model_year end # what BP knows as "year"
47
47
  def fuel_type; 'R' end # what BP knows as "automobile_fuel" and keys on "code"
48
+ def nil_make; nil end
49
+ def nil_model; nil end
48
50
  include Carbon
49
51
  emit_as 'Automobile' do
50
- provide(:make) { |my_nissan_altima| my_nissan_altima.make.name }
52
+ provide(:make) { |my_nissan_altima| my_nissan_altima.make.try(:name) }
51
53
  provide :model
52
54
  provide :model_year, :as => :year
53
55
  provide :fuel_type, :as => :automobile_fuel, :key => :code
56
+
57
+ provide(:nil_make) { |my_nissan_altima| my_nissan_altima.nil_make.try(:blam!) }
58
+ provide :nil_model
54
59
  end
55
60
  end
56
61
 
@@ -147,6 +152,13 @@ describe Carbon do
147
152
  Carbon::Registry.instance['MyFoo'].characteristics.keys.must_equal [:model]
148
153
  end
149
154
  end
155
+ describe '#impact_params' do
156
+ it "only takes non-nil params" do
157
+ a = MyNissanAltima.new(2006)
158
+ a.impact_params.keys.wont_include :nil_model
159
+ a.impact_params.keys.wont_include :nil_make
160
+ end
161
+ end
150
162
  describe '#impact' do
151
163
  it "works" do
152
164
  impact = MyNissanAltima.new(2006).impact
metadata CHANGED
@@ -1,132 +1,103 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: carbon
3
- version: !ruby/object:Gem::Version
4
- hash: 15
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.1
5
5
  prerelease:
6
- segments:
7
- - 2
8
- - 0
9
- - 0
10
- version: 2.0.0
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Seamus Abshere
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2012-03-09 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2012-03-13 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: em-http-request
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: &2153238540 !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 3
29
- segments:
30
- - 0
31
- version: "0"
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
32
22
  type: :runtime
33
- version_requirements: *id001
34
- - !ruby/object:Gem::Dependency
35
- name: activesupport
36
23
  prerelease: false
37
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: *2153238540
25
+ - !ruby/object:Gem::Dependency
26
+ name: activesupport
27
+ requirement: &2153260780 !ruby/object:Gem::Requirement
38
28
  none: false
39
- requirements:
40
- - - ">="
41
- - !ruby/object:Gem::Version
42
- hash: 3
43
- segments:
44
- - 0
45
- version: "0"
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
46
33
  type: :runtime
47
- version_requirements: *id002
48
- - !ruby/object:Gem::Dependency
49
- name: multi_json
50
34
  prerelease: false
51
- requirement: &id003 !ruby/object:Gem::Requirement
35
+ version_requirements: *2153260780
36
+ - !ruby/object:Gem::Dependency
37
+ name: multi_json
38
+ requirement: &2153260300 !ruby/object:Gem::Requirement
52
39
  none: false
53
- requirements:
54
- - - ">="
55
- - !ruby/object:Gem::Version
56
- hash: 3
57
- segments:
58
- - 0
59
- version: "0"
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
60
44
  type: :runtime
61
- version_requirements: *id003
62
- - !ruby/object:Gem::Dependency
63
- name: hashie
64
45
  prerelease: false
65
- requirement: &id004 !ruby/object:Gem::Requirement
46
+ version_requirements: *2153260300
47
+ - !ruby/object:Gem::Dependency
48
+ name: hashie
49
+ requirement: &2153259860 !ruby/object:Gem::Requirement
66
50
  none: false
67
- requirements:
68
- - - ">="
69
- - !ruby/object:Gem::Version
70
- hash: 3
71
- segments:
72
- - 0
73
- version: "0"
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
74
55
  type: :runtime
75
- version_requirements: *id004
76
- - !ruby/object:Gem::Dependency
77
- name: bombshell
78
56
  prerelease: false
79
- requirement: &id005 !ruby/object:Gem::Requirement
57
+ version_requirements: *2153259860
58
+ - !ruby/object:Gem::Dependency
59
+ name: bombshell
60
+ requirement: &2153259340 !ruby/object:Gem::Requirement
80
61
  none: false
81
- requirements:
82
- - - ">="
83
- - !ruby/object:Gem::Version
84
- hash: 3
85
- segments:
86
- - 0
87
- version: "0"
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
88
66
  type: :runtime
89
- version_requirements: *id005
90
- - !ruby/object:Gem::Dependency
91
- name: conversions
92
67
  prerelease: false
93
- requirement: &id006 !ruby/object:Gem::Requirement
68
+ version_requirements: *2153259340
69
+ - !ruby/object:Gem::Dependency
70
+ name: conversions
71
+ requirement: &2153258840 !ruby/object:Gem::Requirement
94
72
  none: false
95
- requirements:
96
- - - ">="
97
- - !ruby/object:Gem::Version
98
- hash: 3
99
- segments:
100
- - 0
101
- version: "0"
73
+ requirements:
74
+ - - ! '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
102
77
  type: :runtime
103
- version_requirements: *id006
104
- - !ruby/object:Gem::Dependency
105
- name: brighter_planet_metadata
106
78
  prerelease: false
107
- requirement: &id007 !ruby/object:Gem::Requirement
79
+ version_requirements: *2153258840
80
+ - !ruby/object:Gem::Dependency
81
+ name: brighter_planet_metadata
82
+ requirement: &2153258380 !ruby/object:Gem::Requirement
108
83
  none: false
109
- requirements:
110
- - - ">="
111
- - !ruby/object:Gem::Version
112
- hash: 3
113
- segments:
114
- - 0
115
- version: "0"
84
+ requirements:
85
+ - - ! '>='
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
116
88
  type: :runtime
117
- version_requirements: *id007
89
+ prerelease: false
90
+ version_requirements: *2153258380
118
91
  description: Brighter Planet API client for Ruby
119
- email:
92
+ email:
120
93
  - seamus@abshere.net
121
94
  - dkastner@gmail.com
122
95
  - andy@rossmeissl.net
123
- executables:
96
+ executables:
124
97
  - carbon
125
98
  extensions: []
126
-
127
99
  extra_rdoc_files: []
128
-
129
- files:
100
+ files:
130
101
  - .gitignore
131
102
  - CHANGELOG
132
103
  - Gemfile
@@ -146,38 +117,29 @@ files:
146
117
  - test/carbon_test.rb
147
118
  homepage: https://github.com/brighterplanet/carbon
148
119
  licenses: []
149
-
150
120
  post_install_message:
151
121
  rdoc_options: []
152
-
153
- require_paths:
122
+ require_paths:
154
123
  - lib
155
- required_ruby_version: !ruby/object:Gem::Requirement
124
+ required_ruby_version: !ruby/object:Gem::Requirement
156
125
  none: false
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
126
+ requirements:
127
+ - - ! '>='
128
+ - !ruby/object:Gem::Version
129
+ version: '0'
130
+ required_rubygems_version: !ruby/object:Gem::Requirement
165
131
  none: false
166
- requirements:
167
- - - ">="
168
- - !ruby/object:Gem::Version
169
- hash: 3
170
- segments:
171
- - 0
172
- version: "0"
132
+ requirements:
133
+ - - ! '>='
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
173
136
  requirements: []
174
-
175
137
  rubyforge_project:
176
- rubygems_version: 1.8.17
138
+ rubygems_version: 1.8.15
177
139
  signing_key:
178
140
  specification_version: 3
179
141
  summary: Brighter Planet API client for Ruby
180
- test_files:
142
+ test_files:
181
143
  - features/shell.feature
182
144
  - features/support/env.rb
183
145
  - test/carbon_test.rb