dm-pager 1.0.2 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.md CHANGED
@@ -1,4 +1,9 @@
1
1
 
2
+ 1.1.0 / 2010-03-08
3
+ ==================
4
+
5
+ * Added ability to have multiple pagers on the same page
6
+
2
7
  1.0.2 / 2010-02-18
3
8
  ==================
4
9
 
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{dm-pager}
5
- s.version = "1.0.2"
5
+ s.version = "1.1.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["TJ Holowaychuk"]
9
- s.date = %q{2010-02-18}
9
+ s.date = %q{2010-03-08}
10
10
  s.description = %q{DataMapper Pagination}
11
11
  s.email = %q{tj@vision-media.ca}
12
12
  s.extra_rdoc_files = ["lib/dm-pager.rb", "lib/dm-pager/defaults.rb", "lib/dm-pager/helpers.rb", "lib/dm-pager/helpers/rails.rb", "lib/dm-pager/pager.rb", "lib/dm-pager/pagination.rb", "lib/dm-pager/version.rb", "tasks/docs.rake", "tasks/gemspec.rake", "tasks/spec.rake"]
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
15
15
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Dm-pager", "--main", "Readme.md"]
16
16
  s.require_paths = ["lib"]
17
17
  s.rubyforge_project = %q{dm-pager}
18
- s.rubygems_version = %q{1.3.5}
18
+ s.rubygems_version = %q{1.3.6}
19
19
  s.summary = %q{DataMapper Pagination}
20
20
 
21
21
  if s.respond_to? :specification_version then
@@ -10,7 +10,8 @@ module DataMapper
10
10
  :next_text => 'Next',
11
11
  :first_text => 'First',
12
12
  :last_text => 'Last',
13
- :more_text => '...'
13
+ :more_text => '...',
14
+ :page_param => :page
14
15
  }
15
16
 
16
17
  ##
@@ -31,10 +32,10 @@ module DataMapper
31
32
  #
32
33
  # DataMapper::Pagination.defaults[:size] = 5
33
34
  #
34
-
35
+
35
36
  def self.defaults
36
37
  @defaults
37
38
  end
38
39
 
39
40
  end
40
- end
41
+ end
@@ -1,52 +1,53 @@
1
1
 
2
2
  module DataMapper
3
3
  class Pager
4
-
4
+
5
5
  ##
6
6
  # Total number of un-limited records.
7
-
8
- attr_reader :total
9
-
7
+
8
+ attr_reader :total
9
+
10
10
  ##
11
11
  # Records per page.
12
-
13
- attr_reader :per_page
14
-
12
+
13
+ attr_reader :per_page
14
+
15
15
  ##
16
16
  # Current page number.
17
-
17
+
18
18
  attr_reader :current_page
19
-
19
+
20
20
  ##
21
21
  # Previous page or nil when no previous page is available.
22
-
22
+
23
23
  attr_reader :previous_page
24
-
24
+
25
25
  ##
26
26
  # Next page or nil when no more pages are available.
27
-
27
+
28
28
  attr_reader :next_page
29
-
29
+
30
30
  ##
31
31
  # Total number of pages.
32
-
32
+
33
33
  attr_reader :total_pages
34
-
34
+
35
35
  ##
36
36
  # Initialize with _options_.
37
-
37
+
38
38
  def initialize options = {}
39
+ @page_param = options.delete(:page_param) || :page
39
40
  @total = options.delete :total
40
41
  @per_page = options.delete :limit
41
- @current_page = options.delete :page
42
+ @current_page = options.delete @page_param
42
43
  @total_pages = total.quo(per_page).ceil
43
44
  @next_page = current_page + 1 unless current_page >= total_pages
44
45
  @previous_page = current_page - 1 unless current_page <= 1
45
46
  end
46
-
47
+
47
48
  ##
48
49
  # Render the pager with the given _uri_ and _options_.
49
- #
50
+ #
50
51
  # === Examples
51
52
  #
52
53
  # User.page(2).pager.to_html('/users')
@@ -56,7 +57,7 @@ module DataMapper
56
57
  #
57
58
  # :size Number of intermediate page number links to be shown; Defaults to 7
58
59
  #
59
-
60
+
60
61
  def to_html uri, options = {}
61
62
  return unless total_pages > 1
62
63
  @uri, @options = uri, options
@@ -73,36 +74,36 @@ module DataMapper
73
74
  last_link,
74
75
  '</ul>'].join
75
76
  end
76
-
77
+
77
78
  private
78
-
79
+
79
80
  ##
80
81
  # Fetch _key_ from the options passed to #to_html, or
81
82
  # its default value.
82
-
83
+
83
84
  def option key
