leaderboard 3.6.0 → 3.7.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.
@@ -0,0 +1,141 @@
1
+ require 'spec_helper'
2
+ require 'tie_ranking_leaderboard'
3
+
4
+ describe 'TieRankingLeaderboard (reverse option)' do
5
+ before(:each) do
6
+ @redis_connection = Redis.new(:host => "127.0.0.1", :db => 15)
7
+ end
8
+
9
+ after(:each) do
10
+ @redis_connection.flushdb
11
+ @redis_connection.client.disconnect
12
+ end
13
+
14
+ context 'ties' do
15
+ it 'should delete the ties ranking internal leaderboard when you delete a leaderboard configured for ties' do
16
+ leaderboard = TieRankingLeaderboard.new('ties', {:reverse => true}, {:host => "127.0.0.1", :db => 15})
17
+ leaderboard.rank_member('member_1', 50)
18
+ leaderboard.rank_member('member_2', 50)
19
+ leaderboard.rank_member('member_3', 30)
20
+ leaderboard.rank_member('member_4', 30)
21
+ leaderboard.rank_member('member_5', 10)
22
+
23
+ expect(@redis_connection.exists(leaderboard.send(:ties_leaderboard_key, leaderboard.leaderboard_name))).to be_truthy
24
+ leaderboard.delete_leaderboard
25
+ expect(@redis_connection.exists(leaderboard.send(:ties_leaderboard_key, leaderboard.leaderboard_name))).to be_falsey
26
+
27
+ leaderboard.disconnect
28
+ end
29
+
30
+ it 'should retrieve the correct rankings for #leaders' do
31
+ leaderboard = TieRankingLeaderboard.new('ties', {:reverse => true}, {:host => "127.0.0.1", :db => 15})
32
+ leaderboard.rank_member('member_1', 50)
33
+ leaderboard.rank_member('member_2', 50)
34
+ leaderboard.rank_member('member_3', 30)
35
+ leaderboard.rank_member('member_4', 30)
36
+ leaderboard.rank_member('member_5', 10)
37
+
38
+ leaderboard.leaders(1).tap do |leaders|
39
+ expect(leaders[0][:rank]).to eq(1)
40
+ expect(leaders[1][:rank]).to eq(2)
41
+ expect(leaders[2][:rank]).to eq(2)
42
+ expect(leaders[3][:rank]).to eq(3)
43
+ expect(leaders[4][:rank]).to eq(3)
44
+ end
45
+
46
+ leaderboard.disconnect
47
+ end
48
+
49
+ it 'should retrieve the correct rankings for #leaders with different page sizes' do
50
+ leaderboard = TieRankingLeaderboard.new('ties', {:reverse => true}, {:host => "127.0.0.1", :db => 15})
51
+ leaderboard.rank_member('member_1', 50)
52
+ leaderboard.rank_member('member_2', 50)
53
+ leaderboard.rank_member('member_3', 30)
54
+ leaderboard.rank_member('member_4', 30)
55
+ leaderboard.rank_member('member_5', 10)
56
+ leaderboard.rank_member('member_6', 50)
57
+ leaderboard.rank_member('member_7', 50)
58
+ leaderboard.rank_member('member_8', 30)
59
+ leaderboard.rank_member('member_9', 30)
60
+ leaderboard.rank_member('member_10', 10)
61
+
62
+ leaderboard.leaders(1, :page_size => 3).tap do |leaders|
63
+ expect(leaders[0][:rank]).to eq(1)
64
+ expect(leaders[1][:rank]).to eq(1)
65
+ expect(leaders[2][:rank]).to eq(2)
66
+ end
67
+
68
+ leaderboard.leaders(2, :page_size => 3).tap do |leaders|
69
+ expect(leaders[0][:rank]).to eq(2)
70
+ expect(leaders[1][:rank]).to eq(2)
71
+ expect(leaders[2][:rank]).to eq(2)
72
+ end
73
+
74
+ leaderboard.disconnect
75
+ end
76
+
77
+ it 'should retrieve the correct rankings for #around_me' do
78
+ leaderboard = TieRankingLeaderboard.new('ties', {:reverse => true}, {:host => "127.0.0.1", :db => 15})
79
+ leaderboard.rank_member('member_1', 50)
80
+ leaderboard.rank_member('member_2', 50)
81
+ leaderboard.rank_member('member_3', 30)
82
+ leaderboard.rank_member('member_4', 30)
83
+ leaderboard.rank_member('member_5', 10)
84
+ leaderboard.rank_member('member_6', 50)
85
+ leaderboard.rank_member('member_7', 50)
86
+ leaderboard.rank_member('member_8', 30)
87
+ leaderboard.rank_member('member_9', 30)
88
+ leaderboard.rank_member('member_10', 10)
89
+
90
+ leaderboard.around_me('member_3', :page_size => 3).tap do |leaders|
91
+ expect(leaders[0][:rank]).to eq(1)
92
+ expect(leaders[1][:rank]).to eq(2)
93
+ expect(leaders[2][:rank]).to eq(2)
94
+ end
95
+
96
+ leaderboard.disconnect
97
+ end
98
+
99
+ it 'should support that removing a single member will also remove their score from the tie scores leaderboard when appropriate' do
100
+ leaderboard = TieRankingLeaderboard.new('ties', {:reverse => true}, {:host => "127.0.0.1", :db => 15})
101
+ leaderboard.rank_member('member_1', 50)
102
+ leaderboard.rank_member('member_2', 50)
103
+ leaderboard.rank_member('member_3', 30)
104
+
105
+ leaderboard.remove_member('member_1')
106
+ expect(leaderboard.total_members_in(leaderboard.send(:ties_leaderboard_key, leaderboard.leaderboard_name))).to eq(2)
107
+ leaderboard.remove_member('member_2')
108
+ expect(leaderboard.total_members_in(leaderboard.send(:ties_leaderboard_key, leaderboard.leaderboard_name))).to eq(1)
109
+ leaderboard.remove_member('member_3')
110
+ expect(leaderboard.total_members_in(leaderboard.send(:ties_leaderboard_key, leaderboard.leaderboard_name))).to eq(0)
111
+
112
+ leaderboard.disconnect
113
+ end
114
+
115
+ it 'should allow you to retrieve the rank of a single member using #rank_for' do
116
+ leaderboard = TieRankingLeaderboard.new('ties', {:reverse => true}, {:host => "127.0.0.1", :db => 15})
117
+ leaderboard.rank_member('member_1', 50)
118
+ leaderboard.rank_member('member_2', 50)
119
+ leaderboard.rank_member('member_3', 30)
120
+
121
+ expect(leaderboard.rank_for('member_1')).to eq(2)
122
+ expect(leaderboard.rank_for('member_2')).to eq(2)
123
+ expect(leaderboard.rank_for('member_3')).to eq(1)
124
+
125
+ leaderboard.disconnect
126
+ end
127
+
128
+ it 'should allow you to retrieve the score and rank of a single member using #score_and_rank_for' do
129
+ leaderboard = TieRankingLeaderboard.new('ties', {:reverse => true}, {:host => "127.0.0.1", :db => 15})
130
+ leaderboard.rank_member('member_1', 50)
131
+ leaderboard.rank_member('member_2', 50)
132
+ leaderboard.rank_member('member_3', 30)
133
+
134
+ expect(leaderboard.score_and_rank_for('member_1')[:rank]).to eq(2)
135
+ expect(leaderboard.score_and_rank_for('member_2')[:rank]).to eq(2)
136
+ expect(leaderboard.score_and_rank_for('member_3')[:rank]).to eq(1)
137
+
138
+ leaderboard.disconnect
139
+ end
140
+ end
141
+ end
data/spec/spec_helper.rb CHANGED
@@ -5,7 +5,7 @@ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
5
5
 
