trackoid 0.3.7 → 0.3.8
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 +1 -1
- data/VERSION +1 -1
- data/lib/trackoid/aggregates.rb +6 -6
- data/lib/trackoid/tracking.rb +4 -2
- data/spec/aggregates_spec.rb +57 -2
- data/spec/spec_helper.rb +2 -1
- data/spec/trackoid_spec.rb +16 -2
- data/trackoid.gemspec +11 -12
- metadata +81 -86
data/Gemfile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.8
|
data/lib/trackoid/aggregates.rb
CHANGED
@@ -2,9 +2,9 @@
|
|
2
2
|
module Mongoid #:nodoc:
|
3
3
|
module Tracking #:nodoc:
|
4
4
|
module Aggregates
|
5
|
-
|
5
|
+
|
6
6
|
DEPRECATED_TOKENS = ['hour', 'hours']
|
7
|
-
|
7
|
+
|
8
8
|
# This module includes aggregate data extensions to Trackoid instances
|
9
9
|
def self.included(base)
|
10
10
|
base.class_eval do
|
@@ -21,7 +21,7 @@ module Mongoid #:nodoc:
|
|
21
21
|
module ClassMethods
|
22
22
|
# Defines an aggregate token to an already tracked model. It defines
|
23
23
|
# a new mongoid model named after the original model.
|
24
|
-
#
|
24
|
+
#
|
25
25
|
# Example:
|
26
26
|
#
|
27
27
|
# <tt>class Page</tt>
|
@@ -36,7 +36,7 @@ module Mongoid #:nodoc:
|
|
36
36
|
# A new model is defined as <tt>class PageAggregates</tt>
|
37
37
|
#
|
38
38
|
# This model has the following structure:
|
39
|
-
#
|
39
|
+
#
|
40
40
|
# <tt>belongs_to :page</tt>
|
41
41
|
# <tt>field :ns, :type => String</tt>
|
42
42
|
# <tt>field :key, :type => String</tt>
|
@@ -132,7 +132,7 @@ module Mongoid #:nodoc:
|
|
132
132
|
def define_klass(&block)
|
133
133
|
scope = internal_aggregates_name.split('::')
|
134
134
|
klass = scope.pop
|
135
|
-
scope = scope.inject(
|
135
|
+
scope = scope.inject(Object) {|scope, const_name| scope.const_get(const_name)}
|
136
136
|
klass = scope.const_set(klass, Class.new)
|
137
137
|
klass.class_eval(&block)
|
138
138
|
end
|
@@ -152,7 +152,7 @@ module Mongoid #:nodoc:
|
|
152
152
|
end
|
153
153
|
end
|
154
154
|
end
|
155
|
-
|
155
|
+
|
156
156
|
end
|
157
157
|
end
|
158
158
|
end
|
data/lib/trackoid/tracking.rb
CHANGED
@@ -7,8 +7,10 @@ module Mongoid #:nodoc:
|
|
7
7
|
# field named after :field
|
8
8
|
def self.included(base)
|
9
9
|
base.class_eval do
|
10
|
-
|
11
|
-
|
10
|
+
unless self.ancestors.include? Mongoid::Document
|
11
|
+
raise Errors::NotMongoid, "Must be included in a Mongoid::Document"
|
12
|
+
end
|
13
|
+
|
12
14
|
include Aggregates
|
13
15
|
extend ClassMethods
|
14
16
|
|
data/spec/aggregates_spec.rb
CHANGED
@@ -7,7 +7,7 @@ class TestModel
|
|
7
7
|
field :name # Dummy field
|
8
8
|
|
9
9
|
# Note that references to "track" and "aggregate" in this test are mixed
|
10
|
-
# for testing
|
10
|
+
# for testing purposes. Trackoid does not make any difference in the
|
11
11
|
# declaration order of tracking fields and aggregate tokens.
|
12
12
|
track :visits
|
13
13
|
aggregate :browsers do |b| b.split.first.downcase if b; end
|
@@ -29,6 +29,34 @@ class SecondTestModel
|
|
29
29
|
aggregate :aggregate_four do Time.now end
|
30
30
|
end
|
31
31
|
|
32
|
+
# Namespaced models to test avoid name collisions
|
33
|
+
# Collitions may happen when declaring internal aggregate classes for a model
|
34
|
+
# which has the same name as other models in another namespace
|
35
|
+
module MyCompany
|
36
|
+
class TestPerson
|
37
|
+
include Mongoid::Document
|
38
|
+
include Mongoid::Tracking
|
39
|
+
|
40
|
+
field :my_name
|
41
|
+
|
42
|
+
track :logins
|
43
|
+
aggregate :initials do |n| n.to_s[0]; end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
module YourCompany
|
48
|
+
class TestPerson
|
49
|
+
include Mongoid::Document
|
50
|
+
include Mongoid::Tracking
|
51
|
+
|
52
|
+
field :your_name
|
53
|
+
|
54
|
+
track :logins
|
55
|
+
aggregate :initials do |n| n.to_s[0]; end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
|
32
60
|
describe Mongoid::Tracking::Aggregates do
|
33
61
|
|
34
62
|
before(:all) do
|
@@ -244,7 +272,7 @@ describe Mongoid::Tracking::Aggregates do
|
|
244
272
|
@mock.visits("Google Chrome").inc
|
245
273
|
@mock.visits.browsers.today.should =~ [["mozilla", 1], ["google", 1]]
|
246
274
|
@mock.visits.referers.today.should =~ [["firefox", 1], ["chrome", 1]]
|
247
|
-
|
275
|
+
|
248
276
|
# Just for testing array manipulations
|
249
277
|
@mock.visits.browsers.today.inject(0) {|total, c| total + c.last }.should == 2
|
250
278
|
end
|
@@ -440,4 +468,31 @@ describe Mongoid::Tracking::Aggregates do
|
|
440
468
|
]
|
441
469
|
end
|
442
470
|
end
|
471
|
+
|
472
|
+
describe "When using models with same name on different namespaces" do
|
473
|
+
before do
|
474
|
+
MyCompany::TestPerson.all.map(&:destroy)
|
475
|
+
MyCompany::TestPerson.create(:my_name => "twoixter")
|
476
|
+
@my_object_id = MyCompany::TestPerson.first.id
|
477
|
+
@my_mock = MyCompany::TestPerson.first
|
478
|
+
@my_mock.logins("ASCII").set(1, "2012-07-07")
|
479
|
+
@my_mock.logins("EBCDIC").set(1, "2012-07-07")
|
480
|
+
|
481
|
+
YourCompany::TestPerson.all.map(&:destroy)
|
482
|
+
YourCompany::TestPerson.create(:your_name => "test")
|
483
|
+
@your_object_id = YourCompany::TestPerson.first.id
|
484
|
+
@your_mock = YourCompany::TestPerson.first
|
485
|
+
@your_mock.logins("UTF8").set(1, "2012-07-07")
|
486
|
+
@your_mock.logins("LATIN1").set(1, "2012-07-07")
|
487
|
+
end
|
488
|
+
|
489
|
+
it "should be different objects" do
|
490
|
+
@my_mock.my_name.should_not == @your_mock.your_name
|
491
|
+
end
|
492
|
+
|
493
|
+
it "should yield different aggregates" do
|
494
|
+
@my_mock.logins.initials.on("2012-07-07").should =~ [["A", 1], ["E", 1]]
|
495
|
+
@your_mock.logins.initials.on("2012-07-07").should =~ [["U", 1], ["L", 1]]
|
496
|
+
end
|
497
|
+
end
|
443
498
|
end
|
data/spec/spec_helper.rb
CHANGED
data/spec/trackoid_spec.rb
CHANGED
@@ -36,6 +36,20 @@ describe Mongoid::Tracking do
|
|
36
36
|
}.should_not raise_error
|
37
37
|
end
|
38
38
|
|
39
|
+
it "should not raise errors when using to/as_json" do
|
40
|
+
mock = Test.new(:name => "Trackoid")
|
41
|
+
json_as = {}
|
42
|
+
json_to = ""
|
43
|
+
|
44
|
+
lambda {
|
45
|
+
json_as = mock.as_json(:except => :_id)
|
46
|
+
json_to = mock.to_json(:except => :_id)
|
47
|
+
}.should_not raise_error
|
48
|
+
|
49
|
+
json_as.should == { "name" => "Trackoid" }
|
50
|
+
json_to.should == "{\"name\":\"Trackoid\"}"
|
51
|
+
end
|
52
|
+
|
39
53
|
describe "when creating a new field with stats" do
|
40
54
|
before(:all) do
|
41
55
|
@mock = Test.new
|
@@ -56,7 +70,7 @@ describe Mongoid::Tracking do
|
|
56
70
|
|
57
71
|
it "should respond 'false' to field_changed? method" do
|
58
72
|
# Ok, this test is not very relevant since it will return false even
|
59
|
-
# if
|
73
|
+
# if Trackoid does not override it.
|
60
74
|
@mock.visits_changed?.should be_false
|
61
75
|
end
|
62
76
|
|
@@ -79,7 +93,7 @@ describe Mongoid::Tracking do
|
|
79
93
|
lambda { @mock.visits.inc }.should raise_error Mongoid::Errors::ModelNotSaved
|
80
94
|
end
|
81
95
|
|
82
|
-
it "
|
96
|
+
it "should create an empty hash as the internal representation" do
|
83
97
|
@mock.visits.send(:_original_hash).should == {}
|
84
98
|
end
|
85
99
|
|
data/trackoid.gemspec
CHANGED
@@ -4,14 +4,14 @@
|
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version = "0.3.
|
7
|
+
s.name = "trackoid"
|
8
|
+
s.version = "0.3.8"
|
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 =
|
13
|
-
s.description =
|
14
|
-
s.email =
|
12
|
+
s.date = "2012-07-07"
|
13
|
+
s.description = "Trackoid uses an embeddable approach to track analytics data using the poweful features of MongoDB for scalability"
|
14
|
+
s.email = "josemiguel@perezruiz.com"
|
15
15
|
s.extra_rdoc_files = [
|
16
16
|
"LICENSE",
|
17
17
|
"README.rdoc"
|
@@ -46,13 +46,12 @@ Gem::Specification.new do |s|
|
|
46
46
|
"spec/trackoid_spec.rb",
|
47
47
|
"trackoid.gemspec"
|
48
48
|
]
|
49
|
-
s.homepage =
|
49
|
+
s.homepage = "http://github.com/twoixter/trackoid"
|
50
50
|
s.require_paths = ["lib"]
|
51
|
-
s.rubygems_version =
|
52
|
-
s.summary =
|
51
|
+
s.rubygems_version = "1.8.24"
|
52
|
+
s.summary = "Trackoid is an easy scalable analytics tracker using MongoDB and Mongoid"
|
53
53
|
|
54
54
|
if s.respond_to? :specification_version then
|
55
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
56
55
|
s.specification_version = 3
|
57
56
|
|
58
57
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
@@ -60,20 +59,20 @@ Gem::Specification.new do |s|
|
|
60
59
|
s.add_development_dependency(%q<rake>, [">= 0"])
|
61
60
|
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
62
61
|
s.add_development_dependency(%q<rspec>, [">= 2.2.0"])
|
63
|
-
s.add_development_dependency(%q<mocha>, ["
|
62
|
+
s.add_development_dependency(%q<mocha>, ["= 0.11.0"])
|
64
63
|
else
|
65
64
|
s.add_dependency(%q<mongoid>, [">= 2.1.0"])
|
66
65
|
s.add_dependency(%q<rake>, [">= 0"])
|
67
66
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
68
67
|
s.add_dependency(%q<rspec>, [">= 2.2.0"])
|
69
|
-
s.add_dependency(%q<mocha>, ["
|
68
|
+
s.add_dependency(%q<mocha>, ["= 0.11.0"])
|
70
69
|
end
|
71
70
|
else
|
72
71
|
s.add_dependency(%q<mongoid>, [">= 2.1.0"])
|
73
72
|
s.add_dependency(%q<rake>, [">= 0"])
|
74
73
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
75
74
|
s.add_dependency(%q<rspec>, [">= 2.2.0"])
|
76
|
-
s.add_dependency(%q<mocha>, ["
|
75
|
+
s.add_dependency(%q<mocha>, ["= 0.11.0"])
|
77
76
|
end
|
78
77
|
end
|
79
78
|
|
metadata
CHANGED
@@ -1,101 +1,105 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: trackoid
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
6
|
-
- 0
|
7
|
-
- 3
|
8
|
-
- 7
|
9
|
-
version: 0.3.7
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.8
|
5
|
+
prerelease:
|
10
6
|
platform: ruby
|
11
|
-
authors:
|
7
|
+
authors:
|
12
8
|
- Jose Miguel Perez
|
13
9
|
autorequire:
|
14
10
|
bindir: bin
|
15
11
|
cert_chain: []
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
dependencies:
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-07-07 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: mongoid
|
22
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
23
17
|
none: false
|
24
|
-
requirements:
|
25
|
-
- -
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
segments:
|
28
|
-
- 2
|
29
|
-
- 1
|
30
|
-
- 0
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
31
21
|
version: 2.1.0
|
32
22
|
type: :runtime
|
33
23
|
prerelease: false
|
34
|
-
version_requirements:
|
35
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 2.1.0
|
30
|
+
- !ruby/object:Gem::Dependency
|
36
31
|
name: rake
|
37
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
38
33
|
none: false
|
39
|
-
requirements:
|
40
|
-
- -
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
|
43
|
-
- 0
|
44
|
-
version: "0"
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
45
38
|
type: :development
|
46
39
|
prerelease: false
|
47
|
-
version_requirements:
|
48
|
-
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
49
47
|
name: jeweler
|
50
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
51
49
|
none: false
|
52
|
-
requirements:
|
53
|
-
- -
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
|
56
|
-
- 0
|
57
|
-
version: "0"
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
58
54
|
type: :development
|
59
55
|
prerelease: false
|
60
|
-
version_requirements:
|
61
|
-
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
62
63
|
name: rspec
|
63
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
64
65
|
none: false
|
65
|
-
requirements:
|
66
|
-
- -
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
segments:
|
69
|
-
- 2
|
70
|
-
- 2
|
71
|
-
- 0
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
72
69
|
version: 2.2.0
|
73
70
|
type: :development
|
74
71
|
prerelease: false
|
75
|
-
version_requirements:
|
76
|
-
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 2.2.0
|
78
|
+
- !ruby/object:Gem::Dependency
|
77
79
|
name: mocha
|
78
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
79
81
|
none: false
|
80
|
-
requirements:
|
81
|
-
- -
|
82
|
-
- !ruby/object:Gem::Version
|
83
|
-
|
84
|
-
- 0
|
85
|
-
version: "0"
|
82
|
+
requirements:
|
83
|
+
- - '='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: 0.11.0
|
86
86
|
type: :development
|
87
87
|
prerelease: false
|
88
|
-
version_requirements:
|
89
|
-
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - '='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 0.11.0
|
94
|
+
description: Trackoid uses an embeddable approach to track analytics data using the
|
95
|
+
poweful features of MongoDB for scalability
|
90
96
|
email: josemiguel@perezruiz.com
|
91
97
|
executables: []
|
92
|
-
|
93
98
|
extensions: []
|
94
|
-
|
95
|
-
extra_rdoc_files:
|
99
|
+
extra_rdoc_files:
|
96
100
|
- LICENSE
|
97
101
|
- README.rdoc
|
98
|
-
files:
|
102
|
+
files:
|
99
103
|
- .document
|
100
104
|
- .rspec
|
101
105
|
- Gemfile
|
@@ -124,37 +128,28 @@ files:
|
|
124
128
|
- spec/timezone_spec.rb
|
125
129
|
- spec/trackoid_spec.rb
|
126
130
|
- trackoid.gemspec
|
127
|
-
has_rdoc: true
|
128
131
|
homepage: http://github.com/twoixter/trackoid
|
129
132
|
licenses: []
|
130
|
-
|
131
133
|
post_install_message:
|
132
134
|
rdoc_options: []
|
133
|
-
|
134
|
-
require_paths:
|
135
|
+
require_paths:
|
135
136
|
- lib
|
136
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
137
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
137
138
|
none: false
|
138
|
-
requirements:
|
139
|
-
- -
|
140
|
-
- !ruby/object:Gem::Version
|
141
|
-
|
142
|
-
|
143
|
-
version: "0"
|
144
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
139
|
+
requirements:
|
140
|
+
- - ! '>='
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: '0'
|
143
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
145
144
|
none: false
|
146
|
-
requirements:
|
147
|
-
- -
|
148
|
-
- !ruby/object:Gem::Version
|
149
|
-
|
150
|
-
- 0
|
151
|
-
version: "0"
|
145
|
+
requirements:
|
146
|
+
- - ! '>='
|
147
|
+
- !ruby/object:Gem::Version
|
148
|
+
version: '0'
|
152
149
|
requirements: []
|
153
|
-
|
154
150
|
rubyforge_project:
|
155
|
-
rubygems_version: 1.
|
151
|
+
rubygems_version: 1.8.24
|
156
152
|
signing_key:
|
157
153
|
specification_version: 3
|
158
154
|
summary: Trackoid is an easy scalable analytics tracker using MongoDB and Mongoid
|
159
155
|
test_files: []
|
160
|
-
|