redis_pagination 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +18 -0
- data/.rspec +2 -0
- data/.rvmrc +1 -0
- data/Gemfile +3 -0
- data/LICENSE +22 -0
- data/README.md +118 -0
- data/Rakefile +12 -0
- data/lib/redis_pagination.rb +10 -0
- data/lib/redis_pagination/configuration.rb +29 -0
- data/lib/redis_pagination/paginator.rb +29 -0
- data/lib/redis_pagination/paginator/list_paginator.rb +51 -0
- data/lib/redis_pagination/paginator/sorted_set_paginator.rb +60 -0
- data/lib/redis_pagination/version.rb +3 -0
- data/redis_pagination.gemspec +21 -0
- data/spec/redis_pagination/configuration_spec.rb +11 -0
- data/spec/redis_pagination/paginator/list_paginator_spec.rb +59 -0
- data/spec/redis_pagination/paginator/sorted_set_paginator_spec.rb +64 -0
- data/spec/redis_pagination/paginator_spec.rb +26 -0
- data/spec/redis_pagination/version_spec.rb +7 -0
- data/spec/spec_helper.rb +29 -0
- metadata +119 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm use ruby-1.9.3@redis_pagination_gem --create
|
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2012 David Czarnecki
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
# RedisPagination
|
2
|
+
|
3
|
+
Simple pagination for Redis lists and sorted sets.
|
4
|
+
|
5
|
+
Make sure your redis server is running! Redis configuration is outside the scope of this README, but
|
6
|
+
check out the [Redis documentation](http://redis.io/documentation) for more information.
|
7
|
+
|
8
|
+
## Installation
|
9
|
+
|
10
|
+
Add this line to your application's Gemfile:
|
11
|
+
|
12
|
+
```ruby
|
13
|
+
gem 'redis_pagination'
|
14
|
+
```
|
15
|
+
|
16
|
+
And then execute:
|
17
|
+
|
18
|
+
```
|
19
|
+
$ bundle
|
20
|
+
```
|
21
|
+
|
22
|
+
Or install it yourself as:
|
23
|
+
|
24
|
+
```
|
25
|
+
$ gem install redis_pagination
|
26
|
+
```
|
27
|
+
|
28
|
+
## Usage
|
29
|
+
|
30
|
+
Configure redis_pagination:
|
31
|
+
|
32
|
+
```ruby
|
33
|
+
RedisPaginations.configure do |configuration|
|
34
|
+
configuration.redis = Redis.new
|
35
|
+
configuration.page_size = 25
|
36
|
+
end
|
37
|
+
```
|
38
|
+
|
39
|
+
Use redis_pagination:
|
40
|
+
|
41
|
+
```ruby
|
42
|
+
require 'redis_pagination'
|
43
|
+
|
44
|
+
RedisPagination.configure do |configuration|
|
45
|
+
configuration.redis = Redis.new(:db => 15)
|
46
|
+
configuration.page_size = 25
|
47
|
+
end
|
48
|
+
|
49
|
+
# List
|
50
|
+
add_items_to_list('items', RedisPagination.page_size + 2)
|
51
|
+
=> 1
|
52
|
+
items_paginator = RedisPagination.paginate('items')
|
53
|
+
=> #<RedisPagination::Paginator::ListPaginator:0x007f8109b08ba0 @key="items">
|
54
|
+
items_paginator.total_items
|
55
|
+
=> 27
|
56
|
+
items_paginator.total_pages
|
57
|
+
=> 2
|
58
|
+
items_paginator.total_pages(5)
|
59
|
+
=> 6
|
60
|
+
items = items_paginator.page(1)
|
61
|
+
=> {:current_page=>1, :total_pages=>2, :total_items=>27, :items=>["item_1", "item_2", "item_3", "item_4", "item_5", "item_6", "item_7", "item_8", "item_9", "item_10", "item_11", "item_12", "item_13", "item_14", "item_15", "item_16", "item_17", "item_18", "item_19", "item_20", "item_21", "item_22", "item_23", "item_24", "item_25"]}
|
62
|
+
items = items_paginator.page(2)
|
63
|
+
=> {:current_page=>2, :total_pages=>2, :total_items=>27, :items=>["item_26", "item_27"]}
|
64
|
+
|
65
|
+
# Sorted Set
|
66
|
+
add_items_to_sorted_set('items', RedisPagination.page_size + 2)
|
67
|
+
=> 1
|
68
|
+
items_paginator = RedisPagination.paginate('items')
|
69
|
+
=> #<RedisPagination::Paginator::SortedSetPaginator:0x007f8109a25828 @key="items">
|
70
|
+
items_paginator.total_items
|
71
|
+
=> 27
|
72
|
+
items_paginator.total_pages
|
73
|
+
=> 2
|
74
|
+
items_paginator.total_pages(5)
|
75
|
+
=> 6
|
76
|
+
items = items_paginator.page(1)
|
77
|
+
=> {:current_page=>1, :total_pages=>2, :total_items=>27, :items=>[["item_27", 27.0], ["item_26", 26.0], ["item_25", 25.0], ["item_24", 24.0], ["item_23", 23.0], ["item_22", 22.0], ["item_21", 21.0], ["item_20", 20.0], ["item_19", 19.0], ["item_18", 18.0], ["item_17", 17.0], ["item_16", 16.0], ["item_15", 15.0], ["item_14", 14.0], ["item_13", 13.0], ["item_12", 12.0], ["item_11", 11.0], ["item_10", 10.0], ["item_9", 9.0], ["item_8", 8.0], ["item_7", 7.0], ["item_6", 6.0], ["item_5", 5.0], ["item_4", 4.0], ["item_3", 3.0]]}
|
78
|
+
items = items_paginator.page(2)
|
79
|
+
=> {:current_page=>2, :total_pages=>2, :total_items=>27, :items=>[["item_2", 2.0], ["item_1", 1.0]]}
|
80
|
+
items = items_paginator.page(1, :with_scores => false, :reverse => false)
|
81
|
+
=> {:current_page=>1, :total_pages=>2, :total_items=>27, :items=>["item_1", "item_2", "item_3", "item_4", "item_5", "item_6", "item_7", "item_8", "item_9", "item_10", "item_11", "item_12", "item_13", "item_14", "item_15", "item_16", "item_17", "item_18", "item_19", "item_20", "item_21", "item_22", "item_23", "item_24", "item_25"]}
|
82
|
+
```
|
83
|
+
|
84
|
+
## Paging Options
|
85
|
+
|
86
|
+
Valid options in the `page` call for paginating a Redis list are:
|
87
|
+
|
88
|
+
* `:page_size` controls the page size for the call. Default is `RedisPagination.page_size`.
|
89
|
+
|
90
|
+
Valid options in the `page` call for paginating a Redis sorted set are:
|
91
|
+
|
92
|
+
* `:page_size` controls the page size for the call. Default is `RedisPagination.page_size`.
|
93
|
+
* `:with_scores` controls whether the score is returned along with the item. Default is `true`.
|
94
|
+
* `:reverse controls` whether to return items in highest-to-lowest (`true`) or loweest-to-highest order (`false`). Default is `true`.
|
95
|
+
|
96
|
+
## Caveats
|
97
|
+
|
98
|
+
There is a difference between how sorted set data with scores is returned between the 2.x and the 3.x branch of the Ruby Redis client library.
|
99
|
+
|
100
|
+
If you are using the 2.x branch, you will get items returned with alternating item and score as follows:
|
101
|
+
|
102
|
+
```ruby
|
103
|
+
{:current_page=>1, :total_pages=>2, :total_items=>27, :items=>["item_27", "27", "item_26", "26", "item_25", "25", "item_24", "24", "item_23", "23", "item_22", "22", "item_21", "21", "item_20", "20", "item_19", "19", "item_18", "18", "item_17", "17", "item_16", "16", "item_15", "15", "item_14", "14", "item_13", "13", "item_12", "12", "item_11", "11", "item_10", "10", "item_9", "9", "item_8", "8", "item_7", "7", "item_6", "6", "item_5", "5", "item_4", "4", "item_3", "3"]}
|
104
|
+
```
|
105
|
+
|
106
|
+
If you are using the 3.x branch, you will get items returned as an array of arrays, where the internal arrays are the item and score as follows:
|
107
|
+
|
108
|
+
```ruby
|
109
|
+
{:current_page=>1, :total_pages=>2, :total_items=>27, :items=>[["item_27", 27.0], ["item_26", 26.0], ["item_25", 25.0], ["item_24", 24.0], ["item_23", 23.0], ["item_22", 22.0], ["item_21", 21.0], ["item_20", 20.0], ["item_19", 19.0], ["item_18", 18.0], ["item_17", 17.0], ["item_16", 16.0], ["item_15", 15.0], ["item_14", 14.0], ["item_13", 13.0], ["item_12", 12.0], ["item_11", 11.0], ["item_10", 10.0], ["item_9", 9.0], ["item_8", 8.0], ["item_7", 7.0], ["item_6", 6.0], ["item_5", 5.0], ["item_4", 4.0], ["item_3", 3.0]]}
|
110
|
+
```
|
111
|
+
|
112
|
+
## Contributing
|
113
|
+
|
114
|
+
1. Fork it
|
115
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
116
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
117
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
118
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
require 'bundler/gem_tasks'
|
3
|
+
|
4
|
+
require 'rspec/core'
|
5
|
+
require 'rspec/core/rake_task'
|
6
|
+
RSpec::Core::RakeTask.new(:spec) do |spec|
|
7
|
+
spec.pattern = FileList['spec/**/*_spec.rb']
|
8
|
+
spec.rspec_opts = ['--backtrace']
|
9
|
+
# spec.ruby_opts = ['-w']
|
10
|
+
end
|
11
|
+
|
12
|
+
task :default => :spec
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module RedisPagination
|
2
|
+
# Configuration settings for redis_pagination.
|
3
|
+
module Configuration
|
4
|
+
# Redis instance.
|
5
|
+
attr_accessor :redis
|
6
|
+
|
7
|
+
# Page size to be used when peforming paging operations.
|
8
|
+
attr_writer :page_size
|
9
|
+
|
10
|
+
# Yield self to be able to configure redis_pagination with block-style configuration.
|
11
|
+
#
|
12
|
+
# Example:
|
13
|
+
#
|
14
|
+
# RedisPagination.configure do |configuration|
|
15
|
+
# configuration.redis = Redis.new
|
16
|
+
# configuration.page_size = 25
|
17
|
+
# end
|
18
|
+
def configure
|
19
|
+
yield self
|
20
|
+
end
|
21
|
+
|
22
|
+
# Page size to be used when peforming paging operations.
|
23
|
+
#
|
24
|
+
# @return the page size to be used when peforming paging operations or the default of 25 if not set.
|
25
|
+
def page_size
|
26
|
+
@page_size ||= 25
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'redis_pagination/paginator/list_paginator'
|
2
|
+
require 'redis_pagination/paginator/sorted_set_paginator'
|
3
|
+
|
4
|
+
module RedisPagination
|
5
|
+
module Paginator
|
6
|
+
# Retrieve a paginator class appropriate for the +key+ in Redis.
|
7
|
+
# +key+ must be one of +list+ or +zset+, otherwise an exception
|
8
|
+
# will be raised.
|
9
|
+
#
|
10
|
+
# @params key [String] Redis key
|
11
|
+
# @params options [Hash] Options to be passed to the individual paginator class.
|
12
|
+
#
|
13
|
+
# @return Returns either a +RedisPagination::Paginator::ListPaginator+ or
|
14
|
+
# a +RedisPagination::Paginator::SortedSetPaginator+ depending on the
|
15
|
+
# type of +key+.
|
16
|
+
def paginate(key, options = {})
|
17
|
+
type = RedisPagination.redis.type(key)
|
18
|
+
|
19
|
+
case type
|
20
|
+
when 'list'
|
21
|
+
RedisPagination::Paginator::ListPaginator.new(key, options)
|
22
|
+
when 'zset'
|
23
|
+
RedisPagination::Paginator::SortedSetPaginator.new(key, options)
|
24
|
+
else
|
25
|
+
raise "Pagination is not supported for #{type}"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module RedisPagination
|
2
|
+
module Paginator
|
3
|
+
class ListPaginator
|
4
|
+
# Initialize a new instance with a given Redis +key+ and options.
|
5
|
+
#
|
6
|
+
# @param key [String] Redis list key.
|
7
|
+
# @param options [Hash] Options for paginator.
|
8
|
+
def initialize(key, options = {})
|
9
|
+
@key = key
|
10
|
+
end
|
11
|
+
|
12
|
+
# Return the total number of pages for +key+.
|
13
|
+
#
|
14
|
+
# @param page_size [int] Page size to calculate total number of pages.
|
15
|
+
#
|
16
|
+
# @return the total number of pages for +key+.
|
17
|
+
def total_pages(page_size = RedisPagination.page_size)
|
18
|
+
(RedisPagination.redis.llen(@key) / page_size.to_f).ceil
|
19
|
+
end
|
20
|
+
|
21
|
+
# Return the total number of items for +key+.
|
22
|
+
#
|
23
|
+
# @return the total number of items for +key+.
|
24
|
+
def total_items
|
25
|
+
RedisPagination.redis.llen(@key)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Retrieve a page of items for +key+.
|
29
|
+
#
|
30
|
+
# @param page [int] Page of items to retrieve.
|
31
|
+
# @param options [Hash] Options. Valid options are :page_size.
|
32
|
+
# :page_size controls the page size for the call. Default is +RedisPagination.page_size+.
|
33
|
+
#
|
34
|
+
# @return a +Hash+ containing +:current_page+, +:total_pages+, +:total_items+ and +:items+.
|
35
|
+
def page(page, options = {})
|
36
|
+
current_page = page < 1 ? 1 : page
|
37
|
+
index_for_redis = current_page - 1
|
38
|
+
page_size = options[:page_size] || RedisPagination.page_size
|
39
|
+
starting_offset = index_for_redis * page_size
|
40
|
+
ending_offset = (starting_offset + page_size) - 1
|
41
|
+
|
42
|
+
{
|
43
|
+
:current_page => current_page,
|
44
|
+
:total_pages => total_pages(page_size),
|
45
|
+
:total_items => total_items,
|
46
|
+
:items => RedisPagination.redis.lrange(@key, starting_offset, ending_offset)
|
47
|
+
}
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module RedisPagination
|
2
|
+
module Paginator
|
3
|
+
class SortedSetPaginator
|
4
|
+
# Initialize a new instance with a given Redis +key+ and options.
|
5
|
+
#
|
6
|
+
# @param key [String] Redis list key.
|
7
|
+
# @param options [Hash] Options for paginator.
|
8
|
+
def initialize(key, options = {})
|
9
|
+
@key = key
|
10
|
+
end
|
11
|
+
|
12
|
+
# Return the total number of pages for +key+.
|
13
|
+
#
|
14
|
+
# @param page_size [int] Page size to calculate total number of pages.
|
15
|
+
#
|
16
|
+
# @return the total number of pages for +key+.
|
17
|
+
def total_pages(page_size = RedisPagination.page_size)
|
18
|
+
(RedisPagination.redis.zcard(@key) / page_size.to_f).ceil
|
19
|
+
end
|
20
|
+
|
21
|
+
# Return the total number of items for +key+.
|
22
|
+
#
|
23
|
+
# @return the total number of items for +key+.
|
24
|
+
def total_items
|
25
|
+
RedisPagination.redis.zcard(@key)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Retrieve a page of items for +key+.
|
29
|
+
#
|
30
|
+
# @param page [int] Page of items to retrieve.
|
31
|
+
# @param options [Hash] Options. Valid options are :page_size, :with_scores and :reverse.
|
32
|
+
# :page_size controls the page size for the call. Default is +RedisPagination.page_size+.
|
33
|
+
# :with_scores controls whether the score is returned along with the item. Default is +true+.
|
34
|
+
# :reverse controls whether to return items in highest-to-lowest (+true+) or loweest-to-highest order (+false+). Default is +true+.
|
35
|
+
#
|
36
|
+
# @return a +Hash+ containing +:current_page+, +:total_pages+, +:total_items+ and +:items+.
|
37
|
+
def page(page, options = {})
|
38
|
+
current_page = page < 1 ? 1 : page
|
39
|
+
index_for_redis = current_page - 1
|
40
|
+
page_size = options[:page_size] || RedisPagination.page_size
|
41
|
+
starting_offset = index_for_redis * page_size
|
42
|
+
ending_offset = (starting_offset + page_size) - 1
|
43
|
+
|
44
|
+
with_scores = options.has_key?(:with_scores) ? options[:with_scores] : true
|
45
|
+
reverse = options.has_key?(:reverse) ? options[:reverse] : true
|
46
|
+
|
47
|
+
{
|
48
|
+
:current_page => current_page,
|
49
|
+
:total_pages => total_pages(page_size),
|
50
|
+
:total_items => total_items,
|
51
|
+
:items => if reverse
|
52
|
+
RedisPagination.redis.zrevrange(@key, starting_offset, ending_offset, :with_scores => with_scores)
|
53
|
+
else
|
54
|
+
RedisPagination.redis.zrange(@key, starting_offset, ending_offset, :with_scores => with_scores)
|
55
|
+
end
|
56
|
+
}
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
require File.expand_path('../lib/redis_pagination/version', __FILE__)
|
3
|
+
|
4
|
+
Gem::Specification.new do |gem|
|
5
|
+
gem.authors = ['David Czarnecki']
|
6
|
+
gem.email = ['me@davidczarnecki.com']
|
7
|
+
gem.description = %q{Simple pagination for Redis lists and sorted sets.}
|
8
|
+
gem.summary = %q{Simple pagination for Redis lists and sorted sets.}
|
9
|
+
gem.homepage = 'https://github.com/czarneckid/redis_pagination'
|
10
|
+
|
11
|
+
gem.files = `git ls-files`.split($\)
|
12
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
13
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = 'redis_pagination'
|
15
|
+
gem.require_paths = ['lib']
|
16
|
+
gem.version = RedisPagination::VERSION
|
17
|
+
|
18
|
+
gem.add_dependency('redis')
|
19
|
+
gem.add_development_dependency('rake')
|
20
|
+
gem.add_development_dependency('rspec')
|
21
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RedisPagination::Paginator::ListPaginator do
|
4
|
+
describe '#total_pages' do
|
5
|
+
it 'should return the correct number of pages' do
|
6
|
+
add_items_to_list('items', RedisPagination.page_size + 2)
|
7
|
+
|
8
|
+
items_paginator = RedisPagination.paginate('items')
|
9
|
+
items_paginator.total_pages.should == 2
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should return the correct number of pages using a different page size' do
|
13
|
+
add_items_to_list('items', 25)
|
14
|
+
|
15
|
+
items_paginator = RedisPagination.paginate('items')
|
16
|
+
items_paginator.total_pages(5).should == 5
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#total_items' do
|
21
|
+
it 'should return the correct number of items' do
|
22
|
+
add_items_to_list('items', RedisPagination.page_size)
|
23
|
+
|
24
|
+
items_paginator = RedisPagination.paginate('items')
|
25
|
+
items_paginator.total_items.should == RedisPagination.page_size
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#page' do
|
30
|
+
it 'should return the correct page of items' do
|
31
|
+
add_items_to_list('items', RedisPagination.page_size + 2)
|
32
|
+
|
33
|
+
items_paginator = RedisPagination.paginate('items')
|
34
|
+
result = items_paginator.page(1)
|
35
|
+
result[:items].length.should == RedisPagination.page_size
|
36
|
+
result[:items][0].should == 'item_1'
|
37
|
+
result[:items][-1].should == 'item_25'
|
38
|
+
result[:current_page].should == 1
|
39
|
+
result[:total_pages].should == 2
|
40
|
+
result[:total_items].should == RedisPagination.page_size + 2
|
41
|
+
|
42
|
+
result = items_paginator.page(2)
|
43
|
+
result[:items].length.should == 2
|
44
|
+
result[:items][-1].should == 'item_27'
|
45
|
+
result[:current_page].should == 2
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should return the correct page of items with the options set' do
|
49
|
+
add_items_to_list('items', RedisPagination.page_size + 2)
|
50
|
+
|
51
|
+
items_paginator = RedisPagination.paginate('items')
|
52
|
+
result = items_paginator.page(1, :page_size => 5)
|
53
|
+
result[:items].length.should == 5
|
54
|
+
result[:items][-1].should == 'item_5'
|
55
|
+
result[:current_page].should == 1
|
56
|
+
result[:total_pages].should == 6
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RedisPagination::Paginator::SortedSetPaginator do
|
4
|
+
describe '#total_pages' do
|
5
|
+
it 'should return the correct number of pages' do
|
6
|
+
add_items_to_sorted_set('items', RedisPagination.page_size + 2)
|
7
|
+
|
8
|
+
items_paginator = RedisPagination.paginate('items')
|
9
|
+
items_paginator.total_pages.should == 2
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should return the correct number of pages using a different page size' do
|
13
|
+
add_items_to_sorted_set('items', 25)
|
14
|
+
|
15
|
+
items_paginator = RedisPagination.paginate('items')
|
16
|
+
items_paginator.total_pages(5).should == 5
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#total_items' do
|
21
|
+
it 'should return the correct number of items' do
|
22
|
+
add_items_to_sorted_set('items', RedisPagination.page_size)
|
23
|
+
|
24
|
+
items_paginator = RedisPagination.paginate('items')
|
25
|
+
items_paginator.total_items.should == RedisPagination.page_size
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '#page' do
|
30
|
+
it 'should return the correct page of items with the default options' do
|
31
|
+
add_items_to_sorted_set('items', RedisPagination.page_size + 2)
|
32
|
+
|
33
|
+
items_paginator = RedisPagination.paginate('items')
|
34
|
+
result = items_paginator.page(1)
|
35
|
+
result[:items].length.should == RedisPagination.page_size
|
36
|
+
result[:items][0].should == ['item_27', 27.0]
|
37
|
+
result[:items][-1].should == ['item_3', 3.0]
|
38
|
+
|
39
|
+
result = items_paginator.page(2)
|
40
|
+
result[:items].length.should == 2
|
41
|
+
result[:items][-1].should == ['item_1', 1.0]
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should return the correct page of items with the options set' do
|
45
|
+
add_items_to_sorted_set('items', RedisPagination.page_size + 2)
|
46
|
+
|
47
|
+
items_paginator = RedisPagination.paginate('items')
|
48
|
+
result = items_paginator.page(1, :reverse => false, :with_scores => false)
|
49
|
+
result[:items].length.should == RedisPagination.page_size
|
50
|
+
result[:items][0].should == 'item_1'
|
51
|
+
result[:items][-1].should == 'item_25'
|
52
|
+
|
53
|
+
result = items_paginator.page(2, :reverse => false, :with_scores => false)
|
54
|
+
result[:items].length.should == 2
|
55
|
+
result[:items][-1].should == 'item_27'
|
56
|
+
|
57
|
+
result = items_paginator.page(1, :page_size => 5, :with_scores => false)
|
58
|
+
result[:items].length.should == 5
|
59
|
+
result[:items][-1].should == 'item_23'
|
60
|
+
result[:current_page].should == 1
|
61
|
+
result[:total_pages].should == 6
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RedisPagination::Paginator do
|
4
|
+
describe '#paginate' do
|
5
|
+
it 'should return a RedisPagination::Paginator::ListPaginator' do
|
6
|
+
redis = RedisPagination.redis
|
7
|
+
redis.lpush("items", "item_1")
|
8
|
+
|
9
|
+
RedisPagination.paginate("items").should be_a_kind_of(RedisPagination::Paginator::ListPaginator)
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'should return a RedisPagination::Paginator::SortedSetPaginator' do
|
13
|
+
redis = RedisPagination.redis
|
14
|
+
redis.zadd("items", 1, "item_1")
|
15
|
+
|
16
|
+
RedisPagination.paginate("items").should be_a_kind_of(RedisPagination::Paginator::SortedSetPaginator)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'should raise an exception if trying to paginate a Redis type that cannot be paginated' do
|
20
|
+
redis = RedisPagination.redis
|
21
|
+
redis.set("items", "item_1")
|
22
|
+
|
23
|
+
lambda { RedisPagination.paginate("items") }.should raise_error
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'rspec'
|
2
|
+
require 'redis_pagination'
|
3
|
+
|
4
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
5
|
+
|
6
|
+
RSpec.configure do |config|
|
7
|
+
config.before(:all) do
|
8
|
+
RedisPagination.configure do |configuration|
|
9
|
+
configuration.redis = Redis.new(:db => 15)
|
10
|
+
configuration.page_size = 25
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
config.before(:each) do
|
15
|
+
RedisPagination.redis.flushdb
|
16
|
+
end
|
17
|
+
|
18
|
+
def add_items_to_list(key, items_to_add = RedisPagination.page_size)
|
19
|
+
1.upto(items_to_add) do |index|
|
20
|
+
RedisPagination.redis.rpush(key, "item_#{index}")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def add_items_to_sorted_set(key, items_to_add = RedisPagination.page_size)
|
25
|
+
1.upto(items_to_add) do |index|
|
26
|
+
RedisPagination.redis.zadd(key, index, "item_#{index}")
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
metadata
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: redis_pagination
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- David Czarnecki
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-07-19 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: redis
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rake
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
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
|
47
|
+
name: rspec
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
description: Simple pagination for Redis lists and sorted sets.
|
63
|
+
email:
|
64
|
+
- me@davidczarnecki.com
|
65
|
+
executables: []
|
66
|
+
extensions: []
|
67
|
+
extra_rdoc_files: []
|
68
|
+
files:
|
69
|
+
- .gitignore
|
70
|
+
- .rspec
|
71
|
+
- .rvmrc
|
72
|
+
- Gemfile
|
73
|
+
- LICENSE
|
74
|
+
- README.md
|
75
|
+
- Rakefile
|
76
|
+
- lib/redis_pagination.rb
|
77
|
+
- lib/redis_pagination/configuration.rb
|
78
|
+
- lib/redis_pagination/paginator.rb
|
79
|
+
- lib/redis_pagination/paginator/list_paginator.rb
|
80
|
+
- lib/redis_pagination/paginator/sorted_set_paginator.rb
|
81
|
+
- lib/redis_pagination/version.rb
|
82
|
+
- redis_pagination.gemspec
|
83
|
+
- spec/redis_pagination/configuration_spec.rb
|
84
|
+
- spec/redis_pagination/paginator/list_paginator_spec.rb
|
85
|
+
- spec/redis_pagination/paginator/sorted_set_paginator_spec.rb
|
86
|
+
- spec/redis_pagination/paginator_spec.rb
|
87
|
+
- spec/redis_pagination/version_spec.rb
|
88
|
+
- spec/spec_helper.rb
|
89
|
+
homepage: https://github.com/czarneckid/redis_pagination
|
90
|
+
licenses: []
|
91
|
+
post_install_message:
|
92
|
+
rdoc_options: []
|
93
|
+
require_paths:
|
94
|
+
- lib
|
95
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
96
|
+
none: false
|
97
|
+
requirements:
|
98
|
+
- - ! '>='
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
102
|
+
none: false
|
103
|
+
requirements:
|
104
|
+
- - ! '>='
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0'
|
107
|
+
requirements: []
|
108
|
+
rubyforge_project:
|
109
|
+
rubygems_version: 1.8.24
|
110
|
+
signing_key:
|
111
|
+
specification_version: 3
|
112
|
+
summary: Simple pagination for Redis lists and sorted sets.
|
113
|
+
test_files:
|
114
|
+
- spec/redis_pagination/configuration_spec.rb
|
115
|
+
- spec/redis_pagination/paginator/list_paginator_spec.rb
|
116
|
+
- spec/redis_pagination/paginator/sorted_set_paginator_spec.rb
|
117
|
+
- spec/redis_pagination/paginator_spec.rb
|
118
|
+
- spec/redis_pagination/version_spec.rb
|
119
|
+
- spec/spec_helper.rb
|