api-pagination 4.1.1 → 4.2.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: a5be5003544e0eb53e5149d0ce0e1062f081834a
4
- data.tar.gz: b3df8c7d6d0fd12721c32283a27c1f5c05b40ab6
3
+ metadata.gz: e8bc41a88d9698b56c9329d03b153e4a26359a89
4
+ data.tar.gz: 5b12ab2abac9d7fa0ad8569b7c80811c35cc3d7c
5
5
  SHA512:
6
- metadata.gz: 2a1b6e4a3cac799cfc8da269937defa9e309001502e156a66b571eaa465f67fd1681ab443c43eeac1c63d1ee39c03e8c77561136e9295da58f31dafa4b04c119
7
- data.tar.gz: ed859205ed82ea72ac784e658ad25d5c92d55d0d47a5a34e745f0903b9ddb3708dff75117f2b46bc13b6f598ffb32b0124aaec989e025b33433048a2133933be
6
+ metadata.gz: 04d2fe7e9d7df6f1b5bf3ca3e623594d9f01934ec8aaf98147fd759a196a5c778d4fda5946e38ab5b1164d68db0b9d641b6473b23bb90b1ed54abc068f44687a
7
+ data.tar.gz: 02c3c45d64667438376d0243ab3671d36f1e0f6360881c1a37398e35a25a4252a7653b0bce98cce739aefc7e228c7eb430895ba4f60be7fb1591ba4bb88b8d28
@@ -10,7 +10,7 @@ module ApiPagination
10
10
 
11
11
  case ApiPagination.config.paginator
12
12
  when :kaminari
13
- paginate_with_kaminari(collection, options)
13
+ paginate_with_kaminari(collection, options, options[:paginate_array_options] || {})
14
14
  when :will_paginate
15
15
  paginate_with_will_paginate(collection, options)
16
16
  else
@@ -39,31 +39,16 @@ module ApiPagination
39
39
  end
40
40
  end
41
41
 
42
- def paginator
43
- warn "[DEPRECATION] ApiPagination.paginator is deprecated. Please use ApiPagination.config.paginator"
44
- config.paginator
45
- end
46
-
47
- def per_page_header
48
- warn "[DEPRECATION] ApiPagination.paginator is deprecated. Please use ApiPagination.config.per_page_header"
49
- config.per_page_header
50
- end
51
-
52
- def total_header
53
- warn "[DEPRECATION] ApiPagination.paginator is deprecated. Please use ApiPagination.config.total_header"
54
- config.total_header
55
- end
56
-
57
42
  private
58
43
 
59
- def paginate_with_kaminari(collection, options)
44
+ def paginate_with_kaminari(collection, options, paginate_array_options = {})
60
45
  if Kaminari.config.max_per_page && options[:per_page] > Kaminari.config.max_per_page
61
46
  options[:per_page] = Kaminari.config.max_per_page
62
47
  elsif options[:per_page] <= 0
63
48
  options[:per_page] = Kaminari.config.default_per_page
64
49
  end
65
50
 
66
- collection = Kaminari.paginate_array(collection) if collection.is_a?(Array)
51
+ collection = Kaminari.paginate_array(collection, paginate_array_options) if collection.is_a?(Array)
67
52
  collection.page(options[:page]).per(options[:per_page])
68
53
  end
69
54
 
@@ -4,6 +4,10 @@ module ApiPagination
4
4
 
5
5
  attr_accessor :per_page_header
6
6
 
7
+ attr_accessor :page_header
8
+
9
+ attr_accessor :include_total
10
+
7
11
  def configure(&block)
8
12
  yield self
9
13
  end
@@ -11,6 +15,8 @@ module ApiPagination
11
15
  def initialize
12
16
  @total_header = 'Total'
13
17
  @per_page_header = 'Per-Page'
18
+ @page_header = nil
19
+ @include_total = true
14
20
  end
15
21
 
16
22
  def paginator
@@ -1,8 +1,8 @@
1
1
  module ApiPagination
2
2
  class Version
3
3
  MAJOR = 4
4
- MINOR = 1
5
- PATCH = 1
4
+ MINOR = 2
5
+ PATCH = 0
6
6
 
7
7
  def self.to_s
8
8
  [MAJOR, MINOR, PATCH].join('.')
@@ -15,17 +15,20 @@ module Grape
15
15
  pages = ApiPagination.pages_from(collection)
16
16
 
17
17
  pages.each do |k, v|
18
- old_params = Rack::Utils.parse_query(request.query_string)
18
+ old_params = Rack::Utils.parse_nested_query(request.query_string)
19
19
  new_params = old_params.merge('page' => v)
