will_paginate 2.3.17 → 3.0.pre

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.

Potentially problematic release.


This version of will_paginate might be problematic. Click here for more details.

Files changed (83) hide show
  1. data/CHANGELOG.rdoc +24 -80
  2. data/LICENSE +1 -1
  3. data/README.rdoc +125 -0
  4. data/Rakefile +26 -22
  5. data/lib/will_paginate.rb +10 -84
  6. data/lib/will_paginate/array.rb +25 -8
  7. data/lib/will_paginate/collection.rb +15 -28
  8. data/lib/will_paginate/core_ext.rb +26 -0
  9. data/lib/will_paginate/deprecation.rb +50 -0
  10. data/lib/will_paginate/finders.rb +9 -0
  11. data/lib/will_paginate/finders/active_record.rb +158 -0
  12. data/lib/will_paginate/finders/active_resource.rb +51 -0
  13. data/lib/will_paginate/finders/base.rb +112 -0
  14. data/lib/will_paginate/finders/data_mapper.rb +30 -0
  15. data/lib/will_paginate/finders/sequel.rb +23 -0
  16. data/lib/will_paginate/railtie.rb +26 -0
  17. data/lib/will_paginate/version.rb +5 -5
  18. data/lib/will_paginate/view_helpers.rb +25 -436
  19. data/lib/will_paginate/view_helpers/action_view.rb +142 -0
  20. data/lib/will_paginate/view_helpers/base.rb +126 -0
  21. data/lib/will_paginate/view_helpers/link_renderer.rb +130 -0
  22. data/lib/will_paginate/view_helpers/link_renderer_base.rb +83 -0
  23. data/lib/will_paginate/view_helpers/merb.rb +13 -0
  24. data/spec/collection_spec.rb +147 -0
  25. data/spec/console +8 -0
  26. data/spec/console_fixtures.rb +8 -0
  27. data/spec/database.yml +22 -0
  28. data/spec/finders/active_record_spec.rb +377 -0
  29. data/spec/finders/active_resource_spec.rb +52 -0
  30. data/spec/finders/activerecord_test_connector.rb +114 -0
  31. data/spec/finders/data_mapper_spec.rb +62 -0
  32. data/spec/finders/data_mapper_test_connector.rb +20 -0
  33. data/spec/finders/sequel_spec.rb +53 -0
  34. data/spec/finders/sequel_test_connector.rb +9 -0
  35. data/spec/finders_spec.rb +76 -0
  36. data/{test → spec}/fixtures/admin.rb +0 -0
  37. data/{test → spec}/fixtures/developer.rb +2 -3
  38. data/{test → spec}/fixtures/developers_projects.yml +0 -0
  39. data/{test → spec}/fixtures/project.rb +2 -6
  40. data/{test → spec}/fixtures/projects.yml +1 -1
  41. data/{test → spec}/fixtures/replies.yml +0 -0
  42. data/{test → spec}/fixtures/reply.rb +1 -1
  43. data/{test → spec}/fixtures/schema.rb +0 -0
  44. data/spec/fixtures/topic.rb +7 -0
  45. data/{test → spec}/fixtures/topics.yml +0 -0
  46. data/{test → spec}/fixtures/user.rb +0 -0
  47. data/{test → spec}/fixtures/users.yml +0 -0
  48. data/spec/rcov.opts +2 -0
  49. data/spec/spec.opts +2 -0
  50. data/spec/spec_helper.rb +74 -0
  51. data/spec/tasks.rake +60 -0
  52. data/spec/view_helpers/action_view_spec.rb +345 -0
  53. data/spec/view_helpers/base_spec.rb +64 -0
  54. data/spec/view_helpers/link_renderer_base_spec.rb +84 -0
  55. data/spec/view_helpers/view_example_group.rb +103 -0
  56. metadata +60 -65
  57. data/README.md +0 -53
  58. data/lib/will_paginate/finder.rb +0 -269
  59. data/lib/will_paginate/i18n.rb +0 -29
  60. data/lib/will_paginate/locale/en.yml +0 -33
  61. data/lib/will_paginate/named_scope.rb +0 -170
  62. data/lib/will_paginate/named_scope_patch.rb +0 -37
  63. data/lib/will_paginate/per_page.rb +0 -27
  64. data/test/ci.rb +0 -60
  65. data/test/collection_test.rb +0 -160
  66. data/test/console +0 -8
  67. data/test/database.yml +0 -16
  68. data/test/finder_test.rb +0 -527
  69. data/test/fixtures/topic.rb +0 -12
  70. data/test/gemfiles/Gemfile.1.2 +0 -13
  71. data/test/gemfiles/Gemfile.1.2.lock +0 -39
  72. data/test/gemfiles/Gemfile.2.0 +0 -16
  73. data/test/gemfiles/Gemfile.2.0.lock +0 -28
  74. data/test/gemfiles/Gemfile.2.1 +0 -16
  75. data/test/gemfiles/Gemfile.2.1.lock +0 -28
  76. data/test/gemfiles/Gemfile.2.2 +0 -16
  77. data/test/gemfiles/Gemfile.2.2.lock +0 -28
  78. data/test/helper.rb +0 -34
  79. data/test/lib/activerecord_test_case.rb +0 -38
  80. data/test/lib/activerecord_test_connector.rb +0 -86
  81. data/test/lib/load_fixtures.rb +0 -12
  82. data/test/lib/view_test_process.rb +0 -186
  83. data/test/view_test.rb +0 -380