84
85
  @options.fetch key, Pagination.defaults[key]
85
86
  end
86
-
87
+
87
88
  ##
88
- # Link to _page_ with optional anchor tag _contents_.
89
-
89
+ # Link to _page_ with optional anchor tag _contents_.
90
+
90
91
  def link_to page, contents = nil
91
92
  %(<a href="#{uri_for(page)}">#{contents || page}</a>)
92
93
  end
93
-
94
+
94
95
  ##
95
96
  # More pages indicator for _position_.
96
-
97
+
97
98
  def more position
98
99
  return '' if position == :before && (current_page <= 1 || first <= 1)
99
100
  return '' if position == :after && (current_page >= total_pages || last >= total_pages)
100
101
  li 'more', option(:more_text)
101
102
  end
102
-
103
+
103
104
  ##
104
105
  # Intermediate page links array.
105
-
106
+
106
107
  def intermediate_links
107
108
  (first..last).map do |page|
108
109
  classes = ["page-#{page}"]
@@ -110,35 +111,35 @@ module DataMapper
110
111
  li classes.join(' '), link_to(page)
111
112
  end
112
113
  end
113
-
114
+
114
115
  ##
115
116
  # Previous link.
116
-
117
+
117
118
  def previous_link
118
119
  li 'previous jump', link_to(previous_page, option(:previous_text)) if previous_page
119
120
  end
120
-
121
+
121
122
  ##
122
123
  # Next link.
123
-
124
+
124
125
  def next_link
125
126
  li 'next jump', link_to(next_page, option(:next_text)) if next_page
126
127
  end
127
-
128
+
128
129
  ##
129
130
  # Last link.
130
-
131
+
131
132
  def last_link
132
133
  li 'last jump', link_to(total_pages, option(:last_text)) if next_page
133
134
  end
134
-
135
+
135
136
  ##
136
137
  # First link.
137
-
138
+
138
139
  def first_link
139
140
  li 'first jump', link_to(1, option(:first_text)) if previous_page
140
141
  end
141
-
142
+
142
143
  ##
143
144
  # Determine first intermediate page.
144
145
 
@@ -151,7 +152,7 @@ module DataMapper
151
152
  first
152
153
  end
153
154
  end
154
-
155
+
155
156
  ##
156
157
  # Determine last intermediate page.
157
158
 
@@ -164,14 +165,14 @@ module DataMapper
164
165
  last
165
166
  end
166
167
  end
167
-
168
+
168
169
  ##
169
170
  # Renders a <li> with the given _css_class_ and _contents_.
170
-
171
+
171
172
  def li css_class = nil, contents = nil
172
173
  "<li#{%( class="#{css_class}") if css_class}>#{contents}</li>\n"
173
174
  end
174
-
175
+
175
176
  ##
176
177
  # Uri for _page_. The following conversions are made
177
178
  # to the _uri_ previously passed to #to_html:
@@ -183,11 +184,11 @@ module DataMapper
183
184
 
184
185
  def uri_for page
185
186
  case @uri
186
- when /\bpage=/ ; @uri.gsub /\bpage=\d+/, "page=#{page}"
187
- when /\?/ ; @uri += "&page=#{page}"
188
- else ; @uri += "?page=#{page}"
187
+ when /\b#{@page_param}=/ ; @uri.gsub /\b#{@page_param}=\d+/, "#{@page_param}=#{page}"
188
+ when /\?/ ; @uri += "&#{@page_param}=#{page}"
189
+ else ; @uri += "?#{@page_param}=#{page}"
189
190
  end
190
191
  end
191
-
192
+
192
193
  end
193
- end
194
+ end
@@ -1,16 +1,16 @@
1
1
 
2
2
  module DataMapper
3
3
  module Pagination
4
-
4
+
5
5
  ##
6
6
  # DataMapper::Pager instance.
7
-
7
+
8
8
  attr_accessor :pager
9
-
9
+
10
10
  ##
11
11
  # Page collection by the _page_ number and _options_ provided.
12
12
  #
13
- # Since pagers will commonly be used with query strings, we
13
+ # Since pagers will commonly be used with query strings, we
14
14
  # coerce all numeric strings such as '12' to their integer value 12.
15
15
  # This is the case for _page_, :per_page, :page, etc.
16
16
  #
@@ -19,21 +19,24 @@ module DataMapper
19
19
  # :page Current page number
20
20
  # :per_page Results per page; defaults to 6
21
21
  # :order Defaults to [:id.desc]
22
+ # :page_param The paramter to use to encode the page. Default :page
22
23
  #
23
24
  # === Examples
24
- #
25
+ #
25
26
  # User.all.page
26
27
  # User.all.page(2)
27
28
  # User.all.page(2, :per_page => 5)
28
29
  # User.all.page(:page => 2, :per_page => 5)
30
+ # User.all.page(:page => 2, :page_param => :user_page)
29
31
  #
30
-
32
+
31
33
  def page page = nil, options = {}
32
34
  options, page = page, nil if page.is_a? Hash
33
- page ||= pager_option :page, options
34
- options.delete :page
35
+ page_param = pager_option(:page_param, options)
36
+ page ||= pager_option page_param, options
37
+ options.delete page_param
35
38
  page = 1 unless (page = page.to_i) && page > 1
36
- per_page = pager_option(:per_page, options).to_i
39
+ per_page = pager_option(:per_page, options).to_i
37
40
  query = options.dup
38
41
  collection = new_collection scoped_query(options = {
39
42
  :limit => per_page,
@@ -41,22 +44,22 @@ module DataMapper
41
44
  :order => [:id.desc]
42
45
  }.merge(query))
43
46
  query.delete :order
44
- options.merge! :total => count(query), :page => page
47
+ options.merge! :total => count(query), page_param => page, :page_param => page_param
45
48
  collection.pager = DataMapper::Pager.new options
46
49
  collection
47
50
  end
48
-
51
+
49
52
  private
50
-
53
+
51
54
  ##
52
55
  # Return value for _key_ from indifferent hash _options_.
53
- #
56
+ #
54
57
  # * Checks for sym key
55
58
  # * Checks for string key
56
59
  # * Checks DataMapper::Pagination.defaults for the sym key
57
60
  # * Deletes both keys to prevent them from being part of the query
58
61
  #
59
-
62
+
60
63
  def pager_option key, options = {}
61
64
  a = options.delete key.to_sym
62
65
  b = options.delete key.to_s
@@ -1,6 +1,6 @@
1
1
 
2
2
  module DataMapper
3
3
  module Pagination
4
- VERSION = '1.0.2'
4
+ VERSION = '1.1.0'
5
5
  end
6
6
  end
@@ -3,58 +3,66 @@ require File.dirname(__FILE__) + '/../spec_helper'
3
3
 
4
4
  describe DataMapper::Pager do
5
5
  before(:each) { mock_items }
6
-
6
+
7
7
  describe "#to_html" do
8
8
  describe "when pages are available" do
9
9
  it "should render a ul.pager wrapper" do
10
- Item.page.pager.to_html('/').should match(/ul class="([^"]+)?"/)
10
+ begin
11
+ Item.page.pager.to_html('/').should match(/ul class="([^"]+)?"/)
12
+ rescue =>e
13
+ puts e.class, e.message, e.backtrace.join("\n")
14
+ end
11
15
  end