20
20
  links << %(<#{url}?#{new_params.to_param}>; rel="#{k}")
21
21
  end
22
22
 
23
23
  total_header = ApiPagination.config.total_header
24
24
  per_page_header = ApiPagination.config.per_page_header
25
+ page_header = ApiPagination.config.page_header
26
+ include_total = ApiPagination.config.include_total
25
27
 
26
28
  header 'Link', links.join(', ') unless links.empty?
27
- header total_header, ApiPagination.total_from(collection)
29
+ header total_header, ApiPagination.total_from(collection) if include_total
28
30
  header per_page_header, options[:per_page].to_s
31
+ header page_header, options[:page].to_s unless page_header.nil?
29
32
 
30
33
  return collection
31
34
  end
@@ -33,7 +36,7 @@ module Grape
33
36
 
34
37
  base.class_eval do
35
38
  def self.paginate(options = {})
36
- route_setting :per_page, (options[:per_page] || 25)
39
+ route_setting :per_page, options[:per_page]
37
40
  route_setting :max_per_page, options[:max_per_page]
38
41
  params do
39
42
  optional :page, :type => Integer, :default => 1,
@@ -41,10 +41,13 @@ module Rails
41
41
 
42
42
  total_header = ApiPagination.config.total_header
43
43
  per_page_header = ApiPagination.config.per_page_header
44
+ page_header = ApiPagination.config.page_header
45
+ include_total = ApiPagination.config.include_total
44
46
 
45
47
  headers['Link'] = links.join(', ') unless links.empty?
46
- headers[total_header] = ApiPagination.total_from(collection)
48
+ headers[total_header] = ApiPagination.total_from(collection) if include_total
47
49
  headers[per_page_header] = options[:per_page].to_s
50
+ headers[page_header] = options[:page].to_s unless page_header.nil?
48
51
 
49
52
  return collection
50
53
  end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ describe ApiPagination do
4
+ let(:collection) { (1..100).to_a }
5
+ let(:paginate_array_options) { { total_count: 1000 } }
6
+
7
+ context 'Using kaminari' do
8
+ before do
9
+ ApiPagination.config.paginator = :kaminari
10
+ end
11
+
12
+ after do
13
+ ApiPagination.config.paginator = ENV['PAGINATOR'].to_sym
14
+ end
15
+
16
+ it 'should accept paginate_array_options option' do
17
+ expect(Kaminari).to receive(:paginate_array)
18
+ .with(collection, paginate_array_options)
19
+ .and_call_original
20
+
21
+ ApiPagination.paginate(
22
+ collection,
23
+ {
24
+ per_page: 30,
25
+ paginate_array_options: paginate_array_options
26
+ }
27
+ )
28
+ end
29
+ end
30
+ end
data/spec/grape_spec.rb CHANGED
@@ -71,6 +71,7 @@ describe NumbersAPI do
71
71
  before do
72
72
  ApiPagination.config.total_header = 'X-Total-Count'
73
73
  ApiPagination.config.per_page_header = 'X-Per-Page'
74
+ ApiPagination.config.page_header = 'X-Page'
74
75
 
75
76
  get '/numbers', count: 10
76
77
  end
@@ -78,10 +79,12 @@ describe NumbersAPI do
78
79
  after do
79
80
  ApiPagination.config.total_header = 'Total'
80
81
  ApiPagination.config.per_page_header = 'Per-Page'
82
+ ApiPagination.config.page_header = nil
81
83
  end
82
84
 
83
85
  let(:total) { last_response.header['X-Total-Count'].to_i }
84
86
  let(:per_page) { last_response.header['X-Per-Page'].to_i }
87
+ let(:page) { last_response.header['X-Page'].to_i }
85
88
 
86
89
  it 'should give a X-Total-Count header' do
87
90
  headers_keys = last_response.headers.keys
@@ -98,6 +101,36 @@ describe NumbersAPI do
98
101
  expect(headers_keys).to include('X-Per-Page')
99
102
  expect(per_page).to eq(10)
100
103
  end
104
+
105
+ it 'should give a X-Page header' do
106
+ headers_keys = last_response.headers.keys
107
+
108
+ expect(headers_keys).to include('X-Page')
109
+ expect(page).to eq(1)
110
+ end
111
+ end
112
+
113
+ context 'configured not to include the total' do
114
+ before { ApiPagination.config.include_total = false }
115
+
116
+ it 'should not include a Total header' do
117
+ get '/numbers', count: 10
118
+
119
+ expect(last_response.header['Total']).to be_nil
120
+ end
121
+
122
+ after { ApiPagination.config.include_total = true }
123
+ end
124
+
125
+ context 'with query string including array parameter' do
126
+ before do
127
+ get '/numbers', { count: 100, parity: ['odd', 'even']}
128
+ end
129
+
130
+ it 'returns links with with same received parameters' do
131
+ expect(links).to include('<http://example.org/numbers?count=100&page=10&parity%5B%5D=odd&parity%5B%5D=even>; rel="last"')
132
+ expect(links).to include('<http://example.org/numbers?count=100&page=2&parity%5B%5D=odd&parity%5B%5D=even>; rel="next"')
133
+ end
101
134
  end
102
135
  end
103
136
  end
data/spec/rails_spec.rb CHANGED
@@ -73,6 +73,7 @@ describe NumbersController, :type => :controller do
73
73
  before do
74
74
  ApiPagination.config.total_header = 'X-Total-Count'
75
75
  ApiPagination.config.per_page_header = 'X-Per-Page'
76
+ ApiPagination.config.page_header = 'X-Page'
76
77
 
77
78
  get :index, count: 10
78
79
  end
@@ -80,10 +81,12 @@ describe NumbersController, :type => :controller do
80
81
  after do
81
82
  ApiPagination.config.total_header = 'Total'
82
83
  ApiPagination.config.per_page_header = 'Per-Page'
84
+ ApiPagination.config.page_header = nil
83
85
  end
84
86
 
85
87
  let(:total) { response.header['X-Total-Count'].to_i }
86
88
  let(:per_page) { response.header['X-Per-Page'].to_i }
89
+ let(:page) { response.header['X-Page'].to_i }
87
90
 
88
91
  it 'should give a X-Total-Count header' do
89
92
  headers_keys = response.headers.keys
@@ -100,6 +103,25 @@ describe NumbersController, :type => :controller do
100
103
  expect(headers_keys).to include('X-Per-Page')
101
104
  expect(per_page).to eq(10)
102
105
  end
106
+
107
+ it 'should give a X-Page header' do
108
+ headers_keys = response.headers.keys
109
+
110
+ expect(headers_keys).to include('X-Page')
111
+ expect(page).to eq(1)
112
+ end
113
+ end
114
+
115
+ context 'configured not to include the total' do
116
+ before { ApiPagination.config.include_total = false }
117
+
118
+ it 'should not include a Total header' do
119
+ get :index, count: 10
120
+
121
+ expect(response.header['Total']).to be_nil
122
+ end
123
+
124
+ after { ApiPagination.config.include_total = true }
103
125
  end
104
126
  end
105
127
  end
metadata CHANGED
@@ -1,83 +1,83 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: api-pagination
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.1
4
+ version: 4.2.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: 2015-02-12 00:00:00.000000000 Z
11
+ date: 2016-01-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '3.0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '3.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: grape
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: 0.10.0
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.10.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: railties
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: 3.0.0
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: 3.0.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: actionpack
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: 3.0.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: 3.0.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: sequel
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: 4.9.0
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: 4.9.0
83
83
  description: Link header pagination for Rails and Grape APIs
@@ -87,12 +87,13 @@ executables: []
87
87
  extensions: []
88
88
  extra_rdoc_files: []
89
89
  files:
90
+ - lib/api-pagination.rb
90
91
  - lib/api-pagination/configuration.rb
91
92
  - lib/api-pagination/hooks.rb
92
93
  - lib/api-pagination/version.rb
93
- - lib/api-pagination.rb
94
94
  - lib/grape/pagination.rb
95
95
  - lib/rails/pagination.rb
96
+ - spec/api-pagination_spec.rb
96
97
  - spec/grape_spec.rb
97
98
  - spec/rails_spec.rb
98
99
  - spec/sequel_spec.rb
@@ -113,21 +114,22 @@ require_paths:
113
114
  - lib
114
115
  required_ruby_version: !ruby/object:Gem::Requirement
115
116
  requirements:
116
- - - '>='
117
+ - - ">="
117
118
  - !ruby/object:Gem::Version
118
119
  version: '0'
119
120
  required_rubygems_version: !ruby/object:Gem::Requirement
120
121
  requirements:
121
- - - '>='
122
+ - - ">="
122
123
  - !ruby/object:Gem::Version
123
124
  version: '0'
124
125
  requirements: []
125
126
  rubyforge_project:
126
- rubygems_version: 2.0.14
127
+ rubygems_version: 2.5.1
127
128
  signing_key:
128
129
  specification_version: 4
129
130
  summary: Link header pagination for Rails and Grape APIs. Don't use the request body.
130
131
  test_files:
132
+ - spec/api-pagination_spec.rb
131
133
  - spec/grape_spec.rb
132
134
  - spec/rails_spec.rb
133
135
  - spec/sequel_spec.rb
@@ -138,3 +140,4 @@ test_files:
138
140
  - spec/support/shared_examples/first_page.rb
139
141
  - spec/support/shared_examples/last_page.rb
140
142
  - spec/support/shared_examples/middle_page.rb
143
+ has_rdoc: