pagy 5.0.0 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9c5f4f4ffd2a294e465f0a026d9795c9ae8e5efe58b968a97df08fa9163bab28
4
- data.tar.gz: 8dc70a9adb26aa4da11f42f1903478d62b3aaff7a17e0bd57163c4b340ffd91e
3
+ metadata.gz: a1345a70a6c730b386f155905f1f64821d0843704a378906cec76a27a68f77bc
4
+ data.tar.gz: b067a51f4178b84cf164374382b41e061e4d0e257819961abb2ef8d3e516c83d
5
5
  SHA512:
6
- metadata.gz: c3b6c77ae8ec22c135f6acc127884a4fe334e811b310ffa464bacae46d842a57a1d3c98faac019935c14900fe78aff2aeb0ebf72fef82822bea8dee9fc1943eb
7
- data.tar.gz: 43b8b9aa866735df4ac4cca43b22f04aaa5c08ef9140c3d6b04b4ed0e132681e40f0ef224111dc788c0e558d3b8ac3d5e283d5a42ad24abc4c152a452b5ed5c5
6
+ metadata.gz: 8aa6a995fff4c56eade45efb978ad63beb36f2ee10152dbf89365cf18d66911f89a7f84f36b35ce94b4228a286f18b6343a6c30c80434bd9ad6a12c177b47b3e
7
+ data.tar.gz: 4a9288306aff02bfc789a3198f38c02ed6b7d038d2caddf1eba1d3b4102e4f1f61c111eefd60c126c6a4f5c2e3b88dd745802732324d506bed8bbd118361027f
data/lib/config/pagy.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Pagy initializer file (5.0.0)
3
+ # Pagy initializer file (5.0.1)
4
4
  # Customize only what you really need and notice that Pagy works also without any of the following lines.
5
5
  # Should you just cherry pick part of this file, please maintain the require-order of the extras
6
6
 
@@ -3,7 +3,7 @@
3
3
  // Container of the whole pagy stuff
4
4
  function Pagy(){}
5
5
 
6
- Pagy.version = '5.0.0'
6
+ Pagy.version = '5.0.1'
7
7
 
8
8
  // Used by the waitForMe function
9
9
  Pagy.delay = 100
@@ -16,8 +16,7 @@ class Pagy
16
16
 
17
17
  # Finalize the instance variables based on the fetched items
18
18
  def finalize(fetched)
19
- raise OverflowError.new(self), "page #{@page} got no items" \
20
- if fetched.zero? && @page > 1
19
+ raise OverflowError.new(self, :page, "to be < #{@page}") if fetched.zero? && @page > 1
21
20
 
22
21
  @pages = @last = (fetched > @items ? @page + 1 : @page)
23
22
  @in = [fetched, @items].min
@@ -27,5 +26,9 @@ class Pagy
27
26
  @next = @page == @last ? (1 if @vars[:cycle]) : @page + 1
28
27
  self
29
28
  end
29
+
30
+ def series(_size = @vars[:size])
31
+ super unless @vars[:countless_minimal]
32
+ end
30
33
  end
31
34
  end
@@ -3,23 +3,24 @@
3
3
  class Pagy
4
4
  # Generic variable error
5
5
  class VariableError < ArgumentError
6
- attr_reader :pagy
6
+ attr_reader :pagy, :variable, :value
7
7
 
8
- def initialize(pagy)
9
- super
10
- @pagy = pagy
11
- end
12
-
13
- def variable
14
- message =~ /expected :(\w+)/
15
- Regexp.last_match(1)&.to_sym
16
- end
17
-
18
- def value
19
- pagy.vars[variable]
8
+ def initialize(pagy, variable, description, value = nil)
9
+ @pagy = pagy
10
+ @variable = variable
11
+ @value = value
12
+ message = +"expected :#{@variable} #{description}"
13
+ message << "; got #{@value.inspect}" if value
14
+ super message
20
15
  end
21
16
  end
22
17
 
23
18
  # Specific overflow error
24
19
  class OverflowError < VariableError; end
20
+
21
+ # I18n configuration error
22
+ class I18nError < StandardError; end
23
+
24
+ # Generic internal error
25
+ class InternalError < StandardError; end
25
26
  end
