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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1868f72daf66f8ede4a9253c2b09f8f31b139491
4
- data.tar.gz: 6c3e2f25535acb3ec0be32c3352d4007405debf8
3
+ metadata.gz: b3445d24047dd419909e314bc5f1b9eb3fdb7f73
4
+ data.tar.gz: 2e6ce5705bc95b523bdd8a7ffa9d8e0b35acc36f
5
5
  SHA512:
6
- metadata.gz: 3ca8c0a4b2e6f3be74b770618fc46f54a729171936b5e39c46425b8c9e48aa61701713825a6a6ab973a93c732886f582366878235624901d06119f94a7ba675d
7
- data.tar.gz: 1127948955580aa81cdaeea1e028f0abec34743e1047bfd659c3152d372bb41299ff7336710b8ef77aeb885b53241f077e93be90e000a1feeb6e602b72447607
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.uniqpath.com/will_paginate/
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, :wp_count_options
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
- count_options = options.delete(:count)
165
- options.delete(:page)
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
- all(options).page(pagenum)
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?
@@ -10,7 +10,7 @@ module WillPaginate::Deprecation
10
10
  private
11
11
 
12
12
  def rails_logger
13
- defined?(Rails) && Rails.logger
13
+ defined?(Rails.logger) && Rails.logger
14
14
  end
15
15
 
16
16
  def origin_of_call(stack)
@@ -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.railties_load_path.unshift(*WillPaginate::I18n.load_path)
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 { alias_method_chain :status_code, :paginate }
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) &&
@@ -1,8 +1,8 @@
1
1
  module WillPaginate #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 3
4
- MINOR = 0
5
- TINY = 7
4
+ MINOR = 1
5
+ TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -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 == topics(:ar)
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, :order => 'projects.name')
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.find(:all, :order => 'projects.id', :limit => 4)
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.paginate(:page => 1, :joins => join_sql, :conditions => 'project_id = 1')
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, :joins => join_sql,
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.paginate(:page => 1, :per_page => 10,
441
- :group => 'salary', :select => 'salary', :order => 'salary').to_a
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
@@ -1,3 +1,3 @@
1
1
  class Admin < User
2
- has_many :companies, :finder_sql => 'SELECT * FROM companies'
2
+ has_many :companies
3
3
  end
@@ -1,12 +1,5 @@
1
1
  class Developer < User
2
- has_and_belongs_to_many :projects, :order => 'projects.name', :join_table => 'developers_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')
@@ -1,5 +1,5 @@
1
1
  class Project < ActiveRecord::Base
2
- has_and_belongs_to_many :developers, :uniq => true, :join_table => 'developers_projects'
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})',
@@ -3,23 +3,41 @@ require 'will_paginate/page_number'
3
3
 
4
4
  describe WillPaginate::PageNumber do
5
5
  describe "valid" do
6
- subject { described_class.new('12', 'page') }
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 { should eq(12) }
9
- its(:inspect) { should eq('page 12') }
10
- it { should be_a(WillPaginate::PageNumber) }
11
- it { should be_instance_of(WillPaginate::PageNumber) }
12
- it { should be_a(Numeric) }
13
- it { should be_a(Fixnum) }
14
- it { should_not be_instance_of(Fixnum) }
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 === subject).should be
35
+ (WillPaginate::PageNumber === num).should be
18
36
  end
19
37
 
20
38
  it "passes the Numeric=== type check" do |variable|
21
- (Numeric === subject).should be
22
- (Fixnum === subject).should be
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
- assert_select elements.last, ':last-child', "Next &#8594;"
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', '&#8592; Previous'
55
59
  assert_select 'em.current', '1'
56
- pagination.first.inner_text.should == '&#8592; Previous 1 2 3 Next &#8594;'
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
- assert_select elements[1], 'a', '1' do |link|
79
- link.first['rel'].should == 'prev start'
80
- end
81
- assert_select elements.first, 'a', "Prev" do |link|
82
- link.first['rel'].should == 'prev start'
83
- end
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 &#8594;</a></div>
127
128
  HTML
128
129
  expected.strip!.gsub!(/\s{2,}/, ' ')
129
- expected_dom = HTML::Document.new(expected).root
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.split('&amp;').sort.should == %w(page=2 tag=%3Cbr%3E)
141
+ parts = query.gsub('&amp;', '&').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('&#8594;', '→').gsub('&#8592;', '←')
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
@@ -10,6 +10,7 @@ describe WillPaginate::ViewHelpers do
10
10
  before(:all) do
11
11
  # make sure default translations aren't loaded
12
12
  I18n.load_path.clear
13
+ I18n.enforce_available_locales = false
13
14
  end
14
15
 
15
16
  before(:each) do
@@ -9,16 +9,24 @@ rescue LoadError
9
9
  ensure
10
10
  $stderr = STDERR
11
11
  end
12
- require 'action_dispatch/testing/assertions'
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
- include ActionDispatch::Assertions::SelectorAssertions
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 ||= HTML::Document.new(@render_output, true, false)
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.7
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: 2014-07-04 00:00:00.000000000 Z
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.2.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