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)