Class: Muster::Strategies::Pagination

Inherits:
Rack
  • Object
show all
Defined in:
lib/muster/strategies/pagination.rb

Overview

Query string parsing strategy with logic to handle pagination options

Examples:


strategy = Muster::Strategies::Pagination.new
results  = strategy.parse('page=3&per_page=10')  #=>  { 'pagination' => {'page' => 3, 'per_page' => 10}, 'limit' => 10, 'offset' => 20 }

Instance Attribute Summary collapse

Attributes inherited from Rack

#fields, #options

Instance Method Summary collapse

Methods inherited from Rack

#fields_to_parse, #parse_query_string

Constructor Details

#initialize(options = {}) ⇒ Pagination

Create a new Pagination parsing strategy

Examples:


strategy = Muster::Strategies::Pagination.new
strategy = Muster::Strategies::Pagination.new(:default_page_size => 10)

Parameters:

  • options (Hash) (defaults to: {})

    the options available for this method

Options Hash (options):

  • :fields (optional, Array<Symbol>)

    when specified, only parse the specified fields You may also use :field if you only intend to pass one field

  • :value_separator (optional, String, RegEx) — default: /, \s*/

    when specified, splits the field value into multiple values You may pass the separator as a string or a regular expression

  • :unique_values (optional, Boolean) — default: true

    when true, ensures field values do not contain duplicates

  • :default_page_size (options, Fixnum) — default: 30

    when specified, the default page size to use when no page size is parsed



34
35
36
37
38
39
40
41
# File 'lib/muster/strategies/pagination.rb', line 34

def initialize( options={} )
  super

  self.default_page_size = self.options[:default_page_size].to_i
  if self.default_page_size < 1
    self.default_page_size = 30
  end
end

Instance Attribute Details

#default_page_sizeFixnum

Returns when specified, will override the default page size of 30 when no page_size is parsed.

Returns:

  • (Fixnum)

    when specified, will override the default page size of 30 when no page_size is parsed



18
19
20
# File 'lib/muster/strategies/pagination.rb', line 18

def default_page_size
  @default_page_size
end

Instance Method Details

#parse(query_string) ⇒ Muster::Results

Processes a query string and returns a hash of its fields/values

Examples:


results = strategy.parse('page=3&per_page=10')  #=>  { 'pagination' => {'page' => 3, 'per_page' => 10}, 'limit' => 10, 'offset' => 20 }

Parameters:

  • query_string (String)

    the query string to parse

Returns:



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/muster/strategies/pagination.rb', line 52

def parse( query_string )
  parameters = self.parse_query_string(query_string)

  page = self.parse_page(parameters)
  page_size = self.parse_page_size(parameters)


  offset = (page - 1) * page_size
  offset = nil if offset < 1

  parameters = parameters.merge(:pagination => {:page => page, :per_page => page_size}, :limit => page_size, :offset => offset)
  
  if self.fields.present?
    parameters = parameters.slice(*self.fields)
  end

  return Muster::Results.new(parameters)
end

#parse_page(parameters) ⇒ Fixnum (protected)

Returns the current page for the current query string.

If page is not specified, or is not a positive number, 1 will be returned instead.

Examples:


page = self.parse_page(:page => 2)    #=>  2
page = self.parse_page(:page => nil)  #=>  1

Parameters:

  • parameters (Hash)

    the parameters parsed from the query string

Returns:

  • (Fixnum)


85
86
87
88
89
# File 'lib/muster/strategies/pagination.rb', line 85

def parse_page( parameters )
  page = parameters.delete(:page).to_i
  page = 1 unless page > 0
  page
end

#parse_page_size(parameters) ⇒ Fixnum (protected)

Returns the page size for the current query string.

If per_page or page_size is not specified, or is not a positive number, :default_page_size will be returned instead.

Examples:


page_size = self.parse_page(:page_size => 10)  #=>  10
page_size = self.parse_page(:per_page  => 10)  #=>  10
page_size = self.parse_page(:per_page  => nil) #=>  30

Parameters:

  • parameters (Hash)

    the parameters parsed from the query string

Returns:

  • (Fixnum)


104
105
106
107
108
# File 'lib/muster/strategies/pagination.rb', line 104

def parse_page_size( parameters )
  page_size = (parameters.delete(:page_size) || parameters.delete(:per_page)).to_i
  page_size = self.default_page_size unless page_size > 0
  page_size
end