api-pagination 4.2.0 → 4.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/api-pagination.rb +22 -2
- data/lib/api-pagination/configuration.rb +27 -0
- data/lib/api-pagination/version.rb +1 -1
- data/lib/grape/pagination.rb +3 -2
- data/lib/rails/pagination.rb +5 -2
- data/spec/rails_spec.rb +119 -0
- data/spec/support/numbers_controller.rb +9 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 48cb5f06eb2928aab44c8b41c50ad8ac87d8907f
|
4
|
+
data.tar.gz: f4f14870f987d37dfe508217a27ee9905de4137e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d159ecc56ea17eeb912638cccb5db3d8d9e188ea7939fb6f4254aaa1f7912b6341ae3d78d9657ae985f6c4d0f56e47c3d40704c0403d47d629f424604cb48540
|
7
|
+
data.tar.gz: a87c54ba5f0bc1761efc5fdf793df7b19d60a7bef57cf41d5b778aef31ace3712aef4ebed963600211c116505ec3050f91849557998c9af8d81dc0934e6b744c
|
data/lib/api-pagination.rb
CHANGED
@@ -45,7 +45,7 @@ module ApiPagination
|
|
45
45
|
if Kaminari.config.max_per_page && options[:per_page] > Kaminari.config.max_per_page
|
46
46
|
options[:per_page] = Kaminari.config.max_per_page
|
47
47
|
elsif options[:per_page] <= 0
|
48
|
-
options[:per_page] =
|
48
|
+
options[:per_page] = get_default_per_page_for_kaminari(collection)
|
49
49
|
end
|
50
50
|
|
51
51
|
collection = Kaminari.paginate_array(collection, paginate_array_options) if collection.is_a?(Array)
|
@@ -53,7 +53,9 @@ module ApiPagination
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def paginate_with_will_paginate(collection, options)
|
56
|
-
|
56
|
+
if options[:per_page] <= 0
|
57
|
+
options[:per_page] = default_per_page_for_will_paginate(collection)
|
58
|
+
end
|
57
59
|
|
58
60
|
if defined?(Sequel::Dataset) && collection.kind_of?(Sequel::Dataset)
|
59
61
|
collection.paginate(options[:page], options[:per_page])
|
@@ -61,6 +63,24 @@ module ApiPagination
|
|
61
63
|
collection.paginate(:page => options[:page], :per_page => options[:per_page])
|
62
64
|
end
|
63
65
|
end
|
66
|
+
|
67
|
+
def get_default_per_page_for_kaminari(collection)
|
68
|
+
default = Kaminari.config.default_per_page
|
69
|
+
detect_model(collection).default_per_page || default
|
70
|
+
rescue
|
71
|
+
default
|
72
|
+
end
|
73
|
+
|
74
|
+
def default_per_page_for_will_paginate(collection)
|
75
|
+
default = WillPaginate.per_page
|
76
|
+
detect_model(collection).per_page || default
|
77
|
+
rescue
|
78
|
+
default
|
79
|
+
end
|
80
|
+
|
81
|
+
def detect_model(collection)
|
82
|
+
collection.first.class
|
83
|
+
end
|
64
84
|
end
|
65
85
|
end
|
66
86
|
|
@@ -19,6 +19,33 @@ module ApiPagination
|
|
19
19
|
@include_total = true
|
20
20
|
end
|
21
21
|
|
22
|
+
['page', 'per_page'].each do |param_name|
|
23
|
+
method_name = "#{param_name}_param"
|
24
|
+
instance_variable_name = "@#{method_name}"
|
25
|
+
|
26
|
+
define_method method_name do |params = nil, &block|
|
27
|
+
if block.is_a?(Proc)
|
28
|
+
instance_variable_set(instance_variable_name, block)
|
29
|
+
return
|
30
|
+
end
|
31
|
+
|
32
|
+
if instance_variable_get(instance_variable_name).nil?
|
33
|
+
# use :page & :per_page by default
|
34
|
+
instance_variable_set(instance_variable_name, (lambda { |p| p[param_name.to_sym] }))
|
35
|
+
end
|
36
|
+
|
37
|
+
instance_variable_get(instance_variable_name).call(params)
|
38
|
+
end
|
39
|
+
|
40
|
+
define_method "#{method_name}=" do |param|
|
41
|
+
if param.is_a?(Symbol) || param.is_a?(String)
|
42
|
+
instance_variable_set(instance_variable_name, (lambda { |params| params[param] }))
|
43
|
+
else
|
44
|
+
raise ArgumentError, "Cannot set page_param option"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
22
49
|
def paginator
|
23
50
|
@paginator || set_paginator
|
24
51
|
end
|
data/lib/grape/pagination.rb
CHANGED
@@ -3,9 +3,10 @@ module Grape
|
|
3
3
|
def self.included(base)
|
4
4
|
Grape::Endpoint.class_eval do
|
5
5
|
def paginate(collection)
|
6
|
-
per_page = params
|
6
|
+
per_page = ApiPagination.config.per_page_param(params) || route_setting(:per_page)
|
7
|
+
|
7
8
|
options = {
|
8
|
-
:page => params
|
9
|
+
:page => ApiPagination.config.page_param(params),
|
9
10
|
:per_page => [per_page, route_setting(:max_per_page)].compact.min
|
10
11
|
}
|
11
12
|
collection = ApiPagination.paginate(collection, options)
|
data/lib/rails/pagination.rb
CHANGED
@@ -25,8 +25,11 @@ module Rails
|
|
25
25
|
|
26
26
|
def _paginate_collection(collection, options={})
|
27
27
|
options = {
|
28
|
-
:page => params
|
29
|
-
:per_page => (
|
28
|
+
:page => ApiPagination.config.page_param(params),
|
29
|
+
:per_page => (
|
30
|
+
options.delete(:per_page) ||
|
31
|
+
ApiPagination.config.per_page_param(params)
|
32
|
+
)
|
30
33
|
}
|
31
34
|
collection = ApiPagination.paginate(collection, options)
|
32
35
|
|
data/spec/rails_spec.rb
CHANGED
@@ -123,5 +123,124 @@ describe NumbersController, :type => :controller do
|
|
123
123
|
|
124
124
|
after { ApiPagination.config.include_total = true }
|
125
125
|
end
|
126
|
+
|
127
|
+
context 'custom page param' do
|
128
|
+
context 'page_param as a symbol' do
|
129
|
+
before do
|
130
|
+
ApiPagination.config.page_param = :foo
|
131
|
+
ApiPagination.config.page_header = 'Page'
|
132
|
+
end
|
133
|
+
|
134
|
+
after do
|
135
|
+
ApiPagination.config.page_param = :page
|
136
|
+
ApiPagination.config.page_header = nil
|
137
|
+
end
|
138
|
+
|
139
|
+
it 'should work' do
|
140
|
+
get :index, :foo => 2, :count => 100
|
141
|
+
|
142
|
+
expect(response.header['Page']).to eq('2')
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
context 'page_param as a block' do
|
147
|
+
before do
|
148
|
+
ApiPagination.config.page_param do |params|
|
149
|
+
params[:foo][:bar]
|
150
|
+
end
|
151
|
+
|
152
|
+
ApiPagination.config.page_header = 'Page'
|
153
|
+
end
|
154
|
+
|
155
|
+
after do
|
156
|
+
ApiPagination.config.page_param = :page
|
157
|
+
ApiPagination.config.page_header = nil
|
158
|
+
end
|
159
|
+
|
160
|
+
it 'should work' do
|
161
|
+
get :index, :foo => { :bar => 2 }, :count => 100
|
162
|
+
|
163
|
+
expect(response.header['Page']).to eq('2')
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
context 'custom per_page param' do
|
169
|
+
context 'per_page_param as a symbol' do
|
170
|
+
before do
|
171
|
+
ApiPagination.config.per_page_param = :foo
|
172
|
+
end
|
173
|
+
|
174
|
+
after do
|
175
|
+
ApiPagination.config.per_page_param = :per_page
|
176
|
+
end
|
177
|
+
|
178
|
+
it 'should work' do
|
179
|
+
get :index_with_no_per_page, :foo => 2, :count => 100
|
180
|
+
|
181
|
+
expect(response.header['Per-Page']).to eq('2')
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
context 'page_param as a block' do
|
186
|
+
before do
|
187
|
+
ApiPagination.config.per_page_param do |params|
|
188
|
+
params[:foo][:bar]
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
after do
|
193
|
+
ApiPagination.config.per_page_param = :per_page
|
194
|
+
end
|
195
|
+
|
196
|
+
it 'should work' do
|
197
|
+
get :index_with_no_per_page, :foo => { :bar => 2 }, :count => 100
|
198
|
+
|
199
|
+
expect(response.header['Per-Page']).to eq('2')
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
context 'default per page in model' do
|
205
|
+
before do
|
206
|
+
class Fixnum
|
207
|
+
@default_per_page = 6
|
208
|
+
@per_page = 6
|
209
|
+
|
210
|
+
class << self
|
211
|
+
attr_accessor :default_per_page, :per_page
|
212
|
+
end
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
after do
|
217
|
+
class Fixnum
|
218
|
+
@default_per_page = 25
|
219
|
+
@per_page = 25
|
220
|
+
end
|
221
|
+
end
|
222
|
+
|
223
|
+
it 'should use default per page from model' do
|
224
|
+
get :index_with_no_per_page, count: 100
|
225
|
+
|
226
|
+
expect(response.header['Per-Page']).to eq('6')
|
227
|
+
end
|
228
|
+
|
229
|
+
it 'should not fail if model does not respond to per page' do
|
230
|
+
class Fixnum
|
231
|
+
@default_per_page = nil
|
232
|
+
@per_page = nil
|
233
|
+
end
|
234
|
+
|
235
|
+
get :index_with_no_per_page, count: 100
|
236
|
+
|
237
|
+
expect(response.header['Per-Page']).to eq(
|
238
|
+
case ApiPagination.config.paginator
|
239
|
+
when :kaminari then Kaminari.config.default_per_page.to_s
|
240
|
+
when :will_paginate then WillPaginate.per_page.to_s
|
241
|
+
end
|
242
|
+
)
|
243
|
+
end
|
244
|
+
end
|
126
245
|
end
|
127
246
|
end
|
@@ -41,6 +41,7 @@ end
|
|
41
41
|
Rails.application.routes.draw do
|
42
42
|
resources :numbers, :only => [:index] do
|
43
43
|
get :index_with_custom_render, on: :collection
|
44
|
+
get :index_with_no_per_page, on: :collection
|
44
45
|
end
|
45
46
|
end
|
46
47
|
|
@@ -76,4 +77,12 @@ class NumbersController < ActionController::Base
|
|
76
77
|
|
77
78
|
render json: NumbersSerializer.new(numbers)
|
78
79
|
end
|
80
|
+
|
81
|
+
def index_with_no_per_page
|
82
|
+
total = params.fetch(:count).to_i
|
83
|
+
numbers = (1..total).to_a
|
84
|
+
numbers = paginate numbers
|
85
|
+
|
86
|
+
render json: NumbersSerializer.new(numbers)
|
87
|
+
end
|
79
88
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: api-pagination
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Celis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-03-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|