lib/merb/vendor/paginator/paginator.rb in merb-0.0.7 vs lib/merb/vendor/paginator/paginator.rb in merb-0.0.8
- old
+ new
@@ -1,121 +1,124 @@
require 'forwardable'
-class Paginator
+module Merb
+ class Paginator
+
+ VERSION = '1.0.6'
- VERSION = '1.0.6'
-
- class ArgumentError < ::ArgumentError; end
- class MissingCountError < ArgumentError; end
- class MissingSelectError < ArgumentError; end
-
- attr_reader :per_page
-
- # 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)
- def initialize(count, per_page, &select)
- @count, @per_page = count, per_page
- unless select
- raise MissingSelectError, "Must provide block to select data for each page"
- end
- @select = select
- end
-
- # Total number of pages
- def number_of_pages
- (@count / @per_page) + (@count % @per_page > 0 ? 1 : 0)
- end
-
- # First page object
- def first
- page 1
- end
-
- # Last page object
- def last
- page number_of_pages
- end
-
- # Iterate through pages
- def each
- each_with_index do |item, index|
- yield item
- end
- end
-
- # Iterate through pages with indices
- def each_with_index
- 1.upto(number_of_pages) do |number|
- yield(page(number), number - 1)
- end
- end
-
- # Retrieve page object by number
- 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
-
- # Page object
- #
- # Retrieves items for a page and provides metadata about the position
- # of the page in the paginator
- class Page
+ class ArgumentError < ::ArgumentError; end
+ class MissingCountError < ArgumentError; end
+ class MissingSelectError < ArgumentError; end
- extend Forwardable
- def_delegator :@pager, :first, :first
- def_delegator :@pager, :last, :last
- def_delegator :items, :each
- def_delegator :items, :each_with_index
-
- attr_reader :number, :pager
+ attr_reader :per_page
- def initialize(pager, number, select) #:nodoc:
- @pager, @number = pager, number
+ # 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)
+ def initialize(count, per_page, &select)
+ @count, @per_page = count, per_page
+ unless select
+ raise MissingSelectError, "Must provide block to select data for each page"
+ end
@select = select
end
- # Retrieve the items for this page
- # * Caches
- def items
- @items ||= @select.call
+ # Total number of pages
+ def number_of_pages
+ (@count / @per_page) + (@count % @per_page > 0 ? 1 : 0)
end
- # Checks to see if there's a page before this one
- def prev?
- @number > 1
+ # First page object
+ def first
+ page 1
end
- # Get previous page (if possible)
- def prev
- @pager.page(@number - 1) if prev?
+ # Last page object
+ def last
+ page number_of_pages
end
- # Checks to see if there's a page after this one
- def next?
- @number < @pager.number_of_pages
+ # Iterate through pages
+ def each
+ each_with_index do |item, index|
+ yield item
+ end
end
- # Get next page (if possible)
- def next
- @pager.page(@number + 1) if next?
+ # Iterate through pages with indices
+ def each_with_index
+ 1.upto(number_of_pages) do |number|
+ yield(page(number), number - 1)
+ end
end
- def ==(other) #:nodoc:
- @pager == other.pager && self.number == other.number
+ # Retrieve page object by number
+ 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
+ # Page object
+ #
+ # Retrieves items for a page and provides metadata about the position
+ # of the page in the paginator
+ class Page
+
+ extend Forwardable
+ def_delegator :@pager, :first, :first
+ def_delegator :@pager, :last, :last
+ def_delegator :items, :each
+ def_delegator :items, :each_with_index
+
+ attr_reader :number, :pager
+
+ def initialize(pager, number, select) #:nodoc:
+ @pager, @number = pager, number
+ @select = select
+ end
+
+ # Retrieve the items for this page
+ # * Caches
+ def items
+ @items ||= @select.call
+ end
+
+ # Checks to see if there's a page before this one
+ def prev?
+ @number > 1
+ end
+
+ # Get previous page (if possible)
+ def prev
+ @pager.page(@number - 1) if prev?
+ end
+
+ # Checks to see if there's a page after this one
+ def next?
+ @number < @pager.number_of_pages
+ end
+
+ # Get next page (if possible)
+ def next
+ @pager.page(@number + 1) if next?
+ end
+
+ def ==(other) #:nodoc:
+ @pager == other.pager && self.number == other.number
+ end
+
+ end
+
end
-end
+end
\ No newline at end of file