will_paginate 3.0.pre4 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of will_paginate might be problematic. Click here for more details.
- data/README.md +61 -0
- data/Rakefile +19 -36
- data/lib/will_paginate.rb +16 -14
- data/lib/will_paginate/{finders/active_record.rb → active_record.rb} +66 -35
- data/lib/will_paginate/array.rb +5 -5
- data/lib/will_paginate/collection.rb +12 -36
- data/lib/will_paginate/core_ext.rb +0 -28
- data/lib/will_paginate/data_mapper.rb +91 -0
- data/lib/will_paginate/i18n.rb +22 -0
- data/lib/will_paginate/locale/en.yml +33 -0
- data/lib/will_paginate/page_number.rb +57 -0
- data/lib/will_paginate/per_page.rb +27 -0
- data/lib/will_paginate/railtie.rb +13 -4
- data/lib/will_paginate/sequel.rb +36 -0
- data/lib/will_paginate/version.rb +1 -1
- data/lib/will_paginate/view_helpers.rb +136 -22
- data/lib/will_paginate/view_helpers/action_view.rb +129 -117
- data/lib/will_paginate/view_helpers/link_renderer.rb +10 -11
- data/lib/will_paginate/view_helpers/link_renderer_base.rb +2 -8
- data/lib/will_paginate/view_helpers/merb.rb +20 -7
- data/lib/will_paginate/view_helpers/sinatra.rb +41 -0
- data/spec/ci.rb +29 -0
- data/spec/collection_spec.rb +7 -23
- data/spec/console +9 -1
- data/spec/console_fixtures.rb +1 -3
- data/spec/database.yml +10 -10
- data/spec/finders/active_record_spec.rb +82 -28
- data/spec/finders/activerecord_test_connector.rb +9 -1
- data/spec/finders/data_mapper_spec.rb +59 -48
- data/spec/finders/data_mapper_test_connector.rb +8 -1
- data/spec/finders/sequel_spec.rb +9 -3
- data/spec/fixtures/project.rb +2 -0
- data/spec/page_number_spec.rb +65 -0
- data/spec/per_page_spec.rb +41 -0
- data/spec/spec_helper.rb +5 -29
- data/spec/view_helpers/action_view_spec.rb +48 -32
- data/spec/view_helpers/base_spec.rb +59 -7
- data/spec/view_helpers/link_renderer_base_spec.rb +7 -12
- data/spec/view_helpers/view_example_group.rb +1 -0
- metadata +22 -23
- data/CHANGELOG.rdoc +0 -105
- data/README.rdoc +0 -111
- data/lib/will_paginate/deprecation.rb +0 -50
- data/lib/will_paginate/finders.rb +0 -9
- data/lib/will_paginate/finders/active_resource.rb +0 -51
- data/lib/will_paginate/finders/base.rb +0 -112
- data/lib/will_paginate/finders/data_mapper.rb +0 -30
- data/lib/will_paginate/finders/sequel.rb +0 -23
- data/lib/will_paginate/view_helpers/base.rb +0 -126
- data/spec/finders/active_resource_spec.rb +0 -52
- data/spec/finders_spec.rb +0 -76
data/spec/collection_spec.rb
CHANGED
@@ -29,17 +29,6 @@ describe WillPaginate::Collection do
|
|
29
29
|
result.size.should == 30
|
30
30
|
end
|
31
31
|
|
32
|
-
describe "old API" do
|
33
|
-
it "should fail with numeric params" do
|
34
|
-
Proc.new { [].paginate(2) }.should raise_error(ArgumentError)
|
35
|
-
Proc.new { [].paginate(2, 10) }.should raise_error(ArgumentError)
|
36
|
-
end
|
37
|
-
|
38
|
-
it "should fail with both options and numeric param" do
|
39
|
-
Proc.new { [].paginate({}, 5) }.should raise_error(ArgumentError)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
32
|
it "should give total_entries precedence over actual size" do
|
44
33
|
%w(a b c).paginate(:total_entries => 5).total_entries.should == 5
|
45
34
|
end
|
@@ -117,27 +106,22 @@ describe WillPaginate::Collection do
|
|
117
106
|
end
|
118
107
|
end
|
119
108
|
|
120
|
-
it "should raise WillPaginate::InvalidPage on invalid input" do
|
121
|
-
for bad_input in [0, -1, nil, '', 'Schnitzel']
|
122
|
-
Proc.new { create bad_input }.should raise_error(WillPaginate::InvalidPage)
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
it "should raise Argument error on invalid per_page setting" do
|
127
|
-
Proc.new { create(1, -1) }.should raise_error(ArgumentError)
|
128
|
-
end
|
129
|
-
|
130
109
|
it "should not respond to page_count anymore" do
|
131
110
|
Proc.new { create.page_count }.should raise_error(NoMethodError)
|
132
111
|
end
|
133
112
|
|
113
|
+
it "inherits per_page from global value" do
|
114
|
+
collection = described_class.new(1)
|
115
|
+
collection.per_page.should == 30
|
116
|
+
end
|
117
|
+
|
134
118
|
private
|
135
119
|
|
136
120
|
def create(page = 2, limit = 5, total = nil, &block)
|
137
121
|
if block_given?
|
138
|
-
|
122
|
+
described_class.create(page, limit, total, &block)
|
139
123
|
else
|
140
|
-
|
124
|
+
described_class.new(page, limit, total)
|
141
125
|
end
|
142
126
|
end
|
143
127
|
|
data/spec/console
CHANGED
@@ -1,4 +1,12 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
|
3
|
-
opts = %w[--simple-prompt -rirb/completion
|
3
|
+
opts = %w[ --simple-prompt -rirb/completion ]
|
4
|
+
if ARGV.include? '-dm'
|
5
|
+
opts << '-rwill_paginate/data_mapper' << '-rfinders/data_mapper_test_connector'
|
6
|
+
elsif ARGV.include? '-seq'
|
7
|
+
opts << '-rwill_paginate/sequel' << '-rfinders/sequel_test_connector'
|
8
|
+
else
|
9
|
+
opts << '-rconsole_fixtures'
|
10
|
+
end
|
11
|
+
|
4
12
|
exec 'bundle', 'exec', irb, '-Ilib:spec', *opts
|
data/spec/console_fixtures.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'bundler'
|
2
2
|
Bundler.setup
|
3
3
|
|
4
|
-
require 'will_paginate/
|
4
|
+
require 'will_paginate/active_record'
|
5
5
|
require 'finders/activerecord_test_connector'
|
6
6
|
|
7
7
|
ActiverecordTestConnector.setup
|
@@ -26,5 +26,3 @@ end
|
|
26
26
|
# load all fixtures
|
27
27
|
ActiverecordTestConnector::Fixtures.create_fixtures \
|
28
28
|
ActiverecordTestConnector::FIXTURES_PATH, ActiveRecord::Base.connection.tables
|
29
|
-
|
30
|
-
WillPaginate::Finders::ActiveRecord.enable!
|
data/spec/database.yml
CHANGED
@@ -3,20 +3,20 @@ sqlite3:
|
|
3
3
|
adapter: sqlite3
|
4
4
|
timeout: 500
|
5
5
|
|
6
|
-
sqlite2:
|
7
|
-
database: ":memory:"
|
8
|
-
adapter: sqlite2
|
9
|
-
|
10
6
|
mysql:
|
11
7
|
adapter: mysql
|
12
|
-
|
13
|
-
|
8
|
+
database: will_paginate
|
9
|
+
username:
|
10
|
+
encoding: utf8
|
11
|
+
|
12
|
+
mysql2:
|
13
|
+
adapter: mysql2
|
14
|
+
database: will_paginate
|
15
|
+
username:
|
14
16
|
encoding: utf8
|
15
|
-
database: will_paginate_unittest
|
16
17
|
|
17
18
|
postgres:
|
18
19
|
adapter: postgresql
|
19
|
-
|
20
|
-
|
21
|
-
database: will_paginate_unittest
|
20
|
+
database: will_paginate
|
21
|
+
username: postgres
|
22
22
|
min_messages: warning
|
@@ -1,11 +1,11 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'will_paginate/
|
2
|
+
require 'will_paginate/active_record'
|
3
3
|
require File.expand_path('../activerecord_test_connector', __FILE__)
|
4
|
-
ActiverecordTestConnector.setup
|
5
4
|
|
6
|
-
|
5
|
+
ActiverecordTestConnector.setup
|
6
|
+
abort unless ActiverecordTestConnector.able_to_connect
|
7
7
|
|
8
|
-
describe WillPaginate::
|
8
|
+
describe WillPaginate::ActiveRecord do
|
9
9
|
|
10
10
|
extend ActiverecordTestConnector::FixtureSetup
|
11
11
|
|
@@ -52,6 +52,19 @@ describe WillPaginate::Finders::ActiveRecord do
|
|
52
52
|
rel.per_page.should == 5
|
53
53
|
end
|
54
54
|
|
55
|
+
it "remembers pagination in sub-relations" do
|
56
|
+
rel = Topic.paginate(:page => 2, :per_page => 3)
|
57
|
+
lambda {
|
58
|
+
rel.total_entries.should == 4
|
59
|
+
}.should run_queries(1)
|
60
|
+
rel = rel.mentions_activerecord
|
61
|
+
rel.current_page.should == 2
|
62
|
+
rel.per_page.should == 3
|
63
|
+
lambda {
|
64
|
+
rel.total_entries.should == 1
|
65
|
+
}.should run_queries(1)
|
66
|
+
end
|
67
|
+
|
55
68
|
it "supports the page() method" do
|
56
69
|
rel = Developer.page('1').order('id')
|
57
70
|
rel.current_page.should == 1
|
@@ -81,13 +94,6 @@ describe WillPaginate::Finders::ActiveRecord do
|
|
81
94
|
end
|
82
95
|
|
83
96
|
describe "counting" do
|
84
|
-
it "should not accept :count parameter" do
|
85
|
-
pending
|
86
|
-
lambda {
|
87
|
-
User.paginate :page => 1, :count => {}
|
88
|
-
}.should raise_error(ArgumentError)
|
89
|
-
end
|
90
|
-
|
91
97
|
it "should guess the total count" do
|
92
98
|
lambda {
|
93
99
|
topics = Topic.paginate :page => 2, :per_page => 3
|
@@ -101,6 +107,64 @@ describe WillPaginate::Finders::ActiveRecord do
|
|
101
107
|
topics.total_entries.should == 0
|
102
108
|
}.should run_queries(1)
|
103
109
|
end
|
110
|
+
|
111
|
+
it "forgets count in sub-relations" do
|
112
|
+
lambda {
|
113
|
+
topics = Topic.paginate :page => 1, :per_page => 3
|
114
|
+
topics.total_entries.should == 4
|
115
|
+
topics.where('1 = 1').total_entries.should == 4
|
116
|
+
}.should run_queries(2)
|
117
|
+
end
|
118
|
+
|
119
|
+
it "remembers custom count options in sub-relations" do
|
120
|
+
topics = Topic.paginate :page => 1, :per_page => 3, :count => {:conditions => "title LIKE '%futurama%'"}
|
121
|
+
topics.total_entries.should == 1
|
122
|
+
topics.length.should == 3
|
123
|
+
lambda {
|
124
|
+
topics.order('id').total_entries.should == 1
|
125
|
+
}.should run_queries(1)
|
126
|
+
end
|
127
|
+
|
128
|
+
it "supports empty? method" do
|
129
|
+
topics = Topic.paginate :page => 1, :per_page => 3
|
130
|
+
lambda {
|
131
|
+
topics.should_not be_empty
|
132
|
+
}.should run_queries(1)
|
133
|
+
end
|
134
|
+
|
135
|
+
it "overrides total_entries count with a fixed value" do
|
136
|
+
lambda {
|
137
|
+
topics = Topic.paginate :page => 1, :per_page => 3, :total_entries => 999
|
138
|
+
topics.total_entries.should == 999
|
139
|
+
# value is kept even in sub-relations
|
140
|
+
topics.where('1 = 1').total_entries.should == 999
|
141
|
+
}.should run_queries(0)
|
142
|
+
end
|
143
|
+
|
144
|
+
it "supports a non-int for total_entries" do
|
145
|
+
topics = Topic.paginate :page => 1, :per_page => 3, :total_entries => "999"
|
146
|
+
topics.total_entries.should == 999
|
147
|
+
end
|
148
|
+
|
149
|
+
it "removes :include for count" do
|
150
|
+
lambda {
|
151
|
+
developers = Developer.paginate(:page => 1, :per_page => 1).includes(:projects)
|
152
|
+
developers.total_entries.should == 11
|
153
|
+
$query_sql.last.should_not =~ /\bJOIN\b/
|
154
|
+
}.should run_queries(1)
|
155
|
+
end
|
156
|
+
|
157
|
+
it "keeps :include for count when they are referenced in :conditions" do
|
158
|
+
developers = Developer.paginate(:page => 1, :per_page => 1).includes(:projects)
|
159
|
+
with_condition = developers.where('projects.id > 1')
|
160
|
+
with_condition.total_entries.should == 1
|
161
|
+
|
162
|
+
$query_sql.last.should =~ /\bJOIN\b/
|
163
|
+
end
|
164
|
+
|
165
|
+
it "should count with group" do
|
166
|
+
Developer.group(:salary).page(1).total_entries.should == 4
|
167
|
+
end
|
104
168
|
end
|
105
169
|
|
106
170
|
it "should not ignore :select parameter when it says DISTINCT" do
|
@@ -222,23 +286,6 @@ describe WillPaginate::Finders::ActiveRecord do
|
|
222
286
|
result.total_entries.should == 4
|
223
287
|
end
|
224
288
|
|
225
|
-
it "should remove :include for count" do
|
226
|
-
lambda {
|
227
|
-
Developer.paginate(:page => 1, :per_page => 1, :include => :projects).to_a
|
228
|
-
$query_sql.last.should_not =~ /\bJOIN\b/
|
229
|
-
}.should run_queries(3..4)
|
230
|
-
end
|
231
|
-
|
232
|
-
it "should keep :include for count when they are referenced in :conditions" do
|
233
|
-
Developer.paginate(
|
234
|
-
:page => 1, :per_page => 1,
|
235
|
-
:include => :projects,
|
236
|
-
:conditions => 'projects.id > 2'
|
237
|
-
).to_a
|
238
|
-
|
239
|
-
$query_sql.last.should =~ /\bJOIN\b/
|
240
|
-
end
|
241
|
-
|
242
289
|
describe "associations" do
|
243
290
|
it "should paginate with include" do
|
244
291
|
project = projects(:active_record)
|
@@ -395,6 +442,13 @@ describe WillPaginate::Finders::ActiveRecord do
|
|
395
442
|
Developer.paginate((1..8).to_a, :per_page => 3, :page => 2, :order => 'id')
|
396
443
|
}.should raise_error(ArgumentError)
|
397
444
|
end
|
445
|
+
|
446
|
+
it "errors out for invalid values" do |variable|
|
447
|
+
lambda {
|
448
|
+
# page that results in an offset larger than BIGINT
|
449
|
+
Project.page(307445734561825862)
|
450
|
+
}.should raise_error(WillPaginate::InvalidPage, "invalid offset: 9223372036854775830")
|
451
|
+
end
|
398
452
|
|
399
453
|
protected
|
400
454
|
|
@@ -5,7 +5,14 @@ require 'active_support/multibyte' # needed for Ruby 1.9.1
|
|
5
5
|
$query_count = 0
|
6
6
|
$query_sql = []
|
7
7
|
|
8
|
-
ignore_sql =
|
8
|
+
ignore_sql = /
|
9
|
+
^(
|
10
|
+
PRAGMA | SHOW\ max_identifier_length |
|
11
|
+
SELECT\ (currval|CAST|@@IDENTITY|@@ROWCOUNT) |
|
12
|
+
SHOW\ (FIELDS|TABLES)
|
13
|
+
)\b |
|
14
|
+
\bFROM\ (sqlite_master|pg_tables|pg_attribute)\b
|
15
|
+
/x
|
9
16
|
|
10
17
|
ActiveSupport::Notifications.subscribe(/^sql\./) do |*args|
|
11
18
|
payload = args.last
|
@@ -60,6 +67,7 @@ module ActiverecordTestConnector
|
|
60
67
|
|
61
68
|
ActiveRecord::Base.configurations = { db => configuration }
|
62
69
|
ActiveRecord::Base.establish_connection(db)
|
70
|
+
ActiveRecord::Base.default_timezone = :utc
|
63
71
|
end
|
64
72
|
|
65
73
|
def load_schema
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
begin
|
4
|
-
require 'will_paginate/
|
4
|
+
require 'will_paginate/data_mapper'
|
5
5
|
require File.expand_path('../data_mapper_test_connector', __FILE__)
|
6
6
|
rescue LoadError => error
|
7
7
|
warn "Error running DataMapper specs: #{error.message}"
|
@@ -10,59 +10,70 @@ else
|
|
10
10
|
datamapper_loaded = true
|
11
11
|
end
|
12
12
|
|
13
|
-
describe WillPaginate::
|
14
|
-
|
15
|
-
it "
|
16
|
-
Animal.should
|
13
|
+
describe WillPaginate::DataMapper do
|
14
|
+
|
15
|
+
it "has per_page" do
|
16
|
+
Animal.per_page.should == 30
|
17
|
+
begin
|
18
|
+
Animal.per_page = 10
|
19
|
+
Animal.per_page.should == 10
|
20
|
+
|
21
|
+
subclass = Class.new(Animal)
|
22
|
+
subclass.per_page.should == 10
|
23
|
+
ensure
|
24
|
+
Animal.per_page = 30
|
25
|
+
end
|
17
26
|
end
|
18
|
-
|
19
|
-
it "
|
20
|
-
Animal.
|
21
|
-
Animal.paginate(:page => 1, :per_page => 5)
|
27
|
+
|
28
|
+
it "doesn't make normal collections appear paginated" do
|
29
|
+
Animal.all.should_not be_paginated
|
22
30
|
end
|
23
|
-
|
24
|
-
it "
|
25
|
-
Animal.
|
31
|
+
|
32
|
+
it "paginates to first page by default" do
|
33
|
+
animals = Animal.paginate(:page => nil)
|
34
|
+
|
35
|
+
animals.should be_paginated
|
36
|
+
animals.current_page.should == 1
|
37
|
+
animals.per_page.should == 30
|
38
|
+
animals.offset.should == 0
|
39
|
+
animals.total_entries.should == 3
|
40
|
+
animals.total_pages.should == 1
|
26
41
|
end
|
27
|
-
|
28
|
-
it "
|
29
|
-
Animal.
|
30
|
-
|
42
|
+
|
43
|
+
it "paginates to first page, explicit limit" do
|
44
|
+
animals = Animal.paginate(:page => 1, :per_page => 2)
|
45
|
+
|
46
|
+
animals.current_page.should == 1
|
47
|
+
animals.per_page.should == 2
|
48
|
+
animals.total_entries.should == 3
|
49
|
+
animals.total_pages.should == 2
|
50
|
+
animals.map {|a| a.name }.should == %w[ Dog Cat ]
|
31
51
|
end
|
32
|
-
|
33
|
-
it "
|
34
|
-
|
35
|
-
|
36
|
-
|
52
|
+
|
53
|
+
it "paginates to second page" do
|
54
|
+
animals = Animal.paginate(:page => 2, :per_page => 2)
|
55
|
+
|
56
|
+
animals.current_page.should == 2
|
57
|
+
animals.offset.should == 2
|
58
|
+
animals.map {|a| a.name }.should == %w[ Lion ]
|
37
59
|
end
|
38
|
-
|
39
|
-
it "
|
40
|
-
Animal.
|
41
|
-
|
42
|
-
|
43
|
-
Animal.paginate :name => 'Dog', :page => 1, :per_page => 4
|
60
|
+
|
61
|
+
it "paginates a collection" do
|
62
|
+
friends = Animal.all(:notes.like => '%friend%')
|
63
|
+
friends.paginate(:page => 1).per_page.should == 30
|
64
|
+
friends.paginate(:page => 1, :per_page => 1).total_entries.should == 2
|
44
65
|
end
|
45
66
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
result.total_entries.should == 6
|
57
|
-
end
|
58
|
-
|
59
|
-
it "should guess that there are no records" do
|
60
|
-
Animal.expects(:all).returns([])
|
61
|
-
Animal.expects(:count).never
|
62
|
-
|
63
|
-
result = Animal.paginate :page => 1, :per_page => 4
|
64
|
-
result.total_entries.should == 0
|
65
|
-
end
|
67
|
+
it "paginates a limited collection" do
|
68
|
+
animals = Animal.all(:limit => 2).paginate(:page => 1)
|
69
|
+
animals.per_page.should == 2
|
70
|
+
end
|
71
|
+
|
72
|
+
it "has page() method" do
|
73
|
+
Animal.page(2).per_page.should == 30
|
74
|
+
Animal.page(2).offset.should == 30
|
75
|
+
Animal.page(2).current_page.should == 2
|
76
|
+
Animal.all(:limit => 2).page(2).per_page.should == 2
|
66
77
|
end
|
67
|
-
|
78
|
+
|
68
79
|
end if datamapper_loaded
|
@@ -1,4 +1,6 @@
|
|
1
|
+
require 'sqlite3'
|
1
2
|
require 'dm-core'
|
3
|
+
require 'dm-core/support/logger'
|
2
4
|
require 'dm-migrations'
|
3
5
|
|
4
6
|
DataMapper.setup :default, 'sqlite3::memory:'
|
@@ -19,4 +21,9 @@ end
|
|
19
21
|
|
20
22
|
# Load fixtures
|
21
23
|
Animal.auto_migrate!
|
22
|
-
Animal.setup
|
24
|
+
Animal.setup
|
25
|
+
|
26
|
+
if 'irb' == $0
|
27
|
+
DataMapper.logger.set_log($stdout, :debug)
|
28
|
+
DataMapper.logger.auto_flush = true
|
29
|
+
end
|
data/spec/finders/sequel_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
begin
|
4
|
-
require 'will_paginate/
|
4
|
+
require 'will_paginate/sequel'
|
5
5
|
require File.expand_path('../sequel_test_connector', __FILE__)
|
6
6
|
rescue LoadError, ArgumentError => error
|
7
7
|
warn "Error running Sequel specs: #{error.message}"
|
@@ -33,17 +33,23 @@ describe Sequel::Dataset::Pagination, 'extension' do
|
|
33
33
|
it "should imitate WillPaginate::Collection" do
|
34
34
|
result = Car.paginate(1, 2)
|
35
35
|
|
36
|
+
result.should_not be_empty
|
37
|
+
result.size.should == 2
|
38
|
+
result.length.should == 2
|
36
39
|
result.total_entries.should == 3
|
37
40
|
result.total_pages.should == 2
|
38
41
|
result.per_page.should == 2
|
39
42
|
result.current_page.should == 1
|
40
|
-
result.previous_page.should be_nil
|
41
|
-
result.next_page.should == 2
|
42
43
|
end
|
43
44
|
|
44
45
|
it "should perform" do
|
45
46
|
Car.paginate(1, 2).all.should == [Car[1], Car[2]]
|
46
47
|
end
|
48
|
+
|
49
|
+
it "should be empty" do
|
50
|
+
result = Car.paginate(3, 2)
|
51
|
+
result.should be_empty
|
52
|
+
end
|
47
53
|
|
48
54
|
it "should perform with #select and #order" do
|
49
55
|
result = Car.select("name as foo".lit).order(:name).paginate(1, 2).all
|