Class: Webby::Paginator

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/webby/stelan/paginator.rb

Defined Under Namespace

Classes: ArgumentError, MissingCountError, MissingSelectError, Page

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Enumerable

#injecting

Constructor Details

#initialize(count, per_page, resource, &select) ⇒ Paginator

Instantiate a new Paginator object

Provide:

  • A total count of the number of objects to paginate

  • The number of objects in each page

  • A block that returns the array of items

    • The block is passed the item offset (and the number of items to show per page, for convenience, if the arity is 2)



32
33
34
35
36
37
38
39
40
41
# File 'lib/webby/stelan/paginator.rb', line 32

def initialize(count, per_page, resource, &select)
  @count, @per_page, @resource = count, per_page, resource
  @meta_data = @resource..dup
  @filename = @resource.filename
  @directory = @resource.directory
  unless select
    raise MissingSelectError, "Must provide block to select data for each page"
  end
  @select = select
end

Instance Attribute Details

#countObject (readonly)

Returns the value of attribute count.



21
22
23
# File 'lib/webby/stelan/paginator.rb', line 21

def count
  @count
end

#directoryObject (readonly)

Returns the value of attribute directory.



21
22
23
# File 'lib/webby/stelan/paginator.rb', line 21

def directory
  @directory
end

#filenameObject (readonly)

Returns the value of attribute filename.



21
22
23
# File 'lib/webby/stelan/paginator.rb', line 21

def filename
  @filename
end

#per_pageObject (readonly)

Returns the value of attribute per_page.



21
22
23
# File 'lib/webby/stelan/paginator.rb', line 21

def per_page
  @per_page
end

#resourceObject (readonly)

Returns the value of attribute resource.



21
22
23
# File 'lib/webby/stelan/paginator.rb', line 21

def resource
  @resource
end

Instance Method Details

#eachObject



58
59
60
61
62
# File 'lib/webby/stelan/paginator.rb', line 58

def each
  1.upto(number_of_pages) do |number|
    yield page(number)
  end
end

#firstObject

First page object



49
50
51
# File 'lib/webby/stelan/paginator.rb', line 49

def first
  page 1
end

#lastObject

Last page object



54
55
56
# File 'lib/webby/stelan/paginator.rb', line 54

def last
  page number_of_pages
end

#number_of_pagesObject

Total number of pages



44
45
46
# File 'lib/webby/stelan/paginator.rb', line 44

def number_of_pages
   (@count / @per_page).to_i + (@count % @per_page > 0 ? 1 : 0)
end

#page(number) ⇒ Object

Retrieve page object by number



65
66
67
68
69
70
71
72
73
# File 'lib/webby/stelan/paginator.rb', line 65

def page(number)
  number = (n = number.to_i) > 0 ? n : 1
  Page.new(self, number, lambda { 
    offset = (number - 1) * @per_page
    args = [offset]
    args << @per_page if @select.arity == 2
    @select.call(*args)
  })
end

#resetObject

Finalizer method that should be called when the paginator is finished



76
77
78
# File 'lib/webby/stelan/paginator.rb', line 76

def reset
  resource._reset(@meta_data)
end