data/test/view_test.rb DELETED
@@ -1,380 +0,0 @@
1
- require 'helper'
2
- require 'lib/view_test_process'
3
-
4
- class AdditionalLinkAttributesRenderer < WillPaginate::LinkRenderer
5
- def initialize(link_attributes = nil)
6
- super()
7
- @additional_link_attributes = link_attributes || { :default => 'true' }
8
- end
9
-
10
- def page_link(page, text, attributes = {})
11
- @template.link_to text, url_for(page), attributes.merge(@additional_link_attributes)
12
- end
13
- end
14
-
15
- class ViewTest < WillPaginate::ViewTestCase
16
-
17
- ## basic pagination ##
18
-
19
- def test_will_paginate
20
- paginate do |pagination|
21
- assert_select 'a[href]', 3 do |elements|
22
- validate_page_numbers [2,3,2], elements
23
- assert_select elements.last, ':last-child', "Next &raquo;"
24
- end
25
- assert_select 'span', 2
26
- assert_select 'span.disabled:first-child', '&laquo; Previous'
27
- assert_select 'span.current', '1'
28
- assert_equal '&laquo; Previous 1 2 3 Next &raquo;', pagination.first.inner_text
29
- end
30
- end
31
-
32
- def test_no_pagination_when_page_count_is_one
33
- paginate :per_page => 30
34
- assert_equal '', @html_result
35
- end
36
-
37
- def test_will_paginate_with_options
38
- paginate({ :page => 2 },
39
- :class => 'will_paginate', :previous_label => 'Prev', :next_label => 'Next') do
40
- assert_select 'a[href]', 4 do |elements|
41
- validate_page_numbers [1,1,3,3], elements
42
- # test rel attribute values:
43
- assert_select elements[1], 'a', '1' do |link|
44
- assert_equal 'prev start', link.first['rel']
45
- end
46
- assert_select elements.first, 'a', "Prev" do |link|
47
- assert_equal 'prev start', link.first['rel']
48
- end
49
- assert_select elements.last, 'a', "Next" do |link|
50
- assert_equal 'next', link.first['rel']
51
- end
52
- end
53
- assert_select 'span.current', '2'
54
- end
55
- end
56
-
57
- def test_will_paginate_using_renderer_class
58
- paginate({}, :renderer => AdditionalLinkAttributesRenderer) do
59
- assert_select 'a[default=true]', 3
60
- end
61
- end
62
-
63
- def test_will_paginate_using_renderer_instance
64
- renderer = WillPaginate::LinkRenderer.new
65
- renderer.gap_marker = '<span class="my-gap">~~</span>'
66
-
67
- paginate({ :per_page => 2 }, :inner_window => 0, :outer_window => 0, :renderer => renderer) do
68
- assert_select 'span.my-gap', '~~'
69
- end
70
-
71
- renderer = AdditionalLinkAttributesRenderer.new(:title => 'rendered')
72
- paginate({}, :renderer => renderer) do
73
- assert_select 'a[title=rendered]', 3
74
- end
75
- end
76
-
77
- def test_prev_next_links_have_classnames
78
- paginate do |pagination|
79
- assert_select 'span.disabled.prev_page:first-child'
80
- assert_select 'a.next_page[href]:last-child'
81
- end
82
- end
83
-
84
- def test_prev_label_deprecated
85
- assert_deprecated ':previous_label' do
86
- paginate({ :page => 2 }, :prev_label => 'Deprecated') do
87
- assert_select 'a[href]:first-child', 'Deprecated'
88
- end
89
- end
90
- end
91
-
92
- def test_full_output
93
- paginate
94
- expected = <<-HTML
95
- <div class="pagination"><span class="disabled prev_page">&laquo; Previous</span>
96
- <span class="current">1</span>
97
- <a href="/foo/bar?page=2" rel="next">2</a>
98
- <a href="/foo/bar?page=3">3</a>
99
- <a href="/foo/bar?page=2" class="next_page" rel="next">Next &raquo;</a></div>
100
- HTML
101
- expected.strip!.gsub!(/\s{2,}/, ' ')
102
-
103
- assert_dom_equal expected, @html_result
104
- end
105
-
106
- def test_escaping_of_urls
107
- paginate({:page => 1, :per_page => 1, :total_entries => 2},
108
- :page_links => false, :params => { :tag => '<br>' })
109
-
110
- assert_select 'a[href]', 1 do |links|
111
- query = links.first['href'].split('?', 2)[1]
112
- assert_equal %w(page=2 tag=%3Cbr%3E), query.split('&amp;').sort
113
- end
114
- end
115
-
116
- ## advanced options for pagination ##
117
-
118
- def test_will_paginate_without_container
119
- paginate({}, :container => false)
120
- assert_select 'div.pagination', 0, 'main DIV present when it shouldn\'t'
121
- assert_select 'a[href]', 3
122
- end
123
-
124
- def test_will_paginate_without_page_links
125
- paginate({ :page => 2 }, :page_links => false) do
126
- assert_select 'a[href]', 2 do |elements|
127
- validate_page_numbers [1,3], elements
128
- end
129
- end
130
- end
131
-
132
- def test_will_paginate_windows
133
- paginate({ :page => 6, :per_page => 1 }, :inner_window => 1) do |pagination|
134
- assert_select 'a[href]', 8 do |elements|
135
- validate_page_numbers [5,1,2,5,7,10,11,7], elements
136
- assert_select elements.first, 'a', '&laquo; Previous'
137
- assert_select elements.last, 'a', 'Next &raquo;'
138
- end
139
- assert_select 'span.current', '6'
140
- assert_equal '&laquo; Previous 1 2 &hellip; 5 6 7 &hellip; 10 11 Next &raquo;', pagination.first.inner_text
141
- end
142
- end
143
-
144
- def test_will_paginate_eliminates_small_gaps
145
- paginate({ :page => 6, :per_page => 1 }, :inner_window => 2) do
146
- assert_select 'a[href]', 12 do |elements|
147
- validate_page_numbers [5,1,2,3,4,5,7,8,9,10,11,7], elements
148
- end
149
- end
150
- end
151
-
152
- def test_container_id
153
- paginate do |div|
154
- assert_nil div.first['id']
155
- end
156
-
157
- # magic ID
158
- paginate({}, :id => true) do |div|
159
- assert_equal 'fixnums_pagination', div.first['id']
160
- end
161
-
162
- # explicit ID
163
- paginate({}, :id => 'custom_id') do |div|
164
- assert_equal 'custom_id', div.first['id']
165
- end
166
- end
167
-
168
- ## other helpers ##
169
-
170
- def test_paginated_section
171
- @template = <<-ERB
172
- <% paginated_section collection, options do %>
173
- <%= content_tag :div, '', :id => "developers" %>
174
- <% end %>
175
- ERB
176
-
177
- paginate
178
- assert_select 'div.pagination', 2
179
- assert_select 'div.pagination + div#developers', 1
180
- end
181
-
182
- def test_page_entries_info
183
- @template = '<%= page_entries_info collection %>'
184
- array = ('a'..'z').to_a
185
-
186
- paginate array.paginate(:page => 2, :per_page => 5)
187
- assert_equal %{Displaying strings <b>6&nbsp;-&nbsp;10</b> of <b>26</b> in total},
188
- @html_result
189
-
190
- paginate array.paginate(:page => 7, :per_page => 4)
191
- assert_equal %{Displaying strings <b>25&nbsp;-&nbsp;26</b> of <b>26</b> in total},
192
- @html_result
193
- end
194
-
195
- uses_mocha 'class name' do
196
- def test_page_entries_info_with_longer_class_name
197
- @template = '<%= page_entries_info collection %>'
198
- collection = ('a'..'z').to_a.paginate
199
- collection.first.stubs(:class).returns(mock('class', :to_s => 'ProjectType'))
200
-
201
- paginate collection
202
- assert @html_result.index('project types'), "expected <#{@html_result.inspect}> to mention 'project types'"
203
- end
204
- end
205
-
206
- def test_page_entries_info_with_single_page_collection
207
- @template = '<%= page_entries_info collection %>'
208
-
209
- paginate(('a'..'d').to_a.paginate(:page => 1, :per_page => 5))
210
- assert_equal %{Displaying <b>all&nbsp;4</b> strings}, @html_result
211
-
212
- paginate(['a'].paginate(:page => 1, :per_page => 5))
213
- assert_equal %{Displaying <b>1</b> string}, @html_result
214
-
215
- paginate([].paginate(:page => 1, :per_page => 5))
216
- assert_equal %{No entries found}, @html_result
217
- end
218
-
219
- def test_page_entries_info_with_custom_entry_name
220
- @template = '<%= page_entries_info collection, :model => "author" %>'
221
-
222
- entries = (1..20).to_a
223
-
224
- paginate(entries.paginate(:page => 1, :per_page => 5))
225
- assert_equal %{Displaying authors <b>1&nbsp;-&nbsp;5</b> of <b>20</b> in total}, @html_result
226
-
227
- paginate(entries.paginate(:page => 1, :per_page => 20))
228
- assert_equal %{Displaying <b>all&nbsp;20</b> authors}, @html_result
229
-
230
- paginate(['a'].paginate(:page => 1, :per_page => 5))
231
- assert_equal %{Displaying <b>1</b> author}, @html_result
232
-
233
- paginate([].paginate(:page => 1, :per_page => 5))
234
- assert_equal %{No authors found}, @html_result
235
- end
236
-
237
- ## parameter handling in page links ##
238
-
239
- def test_will_paginate_preserves_parameters_on_get
240
- @request.params :foo => { :bar => 'baz' }
241
- paginate
242
- assert_links_match /foo%5Bbar%5D=baz/
243
- end
244
-
245
- def test_will_paginate_prevents_host_and_protocol_tampering
246
- @request.params :host => 'disney.com', :protocol => 'javascript'
247
- paginate
248
- assert_no_links_match /disney/
249
- assert_no_links_match /javascript/
250
- end
251
-
252
- def test_will_paginate_doesnt_preserve_parameters_on_post
253
- @request.post
254
- @request.params :foo => 'bar'
255
- paginate
256
- assert_no_links_match /foo=bar/
257
- end
258
-
259
- def test_adding_additional_parameters
260
- paginate({}, :params => { :foo => 'bar' })
261
- assert_links_match /foo=bar/
262
- end
263
-
264
- def test_adding_anchor_parameter
265
- paginate({}, :params => { :anchor => 'anchor' })
266
- assert_links_match /#anchor$/
267
- end
268
-
269
- def test_removing_arbitrary_parameters
270
- @request.params :foo => 'bar'
271
- paginate({}, :params => { :foo => nil })
272
- assert_no_links_match /foo=bar/
273
- end
274
-
275
- def test_adding_additional_route_parameters
276
- paginate({}, :params => { :controller => 'baz', :action => 'list' })
277
- assert_links_match %r{\Wbaz/list\W}
278
- end
279
-
280
- def test_will_paginate_with_custom_page_param
281
- paginate({ :page => 2 }, :param_name => :developers_page) do
282
- assert_select 'a[href]', 4 do |elements|
283
- validate_page_numbers [1,1,3,3], elements, :developers_page
284
- end
285
- end
286
- end
287
-
288
- def test_will_paginate_with_atmark_url
289
- @request.symbolized_path_parameters[:action] = "@tag"
290
- renderer = WillPaginate::LinkRenderer.new
291
-
292
- paginate({ :page => 1 }, :renderer=>renderer)
293
- assert_links_match %r[/foo/(?:@|%40)tag\?page=\d]
294
- end
295
-
296
- def test_complex_custom_page_param
297
- @request.params :developers => { :page => 2 }
298
-
299
- paginate({ :page => 2 }, :param_name => 'developers[page]') do
300
- assert_select 'a[href]', 4 do |links|
301
- assert_links_match /\?developers%5Bpage%5D=\d+$/, links
302
- validate_page_numbers [1,1,3,3], links, 'developers[page]'
303
- end
304
- end
305
- end
306
-
307
- def test_custom_routing_page_param
308
- @request.symbolized_path_parameters.update :controller => 'dummy', :action => nil
309
- paginate :per_page => 2 do
310
- assert_select 'a[href]', 6 do |links|
311
- assert_links_match %r{/page/(\d+)$}, links, [2, 3, 4, 5, 6, 2]
312
- end
313
- end
314
- end
315
-
316
- def test_custom_routing_page_param_with_dot_separator
317
- @request.symbolized_path_parameters.update :controller => 'dummy', :action => 'dots'
318
- paginate :per_page => 2 do
319
- assert_select 'a[href]', 6 do |links|
320
- assert_links_match %r{/page\.(\d+)$}, links, [2, 3, 4, 5, 6, 2]
321
- end
322
- end
323
- end
324
-
325
- def test_custom_routing_with_first_page_hidden
326
- @request.symbolized_path_parameters.update :controller => 'ibocorp', :action => nil
327
- paginate :page => 2, :per_page => 2 do
328
- assert_select 'a[href]', 7 do |links|
329
- assert_links_match %r{/ibocorp(?:/(\d+))?$}, links, [nil, nil, 3, 4, 5, 6, 3]
330
- end
331
- end
332
- end
333
-
334
- ## internal hardcore stuff ##
335
-
336
- class LegacyCollection < WillPaginate::Collection
337
- alias :page_count :total_pages
338
- undef :total_pages
339
- end
340
-
341
- def test_deprecation_notices_with_page_count
342
- collection = LegacyCollection.new(1, 1, 2)
343
-
344
- assert_deprecated collection.class.name do
345
- paginate collection
346
- end
347
- end
348
-
349
- uses_mocha 'view internals' do
350
- def test_collection_name_can_be_guessed
351
- collection = mock
352
- collection.expects(:total_pages).returns(1)
353
-
354
- @template = '<%= will_paginate options %>'
355
- @controller.controller_name = 'developers'
356
- @view.assigns['developers'] = collection
357
-
358
- paginate(nil)
359
- end
360
- end
361
-
362
- def test_inferred_collection_name_raises_error_when_nil
363
- @template = '<%= will_paginate options %>'
364
- @controller.controller_name = 'developers'
365
-
366
- e = assert_raise ArgumentError do
367
- paginate(nil)
368
- end
369
- assert e.message.include?('@developers')
370
- end
371
-
372
- if ActionController::Base.respond_to? :rescue_responses
373
- # only on Rails 2
374
- def test_rescue_response_hook_presence
375
- assert_equal :not_found,
376
- ActionController::Base.rescue_responses['WillPaginate::InvalidPage']
377
- end
378
- end
379
-
380
- end