grape-kaminari 0.3.0 → 0.4.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
  SHA256:
3
- metadata.gz: 690c3b70419498572169fa3e2daee43ba5adef9c93e46ba8b0da6944f2afdcc0
4
- data.tar.gz: 49f722ee554da32f4ecc3351abc2e5edc44454882046cfadf39f0d99c7ba2ba5
3
+ metadata.gz: 5be6c20ba0aef343949970af43c69d6781e945ed043b3baa3b6c258570f4300b
4
+ data.tar.gz: f9f31a5f31560e5cd751b31109d5720410ea4f8c523a1d0b4b050c1eef039247
5
5
  SHA512:
6
- metadata.gz: c08980fd147c292e51c546c19166a095b012fe0727e95a30d5ac9a5682eecfd66fdbf907167b0c2c5160c854269728ecca34cee6808009660e02075eaed67d35
7
- data.tar.gz: ffdf0838305fd025f5fda2fb96ee6c58b9f46bfbe0fe511f13de9b06d9683f1f6651d45a23d8b923434974f65d930242bcfb00723a3042dffa9cdecd6dba8960
6
+ metadata.gz: c1205ab3b90b586436aaeeb2f94ce4443acdbd372b72a6e1acda2cb250081f976e4b9743eb4f36bdc92d82dc0174d16289202c61128536a1ca440c64f5c3d923
7
+ data.tar.gz: 3c8f039a3f9596fc78bb9fd79adf917e79a662b372f480da7aa0bf35a75a07d1b40cc20557c9038300b92e3f12f566ad512ad6a9aede7c4f18f11b3b778c8997
@@ -0,0 +1,42 @@
1
+ ### 0.5.0 (Next)
2
+
3
+ #### Features
4
+
5
+ * Your contribution here.
6
+
7
+ #### Fixes
8
+
9
+ * Your contribution here.
10
+
11
+ ### 0.4.0
12
+
13
+ #### Features
14
+
15
+ * [#57](https://github.com/bsm/grape-kaminari/pull/57): Introduce new params based API - [@dim](https://github.com/dim).
16
+ * [#56](https://github.com/bsm/grape-kaminari/pull/56): Introduce a CHANGELOG - [@dim](https://github.com/dim).
17
+
18
+ #### Fixes
19
+
20
+ * [#57](https://github.com/bsm/grape-kaminari/pull/57): Fix issues related to Grape v1.5 release - [@dim](https://github.com/dim).
21
+
22
+ ### 0.3.0 (2020/08/10)
23
+
24
+ * [#54](https://github.com/bsm/grape-kaminari/pull/54): Inherit paginate helper - [@dim](https://github.com/dim).
25
+
26
+ ### 0.2.1 (2020/06/18)
27
+
28
+ #### Fixes
29
+
30
+ * [#52](https://github.com/bsm/grape-kaminari/pull/52): Skip per-page range validation for non-integer values - [@dim](https://github.com/dim).
31
+
32
+ ### 0.2.0 (2020/06/18)
33
+
34
+ Revived project, migrated to [github.com/bsm/grape-kaminari](github.com/bsm/grape-kaminari).
35
+
36
+ #### Features
37
+
38
+ * [#51](https://github.com/bsm/grape-kaminari/pull/51): Support for Grape 1.x - [@dim](https://github.com/dim).
39
+
40
+ #### Fixes
41
+
42
+ * [#51](https://github.com/bsm/grape-kaminari/pull/51): Fixed code style - [@dim](https://github.com/dim).
@@ -1,14 +1,14 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- grape-kaminari (0.3.0)
4
+ grape-kaminari (0.4.0)
5
5
  grape (>= 1.0, != 1.4.0)
6
6
  kaminari-grape
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- activesupport (6.0.3.2)
11
+ activesupport (6.0.3.4)
12
12
  concurrent-ruby (~> 1.0, >= 1.0.2)
13
13
  i18n (>= 0.7, < 2)
14
14
  minitest (~> 5.1)
@@ -29,7 +29,7 @@ GEM
29
29
  concurrent-ruby (~> 1.0)
30
30
  dry-equalizer (0.3.0)
31
31
  dry-inflector (0.2.0)
32
- dry-logic (1.0.6)
32
+ dry-logic (1.0.8)
33
33
  concurrent-ruby (~> 1.0)
34
34
  dry-core (~> 0.2)
35
35
  dry-equalizer (~> 0.2)
@@ -40,7 +40,7 @@ GEM
40
40
  dry-equalizer (~> 0.3)
41
41
  dry-inflector (~> 0.1, >= 0.1.2)
42
42
  dry-logic (~> 1.0, >= 1.0.2)
43
- grape (1.3.3)
43
+ grape (1.5.0)
44
44
  activesupport
45
45
  builder
46
46
  dry-types (>= 1.1)
@@ -53,13 +53,13 @@ GEM
53
53
  kaminari-grape (1.0.1)
54
54
  grape
55
55
  kaminari-core (~> 1.0)
56
- minitest (5.14.1)
56
+ minitest (5.14.2)
57
57
  mustermann (1.1.1)
58
58
  ruby2_keywords (~> 0.0.1)
59
59
  mustermann-grape (1.0.1)
60
60
  mustermann (>= 1.0.0)
61
61
  parallel (1.19.2)
62
- parser (2.7.1.4)
62
+ parser (2.7.2.0)
63
63
  ast (~> 2.4.1)
64
64
  rack (2.2.3)
65
65
  rack-accept (0.4.5)
@@ -68,13 +68,13 @@ GEM
68
68
  rack (>= 1.0, < 3)
69
69
  rainbow (3.0.0)
70
70
  rake (13.0.1)
71
- regexp_parser (1.7.1)
71
+ regexp_parser (1.8.1)
72
72
  rexml (3.2.4)
73
73
  rspec (3.9.0)
74
74
  rspec-core (~> 3.9.0)
75
75
  rspec-expectations (~> 3.9.0)
76
76
  rspec-mocks (~> 3.9.0)
77
- rspec-core (3.9.2)
77
+ rspec-core (3.9.3)
78
78
  rspec-support (~> 3.9.3)
79
79
  rspec-expectations (3.9.2)
80
80
  diff-lcs (>= 1.2.0, < 2.0)
@@ -83,17 +83,17 @@ GEM
83
83
  diff-lcs (>= 1.2.0, < 2.0)
84
84
  rspec-support (~> 3.9.0)
85
85
  rspec-support (3.9.3)
86
- rubocop (0.89.0)
86
+ rubocop (0.92.0)
87
87
  parallel (~> 1.10)
88
- parser (>= 2.7.1.1)
88
+ parser (>= 2.7.1.5)
89
89
  rainbow (>= 2.2.2, < 4.0)
90
90
  regexp_parser (>= 1.7)
91
91
  rexml
92
- rubocop-ast (>= 0.1.0, < 1.0)
92
+ rubocop-ast (>= 0.5.0)
93
93
  ruby-progressbar (~> 1.7)
94
94
  unicode-display_width (>= 1.4.0, < 2.0)
95
- rubocop-ast (0.3.0)
96
- parser (>= 2.7.1.4)
95
+ rubocop-ast (0.7.1)
96
+ parser (>= 2.7.1.5)
97
97
  ruby-progressbar (1.10.1)
98
98
  ruby2_keywords (0.0.2)
99
99
  thread_safe (0.3.6)
data/README.md CHANGED
@@ -35,7 +35,6 @@ class MyApi < Grape::API
35
35
  resource :posts do
36
36
  desc 'Return a list of posts.'
37
37
 
38
- # Annotate action with `paginate`.
39
38
  # This will add three optional params: page, per_page, and offset
40
39
  #
41
40
  # You can optionally overwrite the default :per_page setting (10)
@@ -45,8 +44,9 @@ class MyApi < Grape::API
45
44
  # You can disable the offset parameter from appearing in the API
46
45
  # documentation by setting it to false.
47
46
  #
48
- paginate per_page: 20, max_per_page: 30, offset: 5
49
-
47
+ params do
48
+ use :pagination, per_page: 20, max_per_page: 30, offset: 5
49
+ end
50
50
  get do
51
51
  posts = Post.where(...)
52
52
 
@@ -9,10 +9,30 @@ module Grape
9
9
 
10
10
  included do
11
11
  helpers HelperMethods
12
- base_instance.extend DSLMethods
13
12
  end
14
13
 
15
14
  module HelperMethods # :nodoc:
15
+ extend Grape::API::Helpers
16
+
17
+ params :pagination do |opts = {}|
18
+ opts.reverse_merge!(
19
+ per_page: ::Kaminari.config.default_per_page || 10,
20
+ max_per_page: ::Kaminari.config.max_per_page,
21
+ offset: 0,
22
+ )
23
+
24
+ optional :page, type: Integer, default: 1,
25
+ desc: 'Page offset to fetch.'
26
+ optional :per_page, type: Integer, default: opts[:per_page],
27
+ desc: 'Number of results to return per page.',
28
+ max_value: opts[:max_per_page]
29
+
30
+ if opts[:offset].is_a?(Integer)
31
+ optional :offset, type: Integer, default: opts[:offset],
32
+ desc: 'Pad a number of results.'
33
+ end
34
+ end
35
+
16
36
  def paginate(collection)
17
37
  collection.page(params[:page].to_i)
18
38
  .per(params[:per_page].to_i)
@@ -30,24 +50,12 @@ module Grape
30
50
  end
31
51
 
32
52
  module DSLMethods # :nodoc:
33
- def paginate(**options)
34
- options.reverse_merge!(
35
- per_page: ::Kaminari.config.default_per_page || 10,
36
- max_per_page: ::Kaminari.config.max_per_page,
37
- offset: 0,
38
- )
53
+ def paginate(opts = {})
39
54
  params do
40
- optional :page, type: Integer, default: 1,
41
- desc: 'Page offset to fetch.'
42
- optional :per_page, type: Integer, default: options[:per_page],
43
- desc: 'Number of results to return per page.',
44
- max_value: options[:max_per_page]
45
- if options[:offset].is_a? Numeric
46
- optional :offset, type: Integer, default: options[:offset],
47
- desc: 'Pad a number of results.'
48
- end
55
+ use(:pagination, opts)
49
56
  end
50
57
  end
51
58
  end
59
+ Grape::API::Instance.extend(DSLMethods)
52
60
  end
53
61
  end
@@ -1,5 +1,5 @@
1
1
  module Grape
2
2
  module Kaminari
3
- VERSION = '0.3.0'.freeze
3
+ VERSION = '0.4.0'.freeze
4
4
  end
5
5
  end
@@ -1,130 +1,131 @@
1
1
  require 'spec_helper'
2
2
 
3
- class UnPaginatedAPI < Grape::API
4
- # Intentionally not including Grape::Kaminari
5
- end
6
-
7
3
  class PaginatedAPI < Grape::API
8
4
  include Grape::Kaminari
9
5
  end
10
6
 
11
7
  describe Grape::Kaminari do
12
- describe 'unpaginated api' do
13
- subject { Class.new(UnPaginatedAPI) }
8
+ subject { Class.new(PaginatedAPI) }
14
9
 
15
- it 'raises an error' do
16
- expect { subject.paginate }.to raise_error(NoMethodError, /undefined method `paginate' for/i)
17
- end
10
+ def declared_params
11
+ subject.namespace_stackable(:declared_params).flatten
18
12
  end
19
13
 
20
- describe 'default paginated api' do
21
- subject { Class.new(PaginatedAPI) }
22
-
23
- it 'adds to declared parameters' do
24
- subject.paginate
25
- expect(subject.inheritable_setting.route[:declared_params]).to eq(%i[page per_page offset])
26
- end
27
-
28
- describe 'descriptions, validation, and defaults' do
29
- let(:params) { subject.routes.first.params }
30
-
31
- before do
32
- subject.paginate
33
- subject.get('/') {}
34
- end
35
-
36
- it 'does not require :page' do
37
- expect(params['page'][:required]).to eq(false)
38
- end
39
-
40
- it 'does not require :per_page' do
41
- expect(params['per_page'][:required]).to eq(false)
42
- end
14
+ it 'adds to declared parameters' do
15
+ subject.params { use :pagination }
16
+ expect(declared_params).to eq(%i[page per_page offset])
17
+ end
43
18
 
44
- it 'does not require :offset' do
45
- expect(params['offset'][:required]).to eq(false)
46
- end
19
+ it 'may exclude :offset' do
20
+ subject.params { use :pagination, offset: false }
21
+ expect(declared_params).to eq(%i[page per_page])
22
+ end
47
23
 
48
- it 'describes :page' do
49
- expect(params['page'][:desc]).to eq('Page offset to fetch.')
50
- end
24
+ it 'should support legacy declarations' do
25
+ subject.paginate
26
+ expect(declared_params).to eq(%i[page per_page offset])
27
+ end
51
28
 
52
- it 'describes :per_page' do
53
- expect(params['per_page'][:desc]).to eq('Number of results to return per page.')
54
- end
29
+ it 'should not stumble across repeated declarations' do
30
+ subject.paginate offset: false
31
+ subject.params do
32
+ optional :extra
33
+ end
34
+ expect(declared_params).to eq(%i[page per_page extra])
35
+ end
55
36
 
56
- it 'describes :offset' do
57
- expect(params['offset'][:desc]).to eq('Pad a number of results.')
58
- end
37
+ describe 'descriptions, validation, and defaults' do
38
+ let(:params) { subject.routes.first.params }
59
39
 
60
- it 'validates :page as Integer' do
61
- expect(params['page'][:type]).to eq('Integer')
62
- end
40
+ before do
41
+ subject.params { use :pagination }
42
+ subject.get('/') {}
43
+ end
63
44
 
64
- it 'validates :per_page as Integer' do
65
- expect(params['per_page'][:type]).to eq('Integer')
66
- end
45
+ it 'does not require :page' do
46
+ expect(params['page'][:required]).to eq(false)
47
+ end
67
48
 
68
- it 'validates :offset as Integer' do
69
- expect(params['offset'][:type]).to eq('Integer')
70
- end
49
+ it 'does not require :per_page' do
50
+ expect(params['per_page'][:required]).to eq(false)
51
+ end
71
52
 
72
- it 'defaults :page to 1' do
73
- expect(params['page'][:default]).to eq(1)
74
- end
53
+ it 'does not require :offset' do
54
+ expect(params['offset'][:required]).to eq(false)
55
+ end
75
56
 
76
- it 'defaults :per_page to Kaminari.config.default_per_page' do
77
- expect(params['per_page'][:default]).to eq(::Kaminari.config.default_per_page)
78
- end
57
+ it 'describes :page' do
58
+ expect(params['page'][:desc]).to eq('Page offset to fetch.')
59
+ end
79
60
 
80
- it 'defaults :offset to 0' do
81
- expect(params['offset'][:default]).to eq(0)
82
- end
61
+ it 'describes :per_page' do
62
+ expect(params['per_page'][:desc]).to eq('Number of results to return per page.')
83
63
  end
84
- end
85
64
 
86
- describe 'custom paginated api' do
87
- subject { Class.new(PaginatedAPI) }
88
- let(:app) { subject }
89
- let(:params) { subject.routes.first.params }
65
+ it 'describes :offset' do
66
+ expect(params['offset'][:desc]).to eq('Pad a number of results.')
67
+ end
90
68
 
91
- before do
92
- subject.paginate per_page: 99, max_per_page: 999, offset: 9
93
- subject.get('/') {}
69
+ it 'validates :page as Integer' do
70
+ expect(params['page'][:type]).to eq('Integer')
94
71
  end
95
72
 
96
- it 'defaults :per_page to customized value' do
97
- expect(params['per_page'][:default]).to eq(99)
73
+ it 'validates :per_page as Integer' do
74
+ expect(params['per_page'][:type]).to eq('Integer')
98
75
  end
99
76
 
100
- it 'succeeds when :per_page is within :max_value' do
101
- get('/', page: 1, per_page: 999)
102
- expect(last_response.status).to eq(200)
77
+ it 'validates :offset as Integer' do
78
+ expect(params['offset'][:type]).to eq('Integer')
103
79
  end
104
80
 
105
- it 'ensures :per_page is within :max_value' do
106
- get('/', page: 1, per_page: 1_000)
107
- expect(last_response.status).to eq(400)
108
- expect(last_response.body).to match(/per_page must be less than or equal 999/)
81
+ it 'defaults :page to 1' do
82
+ expect(params['page'][:default]).to eq(1)
109
83
  end
110
84
 
111
- it 'ensures :per_page is numeric' do
112
- get('/', page: 1, per_page: 'foo')
113
- expect(last_response.status).to eq(400)
114
- expect(last_response.body).to match(/per_page is invalid/)
85
+ it 'defaults :per_page to Kaminari.config.default_per_page' do
86
+ expect(params['per_page'][:default]).to eq(::Kaminari.config.default_per_page)
115
87
  end
116
88
 
117
- it 'defaults :offset to customized value' do
118
- expect(params['offset'][:default]).to eq(9)
89
+ it 'defaults :offset to 0' do
90
+ expect(params['offset'][:default]).to eq(0)
119
91
  end
120
92
  end
93
+ end
121
94
 
122
- describe 'paginated api without :offset' do
123
- subject { Class.new(PaginatedAPI) }
95
+ describe 'custom paginated api' do
96
+ subject { Class.new(PaginatedAPI) }
97
+ let(:app) { subject }
98
+ let(:params) { subject.routes.first.params }
124
99
 
125
- it 'excludes :offset from declared params' do
126
- subject.paginate offset: false
127
- expect(subject.inheritable_setting.route[:declared_params]).not_to include(:offset)
100
+ before do
101
+ subject.params do
102
+ use :pagination, per_page: 99, max_per_page: 999, offset: 9
128
103
  end
104
+ subject.get('/') {}
105
+ end
106
+
107
+ it 'defaults :per_page to customized value' do
108
+ expect(params['per_page'][:default]).to eq(99)
109
+ end
110
+
111
+ it 'succeeds when :per_page is within :max_value' do
112
+ get('/', page: 1, per_page: 999)
113
+ expect(last_response.status).to eq(200)
114
+ end
115
+
116
+ it 'ensures :per_page is within :max_value' do
117
+ get('/', page: 1, per_page: 1_000)
118
+ expect(last_response.status).to eq(400)
119
+ expect(last_response.body).to match(/per_page must be less than or equal 999/)
120
+ end
121
+
122
+ it 'ensures :per_page is numeric' do
123
+ get('/', page: 1, per_page: 'foo')
124
+ expect(last_response.status).to eq(400)
125
+ expect(last_response.body).to match(/per_page is invalid/)
126
+ end
127
+
128
+ it 'defaults :offset to customized value' do
129
+ expect(params['offset'][:default]).to eq(9)
129
130
  end
130
131
  end
@@ -4,18 +4,24 @@ require 'json'
4
4
  class PaginatedAPI < Grape::API
5
5
  include Grape::Kaminari
6
6
 
7
- paginate
7
+ params do
8
+ use :pagination
9
+ end
8
10
  get '' do
9
11
  paginate(Kaminari.paginate_array((1..10).to_a))
10
12
  end
11
13
 
12
- paginate offset: false
14
+ params do
15
+ use :pagination, offset: false
16
+ end
13
17
  get 'no-offset' do
14
18
  paginate(Kaminari.paginate_array((1..10).to_a))
15
19
  end
16
20
 
17
21
  resource :sub do
18
- paginate per_page: 2
22
+ params do
23
+ use :pagination, per_page: 2
24
+ end
19
25
  get '/' do
20
26
  paginate(Kaminari.paginate_array((1..10).to_a))
21
27
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grape-kaminari
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tymon Tobolski
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-08-10 00:00:00.000000000 Z
12
+ date: 2020-10-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: grape
@@ -125,6 +125,7 @@ files:
125
125
  - ".gitignore"
126
126
  - ".rubocop.yml"
127
127
  - ".travis.yml"
128
+ - CHANGELOG.md
128
129
  - Gemfile
129
130
  - Gemfile.lock
130
131
  - LICENSE.txt