godfat-pagify 0.5.0 → 0.6.1
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/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
|