trackoid 0.1.9 → 0.1.10

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -187,20 +187,35 @@ For comparison, this README is already 8.5Kb in size.
187
187
 
188
188
  = Revision History
189
189
 
190
- 0.1.9 - Refactored TrackerAggregates to include all accessor methods
191
- (all, last, first, etc.)
192
-
193
- 0.1.8 - Another maintenance release. Sorry. :-)
194
-
195
- 0.1.7 - Maintenance Release: A little error with the index on aggregated fields
196
-
197
- 0.1.6 - Enabled support for String dates in operators. This string date must
198
- be DateTime parseable.
199
- For example: @spain.world_cups.inc("2010-07-11")
200
- - Normalized Date and DateTime objects to use only Date methods.
201
- - Added "first" / "first_date" / "last" / "last_date" accessors.
202
- - Added "all" accessor.
203
-
204
- 0.1.5 - Added support for namespaced models and aggregations
205
- - Enabled "set" operations on aggregates
190
+ 0.1.10 - Renamed accessor methods from "all", "last", "first" to
191
+ "all_values", "first_value" and "last_value" so as not to
192
+ conflict with traditional ActiveRecord accessors.
193
+ - Aggregate methods with a key returns a single instance, not an
194
+ Array. For example:
195
+
196
+ @page.visits.browser("mozilla").today
197
+ # Returns now a number instead of an Array
198
+
199
+ - Arguments are now passed thru aggregator accessors. For example:
200
+
201
+ @page.visits.brosers("mozilla").last_days(15)
202
+ # Should correctly return now an array with 15 elements.
203
+
204
+ 0.1.9 - Refactored TrackerAggregates to include all accessor methods
205
+ (all, last, first, etc.)
206
+
207
+ 0.1.8 - Another maintenance release. Sorry. :-)
208
+
209
+ 0.1.7 - Maintenance Release: A little error with the index on aggregated
210
+ fields
211
+
212
+ 0.1.6 - Enabled support for String dates in operators. This string date
213
+ must be DateTime parseable.
214
+ For example: @spain.world_cups.inc("2010-07-11")
215
+ - Normalized Date and DateTime objects to use only Date methods.
216
+ - Added "first" / "first_date" / "last" / "last_date" accessors.
217
+ - Added "all" accessor.
218
+
219
+ 0.1.5 - Added support for namespaced models and aggregations
220
+ - Enabled "set" operations on aggregates
206
221
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.9
1
+ 0.1.10
@@ -86,14 +86,6 @@ module Mongoid #:nodoc:
86
86
 
87
87
 
88
88
  # Access methods
89
- def first
90
- data_for(first_date)
91
- end
92
-
93
- def last
94
- data_for(last_date)
95
- end
96
-
97
89
  def today
98
90
  data_for(Date.today)
99
91
  end
@@ -102,6 +94,14 @@ module Mongoid #:nodoc:
102
94
  data_for(Date.today - 1)
103
95
  end
104
96
 
97
+ def first_value
98
+ data_for(first_date)
99
+ end
100
+
101
+ def last_value
102
+ data_for(last_date)
103
+ end
104
+
105
105
  def last_days(how_much = 7)
106
106
  return [today] unless how_much > 0
107
107
  date, values = Date.today, []
@@ -114,7 +114,7 @@ module Mongoid #:nodoc:
114
114
  data_for(date)
115
115
  end
116
116
 
117
- def all
117
+ def all_values
118
118
  on(first_date..last_date) if first_date
119
119
  end
120
120
 
@@ -122,6 +122,7 @@ module Mongoid #:nodoc:
122
122
  def first_date
123
123
  # We are guaranteed _m and _d to exists unless @data is a malformed
124
124
  # hash, so we need to do this nasty "return nil", sorry...
125
+ # TODO: I'm open to change this to a cleaner algorithm :-)
125
126
  return nil unless _y = @data.keys.min
126
127
  return nil unless _m = @data[_y].keys.min
127
128
  return nil unless _d = @data[_y][_m].keys.min
@@ -131,6 +132,7 @@ module Mongoid #:nodoc:
131
132
  def last_date
132
133
  # We are guaranteed _m and _d to exists unless @data is a malformed
133
134
  # hash, so we need to do this nasty "return nil", sorry...
135
+ # TODO: I'm open to change this to a cleaner algorithm :-)
134
136
  return nil unless _y = @data.keys.max
135
137
  return nil unless _m = @data[_y].keys.max
136
138
  return nil unless _d = @data[_y][_m].keys.max
@@ -6,12 +6,12 @@ module Mongoid #:nodoc:
6
6
 
7
7
  def initialize(owner, token, key_selector, track_field = nil)
8
8
  @owner, @token = owner, token
9
- @key = key_selector
9
+ @key = key_selector.first
10
10
  @track_field = track_field
11
11
 
12
12
  @accessor = @owner.class.send(:internal_accessor_name, @token)
13
13
  @selector = {:ns => @token}
14
- @selector.merge!(:key => @key.first) if @key.first
14
+ @selector.merge!(:key => @key) if @key
15
15
  @criteria = @owner.send(@accessor).where(@selector)
