simply_paginate 0.0.2 → 0.0.3
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/.travis.yml +11 -0
- data/README.md +20 -1
- data/Rakefile +2 -0
- data/lib/simply_paginate.rb +1 -0
- data/lib/simply_paginate/not_in_range_error.rb +3 -0
- data/lib/simply_paginate/page.rb +10 -14
- data/lib/simply_paginate/paginator.rb +21 -20
- data/lib/simply_paginate/version.rb +1 -1
- data/simply_paginate.gemspec +1 -1
- data/spec/page_spec.rb +24 -8
- data/spec/paginator_spec.rb +7 -14
- metadata +5 -3
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# SimplyPaginate
|
2
|
+
[](https://travis-ci.org/guiman/simply_paginate)
|
2
3
|
|
3
4
|
Simply paginate will do just that, give me a collection and you will be able to use a pagination logic (no extra html boilerplate or dependecies).
|
4
5
|
|
@@ -29,7 +30,7 @@ collection = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
|
29
30
|
paginator = SimplyPaginate::Paginator.new(collection)
|
30
31
|
|
31
32
|
# create pages with max of 3 elements
|
32
|
-
|
33
|
+
SimplyPaginate::Paginator.per_page 3
|
33
34
|
|
34
35
|
# retrieve a certain page
|
35
36
|
paginator[0]
|
@@ -45,11 +46,29 @@ paginator[0].next.next.next.previous.elements[0]
|
|
45
46
|
paginator[0].next.next.next.previous.elements
|
46
47
|
```
|
47
48
|
|
49
|
+
There is also the possibility to use a DataMapper::Collection as the collection to be paginated (right out of the box, not extensions needed):
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
# I will guess you have a model called Post
|
53
|
+
# By default Paginator.per_page is 10
|
54
|
+
|
55
|
+
paginator = SimplyPaginate::Paginator.new(Post.all)
|
56
|
+
|
57
|
+
paginator[0].elements # this will return a DataMapper::Collection with the first 10 elements
|
58
|
+
```
|
59
|
+
|
48
60
|
## Currently working on:
|
49
61
|
|
50
62
|
* Adding support for common ORMs like: ActiveRecord, Sequel and DataMapper.
|
51
63
|
* Testing...
|
52
64
|
|
65
|
+
## Alternative branch
|
66
|
+
This branch contains a different implementation on the paging algorithm. This one creates pages on the fly and calculating offsets,
|
67
|
+
so when you call ```previous``` or ```next``` or ```[]```page object representing is created on that moment, thus saving memory.
|
68
|
+
|
69
|
+
Another modification is that the ```per_page``` value has moved up to the class, and there is no need on calling ```paginate``` anymore,
|
70
|
+
also the ```pages``` has been dropped.
|
71
|
+
|
53
72
|
## Release 0.0.2 features:
|
54
73
|
* Dropping the each_slice in order to use a more memory efficient index algorithm for paging.
|
55
74
|
* Adding more tests to the page object.
|
data/Rakefile
CHANGED
data/lib/simply_paginate.rb
CHANGED
data/lib/simply_paginate/page.rb
CHANGED
@@ -1,33 +1,29 @@
|
|
1
1
|
module SimplyPaginate
|
2
2
|
class Page
|
3
|
-
attr_reader :
|
3
|
+
attr_reader :first, :last
|
4
4
|
|
5
5
|
def initialize(first, last, paginator, previous_page = nil, next_page = nil)
|
6
6
|
@first = first
|
7
7
|
@last = last
|
8
8
|
@paginator = paginator
|
9
|
-
@next_page = next_page
|
10
|
-
@previous_page = previous_page
|
11
|
-
end
|
12
|
-
|
13
|
-
def current
|
14
|
-
self
|
15
9
|
end
|
16
10
|
|
17
11
|
def next
|
18
|
-
@
|
12
|
+
first = @last + 1
|
13
|
+
last = first + Paginator.per_page - 1
|
14
|
+
|
15
|
+
(first >= @paginator.collection.count) ? nil : @paginator.current = Page.new(first, last, @paginator)
|
19
16
|
end
|
20
17
|
|
21
18
|
def previous
|
22
|
-
@
|
23
|
-
|
19
|
+
first = @first - Paginator.per_page
|
20
|
+
last = @first - 1
|
24
21
|
|
25
|
-
|
26
|
-
@next_page = v
|
22
|
+
(first < 0) ? nil : @paginator.current = Page.new(first, last, @paginator)
|
27
23
|
end
|
28
24
|
|
29
|
-
def
|
30
|
-
@
|
25
|
+
def current?
|
26
|
+
!@paginator.current.nil? && @paginator.current.first == @first && @paginator.current.last == @last
|
31
27
|
end
|
32
28
|
|
33
29
|
def elements
|
@@ -1,33 +1,34 @@
|
|
1
1
|
module SimplyPaginate
|
2
2
|
class Paginator
|
3
|
-
attr_reader :
|
3
|
+
attr_reader :collection
|
4
|
+
attr_accessor :current
|
4
5
|
|
5
|
-
def
|
6
|
-
|
7
|
-
@pages = []
|
8
|
-
end
|
6
|
+
def self.per_page=(amount_per_page)
|
7
|
+
raise NotInRangeError.new("Amount per page should be greater than 0") unless amount_per_page > 0
|
9
8
|
|
10
|
-
|
11
|
-
|
12
|
-
first = last = 0
|
13
|
-
count = limit - 1
|
14
|
-
final_index = @collection.count - 1
|
9
|
+
@@per_page = amount_per_page
|
10
|
+
end
|
15
11
|
|
16
|
-
|
17
|
-
|
12
|
+
def self.per_page
|
13
|
+
@@per_page
|
14
|
+
end
|
18
15
|
|
19
|
-
|
20
|
-
|
16
|
+
def initialize(collection)
|
17
|
+
@collection = collection
|
18
|
+
@current = nil
|
19
|
+
end
|
21
20
|
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
def [](pos)
|
22
|
+
first = pos * @@per_page
|
23
|
+
last = first + @@per_page - 1
|
25
24
|
|
26
|
-
self
|
25
|
+
((first < 0) || (first >= self.collection.count)) ? nil : Page.new(first, last, self)
|
27
26
|
end
|
28
27
|
|
29
|
-
def
|
30
|
-
@
|
28
|
+
def total_pages
|
29
|
+
(@collection.count.to_f / @@per_page.to_f).ceil
|
31
30
|
end
|
31
|
+
|
32
|
+
Paginator.per_page = 10
|
32
33
|
end
|
33
34
|
end
|
data/simply_paginate.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ["alvarola@gmail.com"]
|
11
11
|
spec.description = %q{This gem is a simple paginator for Enumerable collections}
|
12
12
|
spec.summary = %q{You enumerate it we will simply paginate it}
|
13
|
-
spec.homepage = ""
|
13
|
+
spec.homepage = "https://github.com/guiman/simply_paginate"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
spec.files = `git ls-files`.split($/)
|
data/spec/page_spec.rb
CHANGED
@@ -2,10 +2,11 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe SimplyPaginate::Page do
|
4
4
|
before do
|
5
|
-
|
5
|
+
SimplyPaginate::Paginator.per_page = 5
|
6
|
+
|
7
|
+
@paginator = SimplyPaginate::Paginator.new([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
6
8
|
@first_page = SimplyPaginate::Page.new(0, 4, @paginator)
|
7
|
-
@last_page = SimplyPaginate::Page.new(5, 9, @paginator
|
8
|
-
@first_page.next = @last_page
|
9
|
+
@last_page = SimplyPaginate::Page.new(5, 9, @paginator)
|
9
10
|
|
10
11
|
class SimplyPaginate::Page
|
11
12
|
def paginator
|
@@ -32,27 +33,42 @@ describe SimplyPaginate::Page do
|
|
32
33
|
|
33
34
|
describe "when having next and previous pages" do
|
34
35
|
before do
|
35
|
-
|
36
|
+
SimplyPaginate::Paginator.per_page = 2
|
36
37
|
end
|
37
38
|
|
38
39
|
it "must be able to go back and foward" do
|
39
|
-
@paginator[1].next.must_equal @paginator[2]
|
40
|
-
@paginator[1].previous.must_equal @paginator[0]
|
40
|
+
@paginator[1].next.elements.must_equal @paginator[2].elements
|
41
|
+
@paginator[1].previous.elements.must_equal @paginator[0].elements
|
41
42
|
end
|
42
43
|
end
|
43
44
|
|
44
45
|
describe "when having previous and no next" do
|
45
46
|
it "must be able to go back " do
|
46
47
|
@last_page.next.must_be_nil
|
47
|
-
@last_page.previous.must_equal @first_page
|
48
|
+
@last_page.previous.elements.must_equal @first_page.elements
|
48
49
|
end
|
49
50
|
end
|
50
51
|
|
51
52
|
describe "when having next and no previous" do
|
52
53
|
it "must be able to go back " do
|
53
|
-
@first_page.next.must_equal @last_page
|
54
|
+
@first_page.next.elements.must_equal @last_page.elements
|
54
55
|
@first_page.previous.must_be_nil
|
55
56
|
end
|
56
57
|
end
|
57
58
|
|
59
|
+
describe "when moving to previous or next" do
|
60
|
+
it "must be setted as current when landed after next" do
|
61
|
+
@paginator[0].next
|
62
|
+
@paginator[0].current?.must_equal false
|
63
|
+
@paginator[1].current?.must_equal true
|
64
|
+
end
|
65
|
+
|
66
|
+
it "must be setted as current when landed after previous" do
|
67
|
+
@paginator[1].previous
|
68
|
+
@paginator[1].current?.must_equal false
|
69
|
+
@paginator[0].current?.must_equal true
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
58
74
|
end
|
data/spec/paginator_spec.rb
CHANGED
@@ -1,37 +1,30 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
+
|
3
4
|
describe SimplyPaginate::Paginator do
|
4
5
|
before do
|
6
|
+
SimplyPaginate::Paginator.per_page = 3
|
5
7
|
@paginator = SimplyPaginate::Paginator.new [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
|
6
8
|
end
|
7
9
|
|
8
10
|
describe 'before paginating' do
|
9
11
|
it 'must be able to paginate' do
|
10
|
-
@paginator.
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'must not be able to retrieve a certain page' do
|
14
|
-
@paginator[0].must_be_nil
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'must not be able to retrieve all pages' do
|
18
|
-
@paginator.pages.must_equal []
|
12
|
+
@paginator.total_pages.must_equal 4
|
19
13
|
end
|
20
14
|
end
|
21
15
|
|
22
16
|
describe 'after paginating' do
|
23
17
|
before do
|
24
|
-
|
18
|
+
SimplyPaginate::Paginator.per_page = 5
|
25
19
|
|
26
20
|
@first_page = SimplyPaginate::Page.new(0, 4, @paginator)
|
27
|
-
@last_page = SimplyPaginate::Page.new(5, 9, @paginator
|
28
|
-
@first_page.next = @last_page
|
21
|
+
@last_page = SimplyPaginate::Page.new(5, 9, @paginator)
|
29
22
|
|
30
23
|
@pages = [@first_page, @last_page]
|
31
24
|
end
|
32
25
|
|
33
26
|
it 'must be able to paginate' do
|
34
|
-
@paginator.
|
27
|
+
@paginator.total_pages.must_equal 2
|
35
28
|
end
|
36
29
|
|
37
30
|
it 'must be able to retrieve a certain page' do
|
@@ -41,7 +34,7 @@ describe SimplyPaginate::Paginator do
|
|
41
34
|
end
|
42
35
|
|
43
36
|
it 'must be able to retrieve all pages' do
|
44
|
-
@paginator.
|
37
|
+
@paginator.total_pages.must_equal 2
|
45
38
|
|
46
39
|
#test first element
|
47
40
|
@paginator[0].elements.must_equal @first_page.elements
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simply_paginate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-04-
|
12
|
+
date: 2013-04-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -67,11 +67,13 @@ extensions: []
|
|
67
67
|
extra_rdoc_files: []
|
68
68
|
files:
|
69
69
|
- .gitignore
|
70
|
+
- .travis.yml
|
70
71
|
- Gemfile
|
71
72
|
- LICENSE.txt
|
72
73
|
- README.md
|
73
74
|
- Rakefile
|
74
75
|
- lib/simply_paginate.rb
|
76
|
+
- lib/simply_paginate/not_in_range_error.rb
|
75
77
|
- lib/simply_paginate/page.rb
|
76
78
|
- lib/simply_paginate/paginator.rb
|
77
79
|
- lib/simply_paginate/version.rb
|
@@ -79,7 +81,7 @@ files:
|
|
79
81
|
- spec/page_spec.rb
|
80
82
|
- spec/paginator_spec.rb
|
81
83
|
- spec/spec_helper.rb
|
82
|
-
homepage:
|
84
|
+
homepage: https://github.com/guiman/simply_paginate
|
83
85
|
licenses:
|
84
86
|
- MIT
|
85
87
|
post_install_message:
|