carbon 0.0.1 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,5 @@
1
1
  require 'carbon/emitter'
2
- require 'carbon/flight'
2
+ require 'carbon/emissions_calculation'
3
3
 
4
4
  module Carbon
5
5
  class << self
@@ -0,0 +1,53 @@
1
+ require 'uri'
2
+ require 'rest_client'
3
+ require 'activesupport'
4
+
5
+ module Carbon
6
+ class EmissionsCalculation
7
+ class NotYetCalculated < StandardError; end
8
+
9
+ attr_accessor :options, :source, :value, :methodology_url
10
+
11
+ def initialize(options, source)
12
+ self.options = options
13
+ self.source = source
14
+ end
15
+
16
+ def methodology_url
17
+ raise NotYetCalculated if result.nil?
18
+ @methodology_url
19
+ end
20
+ def value
21
+ raise NotYetCalculated if result.nil?
22
+ @value
23
+ end
24
+
25
+ def calculate!
26
+ fetch_calculation
27
+ @value = result['emission']
28
+ @methodology_url = result['methodology']
29
+ end
30
+
31
+ private
32
+ def result
33
+ @result
34
+ end
35
+
36
+ def resource
37
+ url = URI.join(Carbon.base_url, options.emitter_type.to_s.pluralize)
38
+ @resource ||= RestClient::Resource.new(url.to_s)
39
+ end
40
+
41
+ def fields
42
+ options.characteristics.inject({}) do |hsh, characteristic|
43
+ hsh[characteristic.name] = source.send(characteristic.field)
44
+ hsh
45
+ end
46
+ end
47
+
48
+ def fetch_calculation
49
+ response = resource.post fields, :accept => :json
50
+ @result = JSON.parse(response.body)
51
+ end
52
+ end
53
+ end
@@ -4,33 +4,16 @@ require 'carbon/emitter/class_methods'
4
4
  module Carbon
5
5
  module Emitter
6
6
  class NotYetCalculated < StandardError; end
7
- include Resource
8
7
 
9
8
  def self.included(target)
10
9
  target.extend Carbon::Emitter::ClassMethods
11
10
  end
12
11
 
13
- def initialize(args = {})
14
- args.each do |name, value|
15
- next unless self.class.characteristics.include?(name.to_sym)
16
- self.send("#{name}=", value)
17
- end
18
- end
19
-
20
- def methodology
21
- raise Emitter::NotYetCalculated if result.nil?
22
- @methodology
23
- end
24
-
25
- def emission
26
- raise Emitter::NotYetCalculated if result.nil?
27
- @emission
28
- end
29
-
30
- def calculate!
31
- fetch_calculation
32
- @emission = result['emission']
33
- @methodology = result['methodology']
12
+ def emissions
13
+ return @emissions unless @emissions.nil?
14
+ @emissions = Carbon::EmissionsCalculation.new(self.class.emitter_options, self)
15
+ @emissions.calculate!
16
+ @emissions
34
17
  end
35
18
  end
36
19
  end
@@ -0,0 +1,19 @@
1
+ module Carbon
2
+ module Emitter
3
+ class Characteristic
4
+ attr_accessor :name, :field
5
+
6
+ def self.from_options_hash(name, options)
7
+ new(:name => name, :field => options[:with])
8
+ end
9
+
10
+ def initialize(options = {})
11
+ options.each { |name, value| self.send("#{name}=", value) unless value.nil? }
12
+ end
13
+
14
+ def field
15
+ @field ||= self.name
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,14 +1,20 @@
1
+ require 'carbon/emitter/options'
2
+
1
3
  module Carbon
2
4
  module Emitter
3
5
  module ClassMethods
4
- def characteristics(*args)
5
- if args.empty?
6
- @characteristics
7
- else
8
- @characteristics = args
9
- self.instance_eval { attr_accessor *@characteristics }
10
- end
6
+ def emits_as(emitter_type, &blk)
7
+ self.emitter_type = emitter_type
8
+
9
+ self.emitter_options = Carbon::Emitter::Options.new(emitter_type)
10
+ self.emitter_options.instance_eval &blk if block_given?
11
11
  end