12
-
16
+
13
17
  it "should render a ul containing intermediate items" do
14
18
  Item.page.pager.to_html('/').should match(/<ul class="[^"]+?"><li/)
15
19
  end
16
-
20
+
17
21
  it "should add the 'active' class to the current page link <li>" do
18
22
  Item.page.pager.to_html('/').should include('li class="page-1 active"><a href="/?page=1"')
19
23
  Item.page(2).pager.to_html('/').should include('li class="page-2 active"><a href="/?page=2"')
20
24
  Item.page(3).pager.to_html('/').should include('li class="page-3 active"><a href="/?page=3"')
21
25
  end
22
-
26
+
23
27
  it "should add li.last.jump" do
24
28
  Item.page.pager.to_html('/').should include('<li class="last jump">')
25
29
  end
26
-
30
+
27
31
  it "should add li.first.jump" do
28
32
  Item.page(2).pager.to_html('/').should include('<li class="first jump"')
29
33
  end
30
-
34
+
31
35
  it "should add li.next.jump" do
32
36
  Item.page.pager.to_html('/').should include('<li class="next jump">')
33
37
  end
34
-
38
+
35
39
  it "should add li.previous.jump" do
36
40
  Item.page(2).pager.to_html('/').should include('<li class="previous jump">')
37
41
  end
42
+
43
+ it "should allow setting the paging parameter name" do
44
+ Item.page(2, :page_param => :hot_stuff).pager.to_html("/items").should include("href=\"/items?hot_stuff=2\"")
45
+ end
38
46
  end
39
-
47
+
40
48
  describe "when one page is available" do
41
49
  it "should render nothing" do
42
50
  Item.all(:id.lt => 2).page.pager.to_html('/').should be_nil
43
51
  end
44
52
  end
45
-
53
+
46
54
  describe "when no pages are available" do
47
55
  it "should render nothing" do
