will_paginate 3.0.7 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
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