grape-kaminari 0.2.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/test.yml +21 -0
- data/.rubocop.yml +7 -20
- data/CHANGELOG.md +48 -0
- data/Gemfile.lock +69 -56
- data/README.md +4 -4
- data/grape-kaminari.gemspec +3 -3
- data/lib/grape/kaminari/max_value_validator.rb +1 -1
- data/lib/grape/kaminari/version.rb +1 -1
- data/lib/grape/kaminari.rb +45 -31
- data/spec/grape/kaminari_spec.rb +130 -0
- data/spec/spec_helper.rb +1 -1
- metadata +16 -11
- data/.travis.yml +0 -6
- data/spec/kaminari_spec.rb +0 -130
- data/spec/paginate_helper_spec.rb +0 -55
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5282850782bd08c0a0719eaad85f84b406f1a7419b9755162f939dc7f7aa71bc
|
|
4
|
+
data.tar.gz: 1fbe1503fe2149f82413c3e934452c85bfe190657077fbd1607e6a10beb812b2
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 644acde6f381781e2ef22c484c72fd9c754f7b72382e88fb3047bd71686c9284f65ba4154d887ba66ed45dc164fbb2d1902dfefbcb9310ea42124b5f9146e8cc
|
|
7
|
+
data.tar.gz: 12552dd5e9ce60c46726554e51cdffc01d1782b7a026f5298141f6c9b60e29ab0c05ce799eab01ae73acc14f458a08a6127b06d2357948ebc89b60681e5f3b71
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
name: Test
|
|
2
|
+
on:
|
|
3
|
+
push:
|
|
4
|
+
branches:
|
|
5
|
+
- main
|
|
6
|
+
pull_request:
|
|
7
|
+
branches:
|
|
8
|
+
- main
|
|
9
|
+
jobs:
|
|
10
|
+
ruby:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
strategy:
|
|
13
|
+
matrix:
|
|
14
|
+
ruby-version: ["2.5", "2.6", "2.7", "3.0"]
|
|
15
|
+
steps:
|
|
16
|
+
- uses: actions/checkout@v2
|
|
17
|
+
- uses: ruby/setup-ruby@v1
|
|
18
|
+
with:
|
|
19
|
+
ruby-version: ${{ matrix.ruby-version }}
|
|
20
|
+
bundler-cache: true
|
|
21
|
+
- run: bundle exec rake
|
data/.rubocop.yml
CHANGED
|
@@ -1,26 +1,13 @@
|
|
|
1
|
+
inherit_gem:
|
|
2
|
+
rubocop-bsm:
|
|
3
|
+
- default.yml
|
|
4
|
+
inherit_mode:
|
|
5
|
+
merge:
|
|
6
|
+
- Exclude
|
|
7
|
+
|
|
1
8
|
AllCops:
|
|
2
9
|
TargetRubyVersion: "2.5"
|
|
3
|
-
NewCops: enable
|
|
4
|
-
|
|
5
|
-
Metrics/AbcSize:
|
|
6
|
-
Enabled: false
|
|
7
|
-
Metrics/BlockLength:
|
|
8
|
-
Exclude:
|
|
9
|
-
- spec/**/*_spec.rb
|
|
10
|
-
Metrics/MethodLength:
|
|
11
|
-
Max: 20
|
|
12
10
|
|
|
13
11
|
Naming/FileName:
|
|
14
12
|
Exclude:
|
|
15
13
|
- lib/grape-kaminari.rb
|
|
16
|
-
|
|
17
|
-
Style/Documentation:
|
|
18
|
-
Enabled: false
|
|
19
|
-
Style/FrozenStringLiteralComment:
|
|
20
|
-
Enabled: false
|
|
21
|
-
Style/TrailingCommaInArguments:
|
|
22
|
-
EnforcedStyleForMultiline: consistent_comma
|
|
23
|
-
Style/TrailingCommaInArrayLiteral:
|
|
24
|
-
EnforcedStyleForMultiline: consistent_comma
|
|
25
|
-
Style/TrailingCommaInHashLiteral:
|
|
26
|
-
EnforcedStyleForMultiline: consistent_comma
|
data/CHANGELOG.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
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.1
|
|
12
|
+
|
|
13
|
+
#### Features
|
|
14
|
+
|
|
15
|
+
* [#58](https://github.com/bsm/grape-kaminari/pull/58): Allow to paginate without counting - [@dim](https://github.com/dim).
|
|
16
|
+
|
|
17
|
+
### 0.4.0
|
|
18
|
+
|
|
19
|
+
#### Features
|
|
20
|
+
|
|
21
|
+
* [#57](https://github.com/bsm/grape-kaminari/pull/57): Introduce new params based API - [@dim](https://github.com/dim).
|
|
22
|
+
* [#56](https://github.com/bsm/grape-kaminari/pull/56): Introduce a CHANGELOG - [@dim](https://github.com/dim).
|
|
23
|
+
|
|
24
|
+
#### Fixes
|
|
25
|
+
|
|
26
|
+
* [#57](https://github.com/bsm/grape-kaminari/pull/57): Fix issues related to Grape v1.5 release - [@dim](https://github.com/dim).
|
|
27
|
+
|
|
28
|
+
### 0.3.0 (2020/08/10)
|
|
29
|
+
|
|
30
|
+
* [#54](https://github.com/bsm/grape-kaminari/pull/54): Inherit paginate helper - [@dim](https://github.com/dim).
|
|
31
|
+
|
|
32
|
+
### 0.2.1 (2020/06/18)
|
|
33
|
+
|
|
34
|
+
#### Fixes
|
|
35
|
+
|
|
36
|
+
* [#52](https://github.com/bsm/grape-kaminari/pull/52): Skip per-page range validation for non-integer values - [@dim](https://github.com/dim).
|
|
37
|
+
|
|
38
|
+
### 0.2.0 (2020/06/18)
|
|
39
|
+
|
|
40
|
+
Revived project, migrated to [github.com/bsm/grape-kaminari](github.com/bsm/grape-kaminari).
|
|
41
|
+
|
|
42
|
+
#### Features
|
|
43
|
+
|
|
44
|
+
* [#51](https://github.com/bsm/grape-kaminari/pull/51): Support for Grape 1.x - [@dim](https://github.com/dim).
|
|
45
|
+
|
|
46
|
+
#### Fixes
|
|
47
|
+
|
|
48
|
+
* [#51](https://github.com/bsm/grape-kaminari/pull/51): Fixed code style - [@dim](https://github.com/dim).
|
data/Gemfile.lock
CHANGED
|
@@ -1,106 +1,119 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
grape-kaminari (0.2
|
|
5
|
-
grape (>= 1.0)
|
|
4
|
+
grape-kaminari (0.4.2)
|
|
5
|
+
grape (>= 1.6.1, != 1.4.0)
|
|
6
6
|
kaminari-grape
|
|
7
7
|
|
|
8
8
|
GEM
|
|
9
9
|
remote: https://rubygems.org/
|
|
10
10
|
specs:
|
|
11
|
-
activesupport (6.
|
|
11
|
+
activesupport (6.1.3.1)
|
|
12
12
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
13
|
-
i18n (>=
|
|
14
|
-
minitest (
|
|
15
|
-
tzinfo (~>
|
|
16
|
-
zeitwerk (~> 2.
|
|
17
|
-
ast (2.4.
|
|
13
|
+
i18n (>= 1.6, < 2)
|
|
14
|
+
minitest (>= 5.1)
|
|
15
|
+
tzinfo (~> 2.0)
|
|
16
|
+
zeitwerk (~> 2.3)
|
|
17
|
+
ast (2.4.2)
|
|
18
18
|
builder (3.2.4)
|
|
19
|
-
concurrent-ruby (1.1.
|
|
20
|
-
diff-lcs (1.
|
|
21
|
-
dry-configurable (0.
|
|
19
|
+
concurrent-ruby (1.1.8)
|
|
20
|
+
diff-lcs (1.4.4)
|
|
21
|
+
dry-configurable (0.12.1)
|
|
22
22
|
concurrent-ruby (~> 1.0)
|
|
23
|
-
dry-core (~> 0.
|
|
24
|
-
dry-equalizer (~> 0.2)
|
|
23
|
+
dry-core (~> 0.5, >= 0.5.0)
|
|
25
24
|
dry-container (0.7.2)
|
|
26
25
|
concurrent-ruby (~> 1.0)
|
|
27
26
|
dry-configurable (~> 0.1, >= 0.1.3)
|
|
28
|
-
dry-core (0.
|
|
27
|
+
dry-core (0.5.0)
|
|
29
28
|
concurrent-ruby (~> 1.0)
|
|
30
|
-
dry-equalizer (0.3.0)
|
|
31
29
|
dry-inflector (0.2.0)
|
|
32
|
-
dry-logic (1.0
|
|
30
|
+
dry-logic (1.2.0)
|
|
33
31
|
concurrent-ruby (~> 1.0)
|
|
34
|
-
dry-core (~> 0.
|
|
35
|
-
|
|
36
|
-
dry-types (1.4.0)
|
|
32
|
+
dry-core (~> 0.5, >= 0.5)
|
|
33
|
+
dry-types (1.5.1)
|
|
37
34
|
concurrent-ruby (~> 1.0)
|
|
38
35
|
dry-container (~> 0.3)
|
|
39
|
-
dry-core (~> 0.
|
|
40
|
-
dry-equalizer (~> 0.3)
|
|
36
|
+
dry-core (~> 0.5, >= 0.5)
|
|
41
37
|
dry-inflector (~> 0.1, >= 0.1.2)
|
|
42
38
|
dry-logic (~> 1.0, >= 1.0.2)
|
|
43
|
-
grape (1.
|
|
39
|
+
grape (1.6.2)
|
|
44
40
|
activesupport
|
|
45
41
|
builder
|
|
46
42
|
dry-types (>= 1.1)
|
|
47
43
|
mustermann-grape (~> 1.0.0)
|
|
48
44
|
rack (>= 1.3.0)
|
|
49
45
|
rack-accept
|
|
50
|
-
i18n (1.8.
|
|
46
|
+
i18n (1.8.10)
|
|
51
47
|
concurrent-ruby (~> 1.0)
|
|
52
48
|
kaminari-core (1.2.1)
|
|
53
49
|
kaminari-grape (1.0.1)
|
|
54
50
|
grape
|
|
55
51
|
kaminari-core (~> 1.0)
|
|
56
|
-
minitest (5.14.
|
|
52
|
+
minitest (5.14.4)
|
|
57
53
|
mustermann (1.1.1)
|
|
58
54
|
ruby2_keywords (~> 0.0.1)
|
|
59
55
|
mustermann-grape (1.0.1)
|
|
60
56
|
mustermann (>= 1.0.0)
|
|
61
|
-
parallel (1.
|
|
62
|
-
parser (
|
|
63
|
-
ast (~> 2.4.
|
|
57
|
+
parallel (1.20.1)
|
|
58
|
+
parser (3.0.1.1)
|
|
59
|
+
ast (~> 2.4.1)
|
|
64
60
|
rack (2.2.3)
|
|
65
61
|
rack-accept (0.4.5)
|
|
66
62
|
rack (>= 0.4)
|
|
67
63
|
rack-test (1.1.0)
|
|
68
64
|
rack (>= 1.0, < 3)
|
|
69
65
|
rainbow (3.0.0)
|
|
70
|
-
rake (13.0.
|
|
71
|
-
regexp_parser (1.
|
|
72
|
-
rexml (3.2.
|
|
73
|
-
rspec (3.
|
|
74
|
-
rspec-core (~> 3.
|
|
75
|
-
rspec-expectations (~> 3.
|
|
76
|
-
rspec-mocks (~> 3.
|
|
77
|
-
rspec-core (3.
|
|
78
|
-
rspec-support (~> 3.
|
|
79
|
-
rspec-expectations (3.
|
|
66
|
+
rake (13.0.3)
|
|
67
|
+
regexp_parser (2.1.1)
|
|
68
|
+
rexml (3.2.5)
|
|
69
|
+
rspec (3.10.0)
|
|
70
|
+
rspec-core (~> 3.10.0)
|
|
71
|
+
rspec-expectations (~> 3.10.0)
|
|
72
|
+
rspec-mocks (~> 3.10.0)
|
|
73
|
+
rspec-core (3.10.1)
|
|
74
|
+
rspec-support (~> 3.10.0)
|
|
75
|
+
rspec-expectations (3.10.1)
|
|
80
76
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
81
|
-
rspec-support (~> 3.
|
|
82
|
-
rspec-mocks (3.
|
|
77
|
+
rspec-support (~> 3.10.0)
|
|
78
|
+
rspec-mocks (3.10.2)
|
|
83
79
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
84
|
-
rspec-support (~> 3.
|
|
85
|
-
rspec-support (3.
|
|
86
|
-
rubocop (
|
|
80
|
+
rspec-support (~> 3.10.0)
|
|
81
|
+
rspec-support (3.10.2)
|
|
82
|
+
rubocop (1.13.0)
|
|
87
83
|
parallel (~> 1.10)
|
|
88
|
-
parser (>=
|
|
84
|
+
parser (>= 3.0.0.0)
|
|
89
85
|
rainbow (>= 2.2.2, < 4.0)
|
|
90
|
-
regexp_parser (>= 1.
|
|
86
|
+
regexp_parser (>= 1.8, < 3.0)
|
|
91
87
|
rexml
|
|
92
|
-
rubocop-ast (>= 0.0
|
|
88
|
+
rubocop-ast (>= 1.2.0, < 2.0)
|
|
93
89
|
ruby-progressbar (~> 1.7)
|
|
94
|
-
unicode-display_width (>= 1.4.0, <
|
|
95
|
-
rubocop-ast (
|
|
96
|
-
parser (>=
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
90
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
|
91
|
+
rubocop-ast (1.5.0)
|
|
92
|
+
parser (>= 3.0.1.1)
|
|
93
|
+
rubocop-bsm (0.5.9)
|
|
94
|
+
rubocop (~> 1.0)
|
|
95
|
+
rubocop-performance
|
|
96
|
+
rubocop-rails
|
|
97
|
+
rubocop-rake
|
|
98
|
+
rubocop-rspec
|
|
99
|
+
rubocop-performance (1.11.1)
|
|
100
|
+
rubocop (>= 1.7.0, < 2.0)
|
|
101
|
+
rubocop-ast (>= 0.4.0)
|
|
102
|
+
rubocop-rails (2.9.1)
|
|
103
|
+
activesupport (>= 4.2.0)
|
|
104
|
+
rack (>= 1.1)
|
|
105
|
+
rubocop (>= 0.90.0, < 2.0)
|
|
106
|
+
rubocop-rake (0.5.1)
|
|
107
|
+
rubocop
|
|
108
|
+
rubocop-rspec (2.3.0)
|
|
109
|
+
rubocop (~> 1.0)
|
|
110
|
+
rubocop-ast (>= 1.1.0)
|
|
111
|
+
ruby-progressbar (1.11.0)
|
|
112
|
+
ruby2_keywords (0.0.4)
|
|
113
|
+
tzinfo (2.0.4)
|
|
114
|
+
concurrent-ruby (~> 1.0)
|
|
115
|
+
unicode-display_width (2.0.0)
|
|
116
|
+
zeitwerk (2.4.2)
|
|
104
117
|
|
|
105
118
|
PLATFORMS
|
|
106
119
|
ruby
|
|
@@ -111,7 +124,7 @@ DEPENDENCIES
|
|
|
111
124
|
rack-test
|
|
112
125
|
rake
|
|
113
126
|
rspec
|
|
114
|
-
rubocop
|
|
127
|
+
rubocop-bsm
|
|
115
128
|
|
|
116
129
|
BUNDLED WITH
|
|
117
130
|
2.1.4
|
data/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Grape::Kaminari
|
|
2
2
|
|
|
3
|
-
[](https://github.com/bsm/grape-kaminari/actions/workflows/test.yml)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
5
|
|
|
6
6
|
[kaminari](https://github.com/kaminari/kaminari) paginator integration for [grape](https://github.com/intridea/grape) API framework.
|
|
@@ -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
|
-
|
|
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
|
|
data/grape-kaminari.gemspec
CHANGED
|
@@ -12,17 +12,17 @@ Gem::Specification.new do |spec|
|
|
|
12
12
|
spec.homepage = ''
|
|
13
13
|
spec.license = 'MIT'
|
|
14
14
|
|
|
15
|
-
spec.files = `git ls-files -z`.split("\x0").reject {
|
|
15
|
+
spec.files = `git ls-files -z`.split("\x0").reject {|f| f.start_with?('spec/') }
|
|
16
16
|
spec.test_files = `git ls-files -z -- spec/*`.split("\x0")
|
|
17
17
|
spec.require_paths = ['lib']
|
|
18
18
|
spec.required_ruby_version = '>= 2.5'
|
|
19
19
|
|
|
20
|
-
spec.add_runtime_dependency 'grape', '>= 1.0'
|
|
20
|
+
spec.add_runtime_dependency 'grape', '>= 1.6.1', '!= 1.4.0'
|
|
21
21
|
spec.add_runtime_dependency 'kaminari-grape'
|
|
22
22
|
|
|
23
23
|
spec.add_development_dependency 'bundler'
|
|
24
24
|
spec.add_development_dependency 'rack-test'
|
|
25
25
|
spec.add_development_dependency 'rake'
|
|
26
26
|
spec.add_development_dependency 'rspec'
|
|
27
|
-
spec.add_development_dependency 'rubocop'
|
|
27
|
+
spec.add_development_dependency 'rubocop-bsm'
|
|
28
28
|
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
module Grape
|
|
2
2
|
module Kaminari
|
|
3
|
-
class MaxValueValidator < Grape::Validations::Base
|
|
3
|
+
class MaxValueValidator < Grape::Validations::Validators::Base
|
|
4
4
|
def validate_param!(attr_name, params)
|
|
5
5
|
attr = params[attr_name]
|
|
6
6
|
return unless attr.is_a?(Integer) && @option && attr > @option
|
data/lib/grape/kaminari.rb
CHANGED
|
@@ -5,47 +5,61 @@ require 'kaminari/grape'
|
|
|
5
5
|
|
|
6
6
|
module Grape
|
|
7
7
|
module Kaminari
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
.padding(params[:offset].to_i)
|
|
13
|
-
.tap do |data|
|
|
14
|
-
header 'X-Total', data.total_count.to_s
|
|
15
|
-
header 'X-Total-Pages', data.total_pages.to_s
|
|
16
|
-
header 'X-Per-Page', data.limit_value.to_s
|
|
17
|
-
header 'X-Page', data.current_page.to_s
|
|
18
|
-
header 'X-Next-Page', data.next_page.to_s
|
|
19
|
-
header 'X-Prev-Page', data.prev_page.to_s
|
|
20
|
-
header 'X-Offset', params[:offset].to_s
|
|
21
|
-
end
|
|
22
|
-
end
|
|
8
|
+
extend ActiveSupport::Concern
|
|
9
|
+
|
|
10
|
+
included do
|
|
11
|
+
helpers HelperMethods
|
|
23
12
|
end
|
|
24
13
|
|
|
25
|
-
module
|
|
26
|
-
|
|
27
|
-
|
|
14
|
+
module HelperMethods # :nodoc:
|
|
15
|
+
extend Grape::API::Helpers
|
|
16
|
+
|
|
17
|
+
params :pagination do |opts = {}|
|
|
18
|
+
opts.reverse_merge!(
|
|
28
19
|
per_page: ::Kaminari.config.default_per_page || 10,
|
|
29
20
|
max_per_page: ::Kaminari.config.max_per_page,
|
|
30
21
|
offset: 0,
|
|
31
22
|
)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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.'
|
|
42
33
|
end
|
|
43
34
|
end
|
|
35
|
+
|
|
36
|
+
def paginate(collection, without_count: false)
|
|
37
|
+
coll = collection.page(params[:page].to_i)
|
|
38
|
+
.per(params[:per_page].to_i)
|
|
39
|
+
.padding(params[:offset].to_i)
|
|
40
|
+
coll = coll.without_count if without_count && coll.respond_to?(:without_count)
|
|
41
|
+
|
|
42
|
+
unless without_count
|
|
43
|
+
header 'X-Total', coll.total_count.to_s
|
|
44
|
+
header 'X-Total-Pages', coll.total_pages.to_s
|
|
45
|
+
end
|
|
46
|
+
header 'X-Per-Page', coll.limit_value.to_s
|
|
47
|
+
header 'X-Page', coll.current_page.to_s
|
|
48
|
+
header 'X-Next-Page', coll.next_page.to_s
|
|
49
|
+
header 'X-Prev-Page', coll.prev_page.to_s
|
|
50
|
+
header 'X-Offset', params[:offset].to_s
|
|
51
|
+
|
|
52
|
+
coll
|
|
53
|
+
end
|
|
44
54
|
end
|
|
45
55
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
56
|
+
module DSLMethods # :nodoc:
|
|
57
|
+
def paginate(opts = {})
|
|
58
|
+
params do
|
|
59
|
+
use(:pagination, opts)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
49
62
|
end
|
|
63
|
+
Grape::API::Instance.extend(DSLMethods)
|
|
50
64
|
end
|
|
51
65
|
end
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Grape::Kaminari do
|
|
4
|
+
subject do
|
|
5
|
+
Class.new(Grape::API) do
|
|
6
|
+
include Grape::Kaminari
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def declared_params
|
|
11
|
+
subject.namespace_stackable(:declared_params).flatten
|
|
12
|
+
end
|
|
13
|
+
|
|
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
|
|
18
|
+
|
|
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
|
|
23
|
+
|
|
24
|
+
it 'supports legacy declarations' do
|
|
25
|
+
subject.paginate
|
|
26
|
+
expect(declared_params).to eq(%i[page per_page offset])
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it 'does 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
|
|
36
|
+
|
|
37
|
+
describe 'descriptions, validation, and defaults' do
|
|
38
|
+
let(:params) { subject.routes.first.params }
|
|
39
|
+
|
|
40
|
+
before do
|
|
41
|
+
subject.params { use :pagination }
|
|
42
|
+
subject.get('/') { 'OK' }
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
it 'does not require :page' do
|
|
46
|
+
expect(params['page'][:required]).to eq(false)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it 'does not require :per_page' do
|
|
50
|
+
expect(params['per_page'][:required]).to eq(false)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it 'does not require :offset' do
|
|
54
|
+
expect(params['offset'][:required]).to eq(false)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it 'describes :page' do
|
|
58
|
+
expect(params['page'][:desc]).to eq('Page offset to fetch.')
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it 'describes :per_page' do
|
|
62
|
+
expect(params['per_page'][:desc]).to eq('Number of results to return per page.')
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it 'describes :offset' do
|
|
66
|
+
expect(params['offset'][:desc]).to eq('Pad a number of results.')
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it 'validates :page as Integer' do
|
|
70
|
+
expect(params['page'][:type]).to eq('Integer')
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it 'validates :per_page as Integer' do
|
|
74
|
+
expect(params['per_page'][:type]).to eq('Integer')
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it 'validates :offset as Integer' do
|
|
78
|
+
expect(params['offset'][:type]).to eq('Integer')
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
it 'defaults :page to 1' do
|
|
82
|
+
expect(params['page'][:default]).to eq(1)
|
|
83
|
+
end
|
|
84
|
+
|
|
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)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it 'defaults :offset to 0' do
|
|
90
|
+
expect(params['offset'][:default]).to eq(0)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
describe 'custom paginated api' do
|
|
95
|
+
let(:app) { subject }
|
|
96
|
+
let(:params) { subject.routes.first.params }
|
|
97
|
+
|
|
98
|
+
before do
|
|
99
|
+
subject.params do
|
|
100
|
+
use :pagination, per_page: 99, max_per_page: 999, offset: 9
|
|
101
|
+
end
|
|
102
|
+
subject.get('/') { 'OK' }
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
it 'defaults :per_page to customized value' do
|
|
106
|
+
expect(params['per_page'][:default]).to eq(99)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it 'succeeds when :per_page is within :max_value' do
|
|
110
|
+
get('/', page: 1, per_page: 999)
|
|
111
|
+
expect(last_response.status).to eq(200)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
it 'ensures :per_page is within :max_value' do
|
|
115
|
+
get('/', page: 1, per_page: 1_000)
|
|
116
|
+
expect(last_response.status).to eq(400)
|
|
117
|
+
expect(last_response.body).to match(/per_page must be less than or equal 999/)
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
it 'ensures :per_page is numeric' do
|
|
121
|
+
get('/', page: 1, per_page: 'foo')
|
|
122
|
+
expect(last_response.status).to eq(400)
|
|
123
|
+
expect(last_response.body).to match(/per_page is invalid/)
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
it 'defaults :offset to customized value' do
|
|
127
|
+
expect(params['offset'][:default]).to eq(9)
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
data/spec/spec_helper.rb
CHANGED
|
@@ -4,7 +4,7 @@ require 'rack/test'
|
|
|
4
4
|
|
|
5
5
|
# Requires supporting files with custom matchers and macros, etc,
|
|
6
6
|
# in ./support/ and its subdirectories.
|
|
7
|
-
Dir[File.expand_path('./support/**/*.rb', __dir__)].sort.each {
|
|
7
|
+
Dir[File.expand_path('./support/**/*.rb', __dir__)].sort.each {|f| require f }
|
|
8
8
|
|
|
9
9
|
I18n.enforce_available_locales = false
|
|
10
10
|
|
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.2
|
|
4
|
+
version: 0.4.2
|
|
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:
|
|
12
|
+
date: 2022-01-04 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: grape
|
|
@@ -17,14 +17,20 @@ dependencies:
|
|
|
17
17
|
requirements:
|
|
18
18
|
- - ">="
|
|
19
19
|
- !ruby/object:Gem::Version
|
|
20
|
-
version:
|
|
20
|
+
version: 1.6.1
|
|
21
|
+
- - "!="
|
|
22
|
+
- !ruby/object:Gem::Version
|
|
23
|
+
version: 1.4.0
|
|
21
24
|
type: :runtime
|
|
22
25
|
prerelease: false
|
|
23
26
|
version_requirements: !ruby/object:Gem::Requirement
|
|
24
27
|
requirements:
|
|
25
28
|
- - ">="
|
|
26
29
|
- !ruby/object:Gem::Version
|
|
27
|
-
version:
|
|
30
|
+
version: 1.6.1
|
|
31
|
+
- - "!="
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: 1.4.0
|
|
28
34
|
- !ruby/object:Gem::Dependency
|
|
29
35
|
name: kaminari-grape
|
|
30
36
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -96,7 +102,7 @@ dependencies:
|
|
|
96
102
|
- !ruby/object:Gem::Version
|
|
97
103
|
version: '0'
|
|
98
104
|
- !ruby/object:Gem::Dependency
|
|
99
|
-
name: rubocop
|
|
105
|
+
name: rubocop-bsm
|
|
100
106
|
requirement: !ruby/object:Gem::Requirement
|
|
101
107
|
requirements:
|
|
102
108
|
- - ">="
|
|
@@ -116,9 +122,10 @@ executables: []
|
|
|
116
122
|
extensions: []
|
|
117
123
|
extra_rdoc_files: []
|
|
118
124
|
files:
|
|
125
|
+
- ".github/workflows/test.yml"
|
|
119
126
|
- ".gitignore"
|
|
120
127
|
- ".rubocop.yml"
|
|
121
|
-
-
|
|
128
|
+
- CHANGELOG.md
|
|
122
129
|
- Gemfile
|
|
123
130
|
- Gemfile.lock
|
|
124
131
|
- LICENSE.txt
|
|
@@ -129,8 +136,7 @@ files:
|
|
|
129
136
|
- lib/grape/kaminari.rb
|
|
130
137
|
- lib/grape/kaminari/max_value_validator.rb
|
|
131
138
|
- lib/grape/kaminari/version.rb
|
|
132
|
-
- spec/kaminari_spec.rb
|
|
133
|
-
- spec/paginate_helper_spec.rb
|
|
139
|
+
- spec/grape/kaminari_spec.rb
|
|
134
140
|
- spec/spec_helper.rb
|
|
135
141
|
homepage: ''
|
|
136
142
|
licenses:
|
|
@@ -151,11 +157,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
151
157
|
- !ruby/object:Gem::Version
|
|
152
158
|
version: '0'
|
|
153
159
|
requirements: []
|
|
154
|
-
rubygems_version: 3.
|
|
160
|
+
rubygems_version: 3.2.15
|
|
155
161
|
signing_key:
|
|
156
162
|
specification_version: 4
|
|
157
163
|
summary: kaminari integration for grape
|
|
158
164
|
test_files:
|
|
159
|
-
- spec/kaminari_spec.rb
|
|
160
|
-
- spec/paginate_helper_spec.rb
|
|
165
|
+
- spec/grape/kaminari_spec.rb
|
|
161
166
|
- spec/spec_helper.rb
|
data/.travis.yml
DELETED
data/spec/kaminari_spec.rb
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
|
|
3
|
-
class UnPaginatedAPI < Grape::API
|
|
4
|
-
# Intentionally not including Grape::Kaminari
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
class PaginatedAPI < Grape::API
|
|
8
|
-
include Grape::Kaminari
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
describe Grape::Kaminari do
|
|
12
|
-
describe 'unpaginated api' do
|
|
13
|
-
subject { Class.new(UnPaginatedAPI) }
|
|
14
|
-
|
|
15
|
-
it 'raises an error' do
|
|
16
|
-
expect { subject.paginate }.to raise_error(NoMethodError, /undefined method `paginate' for/i)
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
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
|
|
43
|
-
|
|
44
|
-
it 'does not require :offset' do
|
|
45
|
-
expect(params['offset'][:required]).to eq(false)
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
it 'describes :page' do
|
|
49
|
-
expect(params['page'][:desc]).to eq('Page offset to fetch.')
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
it 'describes :per_page' do
|
|
53
|
-
expect(params['per_page'][:desc]).to eq('Number of results to return per page.')
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
it 'describes :offset' do
|
|
57
|
-
expect(params['offset'][:desc]).to eq('Pad a number of results.')
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
it 'validates :page as Integer' do
|
|
61
|
-
expect(params['page'][:type]).to eq('Integer')
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
it 'validates :per_page as Integer' do
|
|
65
|
-
expect(params['per_page'][:type]).to eq('Integer')
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
it 'validates :offset as Integer' do
|
|
69
|
-
expect(params['offset'][:type]).to eq('Integer')
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
it 'defaults :page to 1' do
|
|
73
|
-
expect(params['page'][:default]).to eq(1)
|
|
74
|
-
end
|
|
75
|
-
|
|
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
|
|
79
|
-
|
|
80
|
-
it 'defaults :offset to 0' do
|
|
81
|
-
expect(params['offset'][:default]).to eq(0)
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
describe 'custom paginated api' do
|
|
87
|
-
subject { Class.new(PaginatedAPI) }
|
|
88
|
-
let(:app) { subject }
|
|
89
|
-
let(:params) { subject.routes.first.params }
|
|
90
|
-
|
|
91
|
-
before do
|
|
92
|
-
subject.paginate per_page: 99, max_per_page: 999, offset: 9
|
|
93
|
-
subject.get('/') {}
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
it 'defaults :per_page to customized value' do
|
|
97
|
-
expect(params['per_page'][:default]).to eq(99)
|
|
98
|
-
end
|
|
99
|
-
|
|
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)
|
|
103
|
-
end
|
|
104
|
-
|
|
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/)
|
|
109
|
-
end
|
|
110
|
-
|
|
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/)
|
|
115
|
-
end
|
|
116
|
-
|
|
117
|
-
it 'defaults :offset to customized value' do
|
|
118
|
-
expect(params['offset'][:default]).to eq(9)
|
|
119
|
-
end
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
describe 'paginated api without :offset' do
|
|
123
|
-
subject { Class.new(PaginatedAPI) }
|
|
124
|
-
|
|
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)
|
|
128
|
-
end
|
|
129
|
-
end
|
|
130
|
-
end
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
require 'spec_helper'
|
|
2
|
-
require 'json'
|
|
3
|
-
|
|
4
|
-
class PaginatedAPI < Grape::API
|
|
5
|
-
include Grape::Kaminari
|
|
6
|
-
|
|
7
|
-
paginate
|
|
8
|
-
get '' do
|
|
9
|
-
paginate(Kaminari.paginate_array((1..10).to_a))
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
paginate offset: false
|
|
13
|
-
get 'no-offset' do
|
|
14
|
-
paginate(Kaminari.paginate_array((1..10).to_a))
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
describe Grape::Kaminari do
|
|
19
|
-
subject { PaginatedAPI.new }
|
|
20
|
-
def app
|
|
21
|
-
subject
|
|
22
|
-
end
|
|
23
|
-
let(:json) { JSON.parse(last_response.body) }
|
|
24
|
-
let(:header) { last_response.header }
|
|
25
|
-
|
|
26
|
-
describe 'paginated helper' do
|
|
27
|
-
it 'returns the first page' do
|
|
28
|
-
get '/', page: 1, per_page: 3
|
|
29
|
-
expect(json).to eq [1, 2, 3]
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
it 'returns the second page' do
|
|
33
|
-
get '/', page: 2, per_page: 3
|
|
34
|
-
expect(json).to eq [4, 5, 6]
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
# This is here to ensure that Kaminari can handle `padding(false)`
|
|
38
|
-
# and still do the right thing.
|
|
39
|
-
it 'works when offset is false' do
|
|
40
|
-
get '/no-offset', page: 1, per_page: 3
|
|
41
|
-
expect(json).to eq [1, 2, 3]
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
it 'sets headers' do
|
|
45
|
-
get '/', page: 3, per_page: 2, offset: 1
|
|
46
|
-
expect(header['X-Total']).to eq '10'
|
|
47
|
-
expect(header['X-Total-Pages']).to eq '5'
|
|
48
|
-
expect(header['X-Per-Page']).to eq '2'
|
|
49
|
-
expect(header['X-Page']).to eq '3'
|
|
50
|
-
expect(header['X-Next-Page']).to eq '4'
|
|
51
|
-
expect(header['X-Prev-Page']).to eq '2'
|
|
52
|
-
expect(header['X-Offset']).to eq '1'
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|