48
56
  Item.all(:id.lt => 1).page.pager.to_html('/').should be_nil
49
57
  end
50
58
  end
51
-
59
+
52
60
  describe "when on the first page" do
53
61
  it "should not render the 'Previous' page link" do
54
62
  markup = Item.page.pager.to_html('/')
55
63
  markup.should_not include('Previous')
56
64
  end
57
-
65
+
58
66
  it "should render some intermediate page links with ... after" do
59
67
  markup = Item.page.pager.to_html('/', :size => 3)
60
68
  markup.should include('>1<')
@@ -63,28 +71,28 @@ describe DataMapper::Pager do
63
71
  markup.should_not include('>4<')
64
72
  markup.should include(%(<li class="more">...</li>\n<li class="next jump"))
65
73
  end
66
-
74
+
67
75
  it "should not render ... before" do
68
76
  markup = Item.page.pager.to_html('/', :size => 3)
69
77
  markup.should_not include('<a href="/?page=3" class="previous jump">Previous</a><li class="more">...</li>')
70
78
  end
71
-
79
+
72
80
  it "should not render the 'First' page link" do
73
81
  markup = Item.page.pager.to_html('/')
74
82
  markup.should_not include('First')
75
83
  end
76
-
84
+
77
85
  it "should render the 'Last' page link" do
78
86
  markup = Item.page.pager.to_html('/')
79
87
  markup.should include('Last')
80
88
  end
81
89
  end
82
-
90
+
83
91
  describe "with the :size option set" do
84
92
  it "should raise an error when given an even number" do
85
93
  lambda { Item.page.pager.to_html('/', :size => 2) }.should raise_error(ArgumentError, /must be an odd number/)
86
94
  end
87
-
95
+
88
96
  it "should render only the specified number of intermediate page links" do
89
97
  markup = Item.page.pager.to_html('/', :size => 3)
90
98
  markup.should include('>1<')
@@ -93,7 +101,7 @@ describe DataMapper::Pager do
93
101
  markup.should_not include('>4<')
94
102
  end
95
103
  end
96
-
104
+
97
105
  [:first, :previous, :next, :last].each do |pos|
98
106
  describe "with the #{pos.inspect} option set" do
99
107
  it "should change the default contents for the '#{pos}' link" do
@@ -102,23 +110,23 @@ describe DataMapper::Pager do
102
110
  end
103
111
  end
104
112
  end
105
-
113
+
106
114
  describe "when on the last page" do
107
115
  it "should not render the 'Next' page link" do
108
116
  markup = Item.page(4).pager.to_html('/')
109
117
  markup.should_not include('Next')
110
118
  end
111
-
119
+
112
120
  it "should not render the 'Last' page link" do
113
121
  markup = Item.page(4).pager.to_html('/')
114
122
  markup.should_not include('Last')
115
123
  end
116
-
124
+
117
125
  it "should render the 'First' page link" do
118
126
  markup = Item.page(4).pager.to_html('/')
119
127
  markup.should include('First')
120
128
  end
121
-
129
+
122
130
  it "should render some intermediate page links with ... before" do
123
131
  markup = Item.page(4).pager.to_html('/', :size => 3)
124
132
  markup.should include(%(<li class="previous jump"><a href="/?page=3">Previous</a></li>\n<li class="more">...<))
@@ -128,24 +136,24 @@ describe DataMapper::Pager do
128
136
  markup.should include('>4<')
129
137
  markup.should_not include('>5<')
130
138
  end
131
-
139
+
132
140
  it "should not render ... after" do
133
141
  markup = Item.page(4).pager.to_html('/', :size => 3)
134
142
  markup.should_not include(%(<li class="more">...</li>\n<a href="/?page=6" class="next jump"))
135
143
  end
136
144
  end
137
-
145
+
138
146
  describe "when on an intermediate page" do
139
147
  it "should render the 'Previous' page link" do
140
148
  markup = Item.page(2).pager.to_html('/')
141
149
  markup.should include('Previous')
142
150
  end
143
-
151
+
144
152
  it "should render the 'Next' page link" do
145
- markup = Item.page(2).pager.to_html('/')
153
+ markup = Item.page(2).pager.to_html('/')
146
154
  markup.should include('Next')
147
155
  end
148
-
156
+
149
157
  it "should render some intermediate page links with ... before and after" do
150
158
  markup = Item.page(5, :per_page => 2).pager.to_html('/', :size => 3)
151
159
  markup.should include(%(<li class="previous jump"><a href="/?page=4">Previous</a></li>\n<li class="more">...</li>))
@@ -156,18 +164,18 @@ describe DataMapper::Pager do
156
164
  markup.should_not include('>7<')