16
16
  end
17
17
 
@@ -20,21 +20,21 @@ module Mongoid #:nodoc:
20
20
  @criteria.send(name)
21
21
  end
22
22
 
23
- # Access the aggregation collection with "collection" so that we can
24
- # use the original mongoid methods like "all", "first", etc.
25
- def collection
26
- @criteria
27
- end
28
-
29
23
  # Define all accessors here. Basically we are delegating to the Track
30
24
  # object for every object in the criteria
31
- [ :today, :yesterday, :last_days, :all, :first, :last,
25
+ [ :today, :yesterday, :last_days, :all_values, :first_value, :last_value,
32
26
  :first_date, :last_date
33
27
  ].each {|name|
34
28
  define_method(name) do |*args|
35
- @criteria.collect {|c|
36
- [c.key, c.send(@track_field).send(name)] if @track_field
37
- }
29
+ return nil unless @track_field
30
+ if @key
31
+ res = @criteria.first
32
+ res.send(@track_field).send(name, *args) if res
33
+ else
34
+ @criteria.collect {|c|
35
+ [c.key, c.send(@track_field).send(name, *args)]
36
+ }
37
+ end
38
38
  end
39
39
  }
40
40
 
@@ -161,18 +161,18 @@ describe Mongoid::Tracking::Aggregates do
161
161
 
162
162
  it "should correctly save all aggregation keys as strings (inc)" do
163
163
  @mock.something("test").inc
164
- @mock.something.aggregate_one.collection.first.key.is_a?(String).should be_true
165
- @mock.something.aggregate_two.collection.first.key.is_a?(String).should be_true
166
- @mock.something.aggregate_three.collection.first.key.is_a?(String).should be_true
167
- @mock.something.aggregate_four.collection.first.key.is_a?(String).should be_true
164
+ @mock.something.aggregate_one.first.key.is_a?(String).should be_true
165
+ @mock.something.aggregate_two.first.key.is_a?(String).should be_true
166
+ @mock.something.aggregate_three.first.key.is_a?(String).should be_true
167
+ @mock.something.aggregate_four.first.key.is_a?(String).should be_true
168
168
  end
169
169
 
170
170
  it "should correctly save all aggregation keys as strings (set)" do
171
171
  @mock.something("test").set(5)
172
- @mock.something.aggregate_one.collection.first.key.is_a?(String).should be_true
173
- @mock.something.aggregate_two.collection.first.key.is_a?(String).should be_true
174
- @mock.something.aggregate_three.collection.first.key.is_a?(String).should be_true
175
- @mock.something.aggregate_four.collection.first.key.is_a?(String).should be_true
172
+ @mock.something.aggregate_one.first.key.is_a?(String).should be_true
173
+ @mock.something.aggregate_two.first.key.is_a?(String).should be_true
174
+ @mock.something.aggregate_three.first.key.is_a?(String).should be_true
175
+ @mock.something.aggregate_four.first.key.is_a?(String).should be_true
176
176
  end
177
177
 
178
178
  end
@@ -217,8 +217,8 @@ describe Mongoid::Tracking::Aggregates do
217
217
  end
218
218
 
219
219
  it "should have 0 visits yesterday" do
220
- @mock.visits.browsers.today.should == [["mozilla", 1]]
221
- @mock.visits.referers.today.should == [["firefox", 1]]
220
+ @mock.visits.browsers.yesterday.should == [["mozilla", 0]]
221
+ @mock.visits.referers.yesterday.should == [["firefox", 0]]
222
222
  end
223
223
 
224
224
  it "should have 1 visits last 7 days" do
@@ -226,6 +226,11 @@ describe Mongoid::Tracking::Aggregates do
226
226
  @mock.visits.referers.last_days(7).should == [["firefox", [0, 0, 0, 0, 0, 0, 1]]]
227
227
  end
228
228
 
229
+ it "should work also for arbitrary days" do
230
+ @mock.visits.browsers.last_days(15).should == [["mozilla", [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]]]
231
+ @mock.visits.referers.last_days(15).should == [["firefox", [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]]]
232
+ end
233
+
229
234
  it "should work adding 1 visit with different aggregation data" do
230
235
  @mock.visits("Google Chrome").inc
231
236
  @mock.visits.browsers.today.should == [["mozilla", 1], ["google", 1]]
@@ -235,6 +240,10 @@ describe Mongoid::Tracking::Aggregates do
235
240
  @mock.visits.browsers.today.inject(0) {|total, c| total + c.last }.should == 2
236
241
  end
237
242
 
243
+ it "should return only values when specifying the aggregation key" do
244
+ @mock.visits.browsers("mozilla").today.should == 1
245
+ end
246
+
238
247
  it "should work also with set" do
239
248
  @mock.visits("Google Chrome").set(5)
240
249
  @mock.visits.browsers.today.should == [["mozilla", 1], ["google", 5]]
@@ -278,12 +287,12 @@ describe Mongoid::Tracking::Aggregates do
278
287
  @mock.visits("Internet Explorer").set(6, "2010-07-16")
279
288
  end
280
289
 
281
- it "should return the correct values for .all" do
282
- @mock.visits.all.should == [1, 2, 3, 4, 5, 6]
290
+ it "should return the correct values for .all_values" do
291
+ @mock.visits.all_values.should == [1, 2, 3, 4, 5, 6]
283
292
  end
284
293
 
285
294
  it "should return the all values for every aggregate" do
286
- @mock.visits.browsers.all.should == [
295
+ @mock.visits.browsers.all_values.should == [
287
296
  ["mozilla", [1, 0, 0, 4]],
288
297
  ["google", [2, 0, 0, 5]],
289
298
  ["internet", [3, 0, 0, 6]]
@@ -307,7 +316,7 @@ describe Mongoid::Tracking::Aggregates do
307
316
  end
308
317
 
309
318
  it "should return the first value for aggregates" do
310
- @mock.visits.browsers.first.should == [
319
+ @mock.visits.browsers.first_value.should == [
311
320
  ["mozilla", 1],
312
321
  ["google", 2],
313
322
  ["internet", 3]
@@ -315,7 +324,7 @@ describe Mongoid::Tracking::Aggregates do
315
324
  end
316
325
 
317
326
  it "should return the last value for aggregates" do
318
- @mock.visits.browsers.last.should == [
327
+ @mock.visits.browsers.last_value.should == [
319
328
  ["mozilla", 4],
320
329
  ["google", 5],
321
330
  ["internet", 6]
data/spec/spec_helper.rb CHANGED
@@ -22,6 +22,6 @@ end
22
22
  Spec::Runner.configure do |config|
23
23
  config.mock_with :mocha
24
24
  config.before :suite do
25
- Mongoid.master.collections.each(&:drop)
25
+ Mongoid.master.collections.reject { |c| c.name =~ /^system\./ }.each(&:drop)
26
26
  end
27
27
  end
@@ -153,11 +153,11 @@ describe Mongoid::Tracking do
153
153
  end
154
154
 
155
155
  it "should give the first value" do
156
- @mock.visits.first.should == 1
156
+ @mock.visits.first_value.should == 1
157
157
  end
158
158
 
159
159
  it "should give the last value" do
160
- @mock.visits.last.should == 2
160
+ @mock.visits.last_value.should == 2
161
161
  end
162
162
  end
163
163
 
@@ -177,16 +177,16 @@ describe Mongoid::Tracking do
177
177
  @mock.visits.last_date.should be_nil
178
178
  end
179
179
 
180
- it "should return nil for .first" do
181
- @mock.visits.first.should be_nil
180
+ it "should return nil for .first_date" do
181
+ @mock.visits.first_value.should be_nil
182
182
  end
183
183
 
184
- it "should return nil for .last" do
185
- @mock.visits.last.should be_nil
184
+ it "should return nil for .last_value" do
185
+ @mock.visits.last_value.should be_nil
186
186
  end
187
187
 
188
- it "should return nil for .all" do
189
- @mock.visits.all.should be_nil
188
+ it "should return nil for .all_values" do
189
+ @mock.visits.all_values.should be_nil
190
190
  end
191
191
  end
192
192
 
@@ -198,21 +198,21 @@ describe Mongoid::Tracking do
198
198
  @mock = Test.first
199
199
  end
200
200
 
201
- it "should return the correct values for .all" do
201
+ it "should return the correct values for .all_values" do
202
202
  @mock.visits.set(1, "2010-07-11")
203
203
  @mock.visits.set(2, "2010-07-12")
204
204
  @mock.visits.set(3, "2010-07-13")
205
205
 
206
- @mock.visits.all.should == [1, 2, 3]
206
+ @mock.visits.all_values.should == [1, 2, 3]
207
207
  end
208
208
 
209
- it "should return the correct values for .all (Take II)" do
209
+ it "should return the correct values for .all_values (Take II)" do
210
210
  @mock.visits.set(5, "2010-07-01")
211
211
  @mock.visits.set(10, "2010-07-30")
212
212
 
213
- @mock.visits.all.should == [5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10]
214
- @mock.visits.last.should == 10
215
- @mock.visits.first.should == 5
213
+ @mock.visits.all_values.should == [5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10]
214
+ @mock.visits.last_value.should == 10
215
+ @mock.visits.first_value.should == 5
216
216
  end
217
217
  end
218
218
 
data/trackoid.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{trackoid}
8
- s.version = "0.1.9"
8
+ s.version = "0.1.10"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Jose Miguel Perez"]
12
- s.date = %q{2010-07-18}
12
+ s.date = %q{2010-07-22}
13
13
  s.description = %q{Trackoid uses an embeddable approach to track analytics data using the poweful features of MongoDB for scalability}
14
14
  s.email = %q{josemiguel@perezruiz.com}
15
15
  s.extra_rdoc_files = [
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: trackoid
3
3
  version: !ruby/object:Gem::Version
4
- hash: 9
4
+ hash: 15
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 9
10
- version: 0.1.9
9
+ - 10
10
+ version: 0.1.10
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jose Miguel Perez
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-07-18 00:00:00 +02:00
18
+ date: 2010-07-22 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency