amee-analytics 1.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/.rvmrc ADDED
@@ -0,0 +1 @@
1
+ rvm 1.8.7@amee-analytics
data/CHANGELOG.txt ADDED
@@ -0,0 +1,4 @@
1
+ = Changelog
2
+
3
+ == 1.0.0
4
+ * Initial public release
data/Gemfile ADDED
@@ -0,0 +1,16 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Dependencies
4
+ gem "amee-data-abstraction","~> 1.1"
5
+ gem "amee-data-persistence","~> 1.1"
6
+
7
+ # Add dependencies to develop your gem here.
8
+ # Include everything needed to run rake, tests, features, etc.
9
+ group :development do
10
+ gem "jeweler", "~> 1.6.4"
11
+ gem 'rspec', '1.3.0'
12
+ gem 'rcov'
13
+ gem 'rspec_spinner', '1.1.3'
14
+ gem 'flexmock', '> 0.8.6'
15
+ gem 'activerecord', '~> 2.3.5'
16
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,27 @@
1
+ Copyright (c) 2011, AMEE UK Ltd.
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ Redistributions of source code must retain the above copyright notice,
8
+ this list of conditions and the following disclaimer.
9
+
10
+ Redistributions in binary form must reproduce the above copyright notice,
11
+ this list of conditions and the following disclaimer in the documentation
12
+ and/or other materials provided with the distribution.
13
+
14
+ Neither the name of AMEE UK Ltd nor the names of its contributors may be
15
+ used to endorse or promote products derived from this software without
16
+ specific prior written permission.
17
+
18
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
22
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
25
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
26
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.txt ADDED
@@ -0,0 +1,94 @@
1
+ == amee-analytics
2
+
3
+ The amee-analytics gem provides support for handling collections of the class
4
+ <i>AMEE::DataAbstraction::OngoingCalculation</i> and performing analytical
5
+ operations across the collection.
6
+
7
+ Licensed under the BSD 3-Clause license (See LICENSE.txt for details)
8
+
9
+ Authors: James Smith, Andrew Berkeley, George Palmer
10
+
11
+ Copyright: Copyright (c) 2011 AMEE UK Ltd
12
+
13
+ Homepage: http://github.com/AMEE/amee-analytics
14
+
15
+ Documentation: http://rubydoc.info/gems/amee-analytics
16
+
17
+ == INSTALLATION
18
+
19
+ gem install amee-analytics
20
+
21
+ == REQUIREMENTS
22
+
23
+ * ruby 1.8.7
24
+ * rubygems >= 1.5
25
+
26
+ All gem requirements should be installed as part of the rubygems installation process
27
+ above, but are listed here for completeness.
28
+
29
+ * amee-data-abstraction ~> 1.1
30
+ * amee-data-persistence ~> 1.1
31
+
32
+ == USAGE
33
+
34
+ The library extends a number of classes within the <i>AMEE::DataAbstraction</i>
35
+ module:
36
+
37
+ 1. <i>AMEE::DataAbstraction::CalculationCollection</i> is extended by the
38
+ <i>CalculationCollectionReportingSupport</i> module, providing the ability to filter
39
+ specific calculation terms, sort by term values, standardize units and perform
40
+ analytical operations on specific terms, such as sums, means, modes, and medians
41
+
42
+ 2. <i>AMEE::DataAbstraction::TermsList</i> is extended by the
43
+ <i>TermsListReportingSupport</i> module. This provides much of the functionality
44
+ used by <i>CalculationCollectionReportingSupport</i>, allowing lists to be sorted
45
+ and summed, averaged, etc...
46
+
47
+ 3. <i>AMEE::DataAbstraction::Term</i> is extended by the <i>TermReportingSupport</i>
48
+ module. This provides the ability to convert the units within a term (changing the
49
+ term value attribute accordingly), and is used by the operations provided in
50
+ <i>CalculationCollectionReportingSupport</i> and <i>TermsListReportingSupport</i>.
51
+
52
+ 4. A new subclass of <i>AMEE::DataAbstraction::Term</i> is defined, <i>Result</i>.
53
+ This provides a simple container for returning the result of a <i>TermsList</i>
54
+ analytical operation (e.g. sum, mean) complete with label, value, unit, etc...
55
+
56
+ =Example usage
57
+
58
+ # find method returns instance of CalculationCollection
59
+ my_calculations = OngoingCalculation.find_by_type(:all, :electricity)
60
+ #=> <AMEE::DataAbstraction::CalculationCollection ... >
61
+
62
+ # Dynamic label-derived method returns TermsList of the named term from each
63
+ # calculation in the set
64
+
65
+ my_calculations.country #=> <AMEE::DataAbstraction::TermsList ... >
66
+
67
+ my_calculations.energy #=> <AMEE::DataAbstraction::TermsList ... >
68
+
69
+ my_calculations.co2 #=> <AMEE::DataAbstraction::TermsList ... >
70
+
71
+ # Analytical operations can be applied to lists of terms. These return new
72
+ # objects, of the Result class. #to_s used here for illustrative purposes
73
+
74
+ my_calculations.country.sum.to_s #=> "0.0"
75
+
76
+ my_calculations.energy.sum.to_s #=> "23456 kWh"
77
+
78
+ my_calculations.co2.sum.to_s #=> "12345 kg"
79
+
80
+ my_calculations.co2.sum(:lb).to_s #=> "23456 lb"
81
+
82
+ my_calculations.country.mode.to_s #=> "Sweden"
83
+
84
+ my_calculations.co2.mean.to_s #=> "4512.5 kg"
85
+
86
+ my_calculations.co2.mean('t').to_s #=> "4.5125 t"
87
+
88
+ my_calculations.co2.median.to_s #=> "4567 kg"
89
+
90
+ my_calculations.co2.predominant_unit #=> "kg"
91
+
92
+ my_calculations.sort_by_co2 #=> <AMEE::DataAbstraction::CalculationCollection ... >
93
+
94
+ my_calculations.sort_by_co2! #=> <AMEE::DataAbstraction::CalculationCollection ... >
data/Rakefile ADDED
@@ -0,0 +1,99 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+ begin
6
+ Bundler.setup(:default, :development)
7
+ rescue Bundler::BundlerError => e
8
+ $stderr.puts e.message
9
+ $stderr.puts "Run `bundle install` to install missing gems"
10
+ exit e.status_code
11
+ end
12
+ require 'rake'
13
+ require 'spec'
14
+ require 'spec/rake/spectask'
15
+
16
+ task :default => [:spec]
17
+
18
+ Spec::Rake::SpecTask.new do |t|
19
+ t.spec_opts = ['--options', "spec/spec.opts"]
20
+ t.spec_files = FileList['spec/**/*_spec.rb']
21
+ t.rcov = true
22
+ t.rcov_opts = ['--exclude', 'spec,/*ruby*,/*gems*']
23
+ end
24
+
25
+ require 'jeweler'
26
+ # Fix for Jeweler to use stable branch
27
+ class Jeweler
28
+ module Commands
29
+ class ReleaseToGit
30
+ def run
31
+ unless clean_staging_area?
32
+ system "git status"
33
+ raise "Unclean staging area! Be sure to commit or .gitignore everything first. See `git status` above."
34
+ end
35
+ repo.checkout('stable')
36
+ repo.push('origin', 'stable')
37
+ if release_not_tagged?
38
+ output.puts "Tagging #{release_tag}"
39
+ repo.add_tag(release_tag)
40
+ output.puts "Pushing #{release_tag} to origin"
41
+ repo.push('origin', release_tag)
42
+ end
43
+ end
44
+ end
45
+ class ReleaseGemspec
46
+ def run
47
+ unless clean_staging_area?
48
+ system "git status"
49
+ raise "Unclean staging area! Be sure to commit or .gitignore everything first. See `git status` above."
50
+ end
51
+ repo.checkout('stable')
52
+ regenerate_gemspec!
53
+ commit_gemspec! if gemspec_changed?
54
+ output.puts "Pushing stable to origin"
55
+ repo.push('origin', 'stable')
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ Jeweler::Tasks.new do |gem|
62
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
63
+ gem.name = "amee-analytics"
64
+ gem.homepage = "http://github.com/AMEE/amee-analytics"
65
+ gem.license = "MIT"
66
+ gem.summary = %Q{Analytics module for use with AMEE AppKit}
67
+ gem.description = %Q{Part of the AMEE AppKit, this gem provides the ability to do mathmatical operations over a set of calculations}
68
+ gem.email = "help@amee.com"
69
+ gem.authors = ["James Hetherington", "Andrew Berkeley", "James Smith", "George Palmer"]
70
+ # dependencies defined in Gemfile
71
+ end
72
+ Jeweler::RubygemsDotOrgTasks.new
73
+
74
+ require 'rake/testtask'
75
+ Rake::TestTask.new(:test) do |test|
76
+ test.libs << 'lib' << 'test'
77
+ test.pattern = 'test/**/test_*.rb'
78
+ test.verbose = true
79
+ end
80
+
81
+ require 'rcov/rcovtask'
82
+ Rcov::RcovTask.new do |test|
83
+ test.libs << 'test'
84
+ test.pattern = 'test/**/test_*.rb'
85
+ test.verbose = true
86
+ test.rcov_opts << '--exclude "gems/*"'
87
+ end
88
+
89
+ task :default => :test
90
+
91
+ require 'rake/rdoctask'
92
+ Rake::RDocTask.new do |rdoc|
93
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
94
+
95
+ rdoc.rdoc_dir = 'rdoc'
96
+ rdoc.title = "amee-analytics #{version}"
97
+ rdoc.rdoc_files.include('README*')
98
+ rdoc.rdoc_files.include('lib/**/*.rb')
99
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.1
@@ -0,0 +1,80 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{amee-analytics}
8
+ s.version = "1.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["James Hetherington", "Andrew Berkeley", "James Smith", "George Palmer"]
12
+ s.date = %q{2011-08-31}
13
+ s.description = %q{Part of the AMEE AppKit, this gem provides the ability to do mathmatical operations over a set of calculations}
14
+ s.email = %q{help@amee.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE.txt",
17
+ "README.txt"
18
+ ]
19
+ s.files = [
20
+ ".rvmrc",
21
+ "CHANGELOG.txt",
22
+ "Gemfile",
23
+ "LICENSE.txt",
24
+ "README.txt",
25
+ "Rakefile",
26
+ "VERSION",
27
+ "amee-analytics.gemspec",
28
+ "init.rb",
29
+ "lib/amee-analytics.rb",
30
+ "lib/amee/data_abstraction/calculation_collection_analytics_support.rb",
31
+ "lib/amee/data_abstraction/result.rb",
32
+ "lib/amee/data_abstraction/term_analytics_support.rb",
33
+ "lib/amee/data_abstraction/terms_list_analytics_support.rb",
34
+ "rails/init.rb",
35
+ "spec/amee/analytics/calculation_collection_spec.rb",
36
+ "spec/amee/analytics/term_spec.rb",
37
+ "spec/amee/analytics/terms_list_spec.rb",
38
+ "spec/spec.opts",
39
+ "spec/spec_helper.rb"
40
+ ]
41
+ s.homepage = %q{http://github.com/AMEE/amee-analytics}
42
+ s.licenses = ["MIT"]
43
+ s.require_paths = ["lib"]
44
+ s.rubygems_version = %q{1.6.2}
45
+ s.summary = %q{Analytics module for use with AMEE AppKit}
46
+
47
+ if s.respond_to? :specification_version then
48
+ s.specification_version = 3
49
+
50
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
51
+ s.add_runtime_dependency(%q<amee-data-abstraction>, ["~> 1.1"])
52
+ s.add_runtime_dependency(%q<amee-data-persistence>, ["~> 1.1"])
53
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
54
+ s.add_development_dependency(%q<rspec>, ["= 1.3.0"])
55
+ s.add_development_dependency(%q<rcov>, [">= 0"])
56
+ s.add_development_dependency(%q<rspec_spinner>, ["= 1.1.3"])
57
+ s.add_development_dependency(%q<flexmock>, ["> 0.8.6"])
58
+ s.add_development_dependency(%q<activerecord>, ["~> 2.3.5"])
59
+ else
60
+ s.add_dependency(%q<amee-data-abstraction>, ["~> 1.1"])
61
+ s.add_dependency(%q<amee-data-persistence>, ["~> 1.1"])
62
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
63
+ s.add_dependency(%q<rspec>, ["= 1.3.0"])
64
+ s.add_dependency(%q<rcov>, [">= 0"])
65
+ s.add_dependency(%q<rspec_spinner>, ["= 1.1.3"])
66
+ s.add_dependency(%q<flexmock>, ["> 0.8.6"])
67
+ s.add_dependency(%q<activerecord>, ["~> 2.3.5"])
68
+ end
69
+ else
70
+ s.add_dependency(%q<amee-data-abstraction>, ["~> 1.1"])
71
+ s.add_dependency(%q<amee-data-persistence>, ["~> 1.1"])
72
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
73
+ s.add_dependency(%q<rspec>, ["= 1.3.0"])
74
+ s.add_dependency(%q<rcov>, [">= 0"])
75
+ s.add_dependency(%q<rspec_spinner>, ["= 1.1.3"])
76
+ s.add_dependency(%q<flexmock>, ["> 0.8.6"])
77
+ s.add_dependency(%q<activerecord>, ["~> 2.3.5"])
78
+ end
79
+ end
80
+
data/init.rb ADDED
@@ -0,0 +1,4 @@
1
+ # Copyright (C) 2011 AMEE UK Ltd. - http://www.amee.com
2
+ # Released as Open Source Software under the BSD 3-Clause license. See LICENSE.txt for details.
3
+
4
+ require File.dirname(__FILE__) + "/rails/init"
@@ -0,0 +1,236 @@
1
+ # Copyright (C) 2011 AMEE UK Ltd. - http://www.amee.com
2
+ # Released as Open Source Software under the BSD 3-Clause license. See LICENSE.txt for details.
3
+
4
+ # :title: Module: AMEE::DataAbstraction::CalculationCollectionAnalyticsSupport
5
+
6
+ module AMEE
7
+ module DataAbstraction
8
+
9
+ # Mixin module for the <i>AMEE::DataAbstraction::CalculationCollection</i>
10
+ # class, providing methods for handling collections of calculations.
11
+ #
12
+ module CalculationCollectionAnalyticsSupport
13
+
14
+ # Returns <tt>true</tt> if all calculations in <tt>self</tt> are
15
+ # representatives of the same prototype calculation. Otherwise,
16
+ # returns <tt>false</tt>.
17
+ #
18
+ def homogeneous?
19
+ calculation_labels.size == 1
20
+ end
21
+
22
+ # Returns <tt>true</tt> if all calculations in <tt>self</tt> are NOT
23
+ # representatives of the same prototype calculation. Otherwise,
24
+ # returns <tt>false</tt>.
25
+ #
26
+ def heterogeneous?
27
+ !homogeneous?
28
+ end
29
+
30
+ # Returns an array containing all of the unique labels for calculations
31
+ # held in <tt>self</tt>.
32
+ #
33
+ def calculation_labels
34
+ map(&:label).uniq
35
+ end
36
+
37
+ def +(other_calc_coll)
38
+ self.class.new(self.to_a + other_calc_coll.to_a)
39
+ end
40
+
41
+ def -(other_calc_coll)
42
+ other_calc_coll = [other_calc_coll].flatten
43
+ self.delete_if { |calc| other_calc_coll.include?(calc) }
44
+ end
45
+
46
+ # Similar to <tt>#sort_by!</tt> but returns a new instance of
47
+ # <i>CalculationCollection</i> arranged according to the values on the
48
+ # term labelled <tt>term</tt>. E.g.
49
+ #
50
+ # my_calculation_collection.sort_by :co2
51
+ #
52
+ # #=> <AMEE::DataAbstraction::CalculationCollection ... >
53
+ #
54
+ def sort_by(term)
55
+ term = term.to_sym unless term.is_a? Symbol
56
+ CalculationCollection.new(send(term).sort_by(:value).map(&:parent))
57
+ end
58
+
59
+ # Sorts the calculation collection in place according to the values on the
60
+ # term labelled <tt>term</tt>, returning <tt>self</tt>.
61
+ #
62
+ # my_calculation_collection.sort_by! :mass
63
+ #
64
+ # #=> <AMEE::DataAbstraction::CalculationCollection ... >
65
+ #
66
+ def sort_by!(term)
67
+ replace(sort_by(term))
68
+ end
69
+
70
+ # Returns a new instance of <i>CalculationCollection</i> containing the same
71
+ # calculations contained within <tt>self</tt> but with the units of the term
72
+ # <tt>term</tt> standardized on each.
73
+ #
74
+ # If no further arguments are provided, the standardized units represent
75
+ # those which currently predominate amongst the relevent terms. Otherwise,
76
+ # the specific unit and/or per unit which are required for each instance
77
+ # of <tt>term</tt> can be explicitly specified as the second and third
78
+ # arguments respecitively. Units can be specified in any of the formats
79
+ # which are acceptable to the <tt>Quantify::Unit.for</tt> method (i.e.
80
+ # stringified unit names or symbols, symbolized labels, or
81
+ # <tt>Quantify::Unit::Base</tt> instances of the required unit). E.g.
82
+ #
83
+ # my_calculation_collection.standardize_units(:mass)
84
+ #
85
+ # #=> <AMEE::DataAbstraction::CalculationCollection ... >
86
+ #
87
+ # my_calculation_collection.standardize_units(:mass, :lb)
88
+ #
89
+ # #=> <AMEE::DataAbstraction::CalculationCollection ... >
90
+ #
91
+ # my_calculation_collection.standardize_units(:mass, 'pound')
92
+ #
93
+ # #=> <AMEE::DataAbstraction::CalculationCollection ... >
94
+ #
95
+ # my_calculation_collection.standardize_units(:mass, <Quantify::Unit::NonSI>)
96
+ #
97
+ # #=> <AMEE::DataAbstraction::CalculationCollection ... >
98
+ #
99
+ # my_calculation_collection.standardize_units(:distance, :km, 'year')
100
+ #
101
+ # #=> <AMEE::DataAbstraction::CalculationCollection ... >
102
+ #
103
+ def standardize_units(term,unit=nil,per_unit=nil)
104
+ term = term.to_sym unless term.is_a? Symbol
105
+ new_calcs = send(term).standardize_units(unit,per_unit).map do |term|
106
+ calc = term.parent
107
+ calc.contents[term.label] = term
108
+ calc
109
+ end
110
+ CalculationCollection.new(new_calcs)
111
+ end
112
+
113
+ # Similar to <tt>#standardize_units</tt> but standardizes units in place,
114
+ # returning <tt>self</tt>
115
+ #
116
+ def standardize_units!(term,unit=nil,per_unit=nil)
117
+ new_calcs = standardize_units(term,unit,per_unit)
118
+ replace(new_calcs)
119
+ end
120
+
121
+ # Returns an array of instances of the <tt>Result</tt> class representing the
122
+ # sums of all outputs represented within the collection
123
+ #
124
+ def sum_all_outputs
125
+ TermsList.new(terms.outputs.visible.labels.uniq.map { |o| send(o).sum })
126
+ end
127
+
128
+ # Returns a new instance of the class <tt>TermsList</tt> representing either
129
+ # CO2 or CO2e outputs from each calculation
130
+ #
131
+ def co2_or_co2e_outputs
132
+ terms = TermsList.new
133
+ each do |calculation|
134
+ if calculation['co2e']
135
+ terms << calculation['co2e']
136
+ elsif calculation.outputs.visible.labels.size == 1 && calculation.outputs.visible.labels.first == :co2
137
+ terms << calculation['co2']
138
+ end
139
+ end
140
+ return terms
141
+ end
142
+
143
+ # Call the <tt>#calculate!</tt> method on all calculations contained within
144
+ # <tt>self</tt>.
145
+ #
146
+ def calculate_all!
147
+ each { |calc| calc.calculate! }
148
+ end
149
+
150
+ # Call the <tt>#save</tt> method on all calculations contained within
151
+ # <tt>self</tt>.
152
+ #
153
+ def save_all!
154
+ each { |calc| calc.save }
155
+ end
156
+
157
+ # Returns a terms list of all terms held by calculations contained within
158
+ # <tt>self</tt>.
159
+ #
160
+ def terms
161
+ TermsList.new( (self.map { |calc| calc.terms.map { |term| term } }).flatten )
162
+ end
163
+
164
+ TermsList::Selectors.each do |sel|
165
+ delegate sel,:to=>:terms
166
+ end
167
+
168
+ # Return an instance of <i>TermsList</i> containing only terms labelled
169
+ # :type.
170
+ #
171
+ # This method overrides the standard #type method (which is deprecated) and
172
+ # mimics the functionality provied by the first #method_missing method in
173
+ # dynamically retrieving a subset of terms according their labels.
174
+ #
175
+ def type
176
+ terms.type
177
+ end
178
+
179
+ def respond_to?(method)
180
+ if terms.labels.include? method.to_sym
181
+ return true
182
+ elsif method.to_s =~ /sort_by_(.*)!/ and terms.labels.include? $1.to_sym
183
+ return true
184
+ elsif method.to_s =~ /sort_by_(.*)/ and terms.labels.include? $1.to_sym
185
+ return true
186
+ else
187
+ super
188
+ end
189
+ end
190
+
191
+ # Syntactic sugar for several instance methods.
192
+ #
193
+ # ---
194
+ #
195
+ # Call a method on <tt>self</tt> which named after a specific term label
196
+ # contained with an associated calculation and return an instance of the
197
+ # <tt>TermsList</tt> class contain each of those terms. E.g.,
198
+ #
199
+ # my_terms = my_calculation_collection.type #=> <AMEE::DataAbstraction::TermsList>
200
+ # my_terms.label #=> :type
201
+ #
202
+ # my_terms = my_calculation_collection.mass #=> <AMEE::DataAbstraction::TermsList>
203
+ # my_terms.label #=> :mass
204
+ #
205
+ # my_terms = my_calculation_collection.co2 #=> <AMEE::DataAbstraction::TermsList>
206
+ # my_terms.label #=> :co2
207
+ #
208
+ # ---
209
+ #
210
+ # Call either the <tt>#sort_by</tt> or <tt>#sort_by!</tt> methods including
211
+ # the argument term as part of the method name, e.g.,
212
+ #
213
+ # my_calculation_collection.sort_by_co2
214
+ #
215
+ # #=> <AMEE::DataAbstraction::CalculationCollection ... >
216
+ #
217
+ # my_calculation_collection.sort_by_mass!
218
+ #
219
+ # #=> <AMEE::DataAbstraction::CalculationCollection ... >
220
+ #
221
+ def method_missing(method, *args, &block)
222
+ if terms.labels.include? method.to_sym
223
+ terms.send(method.to_sym)
224
+ elsif method.to_s =~ /sort_by_(.*)!/ and terms.labels.include? $1.to_sym
225
+ sort_by! $1.to_sym
226
+ elsif method.to_s =~ /sort_by_(.*)/ and terms.labels.include? $1.to_sym
227
+ sort_by $1.to_sym
228
+ else
229
+ super
230
+ end
231
+ end
232
+
233
+ end
234
+
235
+ end
236
+ end
@@ -0,0 +1,16 @@
1
+ # Copyright (C) 2011 AMEE UK Ltd. - http://www.amee.com
2
+ # Released as Open Source Software under the BSD 3-Clause license. See LICENSE.txt for details.
3
+ #
4
+ # :title: Class AMEE::DataAbstraction::Result
5
+
6
+ module AMEE
7
+ module DataAbstraction
8
+
9
+ # Subclass of <tt>Term</tt> providing methods and attributes appropriate for
10
+ # representing the results of cross calculation operations specifically
11
+ #
12
+ class Result < Term
13
+
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,28 @@
1
+
2
+ # Copyright (C) 2011 AMEE UK Ltd. - http://www.amee.com
3
+ # Released as Open Source Software under the BSD 3-Clause license. See LICENSE.txt for details.
4
+ #
5
+ # :title: Module: AMEE::DataAbstraction::TermAnalyticsSupport
6
+
7
+ module AMEE
8
+ module DataAbstraction
9
+
10
+ # Mixin module for the <i>AMEE::DataAbstraction::Term</i> class, providing
11
+ # methods for handling collections of calculations.
12
+ #
13
+ module TermAnalyticsSupport
14
+
15
+ # Returns an instance of <i>Result</i> based upon the attributes of
16
+ # <tt>self</tt>.
17
+ #
18
+ def to_result
19
+ result_term = Result.new
20
+ TermsList::TermProperties.each do |attr|
21
+ result_term.send(attr, self.send(attr))
22
+ end
23
+ return result_term
24
+ end
25
+
26
+ end
27
+ end
28
+ end