157
165
  markup.should include(%(<li class="more">...</li>\n<li class="next jump"))
158
166
  end
159
-
167
+
160
168
  it "should render the 'Last' page link" do
161
169
  markup = Item.page(2).pager.to_html('/')
162
170
  markup.should include('Last')
163
171
  end
164
-
172
+
165
173
  it "should render the 'First' page link" do
166
174
  markup = Item.page(2).pager.to_html('/')
167
175
  markup.should include('First')
168
176
  end
169
177
  end
170
-
178
+
171
179
  describe "when on the second page" do
172
180
  it "should render 1 through 3 when :size is 3 followed by ..." do
173
181
  markup = Item.page(2, :per_page => 2).pager.to_html('/', :size => 3)
@@ -179,7 +187,7 @@ describe DataMapper::Pager do
179
187
  markup.should include(%(<li class="more">...</li>\n<li class="next jump"))
180
188
  end
181
189
  end
182
-
190
+
183
191
  describe "when on the second last page" do
184
192
  it "should render 8 through 10 when :size is 3 with preceding ..." do
185
193
  markup = Item.page(9, :per_page => 2).pager.to_html('/', :size => 3)
@@ -192,14 +200,14 @@ describe DataMapper::Pager do
192
200
  markup.should_not include(%(<li class="more">...</li>\n<li class="next jump"))
193
201
  end
194
202
  end
195
-
203
+
196
204
  describe "when passing a uri without a query string" do
197
205
  it "should append a query string to each uri" do
198
206
  markup = Item.page.pager.to_html 'items'
199
207
  markup.should include('items?page=1')
200
208
  end
201
209
  end
202
-
210
+
203
211
  describe "when passing a uri with a query string" do
204
212
  describe "containing page=N" do
205
213
  it "should alter the page value" do
@@ -207,14 +215,14 @@ describe DataMapper::Pager do
207
215
  markup.should include('items?page=1')
208
216
  end
209
217
  end
210
-
218
+
211
219
  describe "not containing page=N" do
212
220
  it "should append a pair" do
213
221
  markup = Item.page.pager.to_html 'items?foo=bar'
214
222
  markup.should include('items?foo=bar&page=1')
215
223
  end
216
224
  end
217
-
225
+
218
226
  describe "when containing other keys with 'page'" do
219
227
  it "should append a pair" do
220
228
  markup = Item.page.pager.to_html 'items?per_page=5'
@@ -224,6 +232,6 @@ describe DataMapper::Pager do
224
232
  end
225
233
  end
226
234
  end
227
-
235
+
228
236
  end
229
- end
237
+ end
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dm-pager
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 1
8
+ - 0
9
+ version: 1.1.0
5
10
  platform: ruby
6
11
  authors:
7
12
  - TJ Holowaychuk
@@ -9,29 +14,37 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2010-02-18 00:00:00 -08:00
17
+ date: 2010-03-08 00:00:00 -08:00
13
18
  default_executable:
14
19
  dependencies:
15
20
  - !ruby/object:Gem::Dependency
16
21
  name: dm-core
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
20
24
  requirements:
21
25
  - - ">="
22
26
  - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ - 10
30
+ - 1
23
31
  version: 0.10.1
24
- version:
32
+ type: :runtime
33
+ version_requirements: *id001
25
34
  - !ruby/object:Gem::Dependency
26
35
  name: dm-aggregates
27
- type: :runtime
28
- version_requirement:
29
- version_requirements: !ruby/object:Gem::Requirement
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
30
38
  requirements:
31
39
  - - ">="
32
40
  - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
43
+ - 10
44
+ - 1
33
45
  version: 0.10.1
34
- version:
46
+ type: :runtime
47
+ version_requirements: *id002
35
48
  description: DataMapper Pagination
36
49
  email: tj@vision-media.ca
37
50
  executables: []
@@ -89,18 +102,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
89
102
  requirements:
90
103
  - - ">="
91
104
  - !ruby/object:Gem::Version
105
+ segments:
106
+ - 0
92
107
  version: "0"
93
- version:
94
108
  required_rubygems_version: !ruby/object:Gem::Requirement
95
109
  requirements:
96
110
  - - ">="
97
111
  - !ruby/object:Gem::Version
112
+ segments:
113
+ - 1
114
+ - 2
98
115
  version: "1.2"
99
- version:
100
116
  requirements: []
101
117
 
102
118
  rubyforge_project: dm-pager
103
- rubygems_version: 1.3.5
119
+ rubygems_version: 1.3.6
104
120
  signing_key:
105
121
  specification_version: 3
106
122
  summary: DataMapper Pagination