module ApiPagination

Constants

VERSION

Public Class Methods

config() click to toggle source
# File lib/api-pagination/configuration.rb, line 132
def config
  @config ||= Configuration.new
end
Also aliased as: configuration
configuration()
Alias for: config
configure() { |config| ... } click to toggle source
# File lib/api-pagination/configuration.rb, line 128
def configure
  yield config
end
pages_from(collection, options = {}) click to toggle source
# File lib/api-pagination.rb, line 23
def pages_from(collection, options = {})
  return pagy_pages_from(collection) if ApiPagination.config.paginator == :pagy && collection.is_a?(Pagy)

  {}.tap do |pages|
    unless collection.first_page?
      pages[:first] = 1
      pages[:prev]  = collection.current_page - 1
    end

    unless collection.last_page? || (ApiPagination.config.paginator == :kaminari && collection.out_of_range?)
      pages[:last] = collection.total_pages if ApiPagination.config.include_total
      pages[:next] = collection.current_page + 1
    end
  end
end
paginate(collection, options = {}) click to toggle source
# File lib/api-pagination.rb, line 6
def paginate(collection, options = {})
  options[:page]     = options[:page].to_i
  options[:page]     = 1 if options[:page] <= 0
  options[:per_page] = options[:per_page].to_i

  case ApiPagination.config.paginator
  when :pagy
    paginate_with_pagy(collection, options)
  when :kaminari
    paginate_with_kaminari(collection, options, options[:paginate_array_options] || {})
  when :will_paginate
    paginate_with_will_paginate(collection, options)
  else
    raise StandardError, "Unknown paginator: #{ApiPagination.config.paginator}"
  end
end
total_from(collection) click to toggle source
# File lib/api-pagination.rb, line 39
def total_from(collection)
  case ApiPagination.config.paginator
    when :pagy          then collection.count.to_s
    when :kaminari      then collection.total_count.to_s
    when :will_paginate then collection.total_entries.to_s
  end
end

Private Class Methods

default_per_page_for_will_paginate(collection) click to toggle source
# File lib/api-pagination.rb, line 124
def default_per_page_for_will_paginate(collection)
  default = WillPaginate.per_page
  extract_per_page_from_model(collection, :per_page) || default
end
extract_per_page_from_model(collection, accessor) click to toggle source
# File lib/api-pagination.rb, line 129
def extract_per_page_from_model(collection, accessor)
  klass = if collection.respond_to?(:klass)
    collection.klass
  else
    collection.first.class
  end

  return unless klass.respond_to?(accessor)
  klass.send(accessor)
end
get_default_per_page_for_kaminari(collection) click to toggle source
# File lib/api-pagination.rb, line 119
def get_default_per_page_for_kaminari(collection)
  default = Kaminari.config.default_per_page
  extract_per_page_from_model(collection, :default_per_page) || default
end
paginate_with_kaminari(collection, options, paginate_array_options = {}) click to toggle source
# File lib/api-pagination.rb, line 90
def paginate_with_kaminari(collection, options, paginate_array_options = {})
  if Kaminari.config.max_per_page && options[:per_page] > Kaminari.config.max_per_page
    options[:per_page] = Kaminari.config.max_per_page
  elsif options[:per_page] <= 0
    options[:per_page] = get_default_per_page_for_kaminari(collection)
  end

  collection = Kaminari.paginate_array(collection, paginate_array_options) if collection.is_a?(Array)
  collection = collection.page(options[:page]).per(options[:per_page])
  collection.without_count if !collection.is_a?(Array) && !ApiPagination.config.include_total
  [collection, nil]
end
paginate_with_pagy(collection, options) click to toggle source
# File lib/api-pagination.rb, line 49
def paginate_with_pagy(collection, options)
  if Pagy::VARS[:max_per_page] && options[:per_page] > Pagy::VARS[:max_per_page]
    options[:per_page] = Pagy::VARS[:max_per_page]
  elsif options[:per_page] <= 0
    options[:per_page] = Pagy::VARS[:items]
  end

  pagy = pagy_from(collection, options)
  collection = if collection.respond_to?(:offset) && collection.respond_to?(:limit)
    collection.offset(pagy.offset).limit(pagy.items)
  else
    collection[pagy.offset, pagy.items]
  end

  return [collection, pagy]
end
paginate_with_will_paginate(collection, options) click to toggle source
# File lib/api-pagination.rb, line 103
def paginate_with_will_paginate(collection, options)
  if options[:per_page] <= 0
    options[:per_page] = default_per_page_for_will_paginate(collection)
  end

  collection = if defined?(Sequel::Dataset) && collection.kind_of?(Sequel::Dataset)
    collection.paginate(options[:page], options[:per_page])
  else
    supported_options = [:page, :per_page, :total_entries]
    options = options.dup.keep_if { |k,v| supported_options.include?(k.to_sym) }
    collection.paginate(options)
  end

  [collection, nil]
end
pagy_from(collection, options) click to toggle source
# File lib/api-pagination.rb, line 66
def pagy_from(collection, options)
  if options[:count]
    count = options[:count]
  else
    count = collection.is_a?(Array) ? collection.count : collection.count(:all)
  end
  
  Pagy.new(count: count, items: options[:per_page], page: options[:page])
end
pagy_pages_from(pagy) click to toggle source
# File lib/api-pagination.rb, line 76
def pagy_pages_from(pagy)
  {}.tap do |pages|
    unless pagy.page == 1
      pages[:first] = 1
      pages[:prev]  = pagy.prev
    end

    unless pagy.page == pagy.pages
      pages[:last] = pagy.pages if ApiPagination.config.include_total
      pages[:next] = pagy.next
    end
  end
end