leaderboard 1.0.4 → 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.markdown +6 -0
- data/Rakefile +5 -1
- data/VERSION +1 -1
- data/leaderboard.gemspec +2 -2
- data/lib/leaderboard.rb +21 -16
- data/test/test_leaderboard.rb +26 -1
- metadata +4 -4
data/CHANGELOG.markdown
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
# leaderboard 1.0.5 (2011-05-04)
|
2
|
+
|
3
|
+
* Updated Rakefile to run tests under ruby 1.8.7 and ruby 1.9.2
|
4
|
+
* Added `page_size` parameter to `total_pages_in` to allow for checking what if values in that scenario
|
5
|
+
* Added `page_size` parameter to `leaders` and `around_me` calls
|
6
|
+
|
1
7
|
# leaderboard 1.0.4 (2011-04-26)
|
2
8
|
|
3
9
|
* Minor bug fix
|
data/Rakefile
CHANGED
@@ -58,7 +58,7 @@ REDIS_LOCATION = ENV['REDIS_LOCATION']
|
|
58
58
|
task :default => :run
|
59
59
|
|
60
60
|
desc "Run tests and manage server start/stop"
|
61
|
-
task :run => [:start, :
|
61
|
+
task :run => [:start, :test_rubies, :stop]
|
62
62
|
|
63
63
|
desc "Run rcov and manage server start/stop"
|
64
64
|
task :rcoverage => [:start, :rcov, :stop]
|
@@ -87,3 +87,7 @@ task :stop do
|
|
87
87
|
FileUtils.rm REDIS_PID
|
88
88
|
end
|
89
89
|
end
|
90
|
+
|
91
|
+
task :test_rubies do
|
92
|
+
system "rvm 1.8.7,1.9.2 rake test"
|
93
|
+
end
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.
|
1
|
+
1.0.5
|
data/leaderboard.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{leaderboard}
|
8
|
-
s.version = "1.0.
|
8
|
+
s.version = "1.0.5"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["David Czarnecki"]
|
12
|
-
s.date = %q{2011-04
|
12
|
+
s.date = %q{2011-05-04}
|
13
13
|
s.description = %q{Leaderboards backed by Redis in Ruby}
|
14
14
|
s.email = %q{dczarnecki@agoragames.com}
|
15
15
|
s.extra_rdoc_files = [
|
data/lib/leaderboard.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'redis'
|
2
2
|
|
3
3
|
class Leaderboard
|
4
|
-
VERSION = '1.0.
|
4
|
+
VERSION = '1.0.5'.freeze
|
5
5
|
|
6
6
|
DEFAULT_PAGE_SIZE = 25
|
7
7
|
DEFAULT_REDIS_HOST = 'localhost'
|
@@ -60,8 +60,9 @@ class Leaderboard
|
|
60
60
|
total_pages_in(@leaderboard_name)
|
61
61
|
end
|
62
62
|
|
63
|
-
def total_pages_in(leaderboard_name)
|
64
|
-
|
63
|
+
def total_pages_in(leaderboard_name, page_size = nil)
|
64
|
+
page_size ||= @page_size.to_f
|
65
|
+
(total_members_in(leaderboard_name) / page_size.to_f).ceil
|
65
66
|
end
|
66
67
|
|
67
68
|
def total_members_in_score_range(min_score, max_score)
|
@@ -124,27 +125,29 @@ class Leaderboard
|
|
124
125
|
@redis_connection.zremrangebyscore(leaderboard_name, min_score, max_score)
|
125
126
|
end
|
126
127
|
|
127
|
-
def leaders(current_page, with_scores = true, with_rank = true, use_zero_index_for_rank = false)
|
128
|
-
leaders_in(@leaderboard_name, current_page, with_scores, with_rank, use_zero_index_for_rank)
|
128
|
+
def leaders(current_page, with_scores = true, with_rank = true, use_zero_index_for_rank = false, page_size = nil)
|
129
|
+
leaders_in(@leaderboard_name, current_page, with_scores, with_rank, use_zero_index_for_rank, page_size)
|
129
130
|
end
|
130
131
|
|
131
|
-
def leaders_in(leaderboard_name, current_page, with_scores = true, with_rank = true, use_zero_index_for_rank = false)
|
132
|
+
def leaders_in(leaderboard_name, current_page, with_scores = true, with_rank = true, use_zero_index_for_rank = false, page_size = nil)
|
132
133
|
if current_page < 1
|
133
134
|
current_page = 1
|
134
135
|
end
|
135
136
|
|
136
|
-
|
137
|
-
|
137
|
+
page_size ||= @page_size
|
138
|
+
|
139
|
+
if current_page > total_pages_in(leaderboard_name, page_size)
|
140
|
+
current_page = total_pages_in(leaderboard_name, page_size)
|
138
141
|
end
|
139
142
|
|
140
143
|
index_for_redis = current_page - 1
|
141
144
|
|
142
|
-
starting_offset = (index_for_redis *
|
145
|
+
starting_offset = (index_for_redis * page_size)
|
143
146
|
if starting_offset < 0
|
144
147
|
starting_offset = 0
|
145
148
|
end
|
146
149
|
|
147
|
-
ending_offset = (starting_offset +
|
150
|
+
ending_offset = (starting_offset + page_size) - 1
|
148
151
|
|
149
152
|
raw_leader_data = @redis_connection.zrevrange(leaderboard_name, starting_offset, ending_offset, :with_scores => with_scores)
|
150
153
|
if raw_leader_data
|
@@ -154,19 +157,21 @@ class Leaderboard
|
|
154
157
|
end
|
155
158
|
end
|
156
159
|
|
157
|
-
def around_me(member, with_scores = true, with_rank = true, use_zero_index_for_rank = false)
|
158
|
-
around_me_in(@leaderboard_name, member, with_scores, with_rank, use_zero_index_for_rank)
|
160
|
+
def around_me(member, with_scores = true, with_rank = true, use_zero_index_for_rank = false, page_size = nil)
|
161
|
+
around_me_in(@leaderboard_name, member, with_scores, with_rank, use_zero_index_for_rank, page_size)
|
159
162
|
end
|
160
163
|
|
161
|
-
def around_me_in(leaderboard_name, member, with_scores = true, with_rank = true, use_zero_index_for_rank = false)
|
164
|
+
def around_me_in(leaderboard_name, member, with_scores = true, with_rank = true, use_zero_index_for_rank = false, page_size = nil)
|
162
165
|
reverse_rank_for_member = @redis_connection.zrevrank(leaderboard_name, member)
|
163
166
|
|
164
|
-
|
167
|
+
page_size ||= @page_size
|
168
|
+
|
169
|
+
starting_offset = reverse_rank_for_member - (page_size / 2)
|
165
170
|
if starting_offset < 0
|
166
171
|
starting_offset = 0
|
167
172
|
end
|
168
|
-
|
169
|
-
ending_offset = (starting_offset +
|
173
|
+
|
174
|
+
ending_offset = (starting_offset + page_size) - 1
|
170
175
|
|
171
176
|
raw_leader_data = @redis_connection.zrevrange(leaderboard_name, starting_offset, ending_offset, :with_scores => with_scores)
|
172
177
|
if raw_leader_data
|
data/test/test_leaderboard.rb
CHANGED
@@ -11,7 +11,7 @@ class TestLeaderboard < Test::Unit::TestCase
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def test_version
|
14
|
-
assert_equal '1.0.
|
14
|
+
assert_equal '1.0.5', Leaderboard::VERSION
|
15
15
|
end
|
16
16
|
|
17
17
|
def test_initialize_with_defaults
|
@@ -274,6 +274,31 @@ class TestLeaderboard < Test::Unit::TestCase
|
|
274
274
|
assert_equal 25, leaders.size
|
275
275
|
end
|
276
276
|
|
277
|
+
def test_total_pages_in_with_new_page_size
|
278
|
+
add_members_to_leaderboard(25)
|
279
|
+
|
280
|
+
assert_equal 1, @leaderboard.total_pages_in(@leaderboard.leaderboard_name)
|
281
|
+
assert_equal 5, @leaderboard.total_pages_in(@leaderboard.leaderboard_name, 5)
|
282
|
+
end
|
283
|
+
|
284
|
+
def test_leaders_call_with_new_page_size
|
285
|
+
add_members_to_leaderboard(25)
|
286
|
+
|
287
|
+
assert_equal 5, @leaderboard.leaders(1, true, true, false, 5).size
|
288
|
+
assert_equal 10, @leaderboard.leaders(1, true, true, false, 10).size
|
289
|
+
assert_equal 10, @leaderboard.leaders(2, true, true, false, 10).size
|
290
|
+
assert_equal 5, @leaderboard.leaders(3, true, true, false, 10).size
|
291
|
+
end
|
292
|
+
|
293
|
+
def test_around_me_call_with_new_page_size
|
294
|
+
add_members_to_leaderboard(Leaderboard::DEFAULT_PAGE_SIZE * 3 + 1)
|
295
|
+
|
296
|
+
leaders_around_me = @leaderboard.around_me('member_30', true, true, false, 3)
|
297
|
+
assert_equal 3, leaders_around_me.size
|
298
|
+
assert_equal 'member_31', leaders_around_me[0][:member]
|
299
|
+
assert_equal 'member_29', leaders_around_me[2][:member]
|
300
|
+
end
|
301
|
+
|
277
302
|
private
|
278
303
|
|
279
304
|
def add_members_to_leaderboard(members_to_add = 5)
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: leaderboard
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 29
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 5
|
10
|
+
version: 1.0.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- David Czarnecki
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-04
|
18
|
+
date: 2011-05-04 00:00:00 -04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|