12
+
13
+ def emitter_type; @emitter_type; end
14
+ def emitter_type=(val); @emitter_type = val; end
15
+
16
+ def emitter_options; @emitter_options; end
17
+ def emitter_options=(val); @emitter_options = val; end
12
18
  end
13
19
  end
14
20
  end
@@ -0,0 +1,30 @@
1
+ require 'carbon/emitter/characteristic'
2
+
3
+ module Carbon
4
+ module Emitter
5
+ class Options
6
+ attr_accessor :emitter_type, :characteristics
7
+
8
+ def initialize(emitter_type)
9
+ self.emitter_type = emitter_type.to_sym
10
+ end
11
+
12
+ def keys
13
+ characteristics.map { |c| c.name }
14
+ end
15
+
16
+ def [](name)
17
+ characteristics.find { |c| c.name == name }
18
+ end
19
+
20
+ def characteristics
21
+ @characteristics ||= []
22
+ end
23
+
24
+ def provides(characteristic_name, options = {})
25
+ characteristics <<
26
+ Carbon::Emitter::Characteristic.from_options_hash(characteristic_name, options)
27
+ end
28
+ end
29
+ end
30
+ end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 1
9
- version: 0.0.1
8
+ - 3
9
+ version: 0.0.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - Derek Kastner
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-01-22 00:00:00 -05:00
17
+ date: 2010-04-26 00:00:00 -04:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -50,10 +50,11 @@ extensions: []
50
50
  extra_rdoc_files:
51
51
  - MIT-LICENSE.txt
52
52
  files:
53
+ - lib/carbon/emissions_calculation.rb
54
+ - lib/carbon/emitter/characteristic.rb
53
55
  - lib/carbon/emitter/class_methods.rb
56
+ - lib/carbon/emitter/options.rb
54
57
  - lib/carbon/emitter.rb
55
- - lib/carbon/flight.rb
56
- - lib/carbon/resource.rb
57
58
  - lib/carbon.rb
58
59
  - MIT-LICENSE.txt
59
60
  has_rdoc: true
@@ -1,10 +0,0 @@
1
- module Carbon
2
- class Flight
3
- include Carbon::Emitter
4
-
5
- characteristics :date, :year, :time_of_day, :destination_airport,
6
- :origin_airport, :distance_class, :distance_estimate, :domesticity,
7
- :airline, :trips, :emplanements_per_trip, :seat_class, :load_factor,
8
- :seats_estimate, :aircraft_class, :aircraft, :propulsion
9
- end
10
- end
@@ -1,60 +0,0 @@
1
- require 'uri'
2
- require 'json'
3
-
4
- module Carbon
5
- module Resource
6
- class << self
7
- def included(target)
8
- if target == Carbon::Emitter
9
- Carbon::Emitter::ClassMethods.instance_eval { include(Carbon::Resource::ClassMethods) }
10
- else
11
- target.extend(Carbon::Resource::ClassMethods)
12
- end
13
- end
14
-
15
- def underscore(string)
16
- string.gsub(/([a-z])([A-Z])/,'\1_\2').downcase
17
- end
18
- end
19
-
20
-
21
- module ClassMethods
22
- def resource_name(val = nil)
23
- @resource_name = val.to_s unless val.nil?
24
- if @resource_name.nil?
25
- class_name = self.to_s.split('::').last
26
- @resource_name ||= "#{Carbon::Resource.underscore(class_name)}s"
27
- end
28
- @resource_name
29
- end
30
- end
31
-
32
- private
33
- attr_accessor :result
34
-
35
- def fields
36
- self.class.characteristics.map(&:to_s).inject({}) do |hash, char|
37
- value = self.send(char)
38
- if value.respond_to?(:keys)
39
- hash[char] = {}
40
- value.each do |key, value|
41
- hash[char][key.to_s] = value
42
- end
43
- elsif !value.nil?
44
- hash[char] = value
45
- end
46
- hash
47
- end
48
- end
49
-
50
- def resource
51
- url = URI.join(Carbon.base_url, self.class.resource_name)
52
- @resource ||= RestClient::Resource.new(url.to_s)
53
- end
54
-
55
- def fetch_calculation
56
- response = resource.post fields, :accept => :json
57
- self.result = JSON.parse(response.body)
58
- end
59
- end
60
- end