weighted_average 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -10,8 +10,8 @@ begin
10
10
  gem.email = "seamus@abshere.net"
11
11
  gem.homepage = "http://github.com/seamusabshere/weighted_average"
12
12
  gem.authors = ["Seamus Abshere", "Andy Rossmeissl", "Ian Hough", "Matt Kling"]
13
- gem.add_dependency 'activerecord', '>=3.0.0.beta2'
14
- gem.add_dependency 'arel', '>=0.3.3'
13
+ gem.add_dependency 'activerecord', '~>3'
14
+ gem.add_dependency 'arel', '~>2'
15
15
  gem.add_development_dependency 'cohort_scope', '>=0.0.2'
16
16
  gem.add_development_dependency "shoulda", ">= 2.10.3"
17
17
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.5
1
+ 0.0.6
@@ -7,13 +7,10 @@ module WeightedAverage
7
7
  end
8
8
 
9
9
  # Returns the ARel relation for a weighted average query.
10
- def weighted_average_relation(column_names, options = {})
10
+ def weighted_average_relation(data_column_names, options = {})
11
11
  raise ArgumentError, "Only use array form if the weighting column in the foreign table is not called 'weighting'" if options[:weighted_by].is_a?(Array) and options[:weighted_by].length != 2
12
12
  raise ArgumentError, "No nil values in weighted_by, please" if Array.wrap(options[:weighted_by]).any?(&:nil?)
13
13
 
14
- # aircraft['seats'] or (aircraft['seats'] + aircraft['payload'])
15
- columns = Array.wrap(column_names).map { |column_name| arel_table[column_name.to_s] }
16
-
17
14
  # :airline_aircraft_seat_class
18
15
  association = if options[:weighted_by].present?
19
16
  options[:weighted_by].is_a?(Array) ? reflect_on_association(options[:weighted_by].first.to_sym) : reflect_on_association(options[:weighted_by].to_sym)
@@ -21,34 +18,37 @@ module WeightedAverage
21
18
 
22
19
  # AirlineAircraftSeatClass
23
20
  association_class = association.klass if association
24
-
25
- # AirlineAircraftSeatClass.arel_table
26
- foreign_arel_table = association_class.arel_table if association_class
27
-
28
- # 'weighting'
29
- weighted_by_column = if association_class and options[:weighted_by].is_a?(Array)
21
+
22
+ # `airline_aircraft_seat_classes`
23
+ weighted_by_table_name = if association_class
24
+ association_class.quoted_table_name
25
+ else
26
+ quoted_table_name
27
+ end
28
+
29
+ # `airline_aircraft_seat_classes`.`weighting`
30
+ weighted_by_column_name = if association_class and options[:weighted_by].is_a?(Array)
30
31
  options[:weighted_by].last.to_s
31
32
  elsif !association_class and (options[:weighted_by].is_a?(String) or options[:weighted_by].is_a?(Symbol))
32
33
  options[:weighted_by].to_s
33
34
  else
34
35
  'weighting'
35
36
  end
36
-
37
- # [foreign_]arel_table['weighting']
38
- weighted_by = if foreign_arel_table
39
- foreign_arel_table[weighted_by_column]
40
- else
41
- arel_table[weighted_by_column]
37
+ weighted_by_column_name = [ weighted_by_table_name, connection.quote_column_name(weighted_by_column_name) ].join '.'
38
+
39
+ # `aircraft`.`passengers`
40
+ disaggregate_by_column_name = if options[:disaggregate_by]
41
+ [ quoted_table_name, connection.quote_column_name(options[:disaggregate_by]) ].join '.'
42
42
  end
43
43
 
44
- disaggregate_by = if options[:disaggregate_by].present?
45
- raise ArgumentError, "Disaggregating by a foreign table isn't supported right now" if options[:disaggregate_by].is_a?(Array)
46
- arel_table[options[:disaggregate_by].to_s]
44
+ # [ `aircraft`.`foo`, `aircraft`.`baz` ]
45
+ data_column_names = Array.wrap(data_column_names).map do |data_column_name|
46
+ [ quoted_table_name, connection.quote_column_name(data_column_name) ].join '.'
47
47
  end
48
48
 
