redistat 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +8 -0
- data/README.md +219 -97
- data/lib/redistat.rb +13 -13
- data/lib/redistat/buffer.rb +27 -24
- data/lib/redistat/collection.rb +5 -5
- data/lib/redistat/connection.rb +23 -18
- data/lib/redistat/core_ext.rb +1 -1
- data/lib/redistat/core_ext/bignum.rb +2 -2
- data/lib/redistat/core_ext/date.rb +2 -2
- data/lib/redistat/core_ext/fixnum.rb +2 -2
- data/lib/redistat/core_ext/hash.rb +4 -4
- data/lib/redistat/date.rb +11 -11
- data/lib/redistat/event.rb +18 -18
- data/lib/redistat/finder.rb +39 -39
- data/lib/redistat/finder/date_set.rb +4 -4
- data/lib/redistat/key.rb +16 -16
- data/lib/redistat/label.rb +14 -14
- data/lib/redistat/mixins/database.rb +1 -1
- data/lib/redistat/mixins/date_helper.rb +1 -1
- data/lib/redistat/mixins/options.rb +8 -8
- data/lib/redistat/mixins/synchronize.rb +12 -11
- data/lib/redistat/model.rb +25 -17
- data/lib/redistat/result.rb +4 -4
- data/lib/redistat/scope.rb +5 -5
- data/lib/redistat/summary.rb +33 -26
- data/lib/redistat/version.rb +1 -1
- data/redistat.gemspec +4 -3
- data/spec/buffer_spec.rb +27 -25
- data/spec/collection_spec.rb +4 -4
- data/spec/connection_spec.rb +12 -12
- data/spec/core_ext/hash_spec.rb +5 -5
- data/spec/database_spec.rb +3 -3
- data/spec/date_spec.rb +15 -15
- data/spec/event_spec.rb +8 -8
- data/spec/finder/date_set_spec.rb +134 -134
- data/spec/finder_spec.rb +36 -36
- data/spec/key_spec.rb +19 -19
- data/spec/label_spec.rb +10 -10
- data/spec/model_helper.rb +10 -9
- data/spec/model_spec.rb +38 -41
- data/spec/options_spec.rb +9 -9
- data/spec/result_spec.rb +4 -4
- data/spec/scope_spec.rb +6 -6
- data/spec/spec_helper.rb +6 -0
- data/spec/summary_spec.rb +31 -24
- data/spec/synchronize_spec.rb +118 -57
- data/spec/thread_safety_spec.rb +6 -6
- metadata +88 -126
- data/.rvmrc +0 -1
data/spec/finder_spec.rb
CHANGED
@@ -2,21 +2,21 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe Redistat::Finder do
|
4
4
|
include Redistat::Database
|
5
|
-
|
5
|
+
|
6
6
|
before(:each) do
|
7
7
|
db.flushdb
|
8
8
|
@scope = "PageViews"
|
9
9
|
@label = "about_us"
|
10
10
|
@date = Time.now
|
11
11
|
@key = Redistat::Key.new(@scope, @label, @date, {:depth => :day})
|
12
|
-
@stats = {"views" => 3, "visitors" => 2}
|
12
|
+
@stats = {"views" => 3, "visitors" => 2}
|
13
13
|
@two_hours_ago = 2.hours.ago
|
14
14
|
@one_hour_ago = 1.hour.ago
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
it "should initialize properly" do
|
18
18
|
options = {:scope => "PageViews", :label => "Label", :from => @two_hours_ago, :till => @one_hour_ago, :depth => :hour, :interval => :hour}
|
19
|
-
|
19
|
+
|
20
20
|
finder = Redistat::Finder.new
|
21
21
|
finder.send(:set_options, options)
|
22
22
|
finder.options[:scope].should be_a(Redistat::Scope)
|
@@ -24,31 +24,31 @@ describe Redistat::Finder do
|
|
24
24
|
finder.options[:label].should be_a(Redistat::Label)
|
25
25
|
finder.options[:label].to_s.should == options[:label]
|
26
26
|
finder.options.should == options.merge(:scope => finder.options[:scope], :label => finder.options[:label])
|
27
|
-
|
27
|
+
|
28
28
|
finder = Redistat::Finder.scope("hello")
|
29
29
|
finder.options[:scope].to_s.should == "hello"
|
30
30
|
finder.scope.to_s.should == "hello"
|
31
|
-
|
31
|
+
|
32
32
|
finder = Redistat::Finder.label("hello")
|
33
33
|
finder.options[:label].to_s.should == "hello"
|
34
34
|
finder.label.to_s.should == "hello"
|
35
|
-
|
35
|
+
|
36
36
|
finder = Redistat::Finder.dates(@two_hours_ago, @one_hour_ago)
|
37
37
|
finder.options[:from].should == @two_hours_ago
|
38
38
|
finder.options[:till].should == @one_hour_ago
|
39
|
-
|
39
|
+
|
40
40
|
finder = Redistat::Finder.from(@two_hours_ago)
|
41
41
|
finder.options[:from].should == @two_hours_ago
|
42
42
|
finder.from.should == @two_hours_ago
|
43
|
-
|
43
|
+
|
44
44
|
finder = Redistat::Finder.till(@one_hour_ago)
|
45
45
|
finder.options[:till].should == @one_hour_ago
|
46
46
|
finder.till.should == @one_hour_ago
|
47
|
-
|
47
|
+
|
48
48
|
finder = Redistat::Finder.depth(:hour)
|
49
49
|
finder.options[:depth].should == :hour
|
50
50
|
finder.depth.should == :hour
|
51
|
-
|
51
|
+
|
52
52
|
finder = Redistat::Finder.interval(true)
|
53
53
|
finder.options[:interval].should be_true
|
54
54
|
finder.interval.should be_true
|
@@ -56,24 +56,24 @@ describe Redistat::Finder do
|
|
56
56
|
finder.options[:interval].should be_false
|
57
57
|
finder.interval.should be_false
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
it "should fetch stats properly" do
|
61
61
|
first_stat, last_stat = create_example_stats
|
62
|
-
|
62
|
+
|
63
63
|
stats = Redistat::Finder.find({:from => first_stat, :till => last_stat, :scope => @scope, :label => @label, :depth => :hour})
|
64
64
|
stats.from.should == first_stat
|
65
65
|
stats.till.should == last_stat
|
66
66
|
stats.depth.should == :hour
|
67
|
-
|
67
|
+
|
68
68
|
stats.total.should == { "views" => 12, "visitors" => 8 }
|
69
69
|
stats.total.from.should == first_stat
|
70
70
|
stats.total.till.should == last_stat
|
71
71
|
stats.first.should == stats.total
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
it "should fetch data per unit when interval option is specified" do
|
75
75
|
first_stat, last_stat = create_example_stats
|
76
|
-
|
76
|
+
|
77
77
|
stats = Redistat::Finder.find(:from => first_stat, :till => last_stat, :scope => @scope, :label => @label, :depth => :hour, :interval => :hour)
|
78
78
|
stats.from.should == first_stat
|
79
79
|
stats.till.should == last_stat
|
@@ -89,22 +89,22 @@ describe Redistat::Finder do
|
|
89
89
|
stats[4].should == {}
|
90
90
|
stats[4].date.should == Time.parse("2010-05-14 16:00")
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
it "should return empty hash when attempting to fetch non-existent results" do
|
94
94
|
stats = Redistat::Finder.find({:from => 3.hours.ago, :till => 2.hours.from_now, :scope => @scope, :label => @label, :depth => :hour})
|
95
95
|
stats.total.should == {}
|
96
96
|
end
|
97
|
-
|
97
|
+
|
98
98
|
it "should throw error on invalid options" do
|
99
99
|
lambda { Redistat::Finder.find(:from => 3.hours.ago) }.should raise_error(Redistat::InvalidOptions)
|
100
100
|
end
|
101
|
-
|
101
|
+
|
102
102
|
describe "Grouping" do
|
103
103
|
before(:each) do
|
104
104
|
@options = {:scope => "PageViews", :label => "message/public", :from => @two_hours_ago, :till => @one_hour_ago, :depth => :hour, :interval => :hour}
|
105
105
|
@finder = Redistat::Finder.new(@options)
|
106
106
|
end
|
107
|
-
|
107
|
+
|
108
108
|
it "should return parent finder" do
|
109
109
|
@finder.instance_variable_get("@parent").should be_nil
|
110
110
|
@finder.parent.should be_a(Redistat::Finder)
|
@@ -116,7 +116,7 @@ describe Redistat::Finder do
|
|
116
116
|
@finder.parent.options[:label].should be_nil
|
117
117
|
@finder.parent.parent.should be_nil
|
118
118
|
end
|
119
|
-
|
119
|
+
|
120
120
|
it "should find children" do
|
121
121
|
Redistat::Key.new("PageViews", "message/public/die").update_index
|
122
122
|
Redistat::Key.new("PageViews", "message/public/live").update_index
|
@@ -130,25 +130,25 @@ describe Redistat::Finder do
|
|
130
130
|
subs.should include('fester')
|
131
131
|
end
|
132
132
|
end
|
133
|
-
|
133
|
+
|
134
134
|
describe "Lazy-Loading" do
|
135
|
-
|
135
|
+
|
136
136
|
before(:each) do
|
137
137
|
@first_stat, @last_stat = create_example_stats
|
138
138
|
|
139
139
|
@finder = Redistat::Finder.new
|
140
140
|
@finder.from(@first_stat).till(@last_stat).scope(@scope).label(@label).depth(:hour)
|
141
|
-
|
141
|
+
|
142
142
|
@match = [{}, {"visitors"=>"4", "views"=>"6"},
|
143
143
|
{"visitors"=>"2", "views"=>"3"},
|
144
144
|
{"visitors"=>"2", "views"=>"3"}, {}]
|
145
145
|
end
|
146
|
-
|
146
|
+
|
147
147
|
it "should lazy-load" do
|
148
148
|
@finder.instance_variable_get("@result").should be_nil
|
149
149
|
stats = @finder.all
|
150
150
|
@finder.instance_variable_get("@result").should_not be_nil
|
151
|
-
|
151
|
+
|
152
152
|
stats.should == @finder.find # find method directly fetches results
|
153
153
|
stats.total.should == @finder.total
|
154
154
|
stats.total.should == { "views" => 12, "visitors" => 8 }
|
@@ -163,35 +163,35 @@ describe Redistat::Finder do
|
|
163
163
|
stats = @finder.all
|
164
164
|
stats.total.should == { "views" => 6, "visitors" => 4 }
|
165
165
|
end
|
166
|
-
|
166
|
+
|
167
167
|
it "should handle #map" do
|
168
168
|
@finder.interval(:hour)
|
169
169
|
@finder.map { |r| r }.should == @match
|
170
170
|
end
|
171
|
-
|
171
|
+
|
172
172
|
it "should handle #each" do
|
173
173
|
@finder.interval(:hour)
|
174
|
-
|
174
|
+
|
175
175
|
res = []
|
176
176
|
@finder.each { |r| res << r }
|
177
177
|
res.should == @match
|
178
178
|
end
|
179
|
-
|
179
|
+
|
180
180
|
it "should handle #each_with_index" do
|
181
181
|
@finder.interval(:hour)
|
182
|
-
|
182
|
+
|
183
183
|
res = {}
|
184
184
|
match = {}
|
185
185
|
@finder.each_with_index { |r, i| res[i] = r }
|
186
186
|
@match.each_with_index { |r, i| match[i] = r }
|
187
187
|
res.should == match
|
188
188
|
end
|
189
|
-
|
189
|
+
|
190
190
|
end # "Lazy-Loading"
|
191
|
-
|
192
|
-
|
191
|
+
|
192
|
+
|
193
193
|
# helper methods
|
194
|
-
|
194
|
+
|
195
195
|
def create_example_stats
|
196
196
|
key = Redistat::Key.new(@scope, @label, (first = Time.parse("2010-05-14 13:43")))
|
197
197
|
Redistat::Summary.send(:update_fields, key, @stats, :hour)
|
@@ -203,5 +203,5 @@ describe Redistat::Finder do
|
|
203
203
|
Redistat::Summary.send(:update_fields, key, @stats, :hour)
|
204
204
|
[first - 1.hour, last + 1.hour]
|
205
205
|
end
|
206
|
-
|
206
|
+
|
207
207
|
end
|
data/spec/key_spec.rb
CHANGED
@@ -2,7 +2,7 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe Redistat::Key do
|
4
4
|
include Redistat::Database
|
5
|
-
|
5
|
+
|
6
6
|
before(:each) do
|
7
7
|
db.flushdb
|
8
8
|
@scope = "PageViews"
|
@@ -11,7 +11,7 @@ describe Redistat::Key do
|
|
11
11
|
@date = Time.now
|
12
12
|
@key = Redistat::Key.new(@scope, @label, @date, {:depth => :hour})
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
it "should initialize properly" do
|
16
16
|
@key.scope.to_s.should == @scope
|
17
17
|
@key.label.to_s.should == @label
|
@@ -20,7 +20,7 @@ describe Redistat::Key do
|
|
20
20
|
@key.date.should be_instance_of(Redistat::Date)
|
21
21
|
@key.date.to_time.to_s.should == @date.to_s
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
it "should convert to string properly" do
|
25
25
|
@key.to_s.should == "#{@scope}/#{@label}:#{@key.date.to_s(:hour)}"
|
26
26
|
props = [:year, :month, :day, :hour, :min, :sec]
|
@@ -31,19 +31,19 @@ describe Redistat::Key do
|
|
31
31
|
key = Redistat::Key.new(@scope, nil, @date, {:depth => :hour})
|
32
32
|
key.to_s.should == "#{@scope}:#{key.date.to_s(:hour)}"
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
it "should abide to hashed_label option" do
|
36
36
|
@key = Redistat::Key.new(@scope, @label, @date, {:depth => :hour, :hashed_label => true})
|
37
37
|
@key.to_s.should == "#{@scope}/#{@label_hash}:#{@key.date.to_s(:hour)}"
|
38
38
|
@key = Redistat::Key.new(@scope, @label, @date, {:depth => :hour, :hashed_label => false})
|
39
39
|
@key.to_s.should == "#{@scope}/#{@label}:#{@key.date.to_s(:hour)}"
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
it "should have default depth option" do
|
43
43
|
@key = Redistat::Key.new(@scope, @label, @date)
|
44
44
|
@key.depth.should == :hour
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
it "should allow changing attributes" do
|
48
48
|
# scope
|
49
49
|
@key.scope.to_s.should == @scope
|
@@ -64,13 +64,13 @@ describe Redistat::Key do
|
|
64
64
|
@key.label.to_s.should == @label
|
65
65
|
@key.label_hash == @label_hash
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
describe "Grouping" do
|
69
69
|
before(:each) do
|
70
70
|
@label = "message/public/offensive"
|
71
71
|
@key = Redistat::Key.new(@scope, @label, @date, {:depth => :hour})
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
it "should create a group of keys from label group" do
|
75
75
|
label = 'message/public/offensive'
|
76
76
|
result = [ "message/public/offensive",
|
@@ -81,49 +81,49 @@ describe Redistat::Key do
|
|
81
81
|
|
82
82
|
key.groups.map { |k| k.label.to_s }.should == result
|
83
83
|
end
|
84
|
-
|
84
|
+
|
85
85
|
it "should know it's parent" do
|
86
86
|
@key.parent.should be_a(Redistat::Key)
|
87
87
|
@key.parent.label.to_s.should == 'message/public'
|
88
88
|
Redistat::Key.new(@scope, 'hello', @date).parent.should be_nil
|
89
89
|
end
|
90
|
-
|
90
|
+
|
91
91
|
it "should update label index and return children" do
|
92
92
|
db.smembers("#{@scope}#{Redistat::LABEL_INDEX}#{@key.label.parent}").should == []
|
93
93
|
@key.children.should have(0).items
|
94
|
-
|
94
|
+
|
95
95
|
@key.update_index # indexing 'message/publish/offensive'
|
96
96
|
Redistat::Key.new("PageViews", "message/public/die").update_index # indexing 'message/publish/die'
|
97
97
|
Redistat::Key.new("PageViews", "message/public/live").update_index # indexing 'message/publish/live'
|
98
|
-
|
98
|
+
|
99
99
|
members = db.smembers("#{@scope}#{Redistat::LABEL_INDEX}#{@key.label.parent}") # checking 'message/public'
|
100
100
|
members.should have(3).item
|
101
101
|
members.should include('offensive')
|
102
102
|
members.should include('live')
|
103
103
|
members.should include('die')
|
104
|
-
|
104
|
+
|
105
105
|
key = @key.parent
|
106
106
|
key.children.first.should be_a(Redistat::Key)
|
107
107
|
key.children.should have(3).item
|
108
108
|
key.children.map { |k| k.label.me }.should == members
|
109
|
-
|
109
|
+
|
110
110
|
members = db.smembers("#{@scope}#{Redistat::LABEL_INDEX}#{key.label.parent}") # checking 'message'
|
111
111
|
members.should have(1).item
|
112
112
|
members.should include('public')
|
113
|
-
|
113
|
+
|
114
114
|
key = key.parent
|
115
115
|
key.children.should have(1).item
|
116
116
|
key.children.map { |k| k.label.me }.should == members
|
117
|
-
|
117
|
+
|
118
118
|
members = db.smembers("#{@scope}#{Redistat::LABEL_INDEX}") # checking ''
|
119
119
|
members.should have(1).item
|
120
120
|
members.should include('message')
|
121
|
-
|
121
|
+
|
122
122
|
key.parent.should be_nil
|
123
123
|
key = Redistat::Key.new("PageViews")
|
124
124
|
key.children.should have(1).item
|
125
125
|
key.children.map { |k| k.label.me }.should include('message')
|
126
126
|
end
|
127
127
|
end
|
128
|
-
|
129
|
-
end
|
128
|
+
|
129
|
+
end
|
data/spec/label_spec.rb
CHANGED
@@ -2,29 +2,29 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe Redistat::Label do
|
4
4
|
include Redistat::Database
|
5
|
-
|
5
|
+
|
6
6
|
before(:each) do
|
7
7
|
db.flushdb
|
8
8
|
@name = "about_us"
|
9
9
|
@label = Redistat::Label.new(@name)
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
it "should initialize properly and SHA1 hash the label name" do
|
13
13
|
@label.name.should == @name
|
14
14
|
@label.hash.should == Digest::SHA1.hexdigest(@name)
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
it "should store a label hash lookup key" do
|
18
18
|
label = Redistat::Label.new(@name, {:hashed_label => true}).save
|
19
19
|
label.saved?.should be_true
|
20
20
|
db.hget(Redistat::KEY_LABELS, label.hash).should == @name
|
21
|
-
|
21
|
+
|
22
22
|
name = "contact_us"
|
23
23
|
label = Redistat::Label.create(name, {:hashed_label => true})
|
24
24
|
label.saved?.should be_true
|
25
25
|
db.hget(Redistat::KEY_LABELS, label.hash).should == name
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
it "should join labels" do
|
29
29
|
include Redistat
|
30
30
|
label = Label.join('email', 'message', 'public')
|
@@ -37,18 +37,18 @@ describe Redistat::Label do
|
|
37
37
|
label.should be_a(Label)
|
38
38
|
label.to_s.should == 'email/message/public'
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
describe "Grouping" do
|
42
42
|
before(:each) do
|
43
43
|
@name = "message/public/offensive"
|
44
44
|
@label = Redistat::Label.new(@name)
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
it "should know it's parent label group" do
|
48
48
|
@label.parent.to_s.should == 'message/public'
|
49
49
|
Redistat::Label.new('hello').parent.should be_nil
|
50
50
|
end
|
51
|
-
|
51
|
+
|
52
52
|
it "should separate label names into groups" do
|
53
53
|
@label.name.should == @name
|
54
54
|
@label.groups.map { |l| l.to_s }.should == [ "message/public/offensive",
|
@@ -67,5 +67,5 @@ describe Redistat::Label do
|
|
67
67
|
@label.groups.map { |l| l.to_s }.should == [ "message" ]
|
68
68
|
end
|
69
69
|
end
|
70
|
-
|
71
|
-
end
|
70
|
+
|
71
|
+
end
|
data/spec/model_helper.rb
CHANGED
@@ -2,29 +2,30 @@ require "redistat"
|
|
2
2
|
|
3
3
|
class ModelHelper1
|
4
4
|
include Redistat::Model
|
5
|
-
|
6
|
-
|
5
|
+
|
6
|
+
|
7
7
|
end
|
8
8
|
|
9
9
|
class ModelHelper2
|
10
10
|
include Redistat::Model
|
11
|
-
|
11
|
+
|
12
12
|
depth :day
|
13
13
|
store_event true
|
14
14
|
hashed_label true
|
15
|
-
|
15
|
+
|
16
16
|
end
|
17
17
|
|
18
18
|
class ModelHelper3
|
19
19
|
include Redistat::Model
|
20
|
-
|
20
|
+
|
21
21
|
connect_to :port => 8379, :db => 14
|
22
|
-
|
22
|
+
|
23
23
|
end
|
24
24
|
|
25
25
|
class ModelHelper4
|
26
26
|
include Redistat::Model
|
27
|
-
|
27
|
+
|
28
28
|
scope "FancyHelper"
|
29
|
-
|
30
|
-
|
29
|
+
expire :hour => 24*3600
|
30
|
+
|
31
|
+
end
|
data/spec/model_spec.rb
CHANGED
@@ -3,7 +3,7 @@ require "model_helper"
|
|
3
3
|
|
4
4
|
describe Redistat::Model do
|
5
5
|
include Redistat::Database
|
6
|
-
|
6
|
+
|
7
7
|
before(:each) do
|
8
8
|
@time = Time.utc(2010, 8, 28, 12, 0, 0)
|
9
9
|
ModelHelper1.redis.flushdb
|
@@ -11,12 +11,12 @@ describe Redistat::Model do
|
|
11
11
|
ModelHelper3.redis.flushdb
|
12
12
|
ModelHelper4.redis.flushdb
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
it "should should name itself correctly" do
|
16
16
|
ModelHelper1.send(:name).should == "ModelHelper1"
|
17
17
|
ModelHelper2.send(:name).should == "ModelHelper2"
|
18
18
|
end
|
19
|
-
|
19
|
+
|
20
20
|
it "should return a Finder" do
|
21
21
|
two_hours_ago = 2.hours.ago
|
22
22
|
one_hour_ago = 1.hour.ago
|
@@ -27,18 +27,19 @@ describe Redistat::Model do
|
|
27
27
|
finder.options[:from].should == two_hours_ago
|
28
28
|
finder.options[:till].should == one_hour_ago
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
it "should #find_event" do
|
32
32
|
Redistat::Event.should_receive(:find).with('ModelHelper1', 1)
|
33
33
|
ModelHelper1.find_event(1)
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
it "should listen to model-defined options" do
|
37
37
|
ModelHelper2.depth.should == :day
|
38
38
|
ModelHelper2.store_event.should == true
|
39
39
|
ModelHelper2.hashed_label.should == true
|
40
40
|
ModelHelper2.scope.should be_nil
|
41
|
-
|
41
|
+
ModelHelper2.expire.should be_nil
|
42
|
+
|
42
43
|
ModelHelper1.depth.should == nil
|
43
44
|
ModelHelper1.store_event.should == nil
|
44
45
|
ModelHelper1.hashed_label.should == nil
|
@@ -54,134 +55,135 @@ describe Redistat::Model do
|
|
54
55
|
ModelHelper1.depth.should == nil
|
55
56
|
ModelHelper1.store_event.should == nil
|
56
57
|
ModelHelper1.hashed_label.should == nil
|
57
|
-
|
58
|
+
|
58
59
|
ModelHelper4.scope.should == "FancyHelper"
|
59
60
|
ModelHelper4.send(:name).should == "FancyHelper"
|
61
|
+
ModelHelper4.expire.should == {:hour => 24*3600}
|
60
62
|
end
|
61
|
-
|
63
|
+
|
62
64
|
it "should store and fetch stats" do
|
63
65
|
ModelHelper1.store("sheep.black", {:count => 6, :weight => 461}, @time.hours_ago(4))
|
64
66
|
ModelHelper1.store("sheep.black", {:count => 2, :weight => 156}, @time)
|
65
|
-
|
67
|
+
|
66
68
|
stats = ModelHelper1.fetch("sheep.black", @time.hours_ago(2), @time.hours_since(1))
|
67
69
|
stats.total["count"].should == 2
|
68
70
|
stats.total["weight"].should == 156
|
69
71
|
stats.first.should == stats.total
|
70
|
-
|
72
|
+
|
71
73
|
stats = ModelHelper1.fetch("sheep.black", @time.hours_ago(5), @time.hours_since(1))
|
72
74
|
stats.total[:count].should == 8
|
73
75
|
stats.total[:weight].should == 617
|
74
76
|
stats.first.should == stats.total
|
75
|
-
|
77
|
+
|
76
78
|
ModelHelper1.store("sheep.white", {:count => 5, :weight => 393}, @time.hours_ago(4))
|
77
79
|
ModelHelper1.store("sheep.white", {:count => 4, :weight => 316}, @time)
|
78
|
-
|
80
|
+
|
79
81
|
stats = ModelHelper1.fetch("sheep.white", @time.hours_ago(2), @time.hours_since(1))
|
80
82
|
stats.total[:count].should == 4
|
81
83
|
stats.total[:weight].should == 316
|
82
84
|
stats.first.should == stats.total
|
83
|
-
|
85
|
+
|
84
86
|
stats = ModelHelper1.fetch("sheep.white", @time.hours_ago(5), @time.hours_since(1))
|
85
87
|
stats.total[:count].should == 9
|
86
88
|
stats.total[:weight].should == 709
|
87
89
|
stats.first.should == stats.total
|
88
90
|
end
|
89
|
-
|
91
|
+
|
90
92
|
it "should store and fetch grouping enabled stats" do
|
91
93
|
ModelHelper1.store("sheep/black", {:count => 6, :weight => 461}, @time.hours_ago(4))
|
92
94
|
ModelHelper1.store("sheep/black", {:count => 2, :weight => 156}, @time)
|
93
95
|
ModelHelper1.store("sheep/white", {:count => 5, :weight => 393}, @time.hours_ago(4))
|
94
96
|
ModelHelper1.store("sheep/white", {:count => 4, :weight => 316}, @time)
|
95
|
-
|
97
|
+
|
96
98
|
stats = ModelHelper1.fetch("sheep/black", @time.hours_ago(2), @time.hours_since(1))
|
97
99
|
stats.total["count"].should == 2
|
98
100
|
stats.total["weight"].should == 156
|
99
101
|
stats.first.should == stats.total
|
100
|
-
|
102
|
+
|
101
103
|
stats = ModelHelper1.fetch("sheep/black", @time.hours_ago(5), @time.hours_since(1))
|
102
104
|
stats.total[:count].should == 8
|
103
105
|
stats.total[:weight].should == 617
|
104
106
|
stats.first.should == stats.total
|
105
|
-
|
107
|
+
|
106
108
|
stats = ModelHelper1.fetch("sheep/white", @time.hours_ago(2), @time.hours_since(1))
|
107
109
|
stats.total[:count].should == 4
|
108
110
|
stats.total[:weight].should == 316
|
109
111
|
stats.first.should == stats.total
|
110
|
-
|
112
|
+
|
111
113
|
stats = ModelHelper1.fetch("sheep/white", @time.hours_ago(5), @time.hours_since(1))
|
112
114
|
stats.total[:count].should == 9
|
113
115
|
stats.total[:weight].should == 709
|
114
116
|
stats.first.should == stats.total
|
115
|
-
|
117
|
+
|
116
118
|
stats = ModelHelper1.fetch("sheep", @time.hours_ago(2), @time.hours_since(1))
|
117
119
|
stats.total[:count].should == 6
|
118
120
|
stats.total[:weight].should == 472
|
119
121
|
stats.first.should == stats.total
|
120
|
-
|
122
|
+
|
121
123
|
stats = ModelHelper1.fetch("sheep", @time.hours_ago(5), @time.hours_since(1))
|
122
124
|
stats.total[:count].should == 17
|
123
125
|
stats.total[:weight].should == 1326
|
124
126
|
stats.first.should == stats.total
|
125
127
|
end
|
126
|
-
|
128
|
+
|
127
129
|
it "should connect to different Redis servers on a per-model basis" do
|
128
130
|
ModelHelper3.redis.client.db.should == 14
|
129
|
-
|
131
|
+
|
130
132
|
ModelHelper3.store("sheep.black", {:count => 6, :weight => 461}, @time.hours_ago(4), :label_indexing => false)
|
131
133
|
ModelHelper3.store("sheep.black", {:count => 2, :weight => 156}, @time, :label_indexing => false)
|
132
|
-
|
134
|
+
|
133
135
|
db.keys("*").should be_empty
|
134
136
|
ModelHelper1.redis.keys("*").should be_empty
|
135
137
|
db("ModelHelper3").keys("*").should have(5).items
|
136
138
|
ModelHelper3.redis.keys("*").should have(5).items
|
137
|
-
|
139
|
+
|
138
140
|
stats = ModelHelper3.fetch("sheep.black", @time.hours_ago(2), @time.hours_since(1), :label_indexing => false)
|
139
141
|
stats.total["count"].should == 2
|
140
142
|
stats.total["weight"].should == 156
|
141
143
|
stats = ModelHelper3.fetch("sheep.black", @time.hours_ago(5), @time.hours_since(1), :label_indexing => false)
|
142
144
|
stats.total[:count].should == 8
|
143
145
|
stats.total[:weight].should == 617
|
144
|
-
|
146
|
+
|
145
147
|
ModelHelper3.connect_to(:port => 8379, :db => 13)
|
146
148
|
ModelHelper3.redis.client.db.should == 13
|
147
|
-
|
149
|
+
|
148
150
|
stats = ModelHelper3.fetch("sheep.black", @time.hours_ago(5), @time.hours_since(1), :label_indexing => false)
|
149
151
|
stats.total.should == {}
|
150
|
-
|
152
|
+
|
151
153
|
ModelHelper3.connect_to(:port => 8379, :db => 14)
|
152
154
|
ModelHelper3.redis.client.db.should == 14
|
153
|
-
|
155
|
+
|
154
156
|
stats = ModelHelper3.fetch("sheep.black", @time.hours_ago(5), @time.hours_since(1), :label_indexing => false)
|
155
157
|
stats.total[:count].should == 8
|
156
158
|
stats.total[:weight].should == 617
|
157
159
|
end
|
158
|
-
|
160
|
+
|
159
161
|
describe "Write Buffer" do
|
160
162
|
before(:each) do
|
161
163
|
Redistat.buffer_size = 20
|
162
164
|
end
|
163
|
-
|
165
|
+
|
164
166
|
after(:each) do
|
165
167
|
Redistat.buffer_size = 0
|
166
168
|
end
|
167
|
-
|
169
|
+
|
168
170
|
it "should buffer calls in memory before committing to Redis" do
|
169
171
|
14.times do
|
170
172
|
ModelHelper1.store("sheep.black", {:count => 1, :weight => 461}, @time.hours_ago(4))
|
171
173
|
end
|
172
174
|
ModelHelper1.fetch("sheep.black", @time.hours_ago(5), @time.hours_since(1)).total.should == {}
|
173
|
-
|
175
|
+
|
174
176
|
5.times do
|
175
177
|
ModelHelper1.store("sheep.black", {:count => 1, :weight => 156}, @time)
|
176
178
|
end
|
177
179
|
ModelHelper1.fetch("sheep.black", @time.hours_ago(5), @time.hours_since(1)).total.should == {}
|
178
|
-
|
180
|
+
|
179
181
|
ModelHelper1.store("sheep.black", {:count => 1, :weight => 156}, @time)
|
180
182
|
stats = ModelHelper1.fetch("sheep.black", @time.hours_ago(5), @time.hours_since(1))
|
181
183
|
stats.total["count"].should == 20
|
182
184
|
stats.total["weight"].should == 7390
|
183
185
|
end
|
184
|
-
|
186
|
+
|
185
187
|
it "should force flush buffer when #flush(true) is called" do
|
186
188
|
ModelHelper1.fetch("sheep.black", @time.hours_ago(5), @time.hours_since(1)).total.should == {}
|
187
189
|
14.times do
|
@@ -189,16 +191,11 @@ describe Redistat::Model do
|
|
189
191
|
end
|
190
192
|
ModelHelper1.fetch("sheep.black", @time.hours_ago(5), @time.hours_since(1)).total.should == {}
|
191
193
|
Redistat.buffer.flush(true)
|
192
|
-
|
194
|
+
|
193
195
|
stats = ModelHelper1.fetch("sheep.black", @time.hours_ago(5), @time.hours_since(1))
|
194
196
|
stats.total["count"].should == 14
|
195
197
|
stats.total["weight"].should == 6454
|
196
198
|
end
|
197
199
|
end
|
198
|
-
|
199
|
-
end
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
200
|
|
201
|
+
end
|