grape-kaminari 0.1.8 → 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
- SHA1:
3
- metadata.gz: 663d1ddc692320b72e10892e6557c37409f3dd0d
4
- data.tar.gz: c87f596ddf5cae8c6251466e2a6b8ceef59a3a84
2
+ SHA256:
3
+ metadata.gz: 5be6c20ba0aef343949970af43c69d6781e945ed043b3baa3b6c258570f4300b
4
+ data.tar.gz: f9f31a5f31560e5cd751b31109d5720410ea4f8c523a1d0b4b050c1eef039247
5
5
  SHA512:
6
- metadata.gz: 47329f62f0d29254b685fc43fac300625e2db36b2c5a09a457f7405c243d603c5bb6e42d9aa6e944c32d0cf62dea72ee209c9062eb1a20dc06f7251bb2df1567
7
- data.tar.gz: cc550d350419d156ea34fd65caa5b3e6453d64034f668e203fc1e0542494749c48f7cc257edb7db37011ed30bdc65c84604bdc7e3c9f2dd125381db4ecb3457c
6
+ metadata.gz: c1205ab3b90b586436aaeeb2f94ce4443acdbd372b72a6e1acda2cb250081f976e4b9743eb4f36bdc92d82dc0174d16289202c61128536a1ca440c64f5c3d923
7
+ data.tar.gz: 3c8f039a3f9596fc78bb9fd79adf917e79a662b372f480da7aa0bf35a75a07d1b40cc20557c9038300b92e3f12f566ad512ad6a9aede7c4f18f11b3b778c8997
data/.gitignore CHANGED
@@ -3,7 +3,6 @@
3
3
  .bundle
4
4
  .config
5
5
  .yardoc
6
- Gemfile.lock
7
6
  InstalledFiles
8
7
  _yardoc
9
8
  coverage
