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.
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