will_paginate 3.0.7 → 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/deprecation.rb +1 -1
- data/lib/will_paginate/mongoid.rb +46 -0
- data/lib/will_paginate/railtie.rb +5 -2
- data/lib/will_paginate/version.rb +2 -2
- data/spec/finders/active_record_spec.rb +9 -168
- data/spec/finders/activerecord_test_connector.rb +12 -1
- data/spec/finders/data_mapper_spec.rb +13 -0
- data/spec/finders/mongoid_spec.rb +140 -0
- data/spec/fixtures/admin.rb +1 -1
- data/spec/fixtures/developer.rb +1 -8
- data/spec/fixtures/project.rb +1 -1
- data/spec/page_number_spec.rb +29 -11
- data/spec/spec_helper.rb +21 -1
- data/spec/view_helpers/action_view_spec.rb +31 -19
- data/spec/view_helpers/base_spec.rb +1 -0
- data/spec/view_helpers/view_example_group.rb +26 -6
- metadata +5 -3
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
|
@@ -32,14 +32,17 @@ module WillPaginate
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def self.add_locale_path(config)
|
35
|
-
config.i18n.
|
35
|
+
config.i18n.load_path.unshift(*WillPaginate::I18n.load_path)
|
36
36
|
end
|
37
37
|
|
38
38
|
# Extending the exception handler middleware so it properly detects
|
39
39
|
# WillPaginate::InvalidPage regardless of it being a tag module.
|
40
40
|
module ShowExceptionsPatch
|
41
41
|
extend ActiveSupport::Concern
|
42
|
-
included
|
42
|
+
included do
|
43
|
+
alias_method :status_code_without_paginate, :status_code
|
44
|
+
alias_method :status_code, :status_code_with_paginate
|
45
|
+
end
|
43
46
|
def status_code_with_paginate(exception = @exception)
|
44
47
|
if exception.is_a?(WillPaginate::InvalidPage) or
|
45
48
|
(exception.respond_to?(:original_exception) &&
|
@@ -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
|
@@ -387,7 +301,7 @@ describe WillPaginate::ActiveRecord do
|
|
387
301
|
result.total_entries.should == 2
|
388
302
|
|
389
303
|
lambda {
|
390
|
-
dhh.projects.
|
304
|
+
dhh.projects.order('projects.id').limit(4).to_a
|
391
305
|
}.should_not raise_error
|
392
306
|
|
393
307
|
result = dhh.projects.paginate(:page => 1, :per_page => 4).reorder('projects.id')
|
@@ -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
|
@@ -4,12 +4,23 @@ require 'active_support/multibyte' # needed for Ruby 1.9.1
|
|
4
4
|
require 'stringio'
|
5
5
|
require 'erb'
|
6
6
|
|
7
|
+
# https://travis-ci.org/mislav/will_paginate/jobs/99999001
|
8
|
+
require 'active_support/core_ext/string/conversions'
|
9
|
+
class String
|
10
|
+
alias to_datetime_without_patch to_datetime
|
11
|
+
def to_datetime
|
12
|
+
to_datetime_without_patch
|
13
|
+
rescue ArgumentError
|
14
|
+
return nil
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
7
18
|
$query_count = 0
|
8
19
|
$query_sql = []
|
9
20
|
|
10
21
|
ignore_sql = /
|
11
22
|
^(
|
12
|
-
PRAGMA | SHOW\ max_identifier_length |
|
23
|
+
PRAGMA | SHOW\ (max_identifier_length|search_path) |
|
13
24
|
SELECT\ (currval|CAST|@@IDENTITY|@@ROWCOUNT) |
|
14
25
|
SHOW\ ((FULL\ )?FIELDS|TABLES)
|
15
26
|
)\b |
|
@@ -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/admin.rb
CHANGED
data/spec/fixtures/developer.rb
CHANGED
@@ -1,12 +1,5 @@
|
|
1
1
|
class Developer < User
|
2
|
-
has_and_belongs_to_many :projects, :
|
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
|
2
|
+
has_and_belongs_to_many :projects, :join_table => 'developers_projects'
|
10
3
|
|
11
4
|
scope :poor, lambda {
|
12
5
|
where(['salary <= ?', 80000]).order('salary')
|
data/spec/fixtures/project.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
class Project < ActiveRecord::Base
|
2
|
-
has_and_belongs_to_many :developers, :
|
2
|
+
has_and_belongs_to_many :developers, :join_table => 'developers_projects'
|
3
3
|
|
4
4
|
has_many :topics
|
5
5
|
# :finder_sql => 'SELECT * FROM topics WHERE (topics.project_id = #{id})',
|
data/spec/page_number_spec.rb
CHANGED
@@ -3,23 +3,41 @@ require 'will_paginate/page_number'
|
|
3
3
|
|
4
4
|
describe WillPaginate::PageNumber do
|
5
5
|
describe "valid" do
|
6
|
-
|
6
|
+
def num
|
7
|
+
WillPaginate::PageNumber.new('12', 'page')
|
8
|
+
end
|
9
|
+
|
10
|
+
it "== 12" do
|
11
|
+
num.should eq(12)
|
12
|
+
end
|
7
13
|
|
8
|
-
it
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
it
|
13
|
-
|
14
|
-
|
14
|
+
it "inspects to 'page 12'" do
|
15
|
+
num.inspect.should eq('page 12')
|
16
|
+
end
|
17
|
+
|
18
|
+
it "is a PageNumber" do
|
19
|
+
(num.instance_of? WillPaginate::PageNumber).should be
|
20
|
+
end
|
21
|
+
|
22
|
+
it "is a kind of Numeric" do
|
23
|
+
(num.is_a? Numeric).should be
|
24
|
+
end
|
25
|
+
|
26
|
+
it "is a kind of Fixnum" do
|
27
|
+
(num.is_a? Fixnum).should be
|
28
|
+
end
|
29
|
+
|
30
|
+
it "isn't directly a Fixnum" do
|
31
|
+
(num.instance_of? Fixnum).should_not be
|
32
|
+
end
|
15
33
|
|
16
34
|
it "passes the PageNumber=== type check" do |variable|
|
17
|
-
(WillPaginate::PageNumber ===
|
35
|
+
(WillPaginate::PageNumber === num).should be
|
18
36
|
end
|
19
37
|
|
20
38
|
it "passes the Numeric=== type check" do |variable|
|
21
|
-
(Numeric ===
|
22
|
-
(Fixnum ===
|
39
|
+
(Numeric === num).should be
|
40
|
+
(Fixnum === num).should be
|
23
41
|
end
|
24
42
|
end
|
25
43
|
|
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
|
@@ -1,3 +1,4 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
require 'spec_helper'
|
2
3
|
require 'active_support/rescuable' # needed for Ruby 1.9.1
|
3
4
|
require 'action_controller'
|
@@ -20,6 +21,7 @@ describe WillPaginate::ActionView do
|
|
20
21
|
|
21
22
|
before(:all) do
|
22
23
|
I18n.load_path.concat WillPaginate::I18n.load_path
|
24
|
+
I18n.enforce_available_locales = false
|
23
25
|
end
|
24
26
|
|
25
27
|
before(:each) do
|
@@ -48,12 +50,14 @@ describe WillPaginate::ActionView do
|
|
48
50
|
paginate do |pagination|
|
49
51
|
assert_select 'a[href]', 3 do |elements|
|
50
52
|
validate_page_numbers [2,3,2], elements
|
51
|
-
|
53
|
+
text(elements[2]).should == 'Next →'
|
54
|
+
end
|
55
|
+
assert_select 'span', 1 do |spans|
|
56
|
+
spans[0]['class'].should == 'previous_page disabled'
|
57
|
+
text(spans[0]).should == '← Previous'
|
52
58
|
end
|
53
|
-
assert_select 'span', 1
|
54
|
-
assert_select 'span.disabled:first-child', '← Previous'
|
55
59
|
assert_select 'em.current', '1'
|
56
|
-
pagination.
|
60
|
+
text(pagination[0]).should == '← Previous 1 2 3 Next →'
|
57
61
|
end
|
58
62
|
end
|
59
63
|
|
@@ -75,15 +79,12 @@ describe WillPaginate::ActionView do
|
|
75
79
|
assert_select 'a[href]', 4 do |elements|
|
76
80
|
validate_page_numbers [1,1,3,3], elements
|
77
81
|
# test rel attribute values:
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
assert_select elements.last, 'a', "Next" do |link|
|
85
|
-
link.first['rel'].should == 'next'
|
86
|
-
end
|
82
|
+
text(elements[0]).should == 'Prev'
|
83
|
+
elements[0]['rel'].should == 'prev start'
|
84
|
+
text(elements[1]).should == '1'
|
85
|
+
elements[1]['rel'].should == 'prev start'
|
86
|
+
text(elements[3]).should == 'Next'
|
87
|
+
elements[3]['rel'].should == 'next'
|
87
88
|
end
|
88
89
|
assert_select '.current', '2'
|
89
90
|
end
|
@@ -126,8 +127,8 @@ describe WillPaginate::ActionView do
|
|
126
127
|
<a href="/foo/bar?page=2" class="next_page" rel="next">Next →</a></div>
|
127
128
|
HTML
|
128
129
|
expected.strip!.gsub!(/\s{2,}/, ' ')
|
129
|
-
expected_dom =
|
130
|
-
|
130
|
+
expected_dom = parse_html_document(expected).root
|
131
|
+
|
131
132
|
html_document.root.should == expected_dom
|
132
133
|
end
|
133
134
|
|
@@ -137,7 +138,8 @@ describe WillPaginate::ActionView do
|
|
137
138
|
|
138
139
|
assert_select 'a[href]', 1 do |links|
|
139
140
|
query = links.first['href'].split('?', 2)[1]
|
140
|
-
query.
|
141
|
+
parts = query.gsub('&', '&').split('&').sort
|
142
|
+
parts.should == %w(page=2 tag=%3Cbr%3E)
|
141
143
|
end
|
142
144
|
end
|
143
145
|
|
@@ -355,6 +357,11 @@ describe WillPaginate::ActionView do
|
|
355
357
|
I18n.available_locales # triggers loading existing translations
|
356
358
|
I18n.backend.store_translations(:en, data)
|
357
359
|
end
|
360
|
+
|
361
|
+
# Normalizes differences between HTML::Document and Nokogiri::HTML
|
362
|
+
def text(node)
|
363
|
+
node.inner_text.gsub('→', '→').gsub('←', '←')
|
364
|
+
end
|
358
365
|
end
|
359
366
|
|
360
367
|
class AdditionalLinkAttributesRenderer < WillPaginate::ActionView::LinkRenderer
|
@@ -376,7 +383,7 @@ class DummyController
|
|
376
383
|
include Routes.url_helpers
|
377
384
|
|
378
385
|
def initialize
|
379
|
-
@request = DummyRequest.new
|
386
|
+
@request = DummyRequest.new(self)
|
380
387
|
end
|
381
388
|
|
382
389
|
def params
|
@@ -399,12 +406,17 @@ class DummyRequest
|
|
399
406
|
attr_accessor :symbolized_path_parameters
|
400
407
|
alias :path_parameters :symbolized_path_parameters
|
401
408
|
|
402
|
-
def initialize
|
409
|
+
def initialize(controller)
|
410
|
+
@controller = controller
|
403
411
|
@get = true
|
404
412
|
@params = {}
|
405
413
|
@symbolized_path_parameters = { :controller => 'foo', :action => 'bar' }
|
406
414
|
end
|
407
|
-
|
415
|
+
|
416
|
+
def routes
|
417
|
+
@controller._routes
|
418
|
+
end
|
419
|
+
|
408
420
|
def get?
|
409
421
|
@get
|
410
422
|
end
|
@@ -9,16 +9,24 @@ rescue LoadError
|
|
9
9
|
ensure
|
10
10
|
$stderr = STDERR
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
|
+
begin
|
14
|
+
require 'rails/dom/testing/assertions'
|
15
|
+
rescue LoadError
|
16
|
+
require 'action_dispatch/testing/assertions'
|
17
|
+
end
|
13
18
|
require 'will_paginate/array'
|
14
19
|
|
15
20
|
module ViewExampleGroup
|
16
21
|
|
17
|
-
|
22
|
+
if defined?(Rails::Dom::Testing::Assertions)
|
23
|
+
include Rails::Dom::Testing::Assertions::SelectorAssertions
|
24
|
+
else
|
25
|
+
include ActionDispatch::Assertions::SelectorAssertions
|
26
|
+
end
|
18
27
|
include MiniTest::Assertions if defined? MiniTest
|
19
28
|
|
20
29
|
def assert(value, message)
|
21
|
-
message = message.call if message.respond_to?(:call)
|
22
30
|
raise message unless value
|
23
31
|
end
|
24
32
|
|
@@ -40,11 +48,23 @@ module ViewExampleGroup
|
|
40
48
|
|
41
49
|
@render_output
|
42
50
|
end
|
43
|
-
|
51
|
+
|
52
|
+
def parse_html_document(html)
|
53
|
+
@html_document ||= if defined?(Rails::Dom::Testing::Assertions)
|
54
|
+
Nokogiri::HTML::Document.parse(html)
|
55
|
+
else
|
56
|
+
HTML::Document.new(html, true, false)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
44
60
|
def html_document
|
45
|
-
@html_document ||=
|
61
|
+
@html_document ||= parse_html_document(@render_output)
|
46
62
|
end
|
47
|
-
|
63
|
+
|
64
|
+
def document_root_element
|
65
|
+
html_document.root
|
66
|
+
end
|
67
|
+
|
48
68
|
def response_from_page_or_rjs
|
49
69
|
html_document.root
|
50
70
|
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:
|
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
|
@@ -98,7 +100,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
98
100
|
version: '0'
|
99
101
|
requirements: []
|
100
102
|
rubyforge_project:
|
101
|
-
rubygems_version: 2.
|
103
|
+
rubygems_version: 2.5.1
|
102
104
|
signing_key:
|
103
105
|
specification_version: 4
|
104
106
|
summary: Pagination plugin for web frameworks and other apps
|