6
6
  RSpec.configure do |config|
7
7
  # Helper method to rank members in a leaderboard
8
- #
8
+ #
9
9
  # @param members_to_add [int] Number of members to add to the leaderboard.
10
10
  def rank_members_in_leaderboard(members_to_add = 5)
11
11
  1.upto(members_to_add) do |index|
@@ -0,0 +1,207 @@
1
+ require 'spec_helper'
2
+ require 'tie_ranking_leaderboard'
3
+
4
+ describe 'TieRankingLeaderboard' do
5
+ before(:each) do
6
+ @redis_connection = Redis.new(:host => "127.0.0.1", :db => 15)
7
+ end
8
+
9
+ after(:each) do
10
+ @redis_connection.flushdb
11
+ @redis_connection.client.disconnect
12
+ end
13
+
14
+ context 'ties' do
15
+ it 'should delete the ties ranking internal leaderboard when you delete a leaderboard configured for ties' do
16
+ leaderboard = TieRankingLeaderboard.new('ties', Leaderboard::DEFAULT_OPTIONS, {:host => "127.0.0.1", :db => 15})
17
+ leaderboard.rank_member('member_1', 50)
18
+ leaderboard.rank_member('member_2', 50)
19
+ leaderboard.rank_member('member_3', 30)
20
+ leaderboard.rank_member('member_4', 30)
21
+ leaderboard.rank_member('member_5', 10)
22
+
23
+ expect(@redis_connection.exists(leaderboard.send(:ties_leaderboard_key, leaderboard.leaderboard_name))).to be_truthy
24
+ leaderboard.delete_leaderboard
25
+ expect(@redis_connection.exists(leaderboard.send(:ties_leaderboard_key, leaderboard.leaderboard_name))).to be_falsey
26
+
27
+ leaderboard.disconnect
28
+ end
29
+
30
+ it 'should retrieve the correct rankings for #leaders' do
31
+ leaderboard = TieRankingLeaderboard.new('ties', Leaderboard::DEFAULT_OPTIONS, {:host => "127.0.0.1", :db => 15})
32
+ leaderboard.rank_member('member_1', 50)
33
+ leaderboard.rank_member('member_2', 50)
34
+ leaderboard.rank_member('member_3', 30)
35
+ leaderboard.rank_member('member_4', 30)
36
+ leaderboard.rank_member('member_5', 10)
37
+
38
+ leaderboard.leaders(1).tap do |leaders|
39
+ expect(leaders[0][:rank]).to eq(1)
40
+ expect(leaders[1][:rank]).to eq(1)
41
+ expect(leaders[2][:rank]).to eq(2)
42
+ expect(leaders[3][:rank]).to eq(2)
43
+ expect(leaders[4][:rank]).to eq(3)
44
+ end
45
+
46
+ leaderboard.disconnect
47
+ end
48
+
49
+ it 'should retrieve the correct rankings for #leaders with different page sizes' do
50
+ leaderboard = TieRankingLeaderboard.new('ties', Leaderboard::DEFAULT_OPTIONS, {:host => "127.0.0.1", :db => 15})
51
+ leaderboard.rank_member('member_1', 50)
52
+ leaderboard.rank_member('member_2', 50)
53
+ leaderboard.rank_member('member_3', 30)
54
+ leaderboard.rank_member('member_4', 30)
55
+ leaderboard.rank_member('member_5', 10)
56
+ leaderboard.rank_member('member_6', 50)
57
+ leaderboard.rank_member('member_7', 50)
58
+ leaderboard.rank_member('member_8', 30)
59
+ leaderboard.rank_member('member_9', 30)
60
+ leaderboard.rank_member('member_10', 10)
61
+
62
+ leaderboard.leaders(1, :page_size => 3).tap do |leaders|
63
+ expect(leaders[0][:rank]).to eq(1)
64
+ expect(leaders[1][:rank]).to eq(1)
65
+ expect(leaders[2][:rank]).to eq(1)
66
+ end
67
+
68
+ leaderboard.leaders(2, :page_size => 3).tap do |leaders|
69
+ expect(leaders[0][:rank]).to eq(1)
70
+ expect(leaders[1][:rank]).to eq(2)
71
+ expect(leaders[2][:rank]).to eq(2)
72
+ end
73
+
74
+ leaderboard.disconnect
75
+ end
76
+
77
+ it 'should retrieve the correct rankings for #around_me' do
78
+ leaderboard = TieRankingLeaderboard.new('ties', Leaderboard::DEFAULT_OPTIONS, {:host => "127.0.0.1", :db => 15})
79
+ leaderboard.rank_member('member_1', 50)
80
+ leaderboard.rank_member('member_2', 50)
81
+ leaderboard.rank_member('member_3', 30)
82
+ leaderboard.rank_member('member_4', 30)
83
+ leaderboard.rank_member('member_5', 10)
84
+ leaderboard.rank_member('member_6', 50)
85
+ leaderboard.rank_member('member_7', 50)
86
+ leaderboard.rank_member('member_8', 30)
87
+ leaderboard.rank_member('member_9', 30)
88
+ leaderboard.rank_member('member_10', 10)
89
+
90
+ leaderboard.around_me('member_3', :page_size => 3).tap do |leaders|
91
+ expect(leaders[0][:rank]).to eq(2)
92
+ expect(leaders[1][:rank]).to eq(2)
93
+ expect(leaders[2][:rank]).to eq(3)
94
+ end
95
+
96
+ leaderboard.disconnect
97
+ end
98
+
99
+ it 'should support that removing a single member will also remove their score from the tie scores leaderboard when appropriate' do
100
+ leaderboard = TieRankingLeaderboard.new('ties', Leaderboard::DEFAULT_OPTIONS, {:host => "127.0.0.1", :db => 15})
101
+ leaderboard.rank_member('member_1', 50)
102
+ leaderboard.rank_member('member_2', 50)
103
+ leaderboard.rank_member('member_3', 30)
104
+
105
+ leaderboard.remove_member('member_1')
106
+ expect(leaderboard.total_members_in(leaderboard.send(:ties_leaderboard_key, leaderboard.leaderboard_name))).to eq(2)
107
+ leaderboard.remove_member('member_2')
108
+ expect(leaderboard.total_members_in(leaderboard.send(:ties_leaderboard_key, leaderboard.leaderboard_name))).to eq(1)
109
+ leaderboard.remove_member('member_3')
110
+ expect(leaderboard.total_members_in(leaderboard.send(:ties_leaderboard_key, leaderboard.leaderboard_name))).to eq(0)
111
+
112
+ leaderboard.disconnect
113
+ end
114
+
115
+ it 'should allow you to retrieve the rank of a single member using #rank_for' do
116
+ leaderboard = TieRankingLeaderboard.new('ties', Leaderboard::DEFAULT_OPTIONS, {:host => "127.0.0.1", :db => 15})
117
+ leaderboard.rank_member('member_1', 50)
118
+ leaderboard.rank_member('member_2', 50)
119
+ leaderboard.rank_member('member_3', 30)
120
+
121
+ expect(leaderboard.rank_for('member_1')).to eq(1)
122
+ expect(leaderboard.rank_for('member_2')).to eq(1)
123
+ expect(leaderboard.rank_for('member_3')).to eq(2)
124
+
125
+ leaderboard.disconnect
126
+ end
127
+
128
+ it 'should allow you to retrieve the score and rank of a single member using #score_and_rank_for' do
129
+ leaderboard = TieRankingLeaderboard.new('ties', Leaderboard::DEFAULT_OPTIONS, {:host => "127.0.0.1", :db => 15})
130
+ leaderboard.rank_member('member_1', 50)
131
+ leaderboard.rank_member('member_2', 50)
132
+ leaderboard.rank_member('member_3', 30)
133
+
134
+ expect(leaderboard.score_and_rank_for('member_1')[:rank]).to eq(1)
135
+ expect(leaderboard.score_and_rank_for('member_2')[:rank]).to eq(1)
136
+ expect(leaderboard.score_and_rank_for('member_3')[:rank]).to eq(2)
137
+
138
+ leaderboard.disconnect
139
+ end
140
+
141
+ it 'should allow you to remove members in a given score range using #remove_members_in_score_range' do
142
+ @leaderboard = TieRankingLeaderboard.new('ties', Leaderboard::DEFAULT_OPTIONS, {:host => "127.0.0.1", :db => 15})
143
+
144
+ rank_members_in_leaderboard
145
+
146
+ expect(@leaderboard.total_members).to be(5)
147
+
148
+ @leaderboard.rank_member('cheater_1', 100)
149
+ @leaderboard.rank_member('cheater_2', 101)
150
+ @leaderboard.rank_member('cheater_3', 102)
151
+
152
+ expect(@leaderboard.total_members).to be(8)
153
+ expect(@leaderboard.total_members_in(@leaderboard.send(:ties_leaderboard_key, @leaderboard.leaderboard_name))).to be(8)
154
+
155
+ @leaderboard.remove_members_in_score_range(100, 102)
156
+
157
+ expect(@leaderboard.total_members).to be(5)
158
+ expect(@leaderboard.total_members_in(@leaderboard.send(:ties_leaderboard_key, @leaderboard.leaderboard_name))).to be(5)
159
+
160
+ leaders = @leaderboard.leaders(1)
161
+ leaders.each do |leader|
162
+ expect(leader[:score]).to be < 100
163
+ end
164
+ end
165
+
166
+ it 'should expire the ties leaderboard in a given number of seconds' do
167
+ @leaderboard = TieRankingLeaderboard.new('ties', Leaderboard::DEFAULT_OPTIONS, {:host => "127.0.0.1", :db => 15})
168
+
169
+ rank_members_in_leaderboard
170
+
171
+ @leaderboard.expire_leaderboard(3)
172
+ @redis_connection.ttl(@leaderboard.leaderboard_name).tap do |ttl|
173
+ expect(ttl).to be > 1
174
+ expect(ttl).to be <= 3
175
+ end
176
+ @redis_connection.ttl(@leaderboard.send(:ties_leaderboard_key, @leaderboard.leaderboard_name)).tap do |ttl|
177
+ expect(ttl).to be > 1
178
+ expect(ttl).to be <= 3
179
+ end
180
+ @redis_connection.ttl(@leaderboard.send(:member_data_key, @leaderboard.leaderboard_name)).tap do |ttl|
181
+ expect(ttl).to be > 1
182
+ expect(ttl).to be <= 3
183
+ end
184
+
185
+ end
186
+
187
+ it 'should expire the ties leaderboard at a specific timestamp' do
188
+ @leaderboard = TieRankingLeaderboard.new('ties', Leaderboard::DEFAULT_OPTIONS, {:host => "127.0.0.1", :db => 15})
189
+
190
+ rank_members_in_leaderboard
191
+
192
+ @leaderboard.expire_leaderboard_at((Time.now + 10).to_i)
193
+ @redis_connection.ttl(@leaderboard.leaderboard_name).tap do |ttl|
194
+ expect(ttl).to be > 1
195
+ expect(ttl).to be <= 10
196
+ end
197
+ @redis_connection.ttl(@leaderboard.send(:ties_leaderboard_key, @leaderboard.leaderboard_name)).tap do |ttl|
198
+ expect(ttl).to be > 1
199
+ expect(ttl).to be <= 10
200
+ end
201
+ @redis_connection.ttl(@leaderboard.send(:member_data_key, @leaderboard.leaderboard_name)).tap do |ttl|
202
+ expect(ttl).to be > 1
203
+ expect(ttl).to be <= 10
204
+ end
205
+ end
206
+ end
207
+ end
data/spec/version_spec.rb CHANGED
@@ -2,6 +2,6 @@ require 'spec_helper'
2
2
 
