godfat-pagify 0.5.0 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +11 -0
- data/README +36 -22
- data/Rakefile +28 -36
- data/TODO +9 -1
- data/lib/pagify.rb +7 -2
- data/lib/pagify/active_record.rb +3 -5
- data/lib/pagify/array.rb +2 -2
- data/lib/pagify/data_mapper.rb +3 -11
- data/lib/pagify/{helpers → helper}/abstract.rb +39 -19
- data/lib/pagify/{helpers/details → helper/detail}/setting.rb +5 -5
- data/lib/pagify/{helpers/details → helper/detail}/setup.rb +1 -1
- data/lib/pagify/{helpers → helper}/html.rb +10 -9
- data/lib/pagify/helper/rails.rb +23 -0
- data/lib/pagify/{pages → page}/basic.rb +2 -4
- data/lib/pagify/{pages → page}/null.rb +2 -3
- data/lib/pagify/{pagers → pager}/active_record.rb +2 -4
- data/lib/pagify/{pagers → pager}/array.rb +2 -3
- data/lib/pagify/{pagers → pager}/basic.rb +2 -2
- data/lib/pagify/{pagers → pager}/data_mapper.rb +2 -3
- data/lib/pagify/{pagers/details → pager/detail}/page_accept_string_or_blank.rb +2 -3
- data/lib/pagify/{pagers → pager}/null.rb +1 -3
- data/lib/pagify/pagifier/abstract.rb +10 -0
- data/lib/pagify/{pagifiers → pagifier}/active_record.rb +1 -1
- data/lib/pagify/{pagifiers → pagifier}/array.rb +1 -1
- data/lib/pagify/{pagifiers → pagifier}/data_mapper.rb +2 -2
- data/lib/pagify/version.rb +1 -1
- data/pagify.gemspec +19 -27
- data/test/helper.rb +14 -2
- data/test/{suite_for_model.rb → helper_model.rb} +1 -43
- data/test/{test_pagify.rb → helper_pagify.rb} +1 -3
- data/test/test_active_record.rb +9 -14
- data/test/test_array.rb +1 -1
- data/test/test_basic.rb +1 -1
- data/test/test_data_mapper.rb +3 -2
- data/test/test_html.rb +33 -7
- data/test/test_null.rb +19 -10
- data/test/test_rails.rb +32 -0
- metadata +39 -66
- data/lib/pagify/basic.rb +0 -3
- data/lib/pagify/null.rb +0 -5
- data/lib/pagify/pagifiers/abstract.rb +0 -34
data/CHANGES
CHANGED
@@ -1,5 +1,16 @@
|
|
1
1
|
= pagify changes history
|
2
2
|
|
3
|
+
== pagify 1.0 / ?
|
4
|
+
|
5
|
+
== pagify 0.6.1 / 2009-07-30
|
6
|
+
* first rubyforge gem release!
|
7
|
+
* rearranged require call.
|
8
|
+
* use normal form for dir and module name
|
9
|
+
* removed pagify pager cache, it's not useful
|
10
|
+
* added rails helper (i.e. would_pagiante)
|
11
|
+
* fixed that NullPage from pagers other than NullPager,
|
12
|
+
it should always acts as an empty array.
|
13
|
+
|
3
14
|
==
|
4
15
|
policy changed. null page was no longer a singleton. see reason below:
|
5
16
|
|
data/README
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
= pagify 0.
|
2
|
-
by Lin Jen-Shin (
|
1
|
+
= pagify 0.6.1
|
2
|
+
by Lin Jen-Shin (aka godfat-真常[http://godfat.org])
|
3
3
|
godfat (XD) godfat.org
|
4
4
|
|
5
5
|
== LINKS:
|
@@ -9,20 +9,30 @@ by Lin Jen-Shin (a.k.a. godfat-真常[http://godfat.org])
|
|
9
9
|
|
10
10
|
== DESCRIPTION:
|
11
11
|
|
12
|
-
|
12
|
+
Pagination tools for Array(or custom class), DataMapper and ActiveRecord
|
13
13
|
|
14
14
|
== FEATURES:
|
15
15
|
|
16
|
-
*
|
17
|
-
*
|
18
|
-
*
|
16
|
+
* Aims to be as flexible as possible
|
17
|
+
* Separate intrusive "pagify" method and Array/DataMapper/ActiveRecord Pager.
|
18
|
+
* Separate view helpers. There's only html helper right now.
|
19
19
|
|
20
20
|
== SYNOPSIS:
|
21
21
|
|
22
|
-
|
22
|
+
# for fast will_paginate replacement:
|
23
|
+
require 'pagify/active_record'
|
24
|
+
require 'pagify/helper/rails'
|
23
25
|
|
26
|
+
# in controller:
|
27
|
+
@photos = Photo.pagify(:page => params[:page])
|
28
|
+
|
29
|
+
# in view:
|
30
|
+
would_paginate(@photos)
|
31
|
+
|
32
|
+
|
33
|
+
|
34
|
+
# basic DataMapper usage:
|
24
35
|
require 'pagify/data_mapper'
|
25
|
-
require 'pagify/helpers/html'
|
26
36
|
|
27
37
|
class User
|
28
38
|
include DataMapper::Resource
|
@@ -43,17 +53,21 @@ by Lin Jen-Shin (a.k.a. godfat-真常[http://godfat.org])
|
|
43
53
|
|
44
54
|
User.get(1).pets.pagify # => create a page contains pets owned by user 1
|
45
55
|
|
56
|
+
|
57
|
+
|
58
|
+
# basic html helper usage:
|
59
|
+
require 'pagify/helper/html'
|
60
|
+
|
46
61
|
# create a string with page links.
|
47
62
|
Pet.pagify.pager.html.links(params[:page]){ |page|
|
48
63
|
# the block result would be used as url for each page
|
49
64
|
"/pets/list?page=#{page}"
|
50
65
|
}
|
51
66
|
|
52
|
-
Pagify::
|
67
|
+
Pagify::Helper::HTML.setting[:prev_text] = '<]' # globally change html setting
|
53
68
|
# NOTE: if you would like to use instance level setting, you shouldn't use method pagify,
|
54
|
-
# NOTE: or
|
55
|
-
|
56
|
-
and the recommended usage is:
|
69
|
+
# NOTE: new your own DataMapperPager or so to remember instance level html setting.
|
70
|
+
# NOTE: for example, see below:
|
57
71
|
|
58
72
|
class Pet
|
59
73
|
# same as above
|
@@ -70,8 +84,7 @@ by Lin Jen-Shin (a.k.a. godfat-真常[http://godfat.org])
|
|
70
84
|
end
|
71
85
|
end
|
72
86
|
|
73
|
-
then you would use Pet.page(3) or user.pets.page(2)
|
74
|
-
thread-safety problem or create a whole new pager in each request.
|
87
|
+
# then you would use Pet.page(3) or user.pets.page(2) to retrieve data
|
75
88
|
|
76
89
|
# this would create next/prev links only.
|
77
90
|
Pet.page(1).html.links_navigate{ |page|
|
@@ -83,30 +96,31 @@ by Lin Jen-Shin (a.k.a. godfat-真常[http://godfat.org])
|
|
83
96
|
"/pets/show?page=#{page}"
|
84
97
|
}
|
85
98
|
|
86
|
-
and you can build your pager from scratch via BasicPager.
|
87
|
-
e.g. BasicPager.new :fetcher => lambda{|*a|[]}, :counter => lambda{0}
|
88
|
-
this would be similar to Pagify::NullPager.
|
99
|
+
# and you can build your pager from scratch via BasicPager.
|
100
|
+
# e.g. BasicPager.new :fetcher => lambda{|*a|[]}, :counter => lambda{0}
|
101
|
+
# this would be similar to Pagify::NullPager.
|
89
102
|
|
90
|
-
you can disable null page via passing :null_page => false to any pager,
|
91
|
-
or set pager.null_page = false; anytime.
|
103
|
+
# you can disable null page via passing :null_page => false to any pager,
|
104
|
+
# or set pager.null_page = false; anytime.
|
92
105
|
|
93
|
-
see example or test for more examples (and use case for ActiveRecordPager).
|
106
|
+
# see example or test for more examples (and use case for ActiveRecordPager).
|
94
107
|
|
95
108
|
== REQUIREMENTS:
|
96
109
|
|
110
|
+
* ruby 1.8+ or 1.9.1
|
97
111
|
* for Basic/Array Pager: only ruby is needed
|
98
112
|
* for DataMapper Pager: dm-core and dm-aggregates 0.9.6 and above
|
99
113
|
* for ActiveRecord Pager: activerecord 2.1.1 and above
|
100
114
|
|
101
115
|
== INSTALL:
|
102
116
|
|
103
|
-
*
|
117
|
+
* gem install pagify
|
104
118
|
|
105
119
|
== LICENSE:
|
106
120
|
|
107
121
|
Apache License 2.0
|
108
122
|
|
109
|
-
Copyright (c) 2008, Lin Jen-Shin (
|
123
|
+
Copyright (c) 2008, Lin Jen-Shin (aka godfat 真常)
|
110
124
|
|
111
125
|
Licensed under the Apache License, Version 2.0 (the "License");
|
112
126
|
you may not use this file except in compliance with the License.
|
data/Rakefile
CHANGED
@@ -1,48 +1,27 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
Bones.setup
|
6
|
-
rescue LoadError
|
7
|
-
load 'tasks/setup.rb' # this line should already be there
|
8
|
-
end
|
3
|
+
require 'bones'
|
4
|
+
Bones.setup
|
9
5
|
|
10
6
|
PROJ.name = 'pagify'
|
11
|
-
|
12
|
-
PROJ.
|
13
|
-
|
14
|
-
PROJ.
|
15
|
-
PROJ.gem.development_dependencies << ['dm-core', '<=0.9.7']
|
16
|
-
PROJ.gem.development_dependencies << ['dm-aggregates', '<=0.9.7']
|
7
|
+
PROJ.authors = 'Lin Jen-Shin (aka godfat 真常)'
|
8
|
+
PROJ.email = 'godfat (XD) godfat.org'
|
9
|
+
PROJ.url = "http://github.com/godfat/#{PROJ.name}"
|
10
|
+
PROJ.rubyforge.name = 'ludy'
|
17
11
|
|
18
|
-
PROJ.gem.development_dependencies << ['
|
19
|
-
|
20
|
-
|
12
|
+
PROJ.gem.development_dependencies << ['dm-core', '>=0.9.9'] <<
|
13
|
+
['dm-aggregates', '>=0.9.9'] <<
|
14
|
+
['activerecord', '>=2.0.0']
|
21
15
|
|
22
|
-
|
23
|
-
|
24
|
-
Rake.application.display_tasks_and_comments
|
25
|
-
end
|
26
|
-
|
27
|
-
namespace :gem do
|
28
|
-
desc "create #{PROJ.name}.gemspec"
|
29
|
-
task 'gemspec' do
|
30
|
-
puts "rake gem:debug > #{PROJ.name}.gemspec"
|
31
|
-
File.open("#{PROJ.name}.gemspec", 'w'){|spec| spec << `rake gem:debug`.sub(/.*/, '')}
|
32
|
-
end
|
33
|
-
end
|
16
|
+
# supress warnings, there's too many warnings in dm-core
|
17
|
+
PROJ.ruby_opts.delete '-w'
|
34
18
|
|
35
|
-
PROJ.authors = 'Lin Jen-Shin (a.k.a. godfat 真常)'
|
36
|
-
PROJ.email = 'godfat (XD) godfat.org'
|
37
|
-
PROJ.url = "http://github.com/godfat/#{PROJ.name}"
|
38
19
|
PROJ.description = PROJ.summary = paragraphs_of('README', 'description').join("\n\n")
|
39
20
|
PROJ.changes = paragraphs_of('CHANGES', 0..1).join("\n\n")
|
40
|
-
PROJ.rubyforge.name = 'ludy'
|
41
21
|
PROJ.version = File.read("lib/#{PROJ.name}/version.rb").gsub(/.*VERSION = '(.*)'.*/m, '\1')
|
42
22
|
|
43
|
-
PROJ.
|
44
|
-
|
45
|
-
'^\.gitignore$', '^ann-', '\.sqlite3$', '\.db$']
|
23
|
+
PROJ.exclude += ['^tmp', 'tmp$', '^pkg', '^\.gitignore$',
|
24
|
+
'^ann-', '\.sqlite3$', '\.db$']
|
46
25
|
|
47
26
|
PROJ.rdoc.remote_dir = PROJ.name
|
48
27
|
|
@@ -50,8 +29,8 @@ PROJ.readme_file = 'README'
|
|
50
29
|
PROJ.rdoc.main = 'README'
|
51
30
|
PROJ.rdoc.exclude += ['Rakefile', '^tasks', '^test']
|
52
31
|
PROJ.rdoc.include << '\w+'
|
53
|
-
PROJ.rdoc.opts << '--diagram' if !WIN32 and `which dot` =~ %r/\/dot/
|
54
|
-
PROJ.rdoc.opts += ['--charset=utf-8', '--inline-source',
|
32
|
+
# PROJ.rdoc.opts << '--diagram' if !Rake::WIN32 and `which dot` =~ %r/\/dot/
|
33
|
+
PROJ.rdoc.opts += ['--charset=utf-8', '--inline-source',
|
55
34
|
'--line-numbers', '--promiscuous']
|
56
35
|
|
57
36
|
PROJ.spec.opts << '--color'
|
@@ -60,3 +39,16 @@ PROJ.ann.file = "ann-#{PROJ.name}-#{PROJ.version}"
|
|
60
39
|
PROJ.ann.paragraphs.concat %w[LINKS SYNOPSIS REQUIREMENTS INSTALL LICENSE]
|
61
40
|
|
62
41
|
CLEAN.include Dir['**/*.rbc']
|
42
|
+
|
43
|
+
task :default do
|
44
|
+
Rake.application.options.show_task_pattern = /./
|
45
|
+
Rake.application.display_tasks_and_comments
|
46
|
+
end
|
47
|
+
|
48
|
+
namespace :gem do
|
49
|
+
desc "create #{PROJ.name}.gemspec"
|
50
|
+
task 'gemspec' do
|
51
|
+
puts "rake gem:debug > #{PROJ.name}.gemspec"
|
52
|
+
File.open("#{PROJ.name}.gemspec", 'w'){|spec| spec << `rake gem:debug`.sub(/.*/, '')}
|
53
|
+
end
|
54
|
+
end
|
data/TODO
CHANGED
@@ -1,4 +1,12 @@
|
|
1
1
|
= pagify todo list
|
2
2
|
|
3
|
+
== current
|
4
|
+
* update README for better understanding, in use case
|
5
|
+
|
6
|
+
== 1.0+
|
7
|
+
* default chinese html setting
|
8
|
+
* cooperate with DataMapper::Collection,
|
9
|
+
do user.pets.pagify work???
|
10
|
+
why test work, but not in my app?
|
11
|
+
|
3
12
|
* refactor setting!!
|
4
|
-
* merb and rails url helper
|
data/lib/pagify.rb
CHANGED
@@ -5,5 +5,10 @@ module Pagify
|
|
5
5
|
autoload :ActiveRecordPager, 'pagify/active_record'
|
6
6
|
end
|
7
7
|
|
8
|
-
require 'pagify/basic'
|
9
|
-
require 'pagify/
|
8
|
+
require 'pagify/pager/basic'
|
9
|
+
require 'pagify/page/basic'
|
10
|
+
|
11
|
+
require 'singleton'
|
12
|
+
|
13
|
+
require 'pagify/pager/null'
|
14
|
+
require 'pagify/page/null'
|
data/lib/pagify/active_record.rb
CHANGED
@@ -1,13 +1,11 @@
|
|
1
1
|
|
2
2
|
# anything for active_record
|
3
3
|
|
4
|
-
require 'active_record'
|
5
|
-
|
6
4
|
require 'pagify'
|
7
|
-
require 'pagify/
|
5
|
+
require 'pagify/pager/detail/page_accept_string_or_blank'
|
8
6
|
|
9
|
-
require 'pagify/
|
10
|
-
require 'pagify/
|
7
|
+
require 'pagify/pager/active_record'
|
8
|
+
require 'pagify/pagifier/active_record'
|
11
9
|
|
12
10
|
require 'pagify/array' # this was needed for active_record...
|
13
11
|
|
data/lib/pagify/array.rb
CHANGED
data/lib/pagify/data_mapper.rb
CHANGED
@@ -1,16 +1,8 @@
|
|
1
1
|
|
2
2
|
# anything for data_mapper
|
3
3
|
|
4
|
-
gem 'extlib', '<=0.9.8'
|
5
|
-
gem 'dm-core', '<=0.9.7'
|
6
|
-
gem 'dm-aggregates', '<=0.9.7'
|
7
|
-
|
8
|
-
require 'dm-core'
|
9
|
-
require 'dm-aggregates'
|
10
|
-
|
11
4
|
require 'pagify'
|
12
|
-
require 'pagify/
|
13
|
-
|
14
|
-
require 'pagify/pagers/data_mapper'
|
15
|
-
require 'pagify/pagifiers/data_mapper'
|
5
|
+
require 'pagify/pager/detail/page_accept_string_or_blank'
|
16
6
|
|
7
|
+
require 'pagify/pager/data_mapper'
|
8
|
+
require 'pagify/pagifier/data_mapper'
|
@@ -1,9 +1,9 @@
|
|
1
1
|
|
2
2
|
module Pagify
|
3
|
-
module
|
3
|
+
module Helper
|
4
4
|
class Abstract
|
5
5
|
def self.default_attributes
|
6
|
-
|
6
|
+
{}
|
7
7
|
end
|
8
8
|
|
9
9
|
def self.setting
|
@@ -33,27 +33,26 @@ module Pagify
|
|
33
33
|
|
34
34
|
private
|
35
35
|
def caculate_2_parts outer_prev, inner_prev, inner_post, outer_post
|
36
|
-
[
|
37
|
-
|
36
|
+
[ caculate_part(outer_prev, inner_prev),
|
37
|
+
caculate_part(inner_post, outer_post) ]
|
38
38
|
end
|
39
|
-
def caculate_prev outer_prev, inner_prev
|
40
|
-
# concat outer and inner, remove overlap
|
41
|
-
links_prev = outer_prev + [setting[:ellipsis]] + inner_prev
|
42
39
|
|
43
|
-
|
44
|
-
|
40
|
+
# concat outer and inner, remove overlap
|
41
|
+
def caculate_part left, right
|
42
|
+
# don't use ellipsis if there's no spaces between them
|
43
|
+
ellipsis = !left.empty? && (left.last + 1) == right.first ?
|
44
|
+
[] : [setting[:ellipsis]]
|
45
45
|
|
46
|
-
|
47
|
-
end
|
48
|
-
def caculate_post inner_post, outer_post
|
49
|
-
# concat outer and inner, remove overlap
|
50
|
-
links_post = inner_post + [setting[:ellipsis]] + outer_post
|
46
|
+
part = left + ellipsis + right
|
51
47
|
|
52
|
-
# clean up overlap and remove '...' if
|
53
|
-
|
48
|
+
# clean up overlap and remove '...' if
|
49
|
+
part.delete(setting[:ellipsis]) if
|
50
|
+
part.uniq! || # there's overlap
|
51
|
+
part.size == 1 # no pages there
|
54
52
|
|
55
|
-
|
53
|
+
part
|
56
54
|
end
|
55
|
+
|
57
56
|
def caculate_4_parts page, size
|
58
57
|
inner_prev, inner_post = caculate_inner(setting[:inner_links], page, size)
|
59
58
|
outer_prev, outer_post = caculate_outer(setting[:outer_links], page, size,
|
@@ -61,10 +60,26 @@ module Pagify
|
|
61
60
|
|
62
61
|
[outer_prev, inner_prev, inner_post, outer_post]
|
63
62
|
end
|
63
|
+
|
64
64
|
def caculate_inner limit, page, size
|
65
|
-
|
66
|
-
|
65
|
+
prev, post = page - limit, page + limit
|
66
|
+
|
67
|
+
left = extract_pages( prev ... page, size )
|
68
|
+
right = extract_pages( (page + 1) .. post, size )
|
69
|
+
|
70
|
+
# adding more right pages if left pages were not enough.
|
71
|
+
right.push(
|
72
|
+
*extract_pages(
|
73
|
+
(post + 1) .. (post + limit - left.size), size )) if left.size < limit
|
74
|
+
|
75
|
+
# ditto
|
76
|
+
left.unshift(
|
77
|
+
*extract_pages(
|
78
|
+
(prev - limit - right.size) .. (prev - 1), size )) if right.size < limit
|
79
|
+
|
80
|
+
[left, right]
|
67
81
|
end
|
82
|
+
|
68
83
|
def caculate_outer limit, page, size, inner_prev, inner_post
|
69
84
|
# caculate index
|
70
85
|
prev_last = [limit, (inner_prev.first || 1) ].min
|
@@ -80,6 +95,11 @@ module Pagify
|
|
80
95
|
|
81
96
|
[outer_prev, outer_post]
|
82
97
|
end
|
98
|
+
|
99
|
+
def extract_pages range, size
|
100
|
+
range.map{ |i| page_exists?(i, size) }.compact
|
101
|
+
end
|
102
|
+
|
83
103
|
def page_exists? page, size
|
84
104
|
if page >= 1 && page <= size
|
85
105
|
page
|
@@ -1,8 +1,8 @@
|
|
1
1
|
|
2
|
-
require 'pagify/
|
2
|
+
require 'pagify/helper/abstract'
|
3
3
|
|
4
4
|
module Pagify
|
5
|
-
module
|
5
|
+
module Helper
|
6
6
|
# TODO: refactor me!!
|
7
7
|
class Setting
|
8
8
|
def initialize helper, parent = {}
|
@@ -49,6 +49,6 @@ module Pagify
|
|
49
49
|
{}
|
50
50
|
end
|
51
51
|
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
52
|
+
end # of Setting
|
53
|
+
end # of Helper
|
54
|
+
end # of Pagify
|
@@ -1,13 +1,14 @@
|
|
1
1
|
|
2
|
-
require 'pagify/
|
2
|
+
require 'pagify/helper/abstract'
|
3
3
|
|
4
|
-
require 'pagify/
|
5
|
-
require 'pagify/
|
4
|
+
require 'pagify/helper/detail/setting'
|
5
|
+
require 'pagify/helper/detail/setup'
|
6
6
|
|
7
7
|
module Pagify
|
8
|
-
module
|
8
|
+
module Helper
|
9
9
|
class HTML < Abstract
|
10
10
|
def self.default_attributes
|
11
|
+
super.merge(
|
11
12
|
{ :first_text => '« First',
|
12
13
|
:last_text => 'Last »',
|
13
14
|
:prev_text => '< Previous',
|
@@ -16,12 +17,12 @@ module Pagify
|
|
16
17
|
:outer_links => 2,
|
17
18
|
# :step => 3,
|
18
19
|
:separator => ' ',
|
19
|
-
:ellipsis => '...' }
|
20
|
+
:ellipsis => '...' })
|
20
21
|
end
|
21
22
|
|
22
23
|
def links_full page, &block
|
23
24
|
page = normalize_page(page)
|
24
|
-
"#{links_navigate(page, &block)}<br
|
25
|
+
"#{links_navigate(page, &block)}<br />#{links(page, &block)}"
|
25
26
|
end
|
26
27
|
|
27
28
|
def links_navigate page
|
@@ -79,7 +80,7 @@ module Pagify
|
|
79
80
|
def normalize_page page
|
80
81
|
pager.__send__(:normalize_page, page)
|
81
82
|
end
|
82
|
-
end
|
83
|
+
end # of HTML
|
83
84
|
setup HTML
|
84
|
-
end
|
85
|
-
end
|
85
|
+
end # of Helper
|
86
|
+
end # of Pagify
|