Module: Wor::Paginate

Defined in:
lib/wor/paginate.rb,
lib/wor/paginate/config.rb,
lib/wor/paginate/version.rb,
lib/wor/paginate/paginate.rb,
lib/wor/paginate/formatter.rb,
lib/wor/paginate/adapters/base.rb,
lib/wor/paginate/utils/uri_helper.rb,
lib/wor/paginate/adapters/kaminari.rb,
lib/wor/paginate/adapters/enumerable.rb,
lib/wor/paginate/utils/preserve_modes.rb,
lib/wor/paginate/adapters/active_record.rb,
lib/wor/paginate/adapters/will_paginate.rb,
lib/generators/wor/paginate/install_generator.rb,
lib/wor/paginate/adapters/helpers/total_count.rb,
lib/wor/paginate/utils/preserve_records_helper.rb,
lib/wor/paginate/exceptions/invalid_page_number.rb,
lib/wor/paginate/exceptions/invalid_limit_number.rb,
lib/wor/paginate/exceptions/no_pagination_adapter.rb,
lib/wor/paginate/adapters/kaminari_already_paginated.rb,
lib/wor/paginate/adapters/will_paginate_already_paginated.rb

Defined Under Namespace

Modules: Adapters, Config, Exceptions, Generators, Utils Classes: Formatter

Constant Summary collapse

VERSION =
'0.2.0'.freeze
ADAPTERS =

The order of this array is important! In a future release we’ll provide an interface to manipulate it

[
  Adapters::KaminariAlreadyPaginated,
  Adapters::WillPaginateAlreadyPaginated,
  Adapters::WillPaginate,
  Adapters::Kaminari,
  Adapters::ActiveRecord,
  Adapters::Enumerable
].freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.configure {|Config| ... } ⇒ Object



17
18
19
20
21
22
23
# File 'lib/wor/paginate.rb', line 17

def self.configure
  yield Config

  return if ADAPTERS.include?(Config.default_adapter) || Config.default_adapter.nil?

  raise Exceptions::NoPaginationAdapter
end

Instance Method Details

#find_adapter_for_content(content, options) ⇒ Object



46
47
48
49
50
51
52
# File 'lib/wor/paginate/paginate.rb', line 46

def find_adapter_for_content(content, options)
  adapters = []
  adapters << Config.default_adapter if Config.default_adapter.present?
  adapters += ADAPTERS
  adapters.map { |adapter| adapter.new(content, page(options), limit(options)) }
          .find(&:adapt?)
end

#formatter_class(options) ⇒ Object



42
43
44
# File 'lib/wor/paginate/paginate.rb', line 42

def formatter_class(options)
  options[:formatter].presence || Formatter
end

#includes?(options) ⇒ Boolean

Returns:

  • (Boolean)


70
71
72
# File 'lib/wor/paginate/paginate.rb', line 70

def includes?(options)
  !options[:include].nil?
end

#limit(options) ⇒ Object



74
75
76
77
78
79
# File 'lib/wor/paginate/paginate.rb', line 74

def limit(options)
  [
    option_max_limit(options) || Config.max_limit,
    option_limit(options) || param_limit || Config.default_per_page
  ].min
end

#option_limit(options) ⇒ Object



58
59
60
# File 'lib/wor/paginate/paginate.rb', line 58

def option_limit(options)
  options[:limit]&.to_i
end

#option_max_limit(options) ⇒ Object



62
63
64
# File 'lib/wor/paginate/paginate.rb', line 62

def option_max_limit(options)
  options[:max_limit]&.to_i
end

#page(options) ⇒ Object



54
55
56
# File 'lib/wor/paginate/paginate.rb', line 54

def page(options)
  options[:page] || params[Config.page_param] || Config.default_page
end

#paginate(content, options = {}) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/wor/paginate/paginate.rb', line 22

def paginate(content, options = {})
  current_url = request.original_url

  if (preserve_records = options[:preserve_records])
    content, current_url = Wor::Paginate::Utils::PreserveRecordsHelper
                           .new(content, current_url,
                                preserve_records.is_a?(Hash) ? preserve_records : {}).call
  end

  adapter = find_adapter_for_content(content, options)
  raise Exceptions::NoPaginationAdapter if adapter.blank?

  formatter_class(options).new(adapter, options.merge(_current_url: current_url))
                          .format
end

#param_limitObject



66
67
68
# File 'lib/wor/paginate/paginate.rb', line 66

def param_limit
  params[Config.per_page_param]&.to_i
end

#render_paginate_with_include(content, options) ⇒ Object



38
39
40
# File 'lib/wor/paginate/paginate.rb', line 38

def render_paginate_with_include(content, options)
  render json: paginate(content, options), include: options[:include]
end

#render_paginated(content, options = {}) ⇒ Object



16
17
18
19
20
# File 'lib/wor/paginate/paginate.rb', line 16

def render_paginated(content, options = {})
  return render_paginate_with_include(content, options) if includes?(options)

  render json: paginate(content, options)
end