49
- relation = select("(SUM((#{columns.map { |column| column.to_sql }.join(' + ')}) #{"/ #{disaggregate_by.to_sql} " if disaggregate_by}* #{weighted_by.to_sql}) / SUM(#{weighted_by.to_sql})) AS weighted_average")
50
- columns.each do |column|
51
- relation = relation.where("#{column.to_sql} IS NOT NULL")
49
+ relation = select("(SUM((#{data_column_names.join(' + ')}) #{"/ #{disaggregate_by_column_name} " if disaggregate_by_column_name}* #{weighted_by_column_name}) / SUM(#{weighted_by_column_name})) AS weighted_average")
50
+ data_column_names.each do |data_column_name|
51
+ relation = relation.where("#{data_column_name} IS NOT NULL")
52
52
  end
53
53
  # FIXME this will break on through relationships, where it has to be :aircraft => :aircraft_class
54
54
  relation = relation.joins(association.name) if association_class
data/test/helper.rb CHANGED
@@ -1,7 +1,9 @@
1
1
  require 'rubygems'
2
2
  require 'test/unit'
3
3
  require 'shoulda'
4
- require 'ruby-debug'
4
+ unless RUBY_VERSION >= '1.9'
5
+ require 'ruby-debug'
6
+ end
5
7
  require 'logger'
6
8
  require 'cohort_scope'
7
9
 
@@ -0,0 +1,63 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{weighted_average}
8
+ s.version = "0.0.6"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Seamus Abshere", "Andy Rossmeissl", "Ian Hough", "Matt Kling"]
12
+ s.date = %q{2010-11-16}
13
+ s.description = %q{Perform weighted averages, even across associations. Rails 3 only because it uses ARel.}
14
+ s.email = %q{seamus@abshere.net}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "LICENSE",
23
+ "README.rdoc",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "lib/weighted_average.rb",
27
+ "test/helper.rb",
28
+ "test/test_weighted_average.rb",
29
+ "weighted_average.gemspec"
30
+ ]
31
+ s.homepage = %q{http://github.com/seamusabshere/weighted_average}
32
+ s.rdoc_options = ["--charset=UTF-8"]
33
+ s.require_paths = ["lib"]
34
+ s.rubygems_version = %q{1.3.7}
35
+ s.summary = %q{Perform weighted averages. Rails 3 only.}
36
+ s.test_files = [
37
+ "test/helper.rb",
38
+ "test/test_weighted_average.rb"
39
+ ]
40
+
41
+ if s.respond_to? :specification_version then
42
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
43
+ s.specification_version = 3
44
+
45
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
46
+ s.add_runtime_dependency(%q<activerecord>, ["~> 3"])
47
+ s.add_runtime_dependency(%q<arel>, ["~> 2"])
48
+ s.add_development_dependency(%q<cohort_scope>, [">= 0.0.2"])
49
+ s.add_development_dependency(%q<shoulda>, [">= 2.10.3"])
50
+ else
51
+ s.add_dependency(%q<activerecord>, ["~> 3"])
52
+ s.add_dependency(%q<arel>, ["~> 2"])
53
+ s.add_dependency(%q<cohort_scope>, [">= 0.0.2"])
54
+ s.add_dependency(%q<shoulda>, [">= 2.10.3"])
55
+ end
56
+ else
57
+ s.add_dependency(%q<activerecord>, ["~> 3"])
58
+ s.add_dependency(%q<arel>, ["~> 2"])
59
+ s.add_dependency(%q<cohort_scope>, [">= 0.0.2"])
60
+ s.add_dependency(%q<shoulda>, [">= 2.10.3"])
61
+ end
62
+ end
63
+
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: weighted_average
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 19
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 5
10
- version: 0.0.5
9
+ - 6
10
+ version: 0.0.6
11
11
  platform: ruby
12
12
  authors:
13
13
  - Seamus Abshere
@@ -18,7 +18,7 @@ autorequire:
18
18
  bindir: bin
19
19
  cert_chain: []
20
20
 
21
- date: 2010-09-20 00:00:00 -05:00
21
+ date: 2010-11-16 00:00:00 -06:00
22
22
  default_executable:
23
23
  dependencies:
24
24
  - !ruby/object:Gem::Dependency
@@ -27,15 +27,12 @@ dependencies:
27
27
  requirement: &id001 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
- - - ">="
30
+ - - ~>
31
31
  - !ruby/object:Gem::Version
32
- hash: 299253626
32
+ hash: 5
33
33
  segments:
34
34
  - 3
35
- - 0
36
- - 0
37
- - beta2
38
- version: 3.0.0.beta2
35
+ version: "3"
39
36
  type: :runtime
40
37
  version_requirements: *id001
41
38
  - !ruby/object:Gem::Dependency
@@ -44,14 +41,12 @@ dependencies:
44
41
  requirement: &id002 !ruby/object:Gem::Requirement
45
42
  none: false
46
43
  requirements:
47
- - - ">="
44
+ - - ~>
48
45
  - !ruby/object:Gem::Version
49
- hash: 21
46
+ hash: 7
50
47
  segments:
51
- - 0
52
- - 3
53
- - 3
54
- version: 0.3.3
48
+ - 2
49
+ version: "2"
55
50
  type: :runtime
56
51
  version_requirements: *id002
57
52
  - !ruby/object:Gem::Dependency
@@ -105,6 +100,7 @@ files:
105
100
  - lib/weighted_average.rb
106
101
  - test/helper.rb
107
102
  - test/test_weighted_average.rb
103
+ - weighted_average.gemspec
108
104
  has_rdoc: true
109
105
  homepage: http://github.com/seamusabshere/weighted_average
110
106
  licenses: []