api-pagination 3.1.0 → 3.2.0
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/lib/api-pagination.rb +50 -14
- data/lib/api-pagination/configuration.rb +97 -0
- data/lib/api-pagination/hooks.rb +14 -46
- data/lib/api-pagination/version.rb +1 -1
- data/lib/grape/pagination.rb +10 -4
- data/lib/rails/pagination.rb +6 -3
- data/spec/grape_spec.rb +53 -5
- data/spec/rails_spec.rb +35 -2
- data/spec/sequel_spec.rb +1 -1
- data/spec/spec_helper.rb +5 -7
- data/spec/support/numbers_api.rb +1 -1
- metadata +7 -5
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: c9b48cddb3e2509595aa30dd7c836cde57a4a690
         | 
| 4 | 
            +
              data.tar.gz: 3fc62e5440d43d007d4b54d415be8e6f0011dd3d
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 5d74a30037b8433a10c00e127cdded4ff3c60164a1beb45ea5c66d8532cb2ed43971e73f6a32d5e886f09fa0a10d6f8013d79a1e067a44acf5746a57fcdd7744
         | 
| 7 | 
            +
              data.tar.gz: da3767bee2071943af66c7bc424d0a4b31504fc03d8d8109b08968adc8e7c6389a6f6f0f26de874a62961c1cb473aad3c5a24dcfab997f2fef1b42cc9981ebc1
         | 
    
        data/lib/api-pagination.rb
    CHANGED
    
    | @@ -1,24 +1,20 @@ | |
| 1 | 
            -
            require 'api-pagination/ | 
| 1 | 
            +
            require 'api-pagination/configuration'
         | 
| 2 2 | 
             
            require 'api-pagination/version'
         | 
| 3 3 |  | 
| 4 4 | 
             
            module ApiPagination
         | 
| 5 5 | 
             
              class << self
         | 
| 6 | 
            -
                attr_reader :paginator
         | 
| 7 | 
            -
             | 
| 8 6 | 
             
                def paginate(collection, options = {})
         | 
| 9 | 
            -
                  options[:page]      | 