3
3
  describe 'Leaderboard::VERSION' do
4
4
  it 'should be the correct version' do
5
- Leaderboard::VERSION.should == '3.6.0'
5
+ expect(Leaderboard::VERSION).to eq('3.7.0')
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,55 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: leaderboard
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.6.0
4
+ version: 3.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Czarnecki
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-15 00:00:00.000000000 Z
11
+ date: 2014-07-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  description: Leaderboards backed by Redis in Ruby
@@ -59,22 +59,28 @@ executables: []
59
59
  extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
- - .gitignore
63
- - .rspec
64
- - .ruby-gemset
65
- - .ruby-version
66
- - .travis.yml
62
+ - ".gitignore"
63
+ - ".rspec"
64
+ - ".ruby-gemset"
65
+ - ".ruby-version"
66
+ - ".travis.yml"
67
67
  - CHANGELOG.markdown
68
68
  - Gemfile
69
69
  - LICENSE.txt
70
70
  - README.markdown
71
71
  - Rakefile
72
72
  - leaderboard.gemspec
73
+ - lib/competition_ranking_leaderboard.rb
73
74
  - lib/leaderboard.rb
74
75
  - lib/leaderboard/version.rb
76
+ - lib/tie_ranking_leaderboard.rb
77
+ - spec/competition_ranking_leaderboard_spec.rb
75
78
  - spec/leaderboard_spec.rb
