From df8607e2dd934c6ef9c4623b993855c4d2b4f3dc Mon Sep 17 00:00:00 2001 From: Domizio Demichelis Date: Mon, 8 Mar 2021 08:03:58 +0700 Subject: [PATCH] refactoring of overflow extra using module prepend instead alias method chaining --- lib/pagy/extras/elasticsearch_rails.rb | 2 +- lib/pagy/extras/overflow.rb | 93 +++++++++++++------------- lib/pagy/extras/searchkick.rb | 2 +- 3 files changed, 50 insertions(+), 47 deletions(-) diff --git a/lib/pagy/extras/elasticsearch_rails.rb b/lib/pagy/extras/elasticsearch_rails.rb index 46dca87c9..7ac235eb8 100644 --- a/lib/pagy/extras/elasticsearch_rails.rb +++ b/lib/pagy/extras/elasticsearch_rails.rb @@ -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) diff --git a/lib/pagy/extras/overflow.rb b/lib/pagy/extras/overflow.rb index e34ec15eb..3afbcf798 100644 --- a/lib/pagy/extras/overflow.rb +++ b/lib/pagy/extras/overflow.rb @@ -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 diff --git a/lib/pagy/extras/searchkick.rb b/lib/pagy/extras/searchkick.rb index 3bae21e60..a0a847f03 100644 --- a/lib/pagy/extras/searchkick.rb +++ b/lib/pagy/extras/searchkick.rb @@ -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)