| 10 | 
            -
                  options[: | 
| 7 | 
            +
                  options[:page]     = options[:page].to_i
         | 
| 8 | 
            +
                  options[:page]     = 1 if options[:page] <= 0
         | 
| 9 | 
            +
                  options[:per_page] = options[:per_page].to_i
         | 
| 11 10 |  | 
| 12 | 
            -
                  case ApiPagination.paginator
         | 
| 11 | 
            +
                  case ApiPagination.config.paginator
         | 
| 13 12 | 
             
                  when :kaminari
         | 
| 14 | 
            -
                     | 
| 15 | 
            -
                    collection.page(options[:page]).per(options[:per_page])
         | 
| 13 | 
            +
                    paginate_with_kaminari(collection, options)
         | 
| 16 14 | 
             
                  when :will_paginate
         | 
| 17 | 
            -
                     | 
| 18 | 
            -
             | 
| 19 | 
            -
                     | 
| 20 | 
            -
                      collection.paginate(:page => options[:page], :per_page => options[:per_page])
         | 
| 21 | 
            -
                    end
         | 
| 15 | 
            +
                    paginate_with_will_paginate(collection, options)
         | 
| 16 | 
            +
                  else
         | 
| 17 | 
            +
                    raise StandardError, "Unknown paginator: #{ApiPagination.config.paginator}"
         | 
| 22 18 | 
             
                  end
         | 
| 23 19 | 
             
                end
         | 
| 24 20 |  | 
| @@ -37,10 +33,50 @@ module ApiPagination | |
| 37 33 | 
             
                end
         | 
| 38 34 |  | 
| 39 35 | 
             
                def total_from(collection)
         | 
| 40 | 
            -
                  case ApiPagination.paginator
         | 
| 36 | 
            +
                  case ApiPagination.config.paginator
         | 
| 41 37 | 
             
                    when :kaminari      then collection.total_count.to_s
         | 
| 42 38 | 
             
                    when :will_paginate then collection.total_entries.to_s
         | 
| 43 39 | 
             
                  end
         | 
| 44 40 | 
             
                end
         | 
| 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 | 
            +
                private
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                def paginate_with_kaminari(collection, options)
         | 
| 60 | 
            +
                  if Kaminari.config.max_per_page && options[:per_page] > Kaminari.config.max_per_page
         | 
| 61 | 
            +
                    options[:per_page] = Kaminari.config.max_per_page
         | 
| 62 | 
            +
                  elsif options[:per_page] <= 0
         | 
| 63 | 
            +
                    options[:per_page] = Kaminari.config.default_per_page
         | 
| 64 | 
            +
                  end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                  collection = Kaminari.paginate_array(collection) if collection.is_a?(Array)
         | 
| 67 | 
            +
                  collection.page(options[:page]).per(options[:per_page])
         | 
| 68 | 
            +
                end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                def paginate_with_will_paginate(collection, options)
         | 
| 71 | 
            +
                  options[:per_page] = WillPaginate.per_page if options[:per_page] <= 0
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                  if defined?(Sequel::Dataset) && collection.kind_of?(Sequel::Dataset)
         | 
| 74 | 
            +
                    collection.paginate(options[:page], options[:per_page])
         | 
| 75 | 
            +
                  else
         | 
| 76 | 
            +
                    collection.paginate(:page => options[:page], :per_page => options[:per_page])
         | 
| 77 | 
            +
                  end
         | 
| 78 | 
            +
                end
         | 
| 45 79 | 
             
              end
         | 
| 46 80 | 
             
            end
         | 
| 81 | 
            +
             | 
| 82 | 
            +
            require 'api-pagination/hooks'
         | 
| @@ -0,0 +1,97 @@ | |
| 1 | 
            +
            module ApiPagination
         | 
| 2 | 
            +
              class Configuration
         | 
| 3 | 
            +
                attr_reader :paginator
         | 
| 4 | 
            +
             | 
| 5 | 
            +
                attr_accessor :total_header
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                attr_accessor :per_page_header
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                def configure(&block)
         | 
| 10 | 
            +
                  yield self
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                def initialize
         | 
| 14 | 
            +
                  @total_header    = 'Total'
         | 
| 15 | 
            +
                  @per_page_header = 'Per-Page'
         | 
| 16 | 
            +
                  set_paginator
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                def paginator=(paginator)
         | 
| 20 | 
            +
                  case paginator
         | 
| 21 | 
            +
                  when :kaminari
         | 
| 22 | 
            +
                    use_kaminari
         | 
| 23 | 
            +
                  when :will_paginate
         | 
| 24 | 
            +
                    use_will_paginate
         | 
| 25 | 
            +
                  else
         | 
| 26 | 
            +
                    raise StandardError, "Unknown paginator: #{paginator}"
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                private
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                def set_paginator
         | 
| 33 | 
            +
                  if defined?(Kaminari) && defined?(WillPaginate::CollectionMethods)
         | 
| 34 | 
            +
                    Kernel.warn <<-WARNING
         | 
| 35 | 
            +
            Warning: api-pagination relies on either Kaminari or WillPaginate, but both are
         | 
| 36 | 
            +
            currently active. If possible, you should remove one or the other. If you can't,
         | 
| 37 | 
            +
            you must configure api-pagination on your own. For example:
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            ApiPagination.configure do |config|
         | 
| 40 | 
            +
              config.paginator = Kaminari
         | 
| 41 | 
            +
            end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            WARNING
         | 
| 44 | 
            +
                  elsif defined?(Kaminari)
         | 
| 45 | 
            +
                    use_kaminari and return
         | 
| 46 | 
            +
                  elsif defined?(WillPaginate::CollectionMethods)
         | 
| 47 | 
            +
                    use_will_paginate and return
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                  begin
         | 
| 51 | 
            +
                    require 'kaminari'
         | 
| 52 | 
            +
                    use_kaminari and return
         | 
| 53 | 
            +
                  rescue LoadError
         | 
| 54 | 
            +
                  end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                  begin
         | 
| 57 | 
            +
                    require 'will_paginate'
         | 
| 58 | 
            +
                    use_will_paginate and return
         | 
| 59 | 
            +
                  rescue LoadError
         | 
| 60 | 
            +
                  end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                  Kernel.warn <<-WARNING
         | 
| 63 | 
            +
            Warning: api-pagination relies on either Kaminari or WillPaginate. Please
         | 
| 64 | 
            +
            install either dependency by adding one of the following to your Gemfile:
         | 
| 65 | 
            +
             | 
| 66 | 
            +
            gem 'kaminari'
         | 
| 67 | 
            +
            gem 'will_paginate'
         | 
| 68 | 
            +
             | 
| 69 | 
            +
            WARNING
         | 
| 70 | 
            +
                end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                def use_kaminari
         | 
| 73 | 
            +
                  require 'kaminari/models/array_extension'
         | 
| 74 | 
            +
                  @paginator = :kaminari
         | 
| 75 | 
            +
                end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                def use_will_paginate
         | 
| 78 | 
            +
                  WillPaginate::CollectionMethods.module_eval do
         | 
| 79 | 
            +
                    def first_page?() !previous_page end
         | 
| 80 | 
            +
                    def last_page?() !next_page end
         | 
| 81 | 
            +
                  end
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                  @paginator = :will_paginate
         | 
| 84 | 
            +
                end
         | 
| 85 | 
            +
              end
         | 
| 86 | 
            +
             | 
| 87 | 
            +
              class << self
         | 
| 88 | 
            +
                def configure
         | 
| 89 | 
            +
                  yield config
         | 
| 90 | 
            +
                end
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                def config
         | 
| 93 | 
            +
                  @config ||= Configuration.new
         | 
| 94 | 
            +
                end
         | 
| 95 | 
            +
                alias :configuration :config
         | 
| 96 | 
            +
              end
         | 
| 97 | 
            +
            end
         | 
    
        data/lib/api-pagination/hooks.rb
    CHANGED
    
    | @@ -1,49 +1,17 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
             | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
             | 
| 6 | 
            -
                    require 'rails/pagination'
         | 
| 7 | 
            -
                    ActionController::Base.send(:include, Rails::Pagination)
         | 
| 8 | 
            -
                  end
         | 
| 9 | 
            -
             | 
| 10 | 
            -
                  begin; require 'rails-api'; rescue LoadError; end
         | 
| 11 | 
            -
                  if defined?(ActionController::API)
         | 
| 12 | 
            -
                    require 'rails/pagination'
         | 
| 13 | 
            -
                    ActionController::API.send(:include, Rails::Pagination)
         | 
| 14 | 
            -
                  end
         | 
| 15 | 
            -
             | 
| 16 | 
            -
                  begin; require 'grape'; rescue LoadError; end
         | 
| 17 | 
            -
                  if defined?(Grape::API)
         | 
| 18 | 
            -
                    require 'grape/pagination'
         | 
| 19 | 
            -
                    Grape::API.send(:include, Grape::Pagination)
         | 
| 20 | 
            -
                  end
         | 
| 21 | 
            -
             | 
| 22 | 
            -
                  begin; require 'will_paginate'; rescue LoadError; end
         | 
| 23 | 
            -
                  if defined?(WillPaginate::CollectionMethods)
         | 
| 24 | 
            -
                    WillPaginate::CollectionMethods.module_eval do
         | 
| 25 | 
            -
                      def first_page?() !previous_page end
         | 
| 26 | 
            -
                      def last_page?() !next_page end
         | 
| 27 | 
            -
                    end
         | 
| 28 | 
            -
             | 
| 29 | 
            -
                    ApiPagination.instance_variable_set(:@paginator, :will_paginate)
         | 
| 30 | 
            -
                  end
         | 
| 31 | 
            -
             | 
| 32 | 
            -
                  begin; require 'kaminari'; rescue LoadError; end
         | 
| 33 | 
            -
                  if defined?(Kaminari)
         | 
| 34 | 
            -
                    ApiPagination.instance_variable_set(:@paginator, :kaminari)
         | 
| 35 | 
            -
                  end
         | 
| 36 | 
            -
             | 
| 37 | 
            -
                  STDERR.puts <<-EOC unless defined?(Kaminari) || defined?(WillPaginate)
         | 
| 38 | 
            -
            Warning: api-pagination relies on either Kaminari or WillPaginate. Please
         | 
| 39 | 
            -
            install either dependency by adding one of the following to your Gemfile:
         | 
| 40 | 
            -
             | 
| 41 | 
            -
            gem 'kaminari'
         | 
| 42 | 
            -
            gem 'will_paginate'
         | 
| 1 | 
            +
            begin; require 'rails'; rescue LoadError; end
         | 
| 2 | 
            +
            if defined?(ActionController::Base)
         | 
| 3 | 
            +
              require 'rails/pagination'
         | 
| 4 | 
            +
              ActionController::Base.send(:include, Rails::Pagination)
         | 
| 5 | 
            +
            end
         | 
| 43 6 |  | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
               | 
| 7 | 
            +
            begin; require 'rails-api'; rescue LoadError; end
         | 
| 8 | 
            +
            if defined?(ActionController::API)
         | 
| 9 | 
            +
              require 'rails/pagination'
         | 
| 10 | 
            +
              ActionController::API.send(:include, Rails::Pagination)
         | 
| 47 11 | 
             
            end
         | 
| 48 12 |  | 
| 49 | 
            -
             | 
| 13 | 
            +
            begin; require 'grape'; rescue LoadError; end
         | 
| 14 | 
            +
            if defined?(Grape::API)
         | 
| 15 | 
            +
              require 'grape/pagination'
         | 
| 16 | 
            +
              Grape::API.send(:include, Grape::Pagination)
         | 
| 17 | 
            +
            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[:per_page] || route_setting(:per_page)
         | 
| 6 7 | 
             
                      options = {
         | 
| 7 8 | 
             
                        :page     => params[:page],
         | 
| 8 | 
            -
                        :per_page =>  | 
| 9 | 
            +
                        :per_page => [per_page, route_setting(:max_per_page)].compact.min
         | 
| 9 10 | 
             
                      }
         | 
| 10 11 | 
             
                      collection = ApiPagination.paginate(collection, options)
         | 
| 11 12 |  | 
| @@ -19,8 +20,12 @@ module Grape | |
| 19 20 | 
             
                        links << %(<#{url}?#{new_params.to_param}>; rel="#{k}")
         | 
| 20 21 | 
             
                      end
         | 
| 21 22 |  | 
| 22 | 
            -
                       | 
| 23 | 
            -
                       | 
| 23 | 
            +
                      total_header    = ApiPagination.config.total_header
         | 
| 24 | 
            +
                      per_page_header = ApiPagination.config.per_page_header
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                      header 'Link',          links.join(', ') unless links.empty?
         | 
| 27 | 
            +
                      header total_header,    ApiPagination.total_from(collection)
         | 
| 28 | 
            +
                      header per_page_header, options[:per_page].to_s
         | 
| 24 29 |  | 
| 25 30 | 
             
                      return collection
         | 
| 26 31 | 
             
                    end
         | 
| @@ -28,7 +33,8 @@ module Grape | |
| 28 33 |  | 
| 29 34 | 
             
                  base.class_eval do
         | 
| 30 35 | 
             
                    def self.paginate(options = {})
         | 
| 31 | 
            -
                       | 
| 36 | 
            +
                      route_setting :per_page, (options[:per_page] || 25)
         | 
| 37 | 
            +
                      route_setting :max_per_page, options[:max_per_page]
         | 
| 32 38 | 
             
                      params do
         | 
| 33 39 | 
             
                        optional :page,     :type => Integer, :default => 1,
         | 
| 34 40 | 
             
                                            :desc => 'Page of results to fetch.'
         | 
    
        data/lib/rails/pagination.rb
    CHANGED
    
    | @@ -39,11 +39,14 @@ module Rails | |
| 39 39 | 
             
                    links << %(<#{url}?#{new_params.to_param}>; rel="#{k}")
         | 
| 40 40 | 
             
                  end
         | 
| 41 41 |  | 
| 42 | 
            -
                   | 
| 43 | 
            -
                   | 
| 42 | 
            +
                  total_header    = ApiPagination.config.total_header
         | 
| 43 | 
            +
                  per_page_header = ApiPagination.config.per_page_header
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                  headers['Link']          = links.join(', ') unless links.empty?
         | 
| 46 | 
            +
                  headers[total_header]    = ApiPagination.total_from(collection)
         | 
| 47 | 
            +
                  headers[per_page_header] = options[:per_page].to_s
         | 
| 44 48 |  | 
| 45 49 | 
             
                  return collection
         | 
| 46 50 | 
             
                end
         | 
| 47 51 | 
             
              end
         | 
| 48 52 | 
             
            end
         | 
| 49 | 
            -
             | 
    
        data/spec/grape_spec.rb
    CHANGED
    
    | @@ -8,9 +8,10 @@ describe NumbersAPI do | |
| 8 8 | 
             
              describe 'GET #index' do
         | 
| 9 9 | 
             
                let(:links) { last_response.headers['Link'].split(', ') }
         | 
| 10 10 | 
             
                let(:total) { last_response.headers['Total'].to_i }
         | 
| 11 | 
            +
                let(:per_page) { last_response.headers['Per-Page'].to_i }
         | 
| 11 12 |  | 
| 12 13 | 
             
                context 'without enough items to give more than one page' do
         | 
| 13 | 
            -
                  before { get  | 
| 14 | 
            +
                  before { get '/numbers', :count => 10 }
         | 
| 14 15 |  | 
| 15 16 | 
             
                  it 'should not paginate' do
         | 
| 16 17 | 
             
                    expect(last_response.headers.keys).not_to include('Link')
         | 
| @@ -20,6 +21,10 @@ describe NumbersAPI do | |
| 20 21 | 
             
                    expect(total).to eq(10)
         | 
| 21 22 | 
             
                  end
         | 
| 22 23 |  | 
| 24 | 
            +
                  it 'should give a Per-Page header' do
         | 
| 25 | 
            +
                    expect(per_page).to eq(10)
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
             | 
| 23 28 | 
             
                  it 'should list all numbers in the response body' do
         | 
| 24 29 | 
             
                    body = '[1,2,3,4,5,6,7,8,9,10]'
         | 
| 25 30 | 
             
                    expect(last_response.body).to eq(body)
         | 
| @@ -27,29 +32,72 @@ describe NumbersAPI do | |
| 27 32 | 
             
                end
         | 
| 28 33 |  | 
| 29 34 | 
             
                context 'with existing Link headers' do
         | 
| 30 | 
            -
                  before { get  | 
| 35 | 
            +
                  before { get '/numbers', :count => 30, :with_headers => true }
         | 
| 31 36 |  | 
| 32 37 | 
             
                  it_behaves_like 'an endpoint with existing Link headers'
         | 
| 33 38 | 
             
                end
         | 
| 34 39 |  | 
| 35 40 | 
             
                context 'with enough items to paginate' do
         | 
| 36 41 | 
             
                  context 'when on the first page' do
         | 
| 37 | 
            -
                    before { get  | 
| 42 | 
            +
                    before { get '/numbers', :count => 100 }
         | 
| 38 43 |  | 
| 39 44 | 
             
                    it_behaves_like 'an endpoint with a first page'
         | 
| 40 45 | 
             
                  end
         | 
| 41 46 |  | 
| 42 47 | 
             
                  context 'when on the last page' do
         | 
| 43 | 
            -
                    before { get  | 
| 48 | 
            +
                    before { get '/numbers', :count => 100, :page => 10 }
         | 
| 44 49 |  | 
| 45 50 | 
             
                    it_behaves_like 'an endpoint with a last page'
         | 
| 46 51 | 
             
                  end
         | 
| 47 52 |  | 
| 48 53 | 
             
                  context 'when somewhere comfortably in the middle' do
         | 
| 49 | 
            -
                    before { get  | 
| 54 | 
            +
                    before { get '/numbers', :count => 100, :page => 2 }
         | 
| 50 55 |  | 
| 51 56 | 
             
                    it_behaves_like 'an endpoint with a middle page'
         | 
| 52 57 | 
             
                  end
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                  context 'with a max_per_page setting' do
         | 
| 60 | 
            +
                    before { get '/numbers', :count => 100, :per_page => 30 }
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                    it 'should not go above the max_per_page_limit' do
         | 
| 63 | 
            +
                      body = '[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]'
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                      expect(last_response.body).to eq(body)
         | 
| 66 | 
            +
                    end
         | 
| 67 | 
            +
                  end
         | 
| 68 | 
            +
                end
         | 
| 69 | 
            +
             | 
| 70 | 
            +
                context 'with custom response headers' do
         | 
| 71 | 
            +
                  before do
         | 
| 72 | 
            +
                    ApiPagination.config.total_header    = 'X-Total-Count'
         | 
| 73 | 
            +
                    ApiPagination.config.per_page_header = 'X-Per-Page'
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                    get '/numbers', count: 10
         | 
| 76 | 
            +
                  end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                  after do
         | 
| 79 | 
            +
                    ApiPagination.config.total_header    = 'Total'
         | 
| 80 | 
            +
                    ApiPagination.config.per_page_header = 'Per-Page'
         | 
| 81 | 
            +
                  end
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                  let(:total) { last_response.header['X-Total-Count'].to_i }
         | 
| 84 | 
            +
                  let(:per_page) { last_response.header['X-Per-Page'].to_i }
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                  it 'should give a X-Total-Count header' do
         | 
| 87 | 
            +
                    headers_keys = last_response.headers.keys
         | 
| 88 | 
            +
             | 
| 89 | 
            +
                    expect(headers_keys).not_to include('Total')
         | 
| 90 | 
            +
                    expect(headers_keys).to include('X-Total-Count')
         | 
| 91 | 
            +
                    expect(total).to eq(10)
         | 
| 92 | 
            +
                  end
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                  it 'should give a X-Per-Page header' do
         | 
| 95 | 
            +
                    headers_keys = last_response.headers.keys
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                    expect(headers_keys).not_to include('Per-Page')
         | 
| 98 | 
            +
                    expect(headers_keys).to include('X-Per-Page')
         | 
| 99 | 
            +
                    expect(per_page).to eq(10)
         | 
| 100 | 
            +
                  end
         | 
| 53 101 | 
             
                end
         | 
| 54 102 | 
             
              end
         | 
| 55 103 | 
             
            end
         | 
    
        data/spec/rails_spec.rb
    CHANGED
    
    | @@ -10,6 +10,7 @@ describe NumbersController, :type => :controller do | |
| 10 10 | 
             
              describe 'GET #index' do
         | 
| 11 11 | 
             
                let(:links) { response.headers['Link'].split(', ') }
         | 
| 12 12 | 
             
                let(:total) { response.headers['Total'].to_i }
         | 
| 13 | 
            +
                let(:per_page) { response.headers['Per-Page'].to_i }
         | 
| 13 14 |  | 
| 14 15 | 
             
                context 'without enough items to give more than one page' do
         | 
| 15 16 | 
             
                  before { get :index, :count => 10 }
         | 
| @@ -22,6 +23,10 @@ describe NumbersController, :type => :controller do | |
| 22 23 | 
             
                    expect(total).to eq(10)
         | 
| 23 24 | 
             
                  end
         | 
| 24 25 |  | 
| 26 | 
            +
                  it 'should give a Per-Page header' do
         | 
| 27 | 
            +
                    expect(per_page).to eq(10)
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
             | 
| 25 30 | 
             
                  it 'should list all numbers in the response body' do
         | 
| 26 31 | 
             
                    body = '[1,2,3,4,5,6,7,8,9,10]'
         | 
| 27 32 | 
             
                    expect(response.body).to eq(body)
         | 
| @@ -63,10 +68,38 @@ describe NumbersController, :type => :controller do | |
| 63 68 | 
             
                    expect(response.body).to eq(json)
         | 
| 64 69 | 
             
                  end
         | 
| 65 70 | 
             
                end
         | 
| 66 | 
            -
              end
         | 
| 67 | 
            -
            end
         | 
| 68 71 |  | 
| 72 | 
            +
                context 'with custom response headers' do
         | 
| 73 | 
            +
                  before do
         | 
| 74 | 
            +
                    ApiPagination.config.total_header    = 'X-Total-Count'
         | 
| 75 | 
            +
                    ApiPagination.config.per_page_header = 'X-Per-Page'
         | 
| 69 76 |  | 
| 77 | 
            +
                    get :index, count: 10
         | 
| 78 | 
            +
                  end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                  after do
         | 
| 81 | 
            +
                    ApiPagination.config.total_header    = 'Total'
         | 
| 82 | 
            +
                    ApiPagination.config.per_page_header = 'Per-Page'
         | 
| 83 | 
            +
                  end
         | 
| 70 84 |  | 
| 85 | 
            +
                  let(:total) { response.header['X-Total-Count'].to_i }
         | 
| 86 | 
            +
                  let(:per_page) { response.header['X-Per-Page'].to_i }
         | 
| 71 87 |  | 
| 88 | 
            +
                  it 'should give a X-Total-Count header' do
         | 
| 89 | 
            +
                    headers_keys = response.headers.keys
         | 
| 72 90 |  | 
| 91 | 
            +
                    expect(headers_keys).not_to include('Total')
         | 
| 92 | 
            +
                    expect(headers_keys).to include('X-Total-Count')
         | 
| 93 | 
            +
                    expect(total).to eq(10)
         | 
| 94 | 
            +
                  end
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                  it 'should give a X-Per-Page header' do
         | 
| 97 | 
            +
                    headers_keys = response.headers.keys
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                    expect(headers_keys).not_to include('Per-Page')
         | 
| 100 | 
            +
                    expect(headers_keys).to include('X-Per-Page')
         | 
| 101 | 
            +
                    expect(per_page).to eq(10)
         | 
| 102 | 
            +
                  end
         | 
| 103 | 
            +
                end
         | 
| 104 | 
            +
              end
         | 
| 105 | 
            +
            end
         | 
    
        data/spec/sequel_spec.rb
    CHANGED
    
    
    
        data/spec/spec_helper.rb
    CHANGED
    
    | @@ -3,17 +3,15 @@ require 'support/numbers_api' | |
| 3 3 | 
             
            require 'api-pagination'
         | 
| 4 4 |  | 
| 5 5 | 
             
            if ENV['PAGINATOR']
         | 
| 6 | 
            -
               | 
| 6 | 
            +
              require ENV['PAGINATOR']
         | 
| 7 | 
            +
              ApiPagination.config.paginator = ENV['PAGINATOR'].to_sym
         | 
| 7 8 | 
             
            else
         | 
| 8 9 | 
             
              warn 'No PAGINATOR set. Defaulting to kaminari. To test against will_paginate, run `PAGINATOR=will_paginate bundle exec rspec`'
         | 
| 9 | 
            -
               | 
| 10 | 
            +
              require 'kaminari'
         | 
| 11 | 
            +
              ApiPagination.config.paginator = :kaminari
         | 
| 10 12 | 
             
            end
         | 
| 11 13 |  | 
| 12 | 
            -
             | 
| 13 | 
            -
              Kaminari::Hooks.init
         | 
| 14 | 
            -
            elsif ApiPagination.paginator == :will_paginate
         | 
| 15 | 
            -
              require 'will_paginate/array'
         | 
| 16 | 
            -
            end
         | 
| 14 | 
            +
            require 'will_paginate/array'
         | 
| 17 15 |  | 
| 18 16 | 
             
            RSpec.configure do |config|
         | 
| 19 17 | 
             
              config.include Rack::Test::Methods
         | 
    
        data/spec/support/numbers_api.rb
    CHANGED
    
    | @@ -5,7 +5,7 @@ class NumbersAPI < Grape::API | |
| 5 5 | 
             
              format :json
         | 
| 6 6 |  | 
| 7 7 | 
             
              desc 'Return some paginated set of numbers'
         | 
| 8 | 
            -
              paginate :per_page => 10
         | 
| 8 | 
            +
              paginate :per_page => 10, :max_per_page => 25 
         | 
| 9 9 | 
             
              params do
         | 
| 10 10 | 
             
                requires :count, :type => Integer
         | 
| 11 11 | 
             
                optional :with_headers, :default => false, :type => Boolean
         | 
    
        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: 3. | 
| 4 | 
            +
              version: 3.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:  | 
| 11 | 
            +
            date: 2015-01-30 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: rspec
         | 
| @@ -30,14 +30,14 @@ dependencies: | |
| 30 30 | 
             
                requirements:
         | 
| 31 31 | 
             
                - - ">="
         | 
| 32 32 | 
             
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            -
                    version:  | 
| 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 | 
            -
                    version:  | 
| 40 | 
            +
                    version: 0.10.0
         | 
| 41 41 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 42 42 | 
             
              name: railties
         | 
| 43 43 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -88,6 +88,7 @@ extensions: [] | |
| 88 88 | 
             
            extra_rdoc_files: []
         | 
| 89 89 | 
             
            files:
         | 
| 90 90 | 
             
            - lib/api-pagination.rb
         | 
| 91 | 
            +
            - lib/api-pagination/configuration.rb
         | 
| 91 92 | 
             
            - lib/api-pagination/hooks.rb
         | 
| 92 93 | 
             
            - lib/api-pagination/version.rb
         | 
| 93 94 | 
             
            - lib/grape/pagination.rb
         | 
| @@ -122,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 122 123 | 
             
                  version: '0'
         | 
| 123 124 | 
             
            requirements: []
         | 
| 124 125 | 
             
            rubyforge_project: 
         | 
| 125 | 
            -
            rubygems_version: 2. | 
| 126 | 
            +
            rubygems_version: 2.4.5
         | 
| 126 127 | 
             
            signing_key: 
         | 
| 127 128 | 
             
            specification_version: 4
         | 
| 128 129 | 
             
            summary: Link header pagination for Rails and Grape APIs. Don't use the request body.
         | 
| @@ -137,3 +138,4 @@ test_files: | |
| 137 138 | 
             
            - spec/support/shared_examples/first_page.rb
         | 
| 138 139 | 
             
            - spec/support/shared_examples/last_page.rb
         | 
| 139 140 | 
             
            - spec/support/shared_examples/middle_page.rb
         | 
| 141 | 
            +
            has_rdoc: 
         |