@@ -0,0 +1,26 @@
1
+ AllCops:
2
+ 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
+
13
+ Naming/FileName:
14
+ Exclude:
15
+ - 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
@@ -0,0 +1,6 @@
1
+ language: ruby
2
+ cache: bundler
3
+ rvm:
4
+ - 2.7
5
+ - 2.6
6
+ - 2.5
@@ -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).
@@ -0,0 +1,117 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ grape-kaminari (0.4.0)
5
+ grape (>= 1.0, != 1.4.0)
6
+ kaminari-grape
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ activesupport (6.0.3.4)
12
+ concurrent-ruby (~> 1.0, >= 1.0.2)
13
+ i18n (>= 0.7, < 2)
14
+ minitest (~> 5.1)
15
+ tzinfo (~> 1.1)
16
+ zeitwerk (~> 2.2, >= 2.2.2)
17
+ ast (2.4.1)
18
+ builder (3.2.4)
19
+ concurrent-ruby (1.1.7)
20
+ diff-lcs (1.4.4)
21
+ dry-configurable (0.11.6)
22
+ concurrent-ruby (~> 1.0)
23
+ dry-core (~> 0.4, >= 0.4.7)
24
+ dry-equalizer (~> 0.2)
25
+ dry-container (0.7.2)
26
+ concurrent-ruby (~> 1.0)
27
+ dry-configurable (~> 0.1, >= 0.1.3)
28
+ dry-core (0.4.9)
29
+ concurrent-ruby (~> 1.0)
30
+ dry-equalizer (0.3.0)
31
+ dry-inflector (0.2.0)
32
+ dry-logic (1.0.8)
33
+ concurrent-ruby (~> 1.0)
34
+ dry-core (~> 0.2)
35
+ dry-equalizer (~> 0.2)
36
+ dry-types (1.4.0)
37
+ concurrent-ruby (~> 1.0)
38
+ dry-container (~> 0.3)
39
+ dry-core (~> 0.4, >= 0.4.4)
40
+ dry-equalizer (~> 0.3)
41
+ dry-inflector (~> 0.1, >= 0.1.2)
42
+ dry-logic (~> 1.0, >= 1.0.2)
43
+ grape (1.5.0)
44
+ activesupport
45
+ builder
46
+ dry-types (>= 1.1)
47
+ mustermann-grape (~> 1.0.0)
48
+ rack (>= 1.3.0)
49
+ rack-accept
50
+ i18n (1.8.5)
51
+ concurrent-ruby (~> 1.0)
52
+ kaminari-core (1.2.1)
53
+ kaminari-grape (1.0.1)
54
+ grape
55
+ kaminari-core (~> 1.0)
56
+ minitest (5.14.2)
57
+ mustermann (1.1.1)
58
+ ruby2_keywords (~> 0.0.1)
59
+ mustermann-grape (1.0.1)
60
+ mustermann (>= 1.0.0)
61
+ parallel (1.19.2)
62
+ parser (2.7.2.0)
63
+ ast (~> 2.4.1)
64
+ rack (2.2.3)
65
+ rack-accept (0.4.5)
66
+ rack (>= 0.4)
67
+ rack-test (1.1.0)
68
+ rack (>= 1.0, < 3)
69
+ rainbow (3.0.0)
70
+ rake (13.0.1)
71
+ regexp_parser (1.8.1)
72
+ rexml (3.2.4)
73
+ rspec (3.9.0)
74
+ rspec-core (~> 3.9.0)
75
+ rspec-expectations (~> 3.9.0)
76
+ rspec-mocks (~> 3.9.0)
77
+ rspec-core (3.9.3)
78
+ rspec-support (~> 3.9.3)
79
+ rspec-expectations (3.9.2)
80
+ diff-lcs (>= 1.2.0, < 2.0)
81
+ rspec-support (~> 3.9.0)
82
+ rspec-mocks (3.9.1)
83
+ diff-lcs (>= 1.2.0, < 2.0)
84
+ rspec-support (~> 3.9.0)
85
+ rspec-support (3.9.3)
86
+ rubocop (0.92.0)
87
+ parallel (~> 1.10)
88
+ parser (>= 2.7.1.5)
89
+ rainbow (>= 2.2.2, < 4.0)
90
+ regexp_parser (>= 1.7)
91
+ rexml
92
+ rubocop-ast (>= 0.5.0)
93
+ ruby-progressbar (~> 1.7)
94
+ unicode-display_width (>= 1.4.0, < 2.0)
95
+ rubocop-ast (0.7.1)
96
+ parser (>= 2.7.1.5)
97
+ ruby-progressbar (1.10.1)
98
+ ruby2_keywords (0.0.2)
99
+ thread_safe (0.3.6)
100
+ tzinfo (1.2.7)
101
+ thread_safe (~> 0.1)
102
+ unicode-display_width (1.7.0)
103
+ zeitwerk (2.4.0)
104
+
105
+ PLATFORMS
106
+ ruby
107
+
108
+ DEPENDENCIES
109
+ bundler
110
+ grape-kaminari!
111
+ rack-test
112
+ rake
113
+ rspec
114
+ rubocop
115
+
116
+ BUNDLED WITH
117
+ 2.1.4
@@ -1,6 +1,7 @@
1
1
  The MIT License (MIT)
2
2
 
3
3
  Copyright (c) 2013-2014 Monterail.com LLC
4
+ Copyright (c) 2020 Black Square Media Ltd
4
5
 
5
6
  Permission is hereby granted, free of charge, to any person obtaining a copy of
6
7
  this software and associated documentation files (the "Software"), to deal in
data/README.md CHANGED
@@ -1,6 +1,9 @@
1
- # Grape::Kaminari [![Gem Version](https://badge.fury.io/rb/grape-kaminari.png)](http://badge.fury.io/rb/grape-kaminari) [![Circle CI](https://circleci.com/gh/monterail/grape-kaminari.png?style=shield)](https://circleci.com/gh/monterail/grape-kaminari)
1
+ # Grape::Kaminari
2
2
 
