will_paginate 3.0.12 → 3.1.0
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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/will_paginate/active_record.rb +5 -14
- data/lib/will_paginate/data_mapper.rb +6 -1
- data/lib/will_paginate/mongoid.rb +46 -0
- data/lib/will_paginate/railtie.rb +9 -13
- data/lib/will_paginate/version.rb +2 -2
- data/lib/will_paginate/view_helpers/action_view.rb +1 -3
- data/lib/will_paginate/view_helpers/link_renderer.rb +4 -4
- data/lib/will_paginate/view_helpers/link_renderer_base.rb +1 -1
- data/spec/database.yml +7 -11
- data/spec/finders/active_record_spec.rb +8 -167
- data/spec/finders/data_mapper_spec.rb +13 -0
- data/spec/finders/mongoid_spec.rb +140 -0
- data/spec/fixtures/developer.rb +0 -7
- data/spec/spec_helper.rb +21 -1
- data/spec/view_helpers/action_view_spec.rb +4 -11
- data/spec/view_helpers/view_example_group.rb +1 -2
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b3445d24047dd419909e314bc5f1b9eb3fdb7f73
|
4
|
+
data.tar.gz: 2e6ce5705bc95b523bdd8a7ffa9d8e0b35acc36f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bdc9b0d1f20379dc1df3dc503796834b329976c90a63f4e0f14b77152aef8721bea240f850d0abc0c0171a3e1ad10d5c88a354136e47d4bb933b29a205311d7d
|
7
|
+
data.tar.gz: c35edfea8e81e70fef045d9f1c3c32bea89723a1bd74a6c2edb438c62fc54c3356eb4704329c42b35760178c71a505ee0d86c0109a6f7cd3fdacd5276af4eb74
|
data/README.md
CHANGED
@@ -58,4 +58,4 @@ Happy paginating.
|
|
58
58
|
[install]: https://github.com/mislav/will_paginate/wiki/Installation "will_paginate installation"
|
59
59
|
[group]: http://groups.google.com/group/will_paginate "will_paginate discussion and support group"
|
60
60
|
[issues]: https://github.com/mislav/will_paginate/issues
|
61
|
-
[css]: http://mislav.
|
61
|
+
[css]: http://mislav.github.io/will_paginate/
|
@@ -2,11 +2,6 @@ require 'will_paginate/per_page'
|
|
2
2
|
require 'will_paginate/page_number'
|
3
3
|
require 'will_paginate/collection'
|
4
4
|
require 'active_record'
|
5
|
-
begin
|
6
|
-
require 'active_record/deprecated_finders'
|
7
|
-
rescue LoadError
|
8
|
-
# only for Rails 4.1
|
9
|
-
end
|
10
5
|
|
11
6
|
module WillPaginate
|
12
7
|
# = Paginating finders for ActiveRecord models
|
@@ -26,7 +21,7 @@ module WillPaginate
|
|
26
21
|
include WillPaginate::CollectionMethods
|
27
22
|
|
28
23
|
attr_accessor :current_page
|
29
|
-
attr_writer :total_entries
|
24
|
+
attr_writer :total_entries
|
30
25
|
|
31
26
|
def per_page(value = nil)
|
32
27
|
if value.nil? then limit_value
|
@@ -88,9 +83,6 @@ module WillPaginate
|
|
88
83
|
excluded = [:order, :limit, :offset, :reorder]
|
89
84
|
excluded << :includes unless eager_loading?
|
90
85
|
rel = self.except(*excluded)
|
91
|
-
# TODO: hack. decide whether to keep
|
92
|
-
rel = rel.apply_finder_options(@wp_count_options) if defined? @wp_count_options
|
93
|
-
|
94
86
|
column_name = (select_for_count(rel) || :all)
|
95
87
|
rel.count(column_name)
|
96
88
|
else
|
@@ -142,7 +134,6 @@ module WillPaginate
|
|
142
134
|
def copy_will_paginate_data(other)
|
143
135
|
other.current_page = current_page unless other.current_page
|
144
136
|
other.total_entries = nil if defined? @total_entries_queried
|
145
|
-
other.wp_count_options = @wp_count_options if defined? @wp_count_options
|
146
137
|
other
|
147
138
|
end
|
148
139
|
|
@@ -158,15 +149,15 @@ module WillPaginate
|
|
158
149
|
def paginate(options)
|
159
150
|
options = options.dup
|
160
151
|
pagenum = options.fetch(:page) { raise ArgumentError, ":page parameter required" }
|
152
|
+
options.delete(:page)
|
161
153
|
per_page = options.delete(:per_page) || self.per_page
|
162
154
|
total = options.delete(:total_entries)
|
163
155
|
|
164
|
-
|
165
|
-
|
156
|
+
if options.any?
|
157
|
+
raise ArgumentError, "unsupported parameters: %p" % options.keys
|
158
|
+
end
|
166
159
|
|
167
160
|
rel = limit(per_page.to_i).page(pagenum)
|
168
|
-
rel = rel.apply_finder_options(options) if options.any?
|
169
|
-
rel.wp_count_options = count_options if count_options
|
170
161
|
rel.total_entries = total.to_i unless total.blank?
|
171
162
|
rel
|
172
163
|
end
|
@@ -21,11 +21,15 @@ module WillPaginate
|
|
21
21
|
options = options.dup
|
22
22
|
pagenum = options.fetch(:page) { raise ArgumentError, ":page parameter required" }
|
23
23
|
per_page = options.delete(:per_page) || self.per_page
|
24
|
+
total = options.delete(:total_entries)
|
24
25
|
|
25
26
|
options.delete(:page)
|
26
27
|
options[:limit] = per_page.to_i
|
27
28
|
|
28
|
-
|
29
|
+
|
30
|
+
col = all(options).page(pagenum)
|
31
|
+
col.total_entries = total.to_i unless total.nil? || (total.kind_of?(String) && total.strip.empty?)
|
32
|
+
col
|
29
33
|
end
|
30
34
|
end
|
31
35
|
|
@@ -33,6 +37,7 @@ module WillPaginate
|
|
33
37
|
include WillPaginate::CollectionMethods
|
34
38
|
|
35
39
|
attr_accessor :current_page
|
40
|
+
attr_writer :total_entries
|
36
41
|
|
37
42
|
def paginated?
|
38
43
|
!current_page.nil?
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'mongoid'
|
2
|
+
require 'will_paginate/collection'
|
3
|
+
|
4
|
+
module WillPaginate
|
5
|
+
module Mongoid
|
6
|
+
module CriteriaMethods
|
7
|
+
def paginate(options = {})
|
8
|
+
extend CollectionMethods
|
9
|
+
@current_page = WillPaginate::PageNumber(options[:page] || @current_page || 1)
|
10
|
+
@page_multiplier = current_page - 1
|
11
|
+
pp = (options[:per_page] || per_page || WillPaginate.per_page).to_i
|
12
|
+
limit(pp).skip(@page_multiplier * pp)
|
13
|
+
end
|
14
|
+
|
15
|
+
def per_page(value = :non_given)
|
16
|
+
if value == :non_given
|
17
|
+
options[:limit] == 0 ? nil : options[:limit] # in new Mongoid versions a nil limit is saved as 0
|
18
|
+
else
|
19
|
+
limit(value)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def page(page)
|
24
|
+
paginate(:page => page)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
module CollectionMethods
|
29
|
+
attr_reader :current_page
|
30
|
+
|
31
|
+
def total_entries
|
32
|
+
@total_entries ||= count
|
33
|
+
end
|
34
|
+
|
35
|
+
def total_pages
|
36
|
+
(total_entries / per_page.to_f).ceil
|
37
|
+
end
|
38
|
+
|
39
|
+
def offset
|
40
|
+
@page_multiplier * per_page
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
::Mongoid::Criteria.send(:include, CriteriaMethods)
|
45
|
+
end
|
46
|
+
end
|
@@ -18,6 +18,8 @@ module WillPaginate
|
|
18
18
|
require 'will_paginate/view_helpers/action_view'
|
19
19
|
end
|
20
20
|
|
21
|
+
self.class.add_locale_path config
|
22
|
+
|
21
23
|
# early access to ViewHelpers.pagination_options
|
22
24
|
require 'will_paginate/view_helpers'
|
23
25
|
end
|
@@ -29,6 +31,10 @@ module WillPaginate
|
|
29
31
|
ActionController::Base.extend ControllerRescuePatch
|
30
32
|
end
|
31
33
|
|
34
|
+
def self.add_locale_path(config)
|
35
|
+
config.i18n.load_path.unshift(*WillPaginate::I18n.load_path)
|
36
|
+
end
|
37
|
+
|
32
38
|
# Extending the exception handler middleware so it properly detects
|
33
39
|
# WillPaginate::InvalidPage regardless of it being a tag module.
|
34
40
|
module ShowExceptionsPatch
|
@@ -38,15 +44,9 @@ module WillPaginate
|
|
38
44
|
alias_method :status_code, :status_code_with_paginate
|
39
45
|
end
|
40
46
|
def status_code_with_paginate(exception = @exception)
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
exception.original_exception
|
45
|
-
else
|
46
|
-
exception
|
47
|
-
end
|
48
|
-
|
49
|
-
if actual_exception.is_a?(WillPaginate::InvalidPage)
|
47
|
+
if exception.is_a?(WillPaginate::InvalidPage) or
|
48
|
+
(exception.respond_to?(:original_exception) &&
|
49
|
+
exception.original_exception.is_a?(WillPaginate::InvalidPage))
|
50
50
|
Rack::Utils.status_code(:not_found)
|
51
51
|
else
|
52
52
|
original_method = method(:status_code_without_paginate)
|
@@ -69,7 +69,3 @@ module WillPaginate
|
|
69
69
|
end
|
70
70
|
end
|
71
71
|
end
|
72
|
-
|
73
|
-
ActiveSupport.on_load :i18n do
|
74
|
-
I18n.load_path.concat(WillPaginate::I18n.load_path)
|
75
|
-
end
|
@@ -99,8 +99,6 @@ module WillPaginate
|
|
99
99
|
class LinkRenderer < ViewHelpers::LinkRenderer
|
100
100
|
protected
|
101
101
|
|
102
|
-
GET_PARAMS_BLACKLIST = [:script_name, :original_script_name]
|
103
|
-
|
104
102
|
def default_url_params
|
105
103
|
{}
|
106
104
|
end
|
@@ -120,7 +118,7 @@ module WillPaginate
|
|
120
118
|
|
121
119
|
def merge_get_params(url_params)
|
122
120
|
if @template.respond_to? :request and @template.request and @template.request.get?
|
123
|
-
symbolized_update(url_params, @template.params
|
121
|
+
symbolized_update(url_params, @template.params)
|
124
122
|
end
|
125
123
|
url_params
|
126
124
|
end
|
@@ -108,17 +108,17 @@ module WillPaginate
|
|
108
108
|
|
109
109
|
def rel_value(page)
|
110
110
|
case page
|
111
|
-
when @collection.current_page - 1; 'prev'
|
111
|
+
when @collection.current_page - 1; 'prev' + (page == 1 ? ' start' : '')
|
112
112
|
when @collection.current_page + 1; 'next'
|
113
|
+
when 1; 'start'
|
113
114
|
end
|
114
115
|
end
|
115
116
|
|
116
|
-
def symbolized_update(target, other
|
117
|
+
def symbolized_update(target, other)
|
117
118
|
other.each do |key, value|
|
118
119
|
key = key.to_sym
|
119
120
|
existing = target[key]
|
120
|
-
|
121
|
-
|
121
|
+
|
122
122
|
if value.is_a?(Hash) and (existing.is_a?(Hash) or existing.nil?)
|
123
123
|
symbolized_update(existing || (target[key] = {}), value)
|
124
124
|
else
|
@@ -30,7 +30,7 @@ module WillPaginate
|
|
30
30
|
window_from = current_page - inner_window
|
31
31
|
window_to = current_page + inner_window
|
32
32
|
|
33
|
-
# adjust lower or upper limit if
|
33
|
+
# adjust lower or upper limit if other is out of bounds
|
34
34
|
if window_to > total_pages
|
35
35
|
window_from -= window_to - total_pages
|
36
36
|
window_to = total_pages
|
data/spec/database.yml
CHANGED
@@ -3,27 +3,23 @@ sqlite3:
|
|
3
3
|
adapter: sqlite3
|
4
4
|
timeout: 500
|
5
5
|
|
6
|
-
mysql:
|
6
|
+
mysql:
|
7
7
|
adapter: mysql
|
8
8
|
database: will_paginate
|
9
9
|
username:
|
10
10
|
encoding: utf8
|
11
|
-
|
12
|
-
host: localhost
|
13
|
-
socket: /var/run/mysql5/mysqld.sock
|
14
|
-
<% elsif File.exist? "/tmp/mysql.sock" %>
|
15
|
-
host: localhost
|
16
|
-
socket: /tmp/mysql.sock
|
17
|
-
<% else %>
|
18
|
-
host: 127.0.0.1
|
19
|
-
<% end %>
|
11
|
+
socket: <%= ENV["BOXEN_MYSQL_SOCKET"] %>
|
20
12
|
|
21
13
|
mysql2:
|
22
|
-
<<: *mysql
|
23
14
|
adapter: mysql2
|
15
|
+
database: will_paginate
|
16
|
+
username:
|
17
|
+
encoding: utf8
|
18
|
+
socket: <%= ENV["BOXEN_MYSQL_SOCKET"] %>
|
24
19
|
|
25
20
|
postgres:
|
26
21
|
adapter: postgresql
|
27
22
|
database: will_paginate
|
28
23
|
username: <%= "postgres" if ENV["TRAVIS"] %>
|
29
24
|
min_messages: warning
|
25
|
+
port: <%= ENV["BOXEN_POSTGRESQL_PORT"] %>
|
@@ -104,13 +104,6 @@ describe WillPaginate::ActiveRecord do
|
|
104
104
|
rel.last(2).should == users(:dev_7, :dev_8)
|
105
105
|
rel.page(3).last.should == users(:poor_jamis)
|
106
106
|
end
|
107
|
-
|
108
|
-
it "keeps pagination data after 'scoped'" do
|
109
|
-
rel = Developer.page(2).scoped
|
110
|
-
rel.per_page.should == 10
|
111
|
-
rel.offset.should == 10
|
112
|
-
rel.current_page.should == 2
|
113
|
-
end
|
114
107
|
end
|
115
108
|
|
116
109
|
describe "counting" do
|
@@ -136,15 +129,6 @@ describe WillPaginate::ActiveRecord do
|
|
136
129
|
}.should run_queries(2)
|
137
130
|
end
|
138
131
|
|
139
|
-
it "remembers custom count options in sub-relations" do
|
140
|
-
topics = Topic.paginate :page => 1, :per_page => 3, :count => {:conditions => "title LIKE '%futurama%'"}
|
141
|
-
topics.total_entries.should == 1
|
142
|
-
topics.length.should == 3
|
143
|
-
lambda {
|
144
|
-
topics.order('id').total_entries.should == 1
|
145
|
-
}.should run_queries(1)
|
146
|
-
end
|
147
|
-
|
148
132
|
it "supports empty? method" do
|
149
133
|
topics = Topic.paginate :page => 1, :per_page => 3
|
150
134
|
lambda {
|
@@ -250,10 +234,11 @@ describe WillPaginate::ActiveRecord do
|
|
250
234
|
end
|
251
235
|
|
252
236
|
it "should strip the order when counting" do
|
237
|
+
expected = topics(:ar)
|
253
238
|
lambda {
|
254
239
|
sql = "select id, title, content from topics order by topics.title"
|
255
240
|
topics = Topic.paginate_by_sql sql, :page => 1, :per_page => 2
|
256
|
-
topics.first.should ==
|
241
|
+
topics.first.should == expected
|
257
242
|
}.should run_queries(2)
|
258
243
|
|
259
244
|
$query_sql.last.should include('COUNT')
|
@@ -295,78 +280,7 @@ describe WillPaginate::ActiveRecord do
|
|
295
280
|
}.should run_queries(2)
|
296
281
|
end
|
297
282
|
|
298
|
-
it "should paginate with :order" do
|
299
|
-
result = Topic.paginate :page => 1, :order => 'created_at DESC'
|
300
|
-
result.should == topics(:futurama, :harvey_birdman, :rails, :ar).reverse
|
301
|
-
result.total_pages.should == 1
|
302
|
-
end
|
303
|
-
|
304
|
-
it "should paginate with :conditions" do
|
305
|
-
result = Topic.paginate :page => 1, :order => 'id ASC',
|
306
|
-
:conditions => ["created_at > ?", 30.minutes.ago]
|
307
|
-
result.should == topics(:rails, :ar)
|
308
|
-
result.total_pages.should == 1
|
309
|
-
end
|
310
|
-
|
311
|
-
it "should paginate with :include and :conditions" do
|
312
|
-
klass = Topic
|
313
|
-
klass = klass.references(:replies) if klass.respond_to?(:references)
|
314
|
-
|
315
|
-
result = klass.paginate \
|
316
|
-
:page => 1,
|
317
|
-
:include => :replies,
|
318
|
-
:conditions => "replies.content LIKE 'Bird%' ",
|
319
|
-
:per_page => 10
|
320
|
-
|
321
|
-
expected = klass.find :all,
|
322
|
-
:include => 'replies',
|
323
|
-
:conditions => "replies.content LIKE 'Bird%' ",
|
324
|
-
:limit => 10
|
325
|
-
|
326
|
-
result.should == expected
|
327
|
-
result.total_entries.should == 1
|
328
|
-
end
|
329
|
-
|
330
|
-
it "should paginate with :include and :order" do
|
331
|
-
result = nil
|
332
|
-
lambda {
|
333
|
-
result = Topic.paginate(:page => 1, :include => :replies, :per_page => 10,
|
334
|
-
:order => 'replies.created_at asc, topics.created_at asc').to_a
|
335
|
-
}.should run_queries(2)
|
336
|
-
|
337
|
-
expected = Topic.find :all,
|
338
|
-
:include => 'replies',
|
339
|
-
:order => 'replies.created_at asc, topics.created_at asc',
|
340
|
-
:limit => 10
|
341
|
-
|
342
|
-
result.should == expected
|
343
|
-
result.total_entries.should == 4
|
344
|
-
end
|
345
|
-
|
346
283
|
describe "associations" do
|
347
|
-
it "should paginate with include" do
|
348
|
-
project = projects(:active_record)
|
349
|
-
|
350
|
-
topics = project.topics
|
351
|
-
topics = topics.references(:replies) if topics.respond_to?(:references)
|
352
|
-
|
353
|
-
result = topics.paginate \
|
354
|
-
:page => 1,
|
355
|
-
:include => :replies,
|
356
|
-
:conditions => ["replies.content LIKE ?", 'Nice%'],
|
357
|
-
:per_page => 10
|
358
|
-
|
359
|
-
topics = Topic
|
360
|
-
topics = topics.references(:replies) if topics.respond_to?(:references)
|
361
|
-
|
362
|
-
expected = topics.find :all,
|
363
|
-
:include => 'replies',
|
364
|
-
:conditions => ["project_id = ? AND replies.content LIKE ?", project.id, 'Nice%'],
|
365
|
-
:limit => 10
|
366
|
-
|
367
|
-
result.should == expected
|
368
|
-
end
|
369
|
-
|
370
284
|
it "should paginate" do
|
371
285
|
dhh = users(:david)
|
372
286
|
expected_name_ordered = projects(:action_controller, :active_record)
|
@@ -375,7 +289,7 @@ describe WillPaginate::ActiveRecord do
|
|
375
289
|
lambda {
|
376
290
|
# with association-specified order
|
377
291
|
result = ignore_deprecation {
|
378
|
-
dhh.projects.includes(:topics).paginate(:page => 1
|
292
|
+
dhh.projects.includes(:topics).order('projects.name').paginate(:page => 1)
|
379
293
|
}
|
380
294
|
result.to_a.should == expected_name_ordered
|
381
295
|
result.total_entries.should == 2
|
@@ -417,7 +331,7 @@ describe WillPaginate::ActiveRecord do
|
|
417
331
|
join_sql = 'LEFT JOIN developers_projects ON users.id = developers_projects.developer_id'
|
418
332
|
|
419
333
|
lambda {
|
420
|
-
result = Developer.
|
334
|
+
result = Developer.where('developers_projects.project_id = 1').joins(join_sql).paginate(:page => 1)
|
421
335
|
result.to_a # trigger loading of records
|
422
336
|
result.size.should == 2
|
423
337
|
developer_names = result.map(&:name)
|
@@ -427,8 +341,7 @@ describe WillPaginate::ActiveRecord do
|
|
427
341
|
|
428
342
|
lambda {
|
429
343
|
expected = result.to_a
|
430
|
-
result = Developer.paginate(:page => 1
|
431
|
-
:conditions => 'project_id = 1', :count => { :select => "users.id" }).to_a
|
344
|
+
result = Developer.where('developers_projects.project_id = 1').joins(join_sql).paginate(:page => 1)
|
432
345
|
result.should == expected
|
433
346
|
result.total_entries.should == 2
|
434
347
|
}.should run_queries(1)
|
@@ -437,8 +350,8 @@ describe WillPaginate::ActiveRecord do
|
|
437
350
|
it "should paginate with group" do
|
438
351
|
result = nil
|
439
352
|
lambda {
|
440
|
-
result = Developer.
|
441
|
-
:
|
353
|
+
result = Developer.select('salary').order('salary').group('salary').
|
354
|
+
paginate(:page => 1, :per_page => 10).to_a
|
442
355
|
}.should run_queries(1)
|
443
356
|
|
444
357
|
expected = users(:david, :jamis, :dev_10, :poor_jamis).map(&:salary).sort
|
@@ -451,12 +364,6 @@ describe WillPaginate::ActiveRecord do
|
|
451
364
|
}.should raise_error(NoMethodError)
|
452
365
|
end
|
453
366
|
|
454
|
-
it "should paginate with_scope" do
|
455
|
-
result = Developer.with_poor_ones { Developer.paginate :page => 1 }
|
456
|
-
result.size.should == 2
|
457
|
-
result.total_entries.should == 2
|
458
|
-
end
|
459
|
-
|
460
367
|
describe "scopes" do
|
461
368
|
it "should paginate" do
|
462
369
|
result = Developer.poor.paginate :page => 1, :per_page => 1
|
@@ -496,12 +403,6 @@ describe WillPaginate::ActiveRecord do
|
|
496
403
|
end
|
497
404
|
end
|
498
405
|
|
499
|
-
it "should paginate with :readonly option" do
|
500
|
-
lambda {
|
501
|
-
Developer.paginate :readonly => true, :page => 1
|
502
|
-
}.should_not raise_error
|
503
|
-
end
|
504
|
-
|
505
406
|
it "should not paginate an array of IDs" do
|
506
407
|
lambda {
|
507
408
|
Developer.paginate((1..8).to_a, :per_page => 3, :page => 2, :order => 'id')
|
@@ -514,64 +415,4 @@ describe WillPaginate::ActiveRecord do
|
|
514
415
|
Project.page(307445734561825862)
|
515
416
|
}.should raise_error(WillPaginate::InvalidPage, "invalid offset: 9223372036854775830")
|
516
417
|
end
|
517
|
-
|
518
|
-
protected
|
519
|
-
|
520
|
-
def ignore_deprecation
|
521
|
-
ActiveSupport::Deprecation.silence { yield }
|
522
|
-
end
|
523
|
-
|
524
|
-
def run_queries(num)
|
525
|
-
QueryCountMatcher.new(num)
|
526
|
-
end
|
527
|
-
|
528
|
-
def show_queries(&block)
|
529
|
-
counter = QueryCountMatcher.new(nil)
|
530
|
-
counter.run block
|
531
|
-
ensure
|
532
|
-
queries = counter.performed_queries
|
533
|
-
if queries.any?
|
534
|
-
puts queries
|
535
|
-
else
|
536
|
-
puts "no queries"
|
537
|
-
end
|
538
|
-
end
|
539
|
-
|
540
|
-
end
|
541
|
-
|
542
|
-
class QueryCountMatcher
|
543
|
-
def initialize(num)
|
544
|
-
@expected_count = num
|
545
|
-
end
|
546
|
-
|
547
|
-
def matches?(block)
|
548
|
-
run(block)
|
549
|
-
|
550
|
-
if @expected_count.respond_to? :include?
|
551
|
-
@expected_count.include? @count
|
552
|
-
else
|
553
|
-
@count == @expected_count
|
554
|
-
end
|
555
|
-
end
|
556
|
-
|
557
|
-
def run(block)
|
558
|
-
$query_count = 0
|
559
|
-
$query_sql = []
|
560
|
-
block.call
|
561
|
-
ensure
|
562
|
-
@queries = $query_sql.dup
|
563
|
-
@count = $query_count
|
564
|
-
end
|
565
|
-
|
566
|
-
def performed_queries
|
567
|
-
@queries
|
568
|
-
end
|
569
|
-
|
570
|
-
def failure_message
|
571
|
-
"expected #{@expected_count} queries, got #{@count}\n#{@queries.join("\n")}"
|
572
|
-
end
|
573
|
-
|
574
|
-
def negative_failure_message
|
575
|
-
"expected query count not to be #{@expected_count}"
|
576
|
-
end
|
577
|
-
end
|
418
|
+
end
|
@@ -80,6 +80,19 @@ describe WillPaginate::DataMapper do
|
|
80
80
|
Animal.all(:conditions => ['1=2']).page(1).total_pages.should == 1
|
81
81
|
end
|
82
82
|
|
83
|
+
it "overrides total_entries count with a fixed value" do
|
84
|
+
lambda {
|
85
|
+
animals = Animal.paginate :page => 1, :per_page => 3, :total_entries => 999
|
86
|
+
animals.total_entries.should == 999
|
87
|
+
}.should run_queries(0)
|
88
|
+
end
|
89
|
+
|
90
|
+
it "supports a non-int for total_entries" do
|
91
|
+
topics = Animal.paginate :page => 1, :per_page => 3, :total_entries => "999"
|
92
|
+
topics.total_entries.should == 999
|
93
|
+
end
|
94
|
+
|
95
|
+
|
83
96
|
it "can iterate and then call WP methods" do
|
84
97
|
animals = Animal.all(:limit => 2).page(1)
|
85
98
|
animals.each { |a| }
|
@@ -0,0 +1,140 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'will_paginate/mongoid'
|
5
|
+
rescue LoadError => error
|
6
|
+
warn "Error running Mongoid specs: #{error.message}"
|
7
|
+
mongoid_loaded = false
|
8
|
+
else
|
9
|
+
Mongoid.connect_to 'will_paginate_test'
|
10
|
+
|
11
|
+
class MongoidModel
|
12
|
+
include Mongoid::Document
|
13
|
+
end
|
14
|
+
|
15
|
+
mongoid_loaded = true
|
16
|
+
end
|
17
|
+
|
18
|
+
describe WillPaginate::Mongoid do
|
19
|
+
before(:all) do
|
20
|
+
MongoidModel.delete_all
|
21
|
+
4.times { MongoidModel.create! }
|
22
|
+
end
|
23
|
+
|
24
|
+
let(:criteria) { MongoidModel.criteria }
|
25
|
+
|
26
|
+
describe "#page" do
|
27
|
+
it "should forward to the paginate method" do
|
28
|
+
criteria.expects(:paginate).with(:page => 2).returns("itself")
|
29
|
+
criteria.page(2).should == "itself"
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should not override per_page if set earlier in the chain" do
|
33
|
+
criteria.paginate(:per_page => 10).page(1).per_page.should == 10
|
34
|
+
criteria.paginate(:per_page => 20).page(1).per_page.should == 20
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "#per_page" do
|
39
|
+
it "should set the limit if given an argument" do
|
40
|
+
criteria.per_page(10).options[:limit].should == 10
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should return the current limit if no argument is given" do
|
44
|
+
criteria.per_page.should == nil
|
45
|
+
criteria.per_page(10).per_page.should == 10
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should be interchangable with limit" do
|
49
|
+
criteria.limit(15).per_page.should == 15
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should be nil'able" do
|
53
|
+
criteria.per_page(nil).per_page.should be_nil
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "#paginate" do
|
58
|
+
it "should use criteria" do
|
59
|
+
criteria.paginate.should be_instance_of(::Mongoid::Criteria)
|
60
|
+
end
|
61
|
+
|
62
|
+
it "should not override page number if set earlier in the chain" do
|
63
|
+
criteria.page(3).paginate.current_page.should == 3
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should limit according to per_page parameter" do
|
67
|
+
criteria.paginate(:per_page => 10).options.should include(:limit => 10)
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should skip according to page and per_page parameters" do
|
71
|
+
criteria.paginate(:page => 2, :per_page => 5).options.should include(:skip => 5)
|
72
|
+
end
|
73
|
+
|
74
|
+
specify "first fallback value for per_page option is the current limit" do
|
75
|
+
criteria.limit(12).paginate.options.should include(:limit => 12)
|
76
|
+
end
|
77
|
+
|
78
|
+
specify "second fallback value for per_page option is WillPaginate.per_page" do
|
79
|
+
criteria.paginate.options.should include(:limit => WillPaginate.per_page)
|
80
|
+
end
|
81
|
+
|
82
|
+
specify "page should default to 1" do
|
83
|
+
criteria.paginate.options.should include(:skip => 0)
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should convert strings to integers" do
|
87
|
+
criteria.paginate(:page => "2", :per_page => "3").options.should include(:limit => 3)
|
88
|
+
end
|
89
|
+
|
90
|
+
describe "collection compatibility" do
|
91
|
+
describe "#total_count" do
|
92
|
+
it "should be calculated correctly" do
|
93
|
+
criteria.paginate(:per_page => 1).total_entries.should == 4
|
94
|
+
criteria.paginate(:per_page => 3).total_entries.should == 4
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should be cached" do
|
98
|
+
criteria.expects(:count).once.returns(123)
|
99
|
+
criteria.paginate
|
100
|
+
2.times { criteria.total_entries.should == 123 }
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
it "should calculate total_pages" do
|
105
|
+
criteria.paginate(:per_page => 1).total_pages.should == 4
|
106
|
+
criteria.paginate(:per_page => 3).total_pages.should == 2
|
107
|
+
criteria.paginate(:per_page => 10).total_pages.should == 1
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should return per_page" do
|
111
|
+
criteria.paginate(:per_page => 1).per_page.should == 1
|
112
|
+
criteria.paginate(:per_page => 5).per_page.should == 5
|
113
|
+
end
|
114
|
+
|
115
|
+
describe "#current_page" do
|
116
|
+
it "should return current_page" do
|
117
|
+
criteria.paginate(:page => 1).current_page.should == 1
|
118
|
+
criteria.paginate(:page => 3).current_page.should == 3
|
119
|
+
end
|
120
|
+
|
121
|
+
it "should be casted to PageNumber" do
|
122
|
+
page = criteria.paginate(:page => 1).current_page
|
123
|
+
(page.instance_of? WillPaginate::PageNumber).should be
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
it "should return offset" do
|
128
|
+
criteria.paginate(:page => 1).offset.should == 0
|
129
|
+
criteria.paginate(:page => 2, :per_page => 5).offset.should == 5
|
130
|
+
criteria.paginate(:page => 3, :per_page => 10).offset.should == 20
|
131
|
+
end
|
132
|
+
|
133
|
+
it "should not pollute plain mongoid criterias" do
|
134
|
+
%w(total_entries total_pages current_page).each do |method|
|
135
|
+
criteria.should_not respond_to(method)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end if mongoid_loaded
|
data/spec/fixtures/developer.rb
CHANGED
@@ -1,13 +1,6 @@
|
|
1
1
|
class Developer < User
|
2
2
|
has_and_belongs_to_many :projects, :join_table => 'developers_projects'
|
3
3
|
|
4
|
-
def self.with_poor_ones(&block)
|
5
|
-
options = { :conditions => ['salary <= ?', 80000], :order => 'salary' }
|
6
|
-
with_scope({ :find => options }, :overwrite) do
|
7
|
-
yield
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
4
|
scope :poor, lambda {
|
12
5
|
where(['salary <= ?', 80000]).order('salary')
|
13
6
|
}
|
data/spec/spec_helper.rb
CHANGED
@@ -19,8 +19,28 @@ RSpec.configure do |config|
|
|
19
19
|
def have_deprecation(msg)
|
20
20
|
DeprecationMatcher.new(msg)
|
21
21
|
end
|
22
|
+
|
23
|
+
def run_queries(num)
|
24
|
+
QueryCountMatcher.new(num)
|
25
|
+
end
|
26
|
+
|
27
|
+
def ignore_deprecation
|
28
|
+
ActiveSupport::Deprecation.silence { yield }
|
29
|
+
end
|
30
|
+
|
31
|
+
def show_queries(&block)
|
32
|
+
counter = QueryCountMatcher.new(nil)
|
33
|
+
counter.run block
|
34
|
+
ensure
|
35
|
+
queries = counter.performed_queries
|
36
|
+
if queries.any?
|
37
|
+
puts queries
|
38
|
+
else
|
39
|
+
puts "no queries"
|
40
|
+
end
|
41
|
+
end
|
22
42
|
}
|
23
|
-
|
43
|
+
|
24
44
|
config.mock_with :mocha
|
25
45
|
config.backtrace_clean_patterns << /view_example_group/
|
26
46
|
end
|
@@ -80,9 +80,9 @@ describe WillPaginate::ActionView do
|
|
80
80
|
validate_page_numbers [1,1,3,3], elements
|
81
81
|
# test rel attribute values:
|
82
82
|
text(elements[0]).should == 'Prev'
|
83
|
-
elements[0]['rel'].should == 'prev'
|
83
|
+
elements[0]['rel'].should == 'prev start'
|
84
84
|
text(elements[1]).should == '1'
|
85
|
-
elements[1]['rel'].should == 'prev'
|
85
|
+
elements[1]['rel'].should == 'prev start'
|
86
86
|
text(elements[3]).should == 'Next'
|
87
87
|
elements[3]['rel'].should == 'next'
|
88
88
|
end
|
@@ -201,13 +201,6 @@ describe WillPaginate::ActionView do
|
|
201
201
|
assert_no_links_match /99/
|
202
202
|
assert_no_links_match /ftp/
|
203
203
|
end
|
204
|
-
|
205
|
-
it "doesn't allow tampering with script_name" do
|
206
|
-
request.params :script_name => 'p0wned', :original_script_name => 'p0wned'
|
207
|
-
paginate
|
208
|
-
assert_links_match %r{^/foo/bar}
|
209
|
-
assert_no_links_match /p0wned/
|
210
|
-
end
|
211
204
|
|
212
205
|
it "should not preserve parameters on POST" do
|
213
206
|
request.post
|
@@ -257,7 +250,7 @@ describe WillPaginate::ActionView do
|
|
257
250
|
end
|
258
251
|
|
259
252
|
it "should paginate with custom route page parameter" do
|
260
|
-
request.symbolized_path_parameters.update :controller => 'dummy', :action =>
|
253
|
+
request.symbolized_path_parameters.update :controller => 'dummy', :action => nil
|
261
254
|
paginate :per_page => 2 do
|
262
255
|
assert_select 'a[href]', 6 do |links|
|
263
256
|
assert_links_match %r{/page/(\d+)$}, links, [2, 3, 4, 5, 6, 2]
|
@@ -275,7 +268,7 @@ describe WillPaginate::ActionView do
|
|
275
268
|
end
|
276
269
|
|
277
270
|
it "should paginate with custom route and first page number implicit" do
|
278
|
-
request.symbolized_path_parameters.update :controller => 'ibocorp', :action =>
|
271
|
+
request.symbolized_path_parameters.update :controller => 'ibocorp', :action => nil
|
279
272
|
paginate :page => 2, :per_page => 2 do
|
280
273
|
assert_select 'a[href]', 7 do |links|
|
281
274
|
assert_links_match %r{/ibocorp(?:/(\d+))?$}, links, [nil, nil, 3, 4, 5, 6, 3]
|
@@ -27,7 +27,6 @@ module ViewExampleGroup
|
|
27
27
|
include MiniTest::Assertions if defined? MiniTest
|
28
28
|
|
29
29
|
def assert(value, message)
|
30
|
-
message = message.call if message.respond_to?(:call)
|
31
30
|
raise message unless value
|
32
31
|
end
|
33
32
|
|
@@ -144,4 +143,4 @@ module HTML
|
|
144
143
|
childless?? '' : super
|
145
144
|
end
|
146
145
|
end
|
147
|
-
end
|
146
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: will_paginate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mislav Marohnić
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-01-03 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: will_paginate provides a simple API for performing paginated queries
|
14
14
|
with Active Record, DataMapper and Sequel, and includes helpers for rendering pagination
|
@@ -31,6 +31,7 @@ files:
|
|
31
31
|
- lib/will_paginate/deprecation.rb
|
32
32
|
- lib/will_paginate/i18n.rb
|
33
33
|
- lib/will_paginate/locale/en.yml
|
34
|
+
- lib/will_paginate/mongoid.rb
|
34
35
|
- lib/will_paginate/page_number.rb
|
35
36
|
- lib/will_paginate/per_page.rb
|
36
37
|
- lib/will_paginate/railtie.rb
|
@@ -51,6 +52,7 @@ files:
|
|
51
52
|
- spec/finders/activerecord_test_connector.rb
|
52
53
|
- spec/finders/data_mapper_spec.rb
|
53
54
|
- spec/finders/data_mapper_test_connector.rb
|
55
|
+
- spec/finders/mongoid_spec.rb
|
54
56
|
- spec/finders/sequel_spec.rb
|
55
57
|
- spec/finders/sequel_test_connector.rb
|
56
58
|
- spec/fixtures/admin.rb
|