79
+ - spec/reverse_competition_ranking_leaderboard_spec.rb
76
80
  - spec/reverse_leaderboard_spec.rb
81
+ - spec/reverse_tie_ranking_leaderboard_spec.rb
77
82
  - spec/spec_helper.rb
83
+ - spec/tie_ranking_leaderboard_spec.rb
78
84
  - spec/version_spec.rb
79
85
  homepage: https://github.com/agoragames/leaderboard
80
86
  licenses:
@@ -86,22 +92,26 @@ require_paths:
86
92
  - lib
87
93
  required_ruby_version: !ruby/object:Gem::Requirement
88
94
  requirements:
89
- - - '>='
95
+ - - ">="
90
96
  - !ruby/object:Gem::Version
91
97
  version: '0'
92
98
  required_rubygems_version: !ruby/object:Gem::Requirement
93
99
  requirements:
94
- - - '>='
100
+ - - ">="
95
101
  - !ruby/object:Gem::Version
96
102
  version: '0'
97
103
  requirements: []
98
104
  rubyforge_project: leaderboard
99
- rubygems_version: 2.1.11
105
+ rubygems_version: 2.2.2
100
106
  signing_key:
101
107
  specification_version: 4
102
108
  summary: Leaderboards backed by Redis in Ruby
103
109
  test_files:
110
+ - spec/competition_ranking_leaderboard_spec.rb
104
111
  - spec/leaderboard_spec.rb
112
+ - spec/reverse_competition_ranking_leaderboard_spec.rb
105
113
  - spec/reverse_leaderboard_spec.rb
114
+ - spec/reverse_tie_ranking_leaderboard_spec.rb
106
115
  - spec/spec_helper.rb
116
+ - spec/tie_ranking_leaderboard_spec.rb
107
117
  - spec/version_spec.rb