3
- [kaminari](https://github.com/amatsuda/kaminari) paginator integration for [grape](https://github.com/intridea/grape) API framework.
3
+ [![Build Status](https://travis-ci.org/bsm/grape-kaminari.png?branch=master)](https://travis-ci.org/bsm/grape-kaminari)
4
+ [![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
5
+
6
+ [kaminari](https://github.com/kaminari/kaminari) paginator integration for [grape](https://github.com/intridea/grape) API framework.
4
7
 
5
8
  ## Installation
6
9
 
@@ -32,7 +35,6 @@ class MyApi < Grape::API
32
35
  resource :posts do
33
36
  desc 'Return a list of posts.'
34
37
 
35
- # Annotate action with `paginate`.
36
38
  # This will add three optional params: page, per_page, and offset
37
39
  #
38
40
  # You can optionally overwrite the default :per_page setting (10)
@@ -42,8 +44,9 @@ class MyApi < Grape::API
42
44
  # You can disable the offset parameter from appearing in the API
43
45
  # documentation by setting it to false.
44
46
  #
45
- paginate per_page: 20, max_per_page: 30, offset: 5
46
-
47
+ params do
48
+ use :pagination, per_page: 20, max_per_page: 30, offset: 5
49
+ end
47
50
  get do
48
51
  posts = Post.where(...)
49
52
 
@@ -87,8 +90,4 @@ X-Offset: 10
87
90
 
88
91
  ## Contributing
89
92
 
90
- 1. Fork it
91
- 2. Create your feature branch (`git checkout -b my-new-feature`)
92
- 3. Commit your changes (`git commit -am 'Add some feature'`)
93
- 4. Push to the branch (`git push origin my-new-feature`)
94
- 5. Create new Pull Request
93
+ Bug reports and pull requests are welcome on GitHub at https://github.com/bsm/grape-kaminari.
data/Rakefile CHANGED
@@ -1,5 +1,8 @@
1
- require "bundler/gem_tasks"
2
-
3
- task default: :spec
1
+ require 'bundler/gem_tasks'
2
+ require 'rubocop/rake_task'
4
3
  require 'rspec/core/rake_task'
4
+
5
+ RuboCop::RakeTask.new
5
6
  RSpec::Core::RakeTask.new
7
+
8
+ task default: %i[rubocop spec]
@@ -1,28 +1,28 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require 'grape/kaminari/version'
5
4
 
6
5
  Gem::Specification.new do |spec|
7
- spec.name = "grape-kaminari"
6
+ spec.name = 'grape-kaminari'
8
7
  spec.version = Grape::Kaminari::VERSION
9
- spec.authors = ["Tymon Tobolski"]
10
- spec.email = ["tymon.tobolski@monterail.com"]
11
- spec.description = %q{kaminari paginator integration for grape API framework}
12
- spec.summary = %q{kaminari integration for grape}
13
- spec.homepage = ""
14
- spec.license = "MIT"
8
+ spec.authors = ['Tymon Tobolski', 'Black Square Media']
9
+ spec.email = ['info@blacksquaremedia.com']
10
+ spec.description = 'kaminari paginator integration for grape API framework'
11
+ spec.summary = 'kaminari integration for grape'
12
+ spec.homepage = ''
13
+ spec.license = 'MIT'
15
14
 
16
- spec.files = `git ls-files`.split($/)
17
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
- spec.require_paths = ["lib"]
15
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.start_with?('spec/') }
16
+ spec.test_files = `git ls-files -z -- spec/*`.split("\x0")
17
+ spec.require_paths = ['lib']
18
+ spec.required_ruby_version = '>= 2.5'
20
19
 
20
+ spec.add_runtime_dependency 'grape', '>= 1.0', '!= 1.4.0'
21
+ spec.add_runtime_dependency 'kaminari-grape'
21
22
 
22
- spec.add_runtime_dependency "grape"
23
- spec.add_runtime_dependency "kaminari"
24
-
25
- spec.add_development_dependency "bundler", "~> 1.3"
26
- spec.add_development_dependency "rake"
27
- spec.add_development_dependency 'rspec', '~> 2.9'
23
+ spec.add_development_dependency 'bundler'
24
+ spec.add_development_dependency 'rack-test'
25
+ spec.add_development_dependency 'rake'
26
+ spec.add_development_dependency 'rspec'
27
+ spec.add_development_dependency 'rubocop'
28
28
  end
@@ -1,11 +1 @@
1
- module Grape
2
- module Kaminari
3
- class << self
4
- def post_0_9_0_grape?
5
- Gem::Version.new(Grape::VERSION) > Gem::Version.new('0.9.0')
6
- end
7
- end
8
- end
9
- end
10
-
11
- require "grape/kaminari"
1
+ require 'grape/kaminari'
@@ -1,45 +1,61 @@
1
- require "grape"
2
- require "grape/kaminari/version"
3
- require "grape/kaminari/max_value_validator"
4
- require "kaminari/grape"
1
+ require 'grape'
2
+ require 'grape/kaminari/version'
3
+ require 'grape/kaminari/max_value_validator'
4
+ require 'kaminari/grape'
5
5
 
6
6
  module Grape
7
7
  module Kaminari
8
- def self.included(base)
9
- base.class_eval do
10
- helpers do
11
- def paginate(collection)
12
- collection.page(params[:page]).per(params[:per_page]).padding(params[:offset]).tap do |data|
13
- header "X-Total", data.total_count.to_s
14
- header "X-Total-Pages", data.num_pages.to_s
15
- header "X-Per-Page", data.limit_value.to_s
16
- header "X-Page", data.current_page.to_s
17
- header "X-Next-Page", data.next_page.to_s
18
- header "X-Prev-Page", data.prev_page.to_s
19
- header "X-Offset", params[:offset].to_s
20
- end
21
- end
8
+ extend ActiveSupport::Concern
9
+
10
+ included do
11
+ helpers HelperMethods
12
+ end
13
+
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.'
22
33
  end
34
+ end
35
+
36
+ def paginate(collection)
37
+ collection.page(params[:page].to_i)
38
+ .per(params[:per_page].to_i)
39
+ .padding(params[:offset].to_i)
40
+ .tap do |data|
41
+ header 'X-Total', data.total_count.to_s
42
+ header 'X-Total-Pages', data.total_pages.to_s
43
+ header 'X-Per-Page', data.limit_value.to_s
44
+ header 'X-Page', data.current_page.to_s
45
+ header 'X-Next-Page', data.next_page.to_s
46
+ header 'X-Prev-Page', data.prev_page.to_s
47
+ header 'X-Offset', params[:offset].to_s
48
+ end
49
+ end
50
+ end
23
51
 
24
- def self.paginate(options = {})
25
- options.reverse_merge!(
26
- per_page: ::Kaminari.config.default_per_page || 10,
27
- max_per_page: ::Kaminari.config.max_per_page,
28
- offset: 0
29
- )
30
- params do
31
- optional :page, type: Integer, default: 1,
32
- desc: 'Page offset to fetch.'
33
- optional :per_page, type: Integer, default: options[:per_page],
34
- desc: 'Number of results to return per page.',
35
- max_value: options[:max_per_page]
36
- if options[:offset].is_a? Numeric
37
- optional :offset, type: Integer, default: options[:offset],
38
- desc: 'Pad a number of results.'
39
- end
40
- end
52
+ module DSLMethods # :nodoc:
53
+ def paginate(opts = {})
54
+ params do
55
+ use(:pagination, opts)
41
56
  end
42
57
  end
43
58
  end
59
+ Grape::API::Instance.extend(DSLMethods)
44
60
  end
45
61
  end
@@ -1,23 +1,14 @@
1
1
  module Grape
2
2
  module Kaminari
3
- base = if post_0_9_0_grape?
4
- Grape::Validations::Base
5
- else
6
- Grape::Validations::SingleOptionValidator
7
- end
8
-
9
- class MaxValueValidator < base
3
+ class MaxValueValidator < Grape::Validations::Base
10
4
  def validate_param!(attr_name, params)
11
- return unless params[attr_name]
12
-
13
5
  attr = params[attr_name]
14
- if attr && @option && attr > @option
15
- if Gem::Version.new(Grape::VERSION) >= Gem::Version.new('0.9.0')
16
- raise Grape::Exceptions::Validation, params: [@scope.full_name(attr_name)], message: "must be less than #{@option}"
17
- else
18
- raise Grape::Exceptions::Validation, param: @scope.full_name(attr_name), message: "must be less than #{@option}"
19
- end
20
- end
6
+ return unless attr.is_a?(Integer) && @option && attr > @option
7
+
8
+ raise Grape::Exceptions::Validation.new(
9
+ params: [@scope.full_name(attr_name)],
10
+ message: "must be less than or equal #{@option}",
11
+ )
21
12
  end
22
13
  end
23
14
  end
@@ -1,5 +1,5 @@
1
1
  module Grape
2
2
  module Kaminari
3
- VERSION = "0.1.8"
3
+ VERSION = '0.4.0'.freeze
4
4
  end
5
5
  end
@@ -1,138 +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
8
+ subject { Class.new(PaginatedAPI) }
12
9
 
13
- describe 'unpaginated api' do
14
- subject { Class.new(UnPaginatedAPI) }
15
-
16
- it 'raises an error' do
17
- expect { subject.paginate }.to raise_error(NoMethodError, /undefined method `paginate' for/i)
18
- end
10
+ def declared_params
11
+ subject.namespace_stackable(:declared_params).flatten
19
12
  end
20
13
 
21
- describe 'default paginated api' do
22
- subject { Class.new(PaginatedAPI) }
23
-
24
- it 'adds to declared parameters' do
25
- subject.paginate
26
- if Grape::Kaminari.post_0_9_0_grape?
27
- expect(subject.inheritable_setting.route[:declared_params]).to eq([:page, :per_page, :offset])
28
- else
29
- expect(subject.settings[:declared_params]).to eq([:page, :per_page, :offset])
30
- end
31
- end
32
-
33
- describe 'descriptions, validation, and defaults' do
34
- before do
35
- subject.paginate
36
- subject.get '/' do; end
37
- end
38
- let(:params) {subject.routes.first.route_params}
39
-
40
- it 'does not require :page' do
41
- expect(params['page'][:required]).to eq(false)
42
- end
43
-
44
- it 'does not require :per_page' do
45
- expect(params['per_page'][:required]).to eq(false)
46
- end
47
-
48
- it 'does not require :offset' do
49
- expect(params['offset'][:required]).to eq(false)
50
- 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
51
18
 
52
- it 'describes :page' do
53
- expect(params['page'][:desc]).to eq('Page offset to fetch.')
54
- 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
55
23
 
56
- it 'describes :per_page' do
57
- expect(params['per_page'][:desc]).to eq('Number of results to return per page.')
58
- end
24
+ it 'should support legacy declarations' do
25
+ subject.paginate
26
+ expect(declared_params).to eq(%i[page per_page offset])
27
+ end
59
28
 
60
- it 'describes :offset' do
61
- expect(params['offset'][:desc]).to eq('Pad a number of results.')
62
- 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
63
36
 
64
- it 'validates :page as Integer' do
65
- expect(params['page'][:type]).to eq('Integer')
66
- end
37
+ describe 'descriptions, validation, and defaults' do
38
+ let(:params) { subject.routes.first.params }
67
39
 
68
- it 'validates :per_page as Integer' do
69
- expect(params['per_page'][:type]).to eq('Integer')
70
- end
40
+ before do
41
+ subject.params { use :pagination }
42
+ subject.get('/') {}
43
+ end
71
44
 
72
- it 'validates :offset as Integer' do
73
- expect(params['offset'][:type]).to eq('Integer')
74
- end
45
+ it 'does not require :page' do
46
+ expect(params['page'][:required]).to eq(false)
47
+ end
75
48
 
76
- it 'defaults :page to 1' do
77
- expect(params['page'][:default]).to eq(1)
78
- end
49
+ it 'does not require :per_page' do
50
+ expect(params['per_page'][:required]).to eq(false)
51
+ end
79
52
 
80
- it 'defaults :per_page to Kaminari.config.default_per_page' do
81
- expect(params['per_page'][:default]).to eq(::Kaminari.config.default_per_page)
82
- end
53
+ it 'does not require :offset' do
54
+ expect(params['offset'][:required]).to eq(false)
55
+ end
83
56
 
84
- it 'defaults :offset to 0' do
85
- expect(params['offset'][:default]).to eq(0)
86
- end
57
+ it 'describes :page' do
58
+ expect(params['page'][:desc]).to eq('Page offset to fetch.')
59
+ end
87
60
 
61
+ it 'describes :per_page' do
62
+ expect(params['per_page'][:desc]).to eq('Number of results to return per page.')
63
+ end
88
64
 
65
+ it 'describes :offset' do
66
+ expect(params['offset'][:desc]).to eq('Pad a number of results.')
89
67
  end
90
68
 
91
- end
69
+ it 'validates :page as Integer' do
70
+ expect(params['page'][:type]).to eq('Integer')
71
+ end
92
72
 
93
- describe 'custom paginated api' do
94
- subject { Class.new(PaginatedAPI) }
95
- def app; subject; end
73
+ it 'validates :per_page as Integer' do
74
+ expect(params['per_page'][:type]).to eq('Integer')
75
+ end
96
76
 
97
- before do
98
- subject.paginate per_page:99, max_per_page: 999, offset: 9
99
- subject.get '/' do; end
77
+ it 'validates :offset as Integer' do
78
+ expect(params['offset'][:type]).to eq('Integer')
100
79
  end
101
- let(:params) {subject.routes.first.route_params}
102
80
 
103
- it 'defaults :per_page to customized value' do
104
- expect(params['per_page'][:default]).to eq(99)
81
+ it 'defaults :page to 1' do
82
+ expect(params['page'][:default]).to eq(1)
105
83
  end
106
84
 
107
- it 'succeeds when :per_page is within :max_value' do
108
- get('/', page: 1, per_page: 999)
109
- expect(last_response.status).to eq 200
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)
110
87
  end
111
88
 
112
- it 'ensures :per_page is within :max_value' do
113
- get('/', page: 1, per_page: 1_000)
114
- expect(last_response.status).to eq 400
115
- expect(last_response.body).to match /per_page must be less than 999/
89
+ it 'defaults :offset to 0' do
90
+ expect(params['offset'][:default]).to eq(0)
116
91
  end
92
+ end
93
+ end
117
94
 
118
- it 'defaults :offset to customized value' do
119
- expect(params['offset'][:default]).to eq(9)
95
+ describe 'custom paginated api' do
96
+ subject { Class.new(PaginatedAPI) }
97
+ let(:app) { subject }
98
+ let(:params) { subject.routes.first.params }
99
+
100
+ before do
101
+ subject.params do
102
+ use :pagination, per_page: 99, max_per_page: 999, offset: 9
120
103
  end
104
+ subject.get('/') {}
105
+ end
121
106
 
107
+ it 'defaults :per_page to customized value' do
108
+ expect(params['per_page'][:default]).to eq(99)
122
109
  end
123
110
 
124
- describe 'paginated api without :offset' do
125
- subject { Class.new(PaginatedAPI) }
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
126
115
 
127
- it 'excludes :offset from declared params' do
128
- subject.paginate offset: false
129
- if Grape::Kaminari.post_0_9_0_grape?
130
- expect(subject.inheritable_setting.route[:declared_params]).not_to include(:offset)
131
- else
132
- expect(subject.settings[:declared_params]).not_to include(:offset)
133
- end
134
- end
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
135
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/)
136
126
  end
137
127
 
128
+ it 'defaults :offset to customized value' do
129
+ expect(params['offset'][:default]).to eq(9)
130
+ end
138
131
  end
@@ -4,25 +4,37 @@ 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
20
+
21
+ resource :sub do
22
+ params do
23
+ use :pagination, per_page: 2
24
+ end
25
+ get '/' do
26
+ paginate(Kaminari.paginate_array((1..10).to_a))
27
+ end
28
+ end
16
29
  end
17
30
 
18
31
  describe Grape::Kaminari do
19
32
  subject { PaginatedAPI.new }
20
- def app; subject; end
33
+ let(:app) { subject }
21
34
  let(:json) { JSON.parse(last_response.body) }
22
35
  let(:header) { last_response.header }
23
36
 
24
37
  describe 'paginated helper' do
25
-
26
38
  it 'returns the first page' do
27
39
  get '/', page: 1, per_page: 3
28
40
  expect(json).to eq [1, 2, 3]
@@ -51,7 +63,9 @@ describe Grape::Kaminari do
51
63
  expect(header['X-Offset']).to eq '1'
52
64
  end
53
65
 
66
+ it 'can be inherited' do
67
+ get '/sub', page: 1
68
+ expect(json).to eq [1, 2]
69
+ end
54
70
  end
55
-
56
-
57
71
  end
@@ -1,19 +1,15 @@
1
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
- $LOAD_PATH.unshift(File.dirname(__FILE__))
3
1
  require 'rspec'
4
- require 'kaminari'
5
- require 'grape'
6
2
  require 'grape-kaminari'
7
3
  require 'rack/test'
8
4
 
9
5
  # Requires supporting files with custom matchers and macros, etc,
10
6
  # in ./support/ and its subdirectories.
11
- Dir['#{File.dirname(__FILE__)}/support/**/*.rb'].each {|f| require f}
7
+ Dir[File.expand_path('./support/**/*.rb', __dir__)].sort.each { |f| require f }
12
8
 
13
9
  I18n.enforce_available_locales = false
14
10
 
15
11
  RSpec.configure do |config|
16
12
  config.include Rack::Test::Methods
17
- config.treat_symbols_as_metadata_keys_with_true_values = true
13
+ config.raise_errors_for_deprecations!
18
14
  config.order = 'random'
19
15
  end
metadata CHANGED
@@ -1,14 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grape-kaminari
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.8
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tymon Tobolski
8
+ - Black Square Media
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2015-07-15 00:00:00.000000000 Z
12
+ date: 2020-10-08 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: grape
@@ -16,16 +17,22 @@ dependencies:
16
17
  requirements:
17
18
  - - ">="
18
19
  - !ruby/object:Gem::Version
19
- version: '0'
20
+ version: '1.0'
21
+ - - "!="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.4.0
20
24
  type: :runtime
21
25
  prerelease: false
22
26
  version_requirements: !ruby/object:Gem::Requirement
23
27
  requirements:
24
28
  - - ">="
25
29
  - !ruby/object:Gem::Version
26
- version: '0'
30
+ version: '1.0'
31
+ - - "!="
32
+ - !ruby/object:Gem::Version
33
+ version: 1.4.0
27
34
  - !ruby/object:Gem::Dependency
28
- name: kaminari
35
+ name: kaminari-grape
29
36
  requirement: !ruby/object:Gem::Requirement
30
37
  requirements:
31
38
  - - ">="
@@ -42,16 +49,30 @@ dependencies:
42
49
  name: bundler
43
50
  requirement: !ruby/object:Gem::Requirement
44
51
  requirements:
45
- - - "~>"
52
+ - - ">="
46
53
  - !ruby/object:Gem::Version
47
- version: '1.3'
54
+ version: '0'
48
55
  type: :development
49
56
  prerelease: false
50
57
  version_requirements: !ruby/object:Gem::Requirement
51
58
  requirements:
52
- - - "~>"
59
+ - - ">="
53
60
  - !ruby/object:Gem::Version
54
- version: '1.3'
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: rack-test
64
+ requirement: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ type: :development
70
+ prerelease: false
71
+ version_requirements: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
55
76
  - !ruby/object:Gem::Dependency
56
77
  name: rake
57
78
  requirement: !ruby/object:Gem::Requirement
@@ -70,25 +91,43 @@ dependencies:
70
91
  name: rspec
71
92
  requirement: !ruby/object:Gem::Requirement
72
93
  requirements:
73
- - - "~>"
94
+ - - ">="
74
95
  - !ruby/object:Gem::Version
75
- version: '2.9'
96
+ version: '0'
76
97
  type: :development
77
98
  prerelease: false
78
99
  version_requirements: !ruby/object:Gem::Requirement
79
100
  requirements:
80
- - - "~>"
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ - !ruby/object:Gem::Dependency
105
+ name: rubocop
106
+ requirement: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
81
109
  - !ruby/object:Gem::Version
82
- version: '2.9'
110
+ version: '0'
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
83
118
  description: kaminari paginator integration for grape API framework
84
119
  email:
85
- - tymon.tobolski@monterail.com
120
+ - info@blacksquaremedia.com
86
121
  executables: []
87
122
  extensions: []
88
123
  extra_rdoc_files: []
89
124
  files:
90
125
  - ".gitignore"
126
+ - ".rubocop.yml"
127
+ - ".travis.yml"
128
+ - CHANGELOG.md
91
129
  - Gemfile
130
+ - Gemfile.lock
92
131
  - LICENSE.txt
93
132
  - README.md
94
133
  - Rakefile
@@ -112,15 +151,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
112
151
  requirements:
113
152
  - - ">="
114
153
  - !ruby/object:Gem::Version
115
- version: '0'
154
+ version: '2.5'
116
155
  required_rubygems_version: !ruby/object:Gem::Requirement
117
156
  requirements:
118
157
  - - ">="
119
158
  - !ruby/object:Gem::Version
120
159
  version: '0'
121
160
  requirements: []
122
- rubyforge_project:
123
- rubygems_version: 2.4.5
161
+ rubygems_version: 3.1.2
124
162
  signing_key:
125
163
  specification_version: 4
126
164
  summary: kaminari integration for grape