@@ -20,6 +20,7 @@ class Pagy
20
20
  %(<li class="page-item active">#{link.call item}</li>)
21
21
  when :gap
22
22
  %(<li class="page-item gap disabled"><a href="#" class="page-link">#{pagy_t 'pagy.nav.gap'}</a></li>)
23
+ else raise InternalError, "expected item types in series to be Integer, String or :gap; got #{item.inspect}"
23
24
  end
24
25
  end
25
26
  html << pagy_bootstrap_next_html(pagy, link)
@@ -22,6 +22,7 @@ class Pagy
22
22
  %(class="pagination-link is-current" aria-label="page #{item}" aria-current="page")}</li>)
23
23
  when :gap
24
24
  %(<li><span class="pagination-ellipsis">#{pagy_t 'pagy.nav.gap'}</span></li>)
25
+ else raise InternalError, "expected item types in series to be Integer, String or :gap; got #{item.inspect}"
25
26
  end
26
27
  end
27
28
  html << %(</ul></nav>)
@@ -17,6 +17,7 @@ class Pagy
17
17
  when Integer then %(<li>#{link.call item}</li>) # page link
18
18
  when String then %(<li class="current">#{item}</li>) # active page
19
19
  when :gap then %(<li class="ellipsis gap" aria-hidden="true"></li>) # page gap
20
+ else raise InternalError, "expected item types in series to be Integer, String or :gap; got #{item.inspect}"
20
21
  end
21
22
  end
22
23
  html << pagy_foundation_next_html(pagy, link)
@@ -13,7 +13,7 @@ class Pagy
13
13
  return super if !@vars[:gearbox_extra] || @vars[:items_extra]
14
14
 
15
15
  gearbox_items = @vars[:gearbox_items]
16
- raise VariableError.new(self), "expected :gearbox_items to be an Array of positives; got #{gearbox_items.inspect}" \
16
+ raise VariableError.new(self, :gearbox_items, 'to be an Array of positives', gearbox_items) \
17
17
  unless gearbox_items.is_a?(Array) && gearbox_items.all? { |num| num.positive? rescue false } # rubocop:disable Style/RescueModifier
18
18
 
19
19
  @items = gearbox_items[@page - 1] || gearbox_items.last
@@ -17,6 +17,7 @@ class Pagy
17
17
  when Integer then %(<li class="waves-effect">#{link.call item}</li>) # page link
18
18
  when String then %(<li class="active">#{link.call item}</li>) # active page
19
19
  when :gap then %(<li class="gap disabled"><a href="#">#{pagy_t 'pagy.nav.gap'}</a></li>) # page gap
20
+ else raise InternalError, "expected item types in series to be Integer, String or :gap; got #{item.inspect}"
20
21
  end
21
22
  end
22
23
  html << pagy_materialize_next_html(pagy, link)
@@ -4,44 +4,20 @@
4
4
  require 'pagy/url_helpers'
5
5
 
6
6
  class Pagy
7
+ DEFAULT[:metadata] = %i[ scaffold_url first_url prev_url page_url next_url last_url
8
+ count page items vars pages last in from to prev next series ]
9
+
7
10
  # Add a specialized backend method for pagination metadata
8
11
  module MetadataExtra
9
12
  private
10
13
 
11
- # Store the array of all the internal variable names usable as METADATA
12
- METADATA = %i[ scaffold_url
13
- first_url
14
- prev_url
15
- page_url
16
- next_url
17
- last_url
18
- count page
19
- items
20
- vars
21
- pages
22
- last
23
- in
24
- from
25
- to
26
- prev
27
- next
28
- series ].tap { |m| m << :sequels if DEFAULT.key?(:steps) }.freeze
29
-
30
- # Set the default metadata variable
31
- Pagy::DEFAULT[:metadata] = METADATA.dup
32
-
33
14
  include UrlHelpers
34
15
 
35
16
  # Return the metadata hash
36
17
  def pagy_metadata(pagy, absolute: nil)
37
- names = pagy.vars[:metadata]
38
- unknown = names - METADATA
39
- raise VariableError.new(pagy), "expected :metadata to be in #{DEFAULT[:metadata].inspect}, got #{unknown.inspect} unknown" \
40
- unless unknown.empty?
41
-
42
18
  scaffold_url = pagy_url_for(pagy, PAGE_PLACEHOLDER, absolute: absolute)
43
19
  {}.tap do |metadata|
44
- names.each do |key|
20
+ pagy.vars[:metadata].each do |key|
45
21
  metadata[key] = case key
46
22
  when :scaffold_url then scaffold_url
47
23
  when :first_url then scaffold_url.sub(PAGE_PLACEHOLDER, 1.to_s)
@@ -51,6 +27,8 @@ class Pagy
51
27
  when :last_url then scaffold_url.sub(PAGE_PLACEHOLDER, pagy.last.to_s)
52
28
  else pagy.send(key)
53
29
  end
30
+ rescue NoMethodError
31
+ raise VariableError.new(pagy, :metadata, 'to contain known keys', key)
54
32
  end
55
33
  end
56
34
  end
@@ -31,8 +31,7 @@ class Pagy
31
31
  @prev = @last # prev relative to the actual page
32
32
  extend Series # special series for :empty_page
33
33
  else
34
- raise VariableError.new(self), \
35
- "expected :overflow to be in [:last_page, :empty_page, :exception]; got #{@vars[:overflow].inspect}"
34
+ raise VariableError.new(self, :overflow, 'to be in [:last_page, :empty_page, :exception]', @vars[:overflow])
36
35
  end
37
36
  end
38
37
 
@@ -63,8 +62,7 @@ class Pagy
63
62
  @vars[:size] = [] # no page in the series
64
63
  self
65
64
  else
66
- raise VariableError.new(self), \
67
- "expected :overflow to be in [:empty_page, :exception]; got #{@vars[:overflow].inspect}"
65
+ raise VariableError.new(self, :overflow, 'to be in [:empty_page, :exception]', @vars[:overflow])
68
66
  end
69
67
  end
70
68
  end
@@ -17,6 +17,7 @@ class Pagy
17
17
  when Integer then link.call item # page link
18
18
  when String then %(<a class="item active">#{item}</a>) # current page
19
19
  when :gap then %(<div class="disabled item">#{pagy_t 'pagy.nav.gap'}</div>) # page gap
20
+ else raise InternalError, "expected item types in series to be Integer, String or :gap; got #{item.inspect}"
20
21
  end
21
22
  end
22
23
  html << pagy_semantic_next_html(pagy, link)
@@ -19,8 +19,7 @@ class Pagy
19
19
  # Notice: if :steps is false it will use the single {0 => @vars[:size]} size
20
20
  def sequels(steps = nil)
21
21
  steps ||= @vars[:steps] || { 0 => @vars[:size] }
22
- raise VariableError.new(self), "expected :steps to define the 0 width; got #{steps.inspect}" \
23
- unless steps.key?(0)
22
+ raise VariableError.new(self, :steps, 'to define the 0 width', steps) unless steps.key?(0)
24
23
 
25
24
  {}.tap do |sequels|
26
25
  steps.each { |width, size| sequels[width.to_s] = series(size) }
@@ -40,7 +40,7 @@ class Pagy
40
40
  params[p_vars[:page_param].to_s] = page
41
41
  params[p_vars[:items_param].to_s] = p_vars[:items] if defined?(ItemsExtra)
42
42
  # no Rack required in standalone mode
43
- query_string = "?#{QueryUtils.build_nested_query(pagy_massage_params(params))}" unless params.empty?
43
+ query_string = "?#{QueryUtils.build_nested_query(pagy_massage_params(params))}"
44
44
  "#{url}#{query_string}#{p_vars[:fragment]}"
45
45
  end
46
46
  end
@@ -16,6 +16,7 @@ class Pagy
16
16
  when Integer then %(<li>#{link.call item}</li>)
17
17
  when String then %(<li class="uk-active"><span>#{item}</span></li>)
18
18
  when :gap then %(<li class="uk-disabled"><span>#{pagy_t 'pagy.nav.gap'}</span></li>)
19
+ else raise InternalError, "expected item types in series to be Integer, String or :gap; got #{item.inspect}"
19
20
  end
20
21
  end
21
22
  html << pagy_uikit_next_html(pagy, link)
data/lib/pagy/frontend.rb CHANGED
@@ -31,6 +31,7 @@ class Pagy
31
31
  when Integer then %(<span class="page">#{link.call item}</span> ) # page link
32
32
  when String then %(<span class="page active">#{item}</span> ) # current page
33
33
  when :gap then %(<span class="page gap">#{pagy_t('pagy.nav.gap')}</span> ) # page gap
34
+ else raise InternalError, "expected item types in series to be Integer, String or :gap; got #{item.inspect}"
34
35
  end
35
36
  end
36
37
  html << if p_next
data/lib/pagy/i18n.rb CHANGED
@@ -130,7 +130,7 @@ class Pagy
130
130
  locale[:filepath] ||= Pagy.root.join('locales', "#{locale[:locale]}.yml")
131
131
  locale[:pluralize] ||= P11n::LOCALE[locale[:locale]]
132
132
  dictionary = YAML.safe_load(File.read(locale[:filepath], encoding: 'UTF-8'))
133
- raise VariableError, %(expected :locale "#{locale[:locale]}" not found in :filepath "#{locale[:filepath].inspect}") \
133
+ raise I18nError, %(expected :locale "#{locale[:locale]}" not found in :filepath "#{locale[:filepath].inspect}") \
134
134
  unless dictionary.key?(locale[:locale])
135
135
 
136
136
  DATA[locale[:locale]] = [flatten(dictionary[locale[:locale]]), locale[:pluralize]]
@@ -10,7 +10,7 @@ class Pagy
10
10
  params[p_vars[:page_param].to_s] = page
11
11
  params[p_vars[:items_param].to_s] = p_vars[:items] if defined?(ItemsExtra)
12
12
  # we rely on Rack by default: use the standalone extra in non rack environments
13
- query_string = "?#{Rack::Utils.build_nested_query(pagy_massage_params(params))}" unless params.empty?
13
+ query_string = "?#{Rack::Utils.build_nested_query(pagy_massage_params(params))}"
14
14
  "#{request.base_url if absolute}#{request.path}#{query_string}#{p_vars[:fragment]}"
15
15
  end
16
16
 
data/lib/pagy.rb CHANGED
@@ -5,7 +5,7 @@ require 'pathname'
5
5
 
6
6
  # Core class
7
7
  class Pagy
8
- VERSION = '5.0.0'
8
+ VERSION = '5.0.1'
9
9
 
10
10
  # Root pathname to get the path of Pagy files like templates or dictionaries
11
11
  def self.root
@@ -32,8 +32,7 @@ class Pagy
32
32
  setup_vars(count: 0, page: 1, outset: 0)
33
33
  setup_items_var
34
34
  setup_pages_var
35
- raise OverflowError.new(self), "expected :page in 1..#{@last}; got #{@page.inspect}" \
36
- if @page > @last
35
+ raise OverflowError.new(self, :page, "in 1..#{@last}", @page) if @page > @last
37
36
 
38
37
  @offset = (@items * (@page - 1)) + @outset
39
38
  @from = [@offset - @outset + 1, @count].min
@@ -46,7 +45,7 @@ class Pagy
46
45
  # Return the array of page numbers and :gap items e.g. [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
47
46
  def series(size = @vars[:size])
48
47
  return [] if size.empty?
49
- raise VariableError.new(self), "expected 4 items >= 0 in :size; got #{size.inspect}" \
48
+ raise VariableError.new(self, :size, 'to contain 4 items >= 0', size) \
50
49
  unless size.size == 4 && size.all? { |num| !num.negative? rescue false } # rubocop:disable Style/RescueModifier
51
50
 
52
51
  # This algorithm is up to ~5x faster and ~2.3x lighter than the previous one (pagy < 4.3)
@@ -81,7 +80,7 @@ class Pagy
81
80
  # Setup and validates the passed vars: var must be present and value.to_i must be >= to min
82
81
  def setup_vars(name_min)
83
82
  name_min.each do |name, min|
84
- raise VariableError.new(self), "expected :#{name} >= #{min}; got #{@vars[name].inspect}" \
83
+ raise VariableError.new(self, name, ">= #{min}", @vars[name]) \
85
84
  unless @vars[name] && instance_variable_set(:"@#{name}", @vars[name].to_i) >= min
86
85
  end
87
86
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pagy
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.0
4
+ version: 5.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Domizio Demichelis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-16 00:00:00.000000000 Z
11
+ date: 2021-10-18 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Agnostic pagination in plain ruby. It does it all. Better.
14
14
  email: