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.
Files changed (41) hide show
  1. data/CHANGES +11 -0
  2. data/README +36 -22
  3. data/Rakefile +28 -36
  4. data/TODO +9 -1
  5. data/lib/pagify.rb +7 -2
  6. data/lib/pagify/active_record.rb +3 -5
  7. data/lib/pagify/array.rb +2 -2
  8. data/lib/pagify/data_mapper.rb +3 -11
  9. data/lib/pagify/{helpers → helper}/abstract.rb +39 -19
  10. data/lib/pagify/{helpers/details → helper/detail}/setting.rb +5 -5
  11. data/lib/pagify/{helpers/details → helper/detail}/setup.rb +1 -1
  12. data/lib/pagify/{helpers → helper}/html.rb +10 -9
  13. data/lib/pagify/helper/rails.rb +23 -0
  14. data/lib/pagify/{pages → page}/basic.rb +2 -4
  15. data/lib/pagify/{pages → page}/null.rb +2 -3
  16. data/lib/pagify/{pagers → pager}/active_record.rb +2 -4
  17. data/lib/pagify/{pagers → pager}/array.rb +2 -3
  18. data/lib/pagify/{pagers → pager}/basic.rb +2 -2
  19. data/lib/pagify/{pagers → pager}/data_mapper.rb +2 -3
  20. data/lib/pagify/{pagers/details → pager/detail}/page_accept_string_or_blank.rb +2 -3
  21. data/lib/pagify/{pagers → pager}/null.rb +1 -3
  22. data/lib/pagify/pagifier/abstract.rb +10 -0
  23. data/lib/pagify/{pagifiers → pagifier}/active_record.rb +1 -1
  24. data/lib/pagify/{pagifiers → pagifier}/array.rb +1 -1
  25. data/lib/pagify/{pagifiers → pagifier}/data_mapper.rb +2 -2
  26. data/lib/pagify/version.rb +1 -1
  27. data/pagify.gemspec +19 -27
  28. data/test/helper.rb +14 -2
  29. data/test/{suite_for_model.rb → helper_model.rb} +1 -43
  30. data/test/{test_pagify.rb → helper_pagify.rb} +1 -3
  31. data/test/test_active_record.rb +9 -14
  32. data/test/test_array.rb +1 -1
  33. data/test/test_basic.rb +1 -1
  34. data/test/test_data_mapper.rb +3 -2
  35. data/test/test_html.rb +33 -7
  36. data/test/test_null.rb +19 -10
  37. data/test/test_rails.rb +32 -0
  38. metadata +39 -66
  39. data/lib/pagify/basic.rb +0 -3
  40. data/lib/pagify/null.rb +0 -5
  41. 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.5
2
- by Lin Jen-Shin (a.k.a. godfat-真常[http://godfat.org])
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
- pagination tools for plain Ruby, DataMapper, ActiveRecord, and other ORM.
12
+ Pagination tools for Array(or custom class), DataMapper and ActiveRecord
13
13
 
14
14
  == FEATURES:
15
15
 
16
- * aims to be as flexible as possible
17
- * separate intrusive "pagify" method and Array/DataMapper/ActiveRecord Pager.
18
- * separate view helpers. there's html helper, yaml helper(planed), xml/rss/atom helper(planed).
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
- the easiest (but not recommended) way to use it is:
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::Helpers::HTML.setting[:prev_text] = '<]' # globally change html setting
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 use User.pagify_cache = true; and face thread-safety problem.
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) without encountering
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
- * sudo gem install pagify
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 (a.k.a. godfat 真常)
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
- begin
4
- require 'bones'
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
- # supress warnings, there's too many warnings in dm-core
12
- PROJ.ruby_opts.delete '-w'
13
-
14
- PROJ.gem.development_dependencies << ['extlib', '<=0.9.8']
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 << ['activerecord', '>=2.0.0']
19
- PROJ.gem.development_dependencies << ['minitest', '>=1.3.0']
20
- # PROJ.gem.executables = ["bin/#{PROJ.name}"]
12
+ PROJ.gem.development_dependencies << ['dm-core', '>=0.9.9'] <<
13
+ ['dm-aggregates', '>=0.9.9'] <<
14
+ ['activerecord', '>=2.0.0']
21
15
 
22
- task :default do
23
- Rake.application.options.show_task_pattern = /./
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.manifest_file = 'Manifest'
44
- PROJ.exclude += ['^Manifest$', '^tmp', 'tmp$', '^pkg',
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/null'
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'
@@ -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/pagers/details/page_accept_string_or_blank'
5
+ require 'pagify/pager/detail/page_accept_string_or_blank'
8
6
 
9
- require 'pagify/pagers/active_record'
10
- require 'pagify/pagifiers/active_record'
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
@@ -2,5 +2,5 @@
2
2
  # anything for array
3
3
 
4
4
  require 'pagify'
5
- require 'pagify/pagers/array'
6
- require 'pagify/pagifiers/array'
5
+ require 'pagify/pager/array'
6
+ require 'pagify/pagifier/array'
@@ -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/pagers/details/page_accept_string_or_blank'
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 Helpers
3
+ module Helper
4
4
  class Abstract
5
5
  def self.default_attributes
6
- raise NotImplementedError
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
- [ caculate_prev(outer_prev, inner_prev),
37
- caculate_post(inner_post, outer_post) ]
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
- # clean up overlap and remove '...' if there's overlap or no pages there
44
- links_prev.delete(setting[:ellipsis]) if links_prev.uniq! || links_prev.size == 1
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
- links_prev
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 there's overlap or no pages there
53
- links_post.delete(setting[:ellipsis]) if links_post.uniq! || links_post.size == 1
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
- links_post
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
- [ (1..limit).map{ |i| page_exists?(page - i, size) }.reverse.compact,
66
- (1..limit).map{ |i| page_exists?(page + i, size) }.compact ]
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/helpers/abstract'
2
+ require 'pagify/helper/abstract'
3
3
 
4
4
  module Pagify
5
- module Helpers
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,6 +1,6 @@
1
1
 
2
2
  module Pagify
3
- module Helpers
3
+ module Helper
4
4
  def self.setup helper_class
5
5
  Pagify::BasicPager.module_eval do
6
6
  helper_name = helper_class.to_s.downcase[/::?(\w+)$/, 1]
@@ -1,13 +1,14 @@
1
1
 
2
- require 'pagify/helpers/abstract'
2
+ require 'pagify/helper/abstract'
3
3
 
4
- require 'pagify/helpers/details/setting'
5
- require 'pagify/helpers/details/setup'
4
+ require 'pagify/helper/detail/setting'
5
+ require 'pagify/helper/detail/setup'
6
6
 
7
7
  module Pagify
8
- module Helpers
8
+ module Helper
9
9
  class HTML < Abstract
10
10
  def self.default_attributes
11
+ super.merge(
11
12
  { :first_text => '&laquo; First',
12
13
  :last_text => 'Last &raquo;',
13
14
  :prev_text => '&lt; 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 />\n#{links(page, &block)}"
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