leaderboard 2.4.0 → 2.5.0
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/.rspec +2 -1
- data/CHANGELOG.markdown +5 -1
- data/README.markdown +75 -62
- data/Rakefile +3 -39
- data/lib/leaderboard.rb +181 -135
- data/lib/leaderboard/version.rb +1 -1
- data/spec/leaderboard_spec.rb +167 -147
- data/spec/reverse_leaderboard_spec.rb +111 -91
- data/spec/version_spec.rb +1 -1
- metadata +5 -9
- data/spec/db/.gitkeep +0 -0
- data/spec/test.conf +0 -8
data/lib/leaderboard/version.rb
CHANGED
data/spec/leaderboard_spec.rb
CHANGED
@@ -13,8 +13,8 @@ describe 'Leaderboard' do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
it 'should be initialized with defaults' do
|
16
|
-
@leaderboard.leaderboard_name.should
|
17
|
-
@leaderboard.page_size.should
|
16
|
+
@leaderboard.leaderboard_name.should eql('name')
|
17
|
+
@leaderboard.page_size.should eql(Leaderboard::DEFAULT_PAGE_SIZE)
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'should be able to disconnect its connection to Redis' do
|
@@ -31,14 +31,14 @@ describe 'Leaderboard' do
|
|
31
31
|
|
32
32
|
it 'should set the page size to the default page size if passed an invalid value' do
|
33
33
|
some_leaderboard = Leaderboard.new('name', {:page_size => 0})
|
34
|
-
|
34
|
+
|
35
35
|
some_leaderboard.page_size.should be(Leaderboard::DEFAULT_PAGE_SIZE)
|
36
36
|
some_leaderboard.disconnect
|
37
37
|
end
|
38
38
|
|
39
39
|
it 'should allow you to delete a leaderboard' do
|
40
40
|
rank_members_in_leaderboard
|
41
|
-
|
41
|
+
|
42
42
|
@redis_connection.exists('name').should be_true
|
43
43
|
@leaderboard.delete_leaderboard
|
44
44
|
@redis_connection.exists('name').should be_false
|
@@ -47,7 +47,7 @@ describe 'Leaderboard' do
|
|
47
47
|
it 'should allow you to pass in an existing redis connection in the initializer' do
|
48
48
|
@leaderboard = Leaderboard.new('name', Leaderboard::DEFAULT_OPTIONS, {:redis_connection => @redis_connection})
|
49
49
|
rank_members_in_leaderboard
|
50
|
-
|
50
|
+
|
51
51
|
@redis_connection.info["connected_clients"].to_i.should be(1)
|
52
52
|
end
|
53
53
|
|
@@ -59,7 +59,7 @@ describe 'Leaderboard' do
|
|
59
59
|
|
60
60
|
it 'should return the correct number of members in a given score range' do
|
61
61
|
rank_members_in_leaderboard(5)
|
62
|
-
|
62
|
+
|
63
63
|
@leaderboard.total_members_in_score_range(2, 4).should be(3)
|
64
64
|
end
|
65
65
|
|
@@ -72,59 +72,59 @@ describe 'Leaderboard' do
|
|
72
72
|
|
73
73
|
it 'should return the correct score when calling score_for' do
|
74
74
|
rank_members_in_leaderboard(5)
|
75
|
-
|
76
|
-
@leaderboard.score_for('member_4').should
|
75
|
+
|
76
|
+
@leaderboard.score_for('member_4').should eql(4.0)
|
77
77
|
end
|
78
78
|
|
79
79
|
it 'should return the correct total pages' do
|
80
80
|
rank_members_in_leaderboard(10)
|
81
|
-
|
81
|
+
|
82
82
|
@leaderboard.total_pages.should be(1)
|
83
83
|
@leaderboard.total_pages(5).should be(2)
|
84
|
-
|
84
|
+
|
85
85
|
@redis_connection.flushdb
|
86
|
-
|
86
|
+
|
87
87
|
rank_members_in_leaderboard(Leaderboard::DEFAULT_PAGE_SIZE + 1)
|
88
|
-
|
88
|
+
|
89
89
|
@leaderboard.total_pages.should be(2)
|
90
90
|
end
|
91
91
|
|
92
92
|
it 'should return the correct list when calling leaders' do
|
93
93
|
rank_members_in_leaderboard(25)
|
94
|
-
|
94
|
+
|
95
95
|
@leaderboard.total_members.should be(25)
|
96
96
|
|
97
97
|
leaders = @leaderboard.leaders(1)
|
98
|
-
|
98
|
+
|
99
99
|
leaders.size.should be(25)
|
100
|
-
leaders[0][:member].should
|
101
|
-
leaders[-2][:member].should
|
102
|
-
leaders[-1][:member].should
|
100
|
+
leaders[0][:member].should eql 'member_25'
|
101
|
+
leaders[-2][:member].should eql 'member_2'
|
102
|
+
leaders[-1][:member].should eql 'member_1'
|
103
103
|
leaders[-1][:score].to_i.should be(1)
|
104
104
|
end
|
105
105
|
|
106
106
|
it 'should return the correct list when calling members' do
|
107
107
|
rank_members_in_leaderboard(25)
|
108
|
-
|
108
|
+
|
109
109
|
@leaderboard.total_members.should be(25)
|
110
110
|
|
111
111
|
members = @leaderboard.members(1)
|
112
|
-
|
112
|
+
|
113
113
|
members.size.should be(25)
|
114
|
-
members[0][:member].should
|
115
|
-
members[-2][:member].should
|
116
|
-
members[-1][:member].should
|
114
|
+
members[0][:member].should eql('member_25')
|
115
|
+
members[-2][:member].should eql('member_2')
|
116
|
+
members[-1][:member].should eql('member_1')
|
117
117
|
members[-1][:score].to_i.should be(1)
|
118
118
|
end
|
119
119
|
|
120
120
|
it 'should return the correct number of members when calling leaders with multiple pages' do
|
121
121
|
rank_members_in_leaderboard(Leaderboard::DEFAULT_PAGE_SIZE * 3 + 1)
|
122
|
-
|
122
|
+
|
123
123
|
@leaderboard.total_members.should be(Leaderboard::DEFAULT_PAGE_SIZE * 3 + 1)
|
124
124
|
|
125
125
|
leaders = @leaderboard.leaders(1)
|
126
126
|
leaders.size.should be(@leaderboard.page_size)
|
127
|
-
|
127
|
+
|
128
128
|
leaders = @leaderboard.leaders(2)
|
129
129
|
leaders.size.should be(@leaderboard.page_size)
|
130
130
|
|
@@ -133,10 +133,10 @@ describe 'Leaderboard' do
|
|
133
133
|
|
134
134
|
leaders = @leaderboard.leaders(4)
|
135
135
|
leaders.size.should be(1)
|
136
|
-
|
136
|
+
|
137
137
|
leaders = @leaderboard.leaders(-5)
|
138
138
|
leaders.size.should be(@leaderboard.page_size)
|
139
|
-
|
139
|
+
|
140
140
|
leaders = @leaderboard.leaders(10)
|
141
141
|
leaders.size.should be(1)
|
142
142
|
end
|
@@ -150,9 +150,9 @@ describe 'Leaderboard' do
|
|
150
150
|
members = @leaderboard.send("all_#{method}")
|
151
151
|
|
152
152
|
members.size.should be(27)
|
153
|
-
members[0][:member].should
|
154
|
-
members[-2][:member].should
|
155
|
-
members[-1][:member].should
|
153
|
+
members[0][:member].should eql('member_27')
|
154
|
+
members[-2][:member].should eql('member_2')
|
155
|
+
members[-1][:member].should eql('member_1')
|
156
156
|
members[-1][:score].to_i.should be(1)
|
157
157
|
end
|
158
158
|
end
|
@@ -163,67 +163,67 @@ describe 'Leaderboard' do
|
|
163
163
|
members = @leaderboard.members_from_score_range(10, 15, {:with_scores => false, :with_rank => false})
|
164
164
|
|
165
165
|
member_15 = {:member => 'member_15'}
|
166
|
-
members[0].should
|
166
|
+
members[0].should eql(member_15)
|
167
167
|
|
168
168
|
member_10 = {:member => 'member_10'}
|
169
|
-
members[5].should
|
169
|
+
members[5].should eql(member_10)
|
170
170
|
|
171
171
|
members = @leaderboard.members_from_score_range(10, 15, {:with_scores => true, :with_rank => true, :with_member_data => true})
|
172
172
|
|
173
173
|
member_15 = {:member => 'member_15', :rank => 11, :score => 15.0, :member_data => {'member_name' => 'Leaderboard member 15'}}
|
174
|
-
members[0].should
|
174
|
+
members[0].should eql(member_15)
|
175
175
|
|
176
176
|
member_10 = {:member => 'member_10', :rank => 16, :score => 10.0, :member_data => {'member_name' => 'Leaderboard member 10'}}
|
177
|
-
members[5].should
|
177
|
+
members[5].should eql(member_10)
|
178
178
|
end
|
179
179
|
|
180
180
|
it 'should allow you to retrieve leaders without scores and ranks' do
|
181
181
|
rank_members_in_leaderboard(Leaderboard::DEFAULT_PAGE_SIZE)
|
182
|
-
|
182
|
+
|
183
183
|
@leaderboard.total_members.should be(Leaderboard::DEFAULT_PAGE_SIZE)
|
184
184
|
leaders = @leaderboard.leaders(1, {:with_scores => false, :with_rank => false})
|
185
185
|
|
186
186
|
member_25 = {:member => 'member_25'}
|
187
|
-
leaders[0].should
|
188
|
-
|
187
|
+
leaders[0].should eql(member_25)
|
188
|
+
|
189
189
|
member_1 = {:member => 'member_1'}
|
190
|
-
leaders[24].should
|
190
|
+
leaders[24].should eql(member_1)
|
191
191
|
end
|
192
192
|
|
193
193
|
it 'should allow you to retrieve leaders with extra data' do
|
194
194
|
rank_members_in_leaderboard(Leaderboard::DEFAULT_PAGE_SIZE)
|
195
|
-
|
195
|
+
|
196
196
|
@leaderboard.total_members.should be(Leaderboard::DEFAULT_PAGE_SIZE)
|
197
197
|
leaders = @leaderboard.leaders(1, {:with_scores => false, :with_rank => false, :with_member_data => true})
|
198
198
|
|
199
199
|
member_25 = {:member => 'member_25', :member_data => { "member_name" => "Leaderboard member 25" }}
|
200
|
-
leaders[0].should
|
201
|
-
|
200
|
+
leaders[0].should eql(member_25)
|
201
|
+
|
202
202
|
member_1 = {:member => 'member_1', :member_data => { "member_name" => "Leaderboard member 1" }}
|
203
|
-
leaders[24].should
|
203
|
+
leaders[24].should eql(member_1)
|
204
204
|
end
|
205
205
|
|
206
206
|
it 'should allow you to retrieve optional member data' do
|
207
207
|
@leaderboard.rank_member('member_id', 1, {'username' => 'member_name', 'other_data_key' => 'other_data_value'})
|
208
208
|
|
209
|
-
@leaderboard.member_data_for('unknown_member').should
|
210
|
-
@leaderboard.member_data_for('member_id').should
|
209
|
+
@leaderboard.member_data_for('unknown_member').should eql({})
|
210
|
+
@leaderboard.member_data_for('member_id').should eql({'username' => 'member_name', 'other_data_key' => 'other_data_value'})
|
211
211
|
end
|
212
212
|
|
213
213
|
it 'should allow you to update optional member data' do
|
214
214
|
@leaderboard.rank_member('member_id', 1, {'username' => 'member_name'})
|
215
215
|
|
216
|
-
@leaderboard.member_data_for('member_id').should
|
216
|
+
@leaderboard.member_data_for('member_id').should eql({'username' => 'member_name'})
|
217
217
|
@leaderboard.update_member_data('member_id', {'other_data_key' => 'other_data_value'})
|
218
|
-
@leaderboard.member_data_for('member_id').should
|
218
|
+
@leaderboard.member_data_for('member_id').should eql({'username' => 'member_name', 'other_data_key' => 'other_data_value'})
|
219
219
|
end
|
220
220
|
|
221
221
|
it 'should allow you to remove optional member data' do
|
222
222
|
@leaderboard.rank_member('member_id', 1, {'username' => 'member_name'})
|
223
223
|
|
224
|
-
@leaderboard.member_data_for('member_id').should
|
224
|
+
@leaderboard.member_data_for('member_id').should eql({'username' => 'member_name'})
|
225
225
|
@leaderboard.remove_member_data('member_id')
|
226
|
-
@leaderboard.member_data_for('member_id').should
|
226
|
+
@leaderboard.member_data_for('member_id').should eql({})
|
227
227
|
end
|
228
228
|
|
229
229
|
it 'should allow you to call leaders with various options that respect the defaults for the options not passed in' do
|
@@ -231,90 +231,90 @@ describe 'Leaderboard' do
|
|
231
231
|
|
232
232
|
leaders = @leaderboard.leaders(1, :page_size => 1)
|
233
233
|
leaders.size.should be(1)
|
234
|
-
|
234
|
+
|
235
235
|
leaders = @leaderboard.leaders(1, :with_rank => false)
|
236
236
|
leaders.size.should be(Leaderboard::DEFAULT_PAGE_SIZE)
|
237
|
-
member_26 = {:member => 'member_26', :score => 26}
|
238
|
-
member_25 = {:member => 'member_25', :score => 25}
|
239
|
-
member_24 = {:member => 'member_24', :score => 24}
|
240
|
-
leaders[0].should
|
241
|
-
leaders[1].should
|
242
|
-
leaders[2].should
|
237
|
+
member_26 = {:member => 'member_26', :score => 26.0}
|
238
|
+
member_25 = {:member => 'member_25', :score => 25.0}
|
239
|
+
member_24 = {:member => 'member_24', :score => 24.0}
|
240
|
+
leaders[0].should eql(member_26)
|
241
|
+
leaders[1].should eql(member_25)
|
242
|
+
leaders[2].should eql(member_24)
|
243
243
|
|
244
244
|
leaders = @leaderboard.leaders(1, :with_scores => false)
|
245
245
|
leaders.size.should be(Leaderboard::DEFAULT_PAGE_SIZE)
|
246
246
|
member_26 = {:member => 'member_26', :rank => 1}
|
247
247
|
member_25 = {:member => 'member_25', :rank => 2}
|
248
|
-
leaders[0].should
|
249
|
-
leaders[1].should
|
248
|
+
leaders[0].should eql(member_26)
|
249
|
+
leaders[1].should eql(member_25)
|
250
250
|
|
251
251
|
leaders = @leaderboard.leaders(1, :with_scores => false, :with_rank => false)
|
252
252
|
leaders.size.should be(Leaderboard::DEFAULT_PAGE_SIZE)
|
253
253
|
member_26 = {:member => 'member_26'}
|
254
254
|
member_25 = {:member => 'member_25'}
|
255
|
-
leaders[0].should
|
256
|
-
leaders[1].should
|
255
|
+
leaders[0].should eql(member_26)
|
256
|
+
leaders[1].should eql(member_25)
|
257
257
|
|
258
258
|
leaders = @leaderboard.leaders(1, :with_rank => false, :page_size => 1)
|
259
259
|
leaders.size.should be(1)
|
260
|
-
member_26 = {:member => 'member_26', :score => 26}
|
261
|
-
leaders[0].should
|
260
|
+
member_26 = {:member => 'member_26', :score => 26.0}
|
261
|
+
leaders[0].should eql(member_26)
|
262
262
|
end
|
263
263
|
|
264
264
|
it 'should return a single member when calling member_at' do
|
265
265
|
rank_members_in_leaderboard(50)
|
266
|
-
@leaderboard.member_at(1)[:rank].should
|
267
|
-
@leaderboard.member_at(1)[:score].should
|
268
|
-
@leaderboard.member_at(26)[:rank].should
|
269
|
-
@leaderboard.member_at(50)[:rank].should
|
266
|
+
@leaderboard.member_at(1)[:rank].should eql(1)
|
267
|
+
@leaderboard.member_at(1)[:score].should eql(50.0)
|
268
|
+
@leaderboard.member_at(26)[:rank].should eql(26)
|
269
|
+
@leaderboard.member_at(50)[:rank].should eql(50)
|
270
270
|
@leaderboard.member_at(51).should be_nil
|
271
|
-
@leaderboard.member_at(1, :with_member_data => true)[:member_data].should
|
272
|
-
@leaderboard.member_at(1, :use_zero_index_for_rank => true)[:rank].should
|
271
|
+
@leaderboard.member_at(1, :with_member_data => true)[:member_data].should eql({'member_name' => 'Leaderboard member 50'})
|
272
|
+
@leaderboard.member_at(1, :use_zero_index_for_rank => true)[:rank].should eql(0)
|
273
273
|
end
|
274
274
|
|
275
275
|
it 'should return the correct information when calling around_me' do
|
276
276
|
rank_members_in_leaderboard(Leaderboard::DEFAULT_PAGE_SIZE * 3 + 1)
|
277
277
|
|
278
278
|
@leaderboard.total_members.should be(Leaderboard::DEFAULT_PAGE_SIZE * 3 + 1)
|
279
|
-
|
279
|
+
|
280
280
|
leaders_around_me = @leaderboard.around_me('member_30')
|
281
281
|
(leaders_around_me.size / 2).should be(@leaderboard.page_size / 2)
|
282
|
-
|
282
|
+
|
283
283
|
leaders_around_me = @leaderboard.around_me('member_1')
|
284
284
|
leaders_around_me.size.should be(@leaderboard.page_size / 2 + 1)
|
285
|
-
|
285
|
+
|
286
286
|
leaders_around_me = @leaderboard.around_me('member_76')
|
287
287
|
(leaders_around_me.size / 2).should be(@leaderboard.page_size / 2)
|
288
288
|
end
|
289
289
|
|
290
290
|
it 'should return the correct information when calling ranked_in_list' do
|
291
291
|
rank_members_in_leaderboard(Leaderboard::DEFAULT_PAGE_SIZE)
|
292
|
-
|
292
|
+
|
293
293
|
@leaderboard.total_members.should be(Leaderboard::DEFAULT_PAGE_SIZE)
|
294
|
-
|
294
|
+
|
295
295
|
members = ['member_1', 'member_5', 'member_10']
|
296
296
|
ranked_members = @leaderboard.ranked_in_list(members, Leaderboard::DEFAULT_LEADERBOARD_REQUEST_OPTIONS)
|
297
|
-
|
297
|
+
|
298
298
|
ranked_members.size.should be(3)
|
299
299
|
|
300
300
|
ranked_members[0][:rank].should be(25)
|
301
|
-
ranked_members[0][:score].should
|
301
|
+
ranked_members[0][:score].should eql(1.0)
|
302
302
|
|
303
303
|
ranked_members[1][:rank].should be(21)
|
304
|
-
ranked_members[1][:score].should
|
304
|
+
ranked_members[1][:score].should eql(5.0)
|
305
305
|
|
306
306
|
ranked_members[2][:rank].should be(16)
|
307
|
-
ranked_members[2][:score].should
|
307
|
+
ranked_members[2][:score].should eql(10.0)
|
308
308
|
end
|
309
309
|
|
310
310
|
it 'should return the correct information when calling ranked_in_list without scores' do
|
311
311
|
rank_members_in_leaderboard(Leaderboard::DEFAULT_PAGE_SIZE)
|
312
|
-
|
312
|
+
|
313
313
|
@leaderboard.total_members.should be(Leaderboard::DEFAULT_PAGE_SIZE)
|
314
|
-
|
314
|
+
|
315
315
|
members = ['member_1', 'member_5', 'member_10']
|
316
316
|
ranked_members = @leaderboard.ranked_in_list(members, {:with_scores => false, :with_rank => true, :use_zero_index_for_rank => false})
|
317
|
-
|
317
|
+
|
318
318
|
ranked_members.size.should be(3)
|
319
319
|
ranked_members[0][:rank].should be(25)
|
320
320
|
ranked_members[1][:rank].should be(21)
|
@@ -323,45 +323,45 @@ describe 'Leaderboard' do
|
|
323
323
|
|
324
324
|
it 'should allow you to remove members' do
|
325
325
|
rank_members_in_leaderboard(Leaderboard::DEFAULT_PAGE_SIZE)
|
326
|
-
|
326
|
+
|
327
327
|
@leaderboard.total_members.should be(Leaderboard::DEFAULT_PAGE_SIZE)
|
328
|
-
|
328
|
+
|
329
329
|
@leaderboard.remove_member('member_1')
|
330
|
-
|
330
|
+
|
331
331
|
@leaderboard.total_members.should be(Leaderboard::DEFAULT_PAGE_SIZE - 1)
|
332
332
|
@leaderboard.rank_for('member_1').should be_nil
|
333
333
|
end
|
334
334
|
|
335
335
|
it 'should allow you to change the score for a member' do
|
336
|
-
@leaderboard.rank_member('member_1', 5)
|
337
|
-
@leaderboard.score_for('member_1').should
|
336
|
+
@leaderboard.rank_member('member_1', 5)
|
337
|
+
@leaderboard.score_for('member_1').should eql(5.0)
|
338
338
|
|
339
|
-
@leaderboard.change_score_for('member_1', 5)
|
340
|
-
@leaderboard.score_for('member_1').should
|
339
|
+
@leaderboard.change_score_for('member_1', 5)
|
340
|
+
@leaderboard.score_for('member_1').should eql(10.0)
|
341
341
|
|
342
|
-
@leaderboard.change_score_for('member_1', -5)
|
343
|
-
@leaderboard.score_for('member_1').should
|
342
|
+
@leaderboard.change_score_for('member_1', -5)
|
343
|
+
@leaderboard.score_for('member_1').should eql(5.0)
|
344
344
|
end
|
345
345
|
|
346
346
|
it 'should allow you to check if a member exists' do
|
347
347
|
@leaderboard.rank_member('member_1', 10)
|
348
|
-
|
348
|
+
|
349
349
|
@leaderboard.check_member?('member_1').should be_true
|
350
350
|
@leaderboard.check_member?('member_2').should be_false
|
351
351
|
end
|
352
352
|
|
353
353
|
it 'should allow you to change the page size and have that reflected in the size of the result set' do
|
354
354
|
rank_members_in_leaderboard(Leaderboard::DEFAULT_PAGE_SIZE)
|
355
|
-
|
355
|
+
|
356
356
|
@leaderboard.page_size = 5
|
357
|
-
|
357
|
+
|
358
358
|
@leaderboard.total_pages.should be(5)
|
359
359
|
@leaderboard.leaders(1).size.should be(5)
|
360
360
|
end
|
361
361
|
|
362
362
|
it 'should not allow you to set the page size to an invalid page size' do
|
363
363
|
rank_members_in_leaderboard(Leaderboard::DEFAULT_PAGE_SIZE)
|
364
|
-
|
364
|
+
|
365
365
|
@leaderboard.page_size = 0
|
366
366
|
@leaderboard.total_pages.should be(1)
|
367
367
|
@leaderboard.leaders(1).size.should be(Leaderboard::DEFAULT_PAGE_SIZE)
|
@@ -369,18 +369,18 @@ describe 'Leaderboard' do
|
|
369
369
|
|
370
370
|
it 'should return the correct information when calling score_and_rank_for' do
|
371
371
|
rank_members_in_leaderboard
|
372
|
-
|
372
|
+
|
373
373
|
data = @leaderboard.score_and_rank_for('member_1')
|
374
|
-
data[:member].should
|
375
|
-
data[:score].should
|
376
|
-
data[:rank].should
|
374
|
+
data[:member].should eql('member_1')
|
375
|
+
data[:score].should eql(1.0)
|
376
|
+
data[:rank].should eql(5)
|
377
377
|
end
|
378
378
|
|
379
379
|
it 'should allow you to remove members in a given score range' do
|
380
380
|
rank_members_in_leaderboard
|
381
|
-
|
381
|
+
|
382
382
|
@leaderboard.total_members.should be(5)
|
383
|
-
|
383
|
+
|
384
384
|
@leaderboard.rank_member('cheater_1', 100)
|
385
385
|
@leaderboard.rank_member('cheater_2', 101)
|
386
386
|
@leaderboard.rank_member('cheater_3', 102)
|
@@ -388,9 +388,9 @@ describe 'Leaderboard' do
|
|
388
388
|
@leaderboard.total_members.should be(8)
|
389
389
|
|
390
390
|
@leaderboard.remove_members_in_score_range(100, 102)
|
391
|
-
|
391
|
+
|
392
392
|
@leaderboard.total_members.should be(5)
|
393
|
-
|
393
|
+
|
394
394
|
leaders = @leaderboard.leaders(1)
|
395
395
|
leaders.each do |leader|
|
396
396
|
leader[:score].should be < 100
|
@@ -400,24 +400,24 @@ describe 'Leaderboard' do
|
|
400
400
|
it 'should allow you to merge leaderboards' do
|
401
401
|
foo = Leaderboard.new('foo', Leaderboard::DEFAULT_LEADERBOARD_REQUEST_OPTIONS, :host => "127.0.0.1", :db => 15)
|
402
402
|
bar = Leaderboard.new('bar', Leaderboard::DEFAULT_LEADERBOARD_REQUEST_OPTIONS, :host => "127.0.0.1", :db => 15)
|
403
|
-
|
403
|
+
|
404
404
|
foo.rank_member('foo_1', 1)
|
405
405
|
foo.rank_member('foo_2', 2)
|
406
406
|
bar.rank_member('bar_1', 3)
|
407
407
|
bar.rank_member('bar_2', 4)
|
408
408
|
bar.rank_member('bar_3', 5)
|
409
|
-
|
409
|
+
|
410
410
|
foobar_keys = foo.merge_leaderboards('foobar', ['bar'])
|
411
411
|
foobar_keys.should be(5)
|
412
|
-
|
412
|
+
|
413
413
|
foobar = Leaderboard.new('foobar', Leaderboard::DEFAULT_LEADERBOARD_REQUEST_OPTIONS, :host => "127.0.0.1", :db => 15)
|
414
414
|
foobar.total_members.should be(5)
|
415
|
-
|
415
|
+
|
416
416
|
first_leader_in_foobar = foobar.leaders(1).first
|
417
|
-
first_leader_in_foobar[:rank].should
|
418
|
-
first_leader_in_foobar[:member].should
|
419
|
-
first_leader_in_foobar[:score].should
|
420
|
-
|
417
|
+
first_leader_in_foobar[:rank].should eql(1)
|
418
|
+
first_leader_in_foobar[:member].should eql('bar_3')
|
419
|
+
first_leader_in_foobar[:score].should eql(5.0)
|
420
|
+
|
421
421
|
foo.disconnect
|
422
422
|
bar.disconnect
|
423
423
|
foobar.disconnect
|
@@ -426,25 +426,25 @@ describe 'Leaderboard' do
|
|
426
426
|
it 'should allow you to intersect leaderboards' do
|
427
427
|
foo = Leaderboard.new('foo', Leaderboard::DEFAULT_LEADERBOARD_REQUEST_OPTIONS, :host => "127.0.0.1", :db => 15)
|
428
428
|
bar = Leaderboard.new('bar', Leaderboard::DEFAULT_LEADERBOARD_REQUEST_OPTIONS, :host => "127.0.0.1", :db => 15)
|
429
|
-
|
429
|
+
|
430
430
|
foo.rank_member('foo_1', 1)
|
431
431
|
foo.rank_member('foo_2', 2)
|
432
432
|
foo.rank_member('bar_3', 6)
|
433
433
|
bar.rank_member('bar_1', 3)
|
434
434
|
bar.rank_member('foo_1', 4)
|
435
435
|
bar.rank_member('bar_3', 5)
|
436
|
-
|
437
|
-
foobar_keys = foo.intersect_leaderboards('foobar', ['bar'], {:aggregate => :max})
|
436
|
+
|
437
|
+
foobar_keys = foo.intersect_leaderboards('foobar', ['bar'], {:aggregate => :max})
|
438
438
|
foobar_keys.should be(2)
|
439
|
-
|
439
|
+
|
440
440
|
foobar = Leaderboard.new('foobar', Leaderboard::DEFAULT_LEADERBOARD_REQUEST_OPTIONS, :host => "127.0.0.1", :db => 15)
|
441
441
|
foobar.total_members.should be(2)
|
442
|
-
|
442
|
+
|
443
443
|
first_leader_in_foobar = foobar.leaders(1).first
|
444
|
-
first_leader_in_foobar[:rank].should
|
445
|
-
first_leader_in_foobar[:member].should
|
446
|
-
first_leader_in_foobar[:score].should
|
447
|
-
|
444
|
+
first_leader_in_foobar[:rank].should eql(1)
|
445
|
+
first_leader_in_foobar[:member].should eql('bar_3')
|
446
|
+
first_leader_in_foobar[:score].should eql(6.0)
|
447
|
+
|
448
448
|
foo.disconnect
|
449
449
|
bar.disconnect
|
450
450
|
foobar.disconnect
|
@@ -452,14 +452,14 @@ describe 'Leaderboard' do
|
|
452
452
|
|
453
453
|
it 'should respect the with_scores option in the massage_leader_data method' do
|
454
454
|
rank_members_in_leaderboard(25)
|
455
|
-
|
455
|
+
|
456
456
|
@leaderboard.total_members.should be(25)
|
457
457
|
|
458
458
|
leaders = @leaderboard.leaders(1, {:with_scores => false, :with_rank => false})
|
459
459
|
leaders[0][:member].should_not be_nil
|
460
460
|
leaders[0][:score].should be_nil
|
461
461
|
leaders[0][:rank].should be_nil
|
462
|
-
|
462
|
+
|
463
463
|
@leaderboard.page_size = 25
|
464
464
|
leaders = @leaderboard.leaders(1, {:with_scores => false, :with_rank => false})
|
465
465
|
leaders.size.should be(25)
|
@@ -469,7 +469,7 @@ describe 'Leaderboard' do
|
|
469
469
|
leaders[0][:member].should_not be_nil
|
470
470
|
leaders[0][:score].should_not be_nil
|
471
471
|
leaders[0][:rank].should_not be_nil
|
472
|
-
|
472
|
+
|
473
473
|
@leaderboard.page_size = 25
|
474
474
|
leaders = @leaderboard.leaders(1, Leaderboard::DEFAULT_LEADERBOARD_REQUEST_OPTIONS)
|
475
475
|
leaders.size.should be(25)
|
@@ -477,14 +477,14 @@ describe 'Leaderboard' do
|
|
477
477
|
|
478
478
|
it 'should return the correct number of pages when calling total_pages_in page size option' do
|
479
479
|
rank_members_in_leaderboard(25)
|
480
|
-
|
480
|
+
|
481
481
|
@leaderboard.total_pages_in(@leaderboard.leaderboard_name).should be(1)
|
482
482
|
@leaderboard.total_pages_in(@leaderboard.leaderboard_name, 5).should be(5)
|
483
483
|
end
|
484
484
|
|
485
485
|
it 'should return the correct number of members when calling leaders with a page_size option' do
|
486
486
|
rank_members_in_leaderboard(25)
|
487
|
-
|
487
|
+
|
488
488
|
@leaderboard.leaders(1, Leaderboard::DEFAULT_LEADERBOARD_REQUEST_OPTIONS.merge({:page_size => 5})).size.should be(5)
|
489
489
|
@leaderboard.leaders(1, Leaderboard::DEFAULT_LEADERBOARD_REQUEST_OPTIONS.merge({:page_size => 10})).size.should be(10)
|
490
490
|
@leaderboard.leaders(2, Leaderboard::DEFAULT_LEADERBOARD_REQUEST_OPTIONS.merge({:page_size => 10})).size.should be(10)
|
@@ -493,35 +493,35 @@ describe 'Leaderboard' do
|
|
493
493
|
|
494
494
|
it 'should return the correct number of members when calling around_me with a page_size options' do
|
495
495
|
rank_members_in_leaderboard(Leaderboard::DEFAULT_PAGE_SIZE * 3 + 1)
|
496
|
-
|
496
|
+
|
497
497
|
leaders_around_me = @leaderboard.around_me('member_30', Leaderboard::DEFAULT_LEADERBOARD_REQUEST_OPTIONS.merge({:page_size => 3}))
|
498
498
|
leaders_around_me.size.should be(3)
|
499
|
-
leaders_around_me[0][:member].should
|
500
|
-
leaders_around_me[2][:member].should
|
499
|
+
leaders_around_me[0][:member].should eql('member_31')
|
500
|
+
leaders_around_me[2][:member].should eql('member_29')
|
501
501
|
end
|
502
502
|
|
503
503
|
it 'should return the correct information when calling percentile_for' do
|
504
504
|
rank_members_in_leaderboard(12)
|
505
|
-
|
506
|
-
@leaderboard.percentile_for('member_1').should
|
507
|
-
@leaderboard.percentile_for('member_2').should
|
508
|
-
@leaderboard.percentile_for('member_3').should
|
509
|
-
@leaderboard.percentile_for('member_4').should
|
510
|
-
@leaderboard.percentile_for('member_12').should
|
505
|
+
|
506
|
+
@leaderboard.percentile_for('member_1').should eql(0)
|
507
|
+
@leaderboard.percentile_for('member_2').should eql(9)
|
508
|
+
@leaderboard.percentile_for('member_3').should eql(17)
|
509
|
+
@leaderboard.percentile_for('member_4').should eql(25)
|
510
|
+
@leaderboard.percentile_for('member_12').should eql(92)
|
511
511
|
end
|
512
512
|
|
513
513
|
it 'should not throw an exception when calling around_me with a member not in the leaderboard' do
|
514
514
|
rank_members_in_leaderboard(Leaderboard::DEFAULT_PAGE_SIZE * 3 + 1)
|
515
|
-
|
515
|
+
|
516
516
|
leaders_around_me = @leaderboard.around_me('jones', Leaderboard::DEFAULT_LEADERBOARD_REQUEST_OPTIONS.merge({:page_size => 3}))
|
517
517
|
leaders_around_me.size.should be(0)
|
518
518
|
end
|
519
519
|
|
520
520
|
it 'should not throw an exception when calling score_and_rank_for with a member not in the leaderboard' do
|
521
521
|
score_and_rank_for_member = @leaderboard.score_and_rank_for('jones')
|
522
|
-
|
523
|
-
score_and_rank_for_member[:member].should
|
524
|
-
score_and_rank_for_member[:score].should
|
522
|
+
|
523
|
+
score_and_rank_for_member[:member].should eql('jones')
|
524
|
+
score_and_rank_for_member[:score].should eql(0.0)
|
525
525
|
score_and_rank_for_member[:rank].should be_nil
|
526
526
|
end
|
527
527
|
|
@@ -542,9 +542,9 @@ describe 'Leaderboard' do
|
|
542
542
|
end
|
543
543
|
|
544
544
|
it 'should allow you to change the score for a member not in the leaderboard' do
|
545
|
-
@leaderboard.score_for('jones').should
|
545
|
+
@leaderboard.score_for('jones').should eql(0.0)
|
546
546
|
@leaderboard.change_score_for('jones', 5)
|
547
|
-
@leaderboard.score_for('jones').should
|
547
|
+
@leaderboard.score_for('jones').should eql(5.0)
|
548
548
|
end
|
549
549
|
|
550
550
|
it 'should return the correct page when calling page_for a given member in the leaderboard' do
|
@@ -566,7 +566,7 @@ describe 'Leaderboard' do
|
|
566
566
|
it 'should set an expire on the leaderboard' do
|
567
567
|
rank_members_in_leaderboard
|
568
568
|
|
569
|
-
@leaderboard.expire_leaderboard(3)
|
569
|
+
@leaderboard.expire_leaderboard(3)
|
570
570
|
@redis_connection.ttl(@leaderboard.leaderboard_name).tap do |ttl|
|
571
571
|
ttl.should be > 1
|
572
572
|
ttl.should be <= 3
|
@@ -587,35 +587,55 @@ describe 'Leaderboard' do
|
|
587
587
|
@leaderboard.total_members.should be(0)
|
588
588
|
@leaderboard.rank_members('member_1', 1, 'member_10', 10)
|
589
589
|
@leaderboard.total_members.should be(2)
|
590
|
-
@leaderboard.leaders(1).first[:member].should
|
590
|
+
@leaderboard.leaders(1).first[:member].should eql('member_10')
|
591
591
|
end
|
592
592
|
|
593
593
|
it 'should allow you to rank multiple members with an array' do
|
594
594
|
@leaderboard.total_members.should be(0)
|
595
595
|
@leaderboard.rank_members(['member_1', 1, 'member_10', 10])
|
596
596
|
@leaderboard.total_members.should be(2)
|
597
|
-
@leaderboard.leaders(1).first[:member].should
|
597
|
+
@leaderboard.leaders(1).first[:member].should eql('member_10')
|
598
598
|
end
|
599
599
|
|
600
600
|
it 'should allow you to set reverse after creating a leaderboard to see results in highest-to-lowest or lowest-to-highest order' do
|
601
601
|
rank_members_in_leaderboard(25)
|
602
602
|
|
603
603
|
leaders = @leaderboard.leaders(1)
|
604
|
-
|
604
|
+
|
605
605
|
leaders.size.should be(25)
|
606
|
-
leaders[0][:member].should
|
607
|
-
leaders[-2][:member].should
|
608
|
-
leaders[-1][:member].should
|
606
|
+
leaders[0][:member].should eql('member_25')
|
607
|
+
leaders[-2][:member].should eql('member_2')
|
608
|
+
leaders[-1][:member].should eql('member_1')
|
609
609
|
leaders[-1][:score].to_i.should be(1)
|
610
610
|
|
611
611
|
@leaderboard.reverse = true
|
612
612
|
|
613
613
|
leaders = @leaderboard.leaders(1)
|
614
|
-
|
614
|
+
|
615
615
|
leaders.size.should be(25)
|
616
|
-
leaders[0][:member].should
|
617
|
-
leaders[-2][:member].should
|
618
|
-
leaders[-1][:member].should
|
616
|
+
leaders[0][:member].should eql('member_1')
|
617
|
+
leaders[-2][:member].should eql('member_24')
|
618
|
+
leaders[-1][:member].should eql('member_25')
|
619
619
|
leaders[-1][:score].to_i.should be(25)
|
620
620
|
end
|
621
|
+
|
622
|
+
it 'should allow you to retrieve a given set of members from the leaderboard in a rank range' do
|
623
|
+
rank_members_in_leaderboard(25)
|
624
|
+
|
625
|
+
members = @leaderboard.members_from_rank_range(5, 9)
|
626
|
+
members.size.should be(5)
|
627
|
+
members[0][:member].should eql('member_21')
|
628
|
+
members[0][:score].to_i.should be(21)
|
629
|
+
members[4][:member].should eql('member_17')
|
630
|
+
|
631
|
+
members = @leaderboard.members_from_rank_range(1, 1)
|
632
|
+
members.size.should be(1)
|
633
|
+
members[0][:member].should eql('member_25')
|
634
|
+
|
635
|
+
members = @leaderboard.members_from_rank_range(-1, 26)
|
636
|
+
members.size.should be(25)
|
637
|
+
members[0][:member].should eql('member_25')
|
638
|
+
members[0][:score].to_i.should be(25)
|
639
|
+
members[24][:member].should eql('member_1')
|
640
|
+
end
|
621
641
|
end
|