Skip to content

Commit

Permalink
refactoring of overflow extra using module prepend instead alias meth…
Browse files Browse the repository at this point in the history
…od chaining
  • Loading branch information
ddnexus committed Mar 8, 2021
1 parent c361293 commit df8607e
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 47 deletions.
2 changes: 1 addition & 1 deletion lib/pagy/extras/elasticsearch_rails.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ def pagy_elasticsearch_rails(pagy_search_args, vars={})
vars[:count] = total.is_a?(Hash) ? total['value'] : total
pagy = Pagy.new(vars)
# with :last_page overflow we need to re-run the method in order to get the hits
if defined?(OVERFLOW) && pagy.overflow? && pagy.vars[:overflow] == :last_page
if defined?(Pagy::Overflow) && pagy.overflow? && pagy.vars[:overflow] == :last_page
return pagy_elasticsearch_rails(pagy_search_args, vars.merge(page: pagy.page))
end
return pagy, called.empty? ? response : response.send(*called)
Expand Down
93 changes: 48 additions & 45 deletions lib/pagy/extras/overflow.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,68 +4,71 @@

class Pagy

OVERFLOW = true
module Overflow
VARS[:overflow] = :empty_page

VARS[:overflow] = :empty_page
def overflow? = @overflow

def overflow?; @overflow end

alias_method :initialize_without_overflow, :initialize
def initialize_with_overflow(vars)
@overflow ||= false # don't override if :last_page re-run the method after an overflow
initialize_without_overflow(vars)
rescue OverflowError
@overflow = true # add the overflow flag
case @vars[:overflow]
when :exception
raise # same as without the extra
when :last_page
initial_page = @vars[:page] # save the very initial page (even after re-run)
initialize(vars.merge!(page: @last)) # re-run with the last page
@vars[:page] = initial_page # restore the inital page
when :empty_page
@offset = @items = @from = @to = 0 # vars relative to the actual page
@prev = @last # prev relative to the actual page
extend(Series) # special series for :empty_page
else
raise VariableError.new(self), "expected :overflow variable in [:last_page, :empty_page, :exception]; got #{@vars[:overflow].inspect}"
def initialize(vars)
@overflow ||= false # don't override if :last_page re-run the method after an overflow
super
rescue OverflowError
@overflow = true # add the overflow flag
case @vars[:overflow]
when :exception
raise # same as without the extra
when :last_page
initial_page = @vars[:page] # save the very initial page (even after re-run)
initialize(vars.merge!(page: @last)) # re-run with the last page
@vars[:page] = initial_page # restore the inital page
when :empty_page
@offset = @items = @from = @to = 0 # vars relative to the actual page
@prev = @last # prev relative to the actual page
extend(Series) # special series for :empty_page
else
raise VariableError.new(self), "expected :overflow variable in [:last_page, :empty_page, :exception]; got #{@vars[:overflow].inspect}"
end
end
end
alias_method :initialize, :initialize_with_overflow

module Series
def series(size=@vars[:size])
@page = @last # series for last page
super(size).tap do |s| # call original series
module Series
def series(size=@vars[:size])
@page = @last # series for last page
super(size).tap do |s| # call original series
s[s.index(@page.to_s)] = @page # string to integer (i.e. no current page)
@page = @vars[:page] # restore the actual page
end
end
end

end
prepend Overflow


# support for Pagy::Countless
if defined?(Pagy::Countless)
class Countless

alias_method :finalize_without_overflow, :finalize
def finalize_with_overflow(items)
@overflow = false
finalize_without_overflow(items)
rescue OverflowError
@overflow = true # add the overflow flag
case @vars[:overflow]
when :exception
raise # same as without the extra
when :empty_page
@offset = @items = @from = @to = 0 # vars relative to the actual page
@vars[:size] = [] # no page in the series
self
else
raise VariableError.new(self), "expected :overflow variable in [:empty_page, :exception]; got #{@vars[:overflow].inspect}"
module Overflow

def finalize(items)
@overflow = false
super
rescue OverflowError
@overflow = true # add the overflow flag
case @vars[:overflow]
when :exception
raise # same as without the extra
when :empty_page
@offset = @items = @from = @to = 0 # vars relative to the actual page
@vars[:size] = [] # no page in the series
self
else
raise VariableError.new(self), "expected :overflow variable in [:empty_page, :exception]; got #{@vars[:overflow].inspect}"
end
end

end
alias_method :finalize, :finalize_with_overflow
prepend Overflow

end
end
Expand Down
2 changes: 1 addition & 1 deletion lib/pagy/extras/searchkick.rb
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def pagy_searchkick(pagy_search_args, vars={})
vars[:count] = results.total_count
pagy = Pagy.new(vars)
# with :last_page overflow we need to re-run the method in order to get the hits
if defined?(OVERFLOW) && pagy.overflow? && pagy.vars[:overflow] == :last_page
if defined?(Pagy::Overflow) && pagy.overflow? && pagy.vars[:overflow] == :last_page
return pagy_searchkick(pagy_search_args, vars.merge(page: pagy.page))
end
return pagy, called.empty? ? results : results.send(*called)
Expand Down

0 comments on commit df8607e

Please sign in to comment.