dm-aggregates 1.1.0.rc2 → 1.1.0.rc3

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/Gemfile CHANGED
@@ -5,7 +5,7 @@ source 'http://rubygems.org'
5
5
  SOURCE = ENV.fetch('SOURCE', :git).to_sym
6
6
  REPO_POSTFIX = SOURCE == :path ? '' : '.git'
7
7
  DATAMAPPER = SOURCE == :path ? Pathname(__FILE__).dirname.parent : 'http://github.com/datamapper'
8
- DM_VERSION = '~> 1.1.0.rc2'
8
+ DM_VERSION = '~> 1.1.0.rc3'
9
9
  DO_VERSION = '~> 0.10.2'
10
10
  DM_DO_ADAPTERS = %w[ sqlite postgres mysql oracle sqlserver ]
11
11
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.0.rc2
1
+ 1.1.0.rc3
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{dm-aggregates}
8
- s.version = "1.1.0.rc2"
8
+ s.version = "1.1.0.rc3"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Foy Savas"]
12
- s.date = %q{2011-03-01}
12
+ s.date = %q{2011-03-10}
13
13
  s.description = %q{DataMapper plugin providing support for aggregates on collections}
14
14
  s.email = %q{foysavas [a] gmail [d] com}
15
15
  s.extra_rdoc_files = [
@@ -28,7 +28,9 @@ Gem::Specification.new do |s|
28
28
  "lib/dm-aggregates/aggregate_functions.rb",
29
29
  "lib/dm-aggregates/collection.rb",
30
30
  "lib/dm-aggregates/core_ext/symbol.rb",
31
+ "lib/dm-aggregates/functions.rb",
31
32
  "lib/dm-aggregates/model.rb",
33
+ "lib/dm-aggregates/operators.rb",
32
34
  "lib/dm-aggregates/query.rb",
33
35
  "lib/dm-aggregates/repository.rb",
34
36
  "spec/isolated/require_after_setup_spec.rb",
@@ -47,7 +49,7 @@ Gem::Specification.new do |s|
47
49
  s.homepage = %q{http://github.com/datamapper/dm-aggregates}
48
50
  s.require_paths = ["lib"]
49
51
  s.rubyforge_project = %q{datamapper}
50
- s.rubygems_version = %q{1.5.2}
52
+ s.rubygems_version = %q{1.6.2}
51
53
  s.summary = %q{DataMapper plugin providing support for aggregates on collections}
52
54
  s.test_files = [
53
55
  "spec/isolated/require_after_setup_spec.rb",
@@ -63,18 +65,18 @@ Gem::Specification.new do |s|
63
65
  s.specification_version = 3
64
66
 
65
67
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
66
- s.add_runtime_dependency(%q<dm-core>, ["~> 1.1.0.rc2"])
68
+ s.add_runtime_dependency(%q<dm-core>, ["~> 1.1.0.rc3"])
67
69
  s.add_development_dependency(%q<jeweler>, ["~> 1.5.2"])
68
70
  s.add_development_dependency(%q<rake>, ["~> 0.8.7"])
69
71
  s.add_development_dependency(%q<rspec>, ["~> 1.3.1"])
70
72
  else
71
- s.add_dependency(%q<dm-core>, ["~> 1.1.0.rc2"])
73
+ s.add_dependency(%q<dm-core>, ["~> 1.1.0.rc3"])
72
74
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
73
75
  s.add_dependency(%q<rake>, ["~> 0.8.7"])
74
76
  s.add_dependency(%q<rspec>, ["~> 1.3.1"])
75
77
  end
76
78
  else
77
- s.add_dependency(%q<dm-core>, ["~> 1.1.0.rc2"])
79
+ s.add_dependency(%q<dm-core>, ["~> 1.1.0.rc3"])
78
80
  s.add_dependency(%q<jeweler>, ["~> 1.5.2"])
79
81
  s.add_dependency(%q<rake>, ["~> 0.8.7"])
80
82
  s.add_dependency(%q<rspec>, ["~> 1.3.1"])
data/lib/dm-aggregates.rb CHANGED
@@ -7,12 +7,6 @@ require 'dm-aggregates/model'
7
7
  require 'dm-aggregates/query'
8
8
  require 'dm-aggregates/repository'
9
9
 
10
- begin
11
- require 'active_support/core_ext/time/conversions'
12
- rescue LoadError
13
- require 'extlib/time'
14
- end
15
-
16
10
  module DataMapper
17
11
  module Aggregates
18
12
  def self.include_aggregate_api
@@ -1,232 +1 @@
1
- module DataMapper
2
- module Aggregates
3
- module Functions
4
- include DataMapper::Assertions
5
-
6
- # Count results (given the conditions)
7
- #
8
- # @example the count of all friends
9
- # Friend.count
10
- #
11
- # @example the count of all friends older then 18
12
- # Friend.count(:age.gt => 18)
13
- #
14
- # @example the count of all your female friends
15
- # Friend.count(:conditions => [ 'gender = ?', 'female' ])
16
- #
17
- # @example the count of all friends with an address (NULL values are not included)
18
- # Friend.count(:address)
19
- #
20
- # @example the count of all friends with an address that are older then 18
21
- # Friend.count(:address, :age.gt => 18)
22
- #
23
- # @example the count of all your female friends with an address
24
- # Friend.count(:address, :conditions => [ 'gender = ?', 'female' ])
25
- #
26
- # @param property [Symbol] of the property you with to count (optional)
27
- # @param opts [Hash, Symbol] the conditions
28
- #
29
- # @return [Integer] return the count given the conditions
30
- #
31
- # @api public
32
- def count(*args)
33
- query = args.last.kind_of?(Hash) ? args.pop : {}
34
- property_name = args.first
35
-
36
- if property_name
37
- assert_kind_of 'property', property_by_name(property_name), Property
38
- end
39
-
40
- aggregate(query.merge(:fields => [ property_name ? property_name.count : :all.count ])).to_i
41
- end
42
-
43
- # Get the lowest value of a property
44
- #
45
- # @example the age of the youngest friend
46
- # Friend.min(:age)
47
- #
48
- # @example the age of the youngest female friend
49
- # Friend.min(:age, :conditions => [ 'gender = ?', 'female' ])
50
- #
51
- # @param property [Symbol] the property you wish to get the lowest value of
52
- # @param opts [Hash, Symbol] the conditions
53
- #
54
- # @return [Integer] return the lowest value of a property given the conditions
55
- #
56
- # @api public
57
- def min(*args)
58
- query = args.last.kind_of?(Hash) ? args.pop : {}
59
- property_name = args.first
60
-
61
- assert_property_type property_name, ::Integer, ::Float, ::BigDecimal, ::DateTime, ::Date, ::Time
62
-
63
- aggregate(query.merge(:fields => [ property_name.min ]))
64
- end
65
-
66
- # Get the highest value of a property
67
- #
68
- # @example the age of the oldest friend
69
- # Friend.max(:age)
70
- #
71
- # @example the age of the oldest female friend
72
- # Friend.max(:age, :conditions => [ 'gender = ?', 'female' ])
73
- #
74
- # @param property [Symbol] the property you wish to get the highest value of
75
- # @param opts [Hash, Symbol] the conditions
76
- #
77
- # @return [Integer] return the highest value of a property given the conditions
78
- #
79
- # @api public
80
- def max(*args)
81
- query = args.last.kind_of?(Hash) ? args.pop : {}
82
- property_name = args.first
83
-
84
- assert_property_type property_name, ::Integer, ::Float, ::BigDecimal, ::DateTime, ::Date, ::Time
85
-
86
- aggregate(query.merge(:fields => [ property_name.max ]))
87
- end
88
-
89
- # Get the average value of a property
90
- #
91
- # @example the average age of all friends
92
- # Friend.avg(:age)
93
- #
94
- # @example the average age of all female friends
95
- # Friend.avg(:age, :conditions => [ 'gender = ?', 'female' ])
96
- #
97
- # @param property [Symbol] the property you wish to get the average value of
98
- # @param opts [Hash, Symbol] the conditions
99
- #
100
- # @return [Integer] return the average value of a property given the conditions
101
- #
102
- # @api public
103
- def avg(*args)
104
- query = args.last.kind_of?(Hash) ? args.pop : {}
105
- property_name = args.first
106
-
107
- assert_property_type property_name, ::Integer, ::Float, ::BigDecimal
108
-
109
- aggregate(query.merge(:fields => [ property_name.avg ]))
110
- end
111
-
112
- # Get the total value of a property
113
- #
114
- # @example the total age of all friends
115
- # Friend.sum(:age)
116
- #
117
- # @example the total age of all female friends
118
- # Friend.max(:age, :conditions => [ 'gender = ?', 'female' ])
119
- #
120
- # @param property [Symbol] the property you wish to get the total value of
121
- # @param opts [Hash, Symbol] the conditions
122
- #
123
- # @return [Integer] return the total value of a property given the conditions
124
- #
125
- # @api public
126
- def sum(*args)
127
- query = args.last.kind_of?(::Hash) ? args.pop : {}
128
- property_name = args.first
129
-
130
- assert_property_type property_name, ::Integer, ::Float, ::BigDecimal
131
-
132
- aggregate(query.merge(:fields => [ property_name.sum ]))
133
- end
134
-
135
- # Perform aggregate queries
136
- #
137
- # @example the count of friends
138
- # Friend.aggregate(:all.count)
139
- #
140
- # @example the minimum age, the maximum age and the total age of friends
141
- # Friend.aggregate(:age.min, :age.max, :age.sum)
142
- #
143
- # @example the average age, grouped by gender
144
- # Friend.aggregate(:age.avg, :fields => [ :gender ])
145
- #
146
- # @param aggregates [Symbol, ...] operators to aggregate with
147
- # @param query [Hash] the conditions
148
- #
149
- # @return [Array,Numeric,DateTime,Date,Time] the results of the
150
- # aggregate query
151
- #
152
- # @api public
153
- def aggregate(*args)
154
- query = args.last.kind_of?(Hash) ? args.pop : {}
155
-
156
- query[:fields] ||= []
157
- query[:fields] |= args
158
- query[:fields].map! { |f| normalize_field(f) }
159
-
160
- raise ArgumentError, 'query[:fields] must not be empty' if query[:fields].empty?
161
-
162
- unless query.key?(:order)
163
- # the current collection/model is already sorted by attributes
164
- # and since we are projecting away some of the attributes,
165
- # and then performing aggregate functions on the remainder,
166
- # we need to honor the existing order, as if it were already
167
- # materialized, and we are looping over the rows in order.
168
-
169
- directions = direction_map
170
-
171
- query[:order] = []
172
-
173
- # use the current query order for each property if available
174
- query[:fields].each do |property|
175
- next unless property.kind_of?(Property)
176
- query[:order] << directions.fetch(property, property)
177
- end
178
- end
179
-
180
- query = scoped_query(query)
181
-
182
- if query.fields.any? { |p| p.kind_of?(Property) }
183
- query.repository.aggregate(query.update(:unique => true))
184
- else
185
- query.repository.aggregate(query).first # only return one row
186
- end
187
- end
188
-
189
- private
190
-
191
- def assert_property_type(name, *types)
192
- if name.nil?
193
- raise ArgumentError, 'property name must not be nil'
194
- end
195
-
196
- property = property_by_name(name)
197
- type = property.primitive
198
-
199
- unless types.include?(type)
200
- raise ArgumentError, "#{name} must be #{types * ' or '}, but was #{type}"
201
- end
202
- end
203
-
204
- def normalize_field(field)
205
- assert_kind_of 'field', field, DataMapper::Query::Operator, Symbol, Property
206
-
207
- case field
208
- when DataMapper::Query::Operator
209
- if field.target == :all
210
- field
211
- else
212
- field.class.new(property_by_name(field.target), field.operator)
213
- end
214
-
215
- when Symbol
216
- property_by_name(field)
217
-
218
- when Property
219
- field
220
- end
221
- end
222
-
223
- def direction_map
224
- direction_map = {}
225
- self.query.order.each do |direction|
226
- direction_map[direction.target] = direction
227
- end
228
- direction_map
229
- end
230
- end
231
- end
232
- end
1
+ require 'dm-aggregates/functions'
@@ -3,10 +3,6 @@ module DataMapper
3
3
  module Collection
4
4
  include Functions
5
5
 
6
- # def size
7
- # loaded? ? super : count
8
- # end
9
-
10
6
  private
11
7
 
12
8
  def property_by_name(property_name)
@@ -1,9 +1,7 @@
1
+ require 'dm-aggregates/operators'
2
+
1
3
  class Symbol
2
- [ :count, :min, :max, :avg, :sum ].each do |sym|
3
- class_eval <<-RUBY, __FILE__, __LINE__ + 1
4
- def #{sym}
5
- DataMapper::Query::Operator.new(self, #{sym.inspect})
6
- end
7
- RUBY
8
- end
9
- end # class Symbol
4
+
5
+ include DataMapper::Aggregates::Operators
6
+
7
+ end
@@ -0,0 +1,232 @@
1
+ module DataMapper
2
+ module Aggregates
3
+ module Functions
4
+ include DataMapper::Assertions
5
+
6
+ # Count results (given the conditions)
7
+ #
8
+ # @example the count of all friends
9
+ # Friend.count
10
+ #
11
+ # @example the count of all friends older then 18
12
+ # Friend.count(:age.gt => 18)
13
+ #
14
+ # @example the count of all your female friends
15
+ # Friend.count(:conditions => [ 'gender = ?', 'female' ])
16
+ #
17
+ # @example the count of all friends with an address (NULL values are not included)
18
+ # Friend.count(:address)
19
+ #
20
+ # @example the count of all friends with an address that are older then 18
21
+ # Friend.count(:address, :age.gt => 18)
22
+ #
23
+ # @example the count of all your female friends with an address
24
+ # Friend.count(:address, :conditions => [ 'gender = ?', 'female' ])
25
+ #
26
+ # @param property [Symbol] of the property you with to count (optional)
27
+ # @param opts [Hash, Symbol] the conditions
28
+ #
29
+ # @return [Integer] return the count given the conditions
30
+ #
31
+ # @api public
32
+ def count(*args)
33
+ query = args.last.kind_of?(Hash) ? args.pop : {}
34
+ property_name = args.first
35
+
36
+ if property_name
37
+ assert_kind_of 'property', property_by_name(property_name), Property
38
+ end
39
+
40
+ aggregate(query.merge(:fields => [ property_name ? property_name.count : :all.count ])).to_i
41
+ end
42
+
43
+ # Get the lowest value of a property
44
+ #
45
+ # @example the age of the youngest friend
46
+ # Friend.min(:age)
47
+ #
48
+ # @example the age of the youngest female friend
49
+ # Friend.min(:age, :conditions => [ 'gender = ?', 'female' ])
50
+ #
51
+ # @param property [Symbol] the property you wish to get the lowest value of
52
+ # @param opts [Hash, Symbol] the conditions
53
+ #
54
+ # @return [Integer] return the lowest value of a property given the conditions
55
+ #
56
+ # @api public
57
+ def min(*args)
58
+ query = args.last.kind_of?(Hash) ? args.pop : {}
59
+ property_name = args.first
60
+
61
+ assert_property_type property_name, ::Integer, ::Float, ::BigDecimal, ::DateTime, ::Date, ::Time
62
+
63
+ aggregate(query.merge(:fields => [ property_name.min ]))
64
+ end
65
+
66
+ # Get the highest value of a property
67
+ #
68
+ # @example the age of the oldest friend
69
+ # Friend.max(:age)
70
+ #
71
+ # @example the age of the oldest female friend
72
+ # Friend.max(:age, :conditions => [ 'gender = ?', 'female' ])
73
+ #
74
+ # @param property [Symbol] the property you wish to get the highest value of
75
+ # @param opts [Hash, Symbol] the conditions
76
+ #
77
+ # @return [Integer] return the highest value of a property given the conditions
78
+ #
79
+ # @api public
80
+ def max(*args)
81
+ query = args.last.kind_of?(Hash) ? args.pop : {}
82
+ property_name = args.first
83
+
84
+ assert_property_type property_name, ::Integer, ::Float, ::BigDecimal, ::DateTime, ::Date, ::Time
85
+
86
+ aggregate(query.merge(:fields => [ property_name.max ]))
87
+ end
88
+
89
+ # Get the average value of a property
90
+ #
91
+ # @example the average age of all friends
92
+ # Friend.avg(:age)
93
+ #
94
+ # @example the average age of all female friends
95
+ # Friend.avg(:age, :conditions => [ 'gender = ?', 'female' ])
96
+ #
97
+ # @param property [Symbol] the property you wish to get the average value of
98
+ # @param opts [Hash, Symbol] the conditions
99
+ #
100
+ # @return [Integer] return the average value of a property given the conditions
101
+ #
102
+ # @api public
103
+ def avg(*args)
104
+ query = args.last.kind_of?(Hash) ? args.pop : {}
105
+ property_name = args.first
106
+
107
+ assert_property_type property_name, ::Integer, ::Float, ::BigDecimal
108
+
109
+ aggregate(query.merge(:fields => [ property_name.avg ]))
110
+ end
111
+
112
+ # Get the total value of a property
113
+ #
114
+ # @example the total age of all friends
115
+ # Friend.sum(:age)
116
+ #
117
+ # @example the total age of all female friends
118
+ # Friend.max(:age, :conditions => [ 'gender = ?', 'female' ])
119
+ #
120
+ # @param property [Symbol] the property you wish to get the total value of
121
+ # @param opts [Hash, Symbol] the conditions
122
+ #
123
+ # @return [Integer] return the total value of a property given the conditions
124
+ #
125
+ # @api public
126
+ def sum(*args)
127
+ query = args.last.kind_of?(::Hash) ? args.pop : {}
128
+ property_name = args.first
129
+
130
+ assert_property_type property_name, ::Integer, ::Float, ::BigDecimal
131
+
132
+ aggregate(query.merge(:fields => [ property_name.sum ]))
133
+ end
134
+
135
+ # Perform aggregate queries
136
+ #
137
+ # @example the count of friends
138
+ # Friend.aggregate(:all.count)
139
+ #
140
+ # @example the minimum age, the maximum age and the total age of friends
141
+ # Friend.aggregate(:age.min, :age.max, :age.sum)
142
+ #
143
+ # @example the average age, grouped by gender
144
+ # Friend.aggregate(:age.avg, :fields => [ :gender ])
145
+ #
146
+ # @param aggregates [Symbol, ...] operators to aggregate with
147
+ # @param query [Hash] the conditions
148
+ #
149
+ # @return [Array,Numeric,DateTime,Date,Time] the results of the
150
+ # aggregate query
151
+ #
152
+ # @api public
153
+ def aggregate(*args)
154
+ query = args.last.kind_of?(Hash) ? args.pop : {}
155
+
156
+ query[:fields] ||= []
157
+ query[:fields] |= args
158
+ query[:fields].map! { |f| normalize_field(f) }
159
+
160
+ raise ArgumentError, 'query[:fields] must not be empty' if query[:fields].empty?
161
+
162
+ unless query.key?(:order)
163
+ # the current collection/model is already sorted by attributes
164
+ # and since we are projecting away some of the attributes,
165
+ # and then performing aggregate functions on the remainder,
166
+ # we need to honor the existing order, as if it were already
167
+ # materialized, and we are looping over the rows in order.
168
+
169
+ directions = direction_map
170
+
171
+ query[:order] = []
172
+
173
+ # use the current query order for each property if available
174
+ query[:fields].each do |property|
175
+ next unless property.kind_of?(Property)
176
+ query[:order] << directions.fetch(property, property)
177
+ end
178
+ end
179
+
180
+ query = scoped_query(query)
181
+
182
+ if query.fields.any? { |p| p.kind_of?(Property) }
183
+ query.repository.aggregate(query.update(:unique => true))
184
+ else
185
+ query.repository.aggregate(query).first # only return one row
186
+ end
187
+ end
188
+
189
+ private
190
+
191
+ def assert_property_type(name, *types)
192
+ if name.nil?
193
+ raise ArgumentError, 'property name must not be nil'
194
+ end
195
+
196
+ property = property_by_name(name)
197
+ type = property.primitive
198
+
199
+ unless types.include?(type)
200
+ raise ArgumentError, "#{name} must be #{types * ' or '}, but was #{type}"
201
+ end
202
+ end
203
+
204
+ def normalize_field(field)
205
+ assert_kind_of 'field', field, DataMapper::Query::Operator, Symbol, Property
206
+
207
+ case field
208
+ when DataMapper::Query::Operator
209
+ if field.target == :all
210
+ field
211
+ else
212
+ field.class.new(property_by_name(field.target), field.operator)
213
+ end
214
+
215
+ when Symbol
216
+ property_by_name(field)
217
+
218
+ when Property
219
+ field
220
+ end
221
+ end
222
+
223
+ def direction_map
224
+ direction_map = {}
225
+ self.query.order.each do |direction|
226
+ direction_map[direction.target] = direction
227
+ end
228
+ direction_map
229
+ end
230
+ end
231
+ end
232
+ end
@@ -3,10 +3,6 @@ module DataMapper
3
3
  module Model
4
4
  include Functions
5
5
 
6
- # def size
7
- # count
8
- # end
9
-
10
6
  private
11
7
 
12
8
  def property_by_name(property_name)
@@ -0,0 +1,25 @@
1
+ module DataMapper
2
+ module Aggregates
3
+ module Operators
4
+ def count
5
+ DataMapper::Query::Operator.new(self, :count)
6
+ end
7
+
8
+ def min
9
+ DataMapper::Query::Operator.new(self, :min)
10
+ end
11
+
12
+ def max
13
+ DataMapper::Query::Operator.new(self, :max)
14
+ end
15
+
16
+ def avg
17
+ DataMapper::Query::Operator.new(self, :avg)
18
+ end
19
+
20
+ def sum
21
+ DataMapper::Query::Operator.new(self, :sum)
22
+ end
23
+ end # module Operators
24
+ end # module Aggregates
25
+ end # module DataMapper
@@ -2,8 +2,11 @@ module DataMapper
2
2
  module Aggregates
3
3
  module Repository
4
4
  def aggregate(query)
5
- return [] unless query.valid?
6
- adapter.aggregate(query)
5
+ unless query.valid?
6
+ []
7
+ else
8
+ adapter.aggregate(query)
9
+ end
7
10
  end
8
11
  end
9
12
  end
@@ -118,7 +118,9 @@ describe DataMapper::Collection do
118
118
 
119
119
  describe "#count" do
120
120
  it 'should return 1' do
121
- pending { @dragons.count.should == 1 }
121
+ pending 'TODO: make count apply to the limited collection. Currently limit applies after the count' do
122
+ @dragons.count.should == 1
123
+ end
122
124
  end
123
125
  end
124
126
 
@@ -10,9 +10,9 @@ shared_examples_for 'It Has Setup Resources' do
10
10
 
11
11
  DataMapper.auto_migrate!
12
12
 
13
- @birth_time = Time.now
14
- @birth_at = @birth_time.to_datetime
15
- @birth_on = @birth_time.send(:to_date)
13
+ @birth_at = DateTime.now
14
+ @birth_on = Date.parse(@birth_at.to_s)
15
+ @birth_time = Time.parse(@birth_at.to_s)
16
16
 
17
17
  @chuck = Knight.create(:name => 'Chuck')
18
18
  @larry = Knight.create(:name => 'Larry')
@@ -112,9 +112,10 @@ shared_examples_for 'An Aggregatable Class' do
112
112
  end
113
113
 
114
114
  it 'should provide the lowest value of a DateTime property' do
115
- pending 'TODO: returns incorrect value until DO handles TZs properly' if @skip
116
- @dragons.min(:birth_at).should be_kind_of(DateTime)
117
- @dragons.min(:birth_at).to_s.should == @birth_at.to_s
115
+ pending_if 'TODO: returns incorrect value until DO handles TZs properly', @skip do
116
+ @dragons.min(:birth_at).should be_kind_of(DateTime)
117
+ @dragons.min(:birth_at).to_s.should == @birth_at.to_s
118
+ end
118
119
  end
119
120
 
120
121
  it 'should provide the lowest value of a Date property' do
@@ -158,9 +159,10 @@ shared_examples_for 'An Aggregatable Class' do
158
159
  end
159
160
 
160
161
  it 'should provide the highest value of a DateTime property' do
161
- pending 'TODO: returns incorrect value until DO handles TZs properly' if @skip
162
- @dragons.min(:birth_at).should be_kind_of(DateTime)
163
- @dragons.min(:birth_at).to_s.should == @birth_at.to_s
162
+ pending_if 'TODO: returns incorrect value until DO handles TZs properly', @skip do
163
+ @dragons.min(:birth_at).should be_kind_of(DateTime)
164
+ @dragons.min(:birth_at).to_s.should == @birth_at.to_s
165
+ end
164
166
  end
165
167
 
166
168
  it 'should provide the highest value of a Date property' do
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'dm-core/spec/setup'
2
2
  require 'dm-core/spec/lib/adapter_helpers'
3
+ require 'dm-core/spec/lib/pending_helpers'
3
4
 
4
5
  require 'dm-aggregates'
5
6
  require 'dm-migrations'
@@ -11,6 +12,7 @@ DataMapper::Spec.setup
11
12
  Spec::Runner.configure do |config|
12
13
 
13
14
  config.extend(DataMapper::Spec::Adapters::Helpers)
15
+ config.include(DataMapper::Spec::PendingHelpers)
14
16
 
15
17
  config.before(:all) do
16
18
 
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: dm-aggregates
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: 6
5
- version: 1.1.0.rc2
5
+ version: 1.1.0.rc3
6
6
  platform: ruby
7
7
  authors:
8
8
  - Foy Savas
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-03-01 00:00:00 -08:00
13
+ date: 2011-03-10 00:00:00 -08:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ~>
22
22
  - !ruby/object:Gem::Version
23
- version: 1.1.0.rc2
23
+ version: 1.1.0.rc3
24
24
  type: :runtime
25
25
  prerelease: false
26
26
  version_requirements: *id001
@@ -78,7 +78,9 @@ files:
78
78
  - lib/dm-aggregates/aggregate_functions.rb
79
79
  - lib/dm-aggregates/collection.rb
80
80
  - lib/dm-aggregates/core_ext/symbol.rb
81
+ - lib/dm-aggregates/functions.rb
81
82
  - lib/dm-aggregates/model.rb
83
+ - lib/dm-aggregates/operators.rb
82
84
  - lib/dm-aggregates/query.rb
83
85
  - lib/dm-aggregates/repository.rb
84
86
  - spec/isolated/require_after_setup_spec.rb
@@ -117,7 +119,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
117
119
  requirements: []
118
120
 
119
121
  rubyforge_project: datamapper
120
- rubygems_version: 1.5.2
122
+ rubygems_version: 1.6.2
121
123
  signing_key:
122
124
  specification_version: 3
123
125
  summary: DataMapper plugin providing support for aggregates on collections