pagy 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a984f9eb44e5f2d637f92e5b5317edbff0691c2b2d4e89d8bf02f2e1a11939b8
4
- data.tar.gz: 01dc6a1f9ca9bba43400f00a645a47c02cf4aa11868705193a9b4c33a50e1811
3
+ metadata.gz: c1f0144a6fd3d7656796cc0811c275402fa66db024bd9dfd08a2f76853b33b3d
4
+ data.tar.gz: '09ea67fbafb73195fd9efe1470860884f317800c455a40150ce533b2b1a74574'
5
5
  SHA512:
6
- metadata.gz: b2ed0782436c442bb3127598cb1f8b8aaeb7afaf373836933e61a93b834bc91125a1f44fb34fad18b362a989c59b2c1ba3683483cf2098b36657be75420f3fc3
7
- data.tar.gz: e7399e4568cf8fbfa537a4a193c928d0810ce47ea4d5c877765d5669d077618e7ab1e715d9892c7bf51e8e827a06b897afef12d417c2994f7be6f65c69cd7fe1
6
+ metadata.gz: 50ce6bb16a1ac0cb961cdbabcdf41065fdecdbccc4d6293b18fd345e34ffba60fd40a1855f4e77036420c46be848d6c4ae614a351418549854cefc51fab63ee7
7
+ data.tar.gz: 56f0b36c864d625775bf39ed574ea1996d1bb608a918ba57ef46082b8ae10fc927588fda1955e8b129a68fd97089a32ff3f47ce1abce202a7f037d6710a0b300
@@ -16,3 +16,6 @@ en:
16
16
  zero: "items"
17
17
  one: "item"
18
18
  other: "items"
19
+ compact:
20
+ page: Page
21
+ of: of
@@ -2,7 +2,7 @@
2
2
 
3
3
  require 'pathname'
4
4
 
5
- class Pagy ; VERSION = '0.5.0'
5
+ class Pagy ; VERSION = '0.6.0'
6
6
 
7
7
  autoload :Backend, 'pagy/backend'
8
8
  autoload :Frontend, 'pagy/frontend'
@@ -13,7 +13,7 @@ class Pagy ; VERSION = '0.5.0'
13
13
  def self.root; Pathname.new(__FILE__).dirname end
14
14
 
15
15
  # default core vars
16
- VARS = { items:20, outset:0, initial:1, before:4, after:4, final:1 }
16
+ VARS = { items:20, outset:0, size:[1,4,4,1] }
17
17
 
18
18
  # default I18n vars
19
19
  I18N = { file: Pagy.root.join('locales', 'pagy.yml').to_s, plurals: -> (c) {c==0 && 'zero' || c==1 && 'one' || 'other'} }
@@ -23,11 +23,11 @@ class Pagy ; VERSION = '0.5.0'
23
23
 
24
24
  # merge and validate the options, do some simple aritmetic and set the instance variables
25
25
  def initialize(vars)
26
- @vars = VARS.merge(vars) # default vars + instance vars
26
+ @vars = VARS.merge(vars) # default vars + instance vars
27
27
  @vars[:page] = (@vars[:page]||1).to_i # set page to 1 if nil
28
- {count:0, items:1, outset:0, initial:0, before:0, page:1, after:0, final:0}.each do |k,min|
28
+ { count:0, items:1, outset:0, page:1 }.each do |k,min| # validate core variables
29
29
  @vars[k] >= min rescue nil || raise(ArgumentError, "expected :#{k} >= #{min}; got #{@vars[k].inspect}")
30
- instance_variable_set(:"@#{k}", @vars.delete(k)) # set all the core variables
30
+ instance_variable_set(:"@#{k}", @vars.delete(k)) # set instance variables
31
31
  end
32
32
  @pages = @last = [(@count.to_f / @items).ceil, 1].max # cardinal and ordinal meanings
33
33
  (1..@last).cover?(@page) || raise(OutOfRangeError, "expected :page in 1..#{@last}; got #{@page.inspect}")
@@ -40,18 +40,17 @@ class Pagy ; VERSION = '0.5.0'
40
40
  end
41
41
 
42
42
  # return the array of page numbers and :gap items e.g. [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
43
- def series
44
- @series ||= [].tap do |series|
45
- [*0..@initial, *@page-@before..@page+@after, *@last-@final+1..@last+1].sort!.each_cons(2) do |a, b|
46
- if a<0 || a==b || a>@last # skip out of range and duplicates
47
- elsif a+1 == b; series.push(a) # no gap -> no additions
48
- elsif a+2 == b; series.push(a, a+1) # 1 page gap -> fill with missing page
49
- else series.push(a, :gap) # n page gap -> add :gap
50
- end # skip the end boundary (last+1)
51
- end
52
- series.shift # remove the start boundary (0)
53
- series[series.index(@page)] = @page.to_s # convert the current page to String
54
- end
43
+ def series(size=@vars[:size])
44
+ (0..3).each{|i| size[i]>=0 rescue nil || raise(ArgumentError, "expected 4 items in :size >= 0; got #{size.inspect}")}
45
+ series = []
46
+ [*0..size[0], *@page-size[1]..@page+size[2], *@last-size[3]+1..@last+1].sort!.each_cons(2) do |a, b|
47
+ if a<0 || a==b || a>@last # skip out of range and duplicates
48
+ elsif a+1 == b; series.push(a) # no gap -> no additions
49
+ elsif a+2 == b; series.push(a, a+1) # 1 page gap -> fill with missing page
50
+ else series.push(a, :gap) # n page gap -> add :gap
51
+ end # skip the end boundary (last+1)
52
+ end # shift the start boundary (0) and
53
+ series.tap{|s| s.shift; s[s.index(@page)] = @page.to_s} # convert the current page to String
55
54
  end
56
55
 
57
56
  end
@@ -1,7 +1,5 @@
1
1
  # See Pagy::Frontend API documentation: https://ddnexus.github.io/pagy/api/frontend
2
2
 
3
- # this file will get autoloaded, so environment constants like ::I18n will be already set
4
- require 'yaml'
5
3
  class Pagy
6
4
 
7
5
  # All the code here has been optimized for performance: it may not look very pretty
@@ -10,37 +8,19 @@ class Pagy
10
8
 
11
9
  # Generic pagination: it returns the html with the series of links to the pages
12
10
  def pagy_nav(pagy)
13
- tags = []; link = pagy_link_proc(pagy)
11
+ tags = ''; link = pagy_link_proc(pagy)
14
12
 
15
- tags << (pagy.prev ? %(<span class="page prev">#{link.call pagy.prev, pagy_t('pagy.nav.prev'.freeze), 'aria-label="previous"'.freeze}</span>)
16
- : %(<span class="page prev disabled">#{pagy_t('pagy.nav.prev'.freeze)}</span>))
13
+ tags << (pagy.prev ? %(<span class="page prev">#{link.call pagy.prev, pagy_t('pagy.nav.prev'.freeze), 'aria-label="previous"'.freeze}</span> )
14
+ : %(<span class="page prev disabled">#{pagy_t('pagy.nav.prev'.freeze)}</span> ))
17
15
  pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
18
- tags << if item.is_a?(Integer); %(<span class="page">#{link.call item}</span>) # page link
19
- elsif item.is_a?(String) ; %(<span class="page active">#{item}</span>) # current page
20
- elsif item == :gap ; %(<span class="page gap">#{pagy_t('pagy.nav.gap'.freeze)}</span>) # page gap
16
+ tags << if item.is_a?(Integer); %(<span class="page">#{link.call item}</span> ) # page link
17
+ elsif item.is_a?(String) ; %(<span class="page active">#{item}</span> ) # current page
18
+ elsif item == :gap ; %(<span class="page gap">#{pagy_t('pagy.nav.gap'.freeze)}</span> ) # page gap
21
19
  end
22
20
  end
23
21
  tags << (pagy.next ? %(<span class="page next">#{link.call pagy.next, pagy_t('pagy.nav.next'.freeze), 'aria-label="next"'.freeze}</span>)
24
22
  : %(<span class="page next disabled">#{pagy_t('pagy.nav.next'.freeze)}</span>))
25
- %(<nav class="pagination" role="navigation" aria-label="pager">#{tags.join(' '.freeze)}</nav>)
26
- end
27
-
28
-
29
- # Pagination for bootstrap: it returns the html with the series of links to the pages
30
- def pagy_nav_bootstrap(pagy)
31
- tags = []; link = pagy_link_proc(pagy, 'class="page-link"'.freeze)
32
-
33
- tags << (pagy.prev ? %(<li class="page-item prev">#{link.call pagy.prev, pagy_t('pagy.nav.prev'.freeze), 'aria-label="previous"'.freeze}</li>)
34
- : %(<li class="page-item prev disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.prev'.freeze)}</a></li>))
35
- pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
36
- tags << if item.is_a?(Integer); %(<li class="page-item">#{link.call item}</li>) # page link
37
- elsif item.is_a?(String) ; %(<li class="page-item active">#{link.call item}</li>) # active page
38
- elsif item == :gap ; %(<li class="page-item gap disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.gap'.freeze)}</a></li>) # page gap
39
- end
40
- end
41
- tags << (pagy.next ? %(<li class="page-item next">#{link.call pagy.next, pagy_t('pagy.nav.next'.freeze), 'aria-label="next"'.freeze}</li>)
42
- : %(<li class="page-item next disabled"><a href="#" class="page-link">#{pagy_t('pagy.nav.next'.freeze)}</a></li>))
43
- %(<nav class="pagination" role="navigation" aria-label="pager"><ul class="pagination">#{tags.join}</ul></nav>)
23
+ %(<nav class="pagy-nav pagination" role="navigation" aria-label="pager">#{tags}</nav>)
44
24
  end
45
25
 
46
26
 
@@ -77,10 +57,12 @@ class Pagy
77
57
 
78
58
 
79
59
  # define #pagy_t depending on I18N[:gem] and I18n
60
+ # this file will get autoloaded, so environment constants like ::I18n will be already set
80
61
  if I18N[:gem] || I18N[:gem].nil? && defined?(I18n)
81
62
  I18n.load_path << I18N[:file]
82
- def pagy_t(*a); I18n.t(*a) end
63
+ def pagy_t(*a) I18n.t(*a) end
83
64
  else
65
+ require 'yaml'
84
66
  # load data from the first locale in the file
85
67
  I18N_DATA = YAML.load_file(I18N[:file]).first[1].freeze
86
68
  # Similar to I18n.t for interpolation and pluralization but without translation
@@ -6,7 +6,7 @@
6
6
  Usage: link.call( page_number [, text [, extra_attributes_string ]])
7
7
  -%>
8
8
  <% link = pagy_link_proc(pagy) -%>
9
- <%# -%><nav aria-label="pager" class="pagination" role="navigation">
9
+ <%# -%><nav aria-label="pager" class="pagy_nav agination" role="navigation">
10
10
  <% if pagy.prev -%> <span class="page prev"><%== link.call(pagy.prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"') %></span>
11
11
  <% else -%> <span class="page prev disabled"><%== pagy_t('pagy.nav.prev') %></span>
12
12
  <% end -%>
@@ -6,7 +6,7 @@
6
6
 
7
7
  - link = pagy_link_proc(pagy)
8
8
 
9
- %nav.pagination{"aria-label" => "pager", :role => "navigation"}
9
+ %nav.pagy_nav.pagination{"aria-label" => "pager", :role => "navigation"}
10
10
 
11
11
  - if pagy.prev
12
12
  %span.page.prev!= link.call(pagy.prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"')
@@ -6,7 +6,7 @@
6
6
 
7
7
  - link = pagy_link_proc(pagy)
8
8
 
9
- nav.pagination role="navigation" aria-label="pager"
9
+ nav.pagy_nav.pagination role="navigation" aria-label="pager"
10
10
 
11
11
  - if pagy.prev
12
12
  span.page.prev ==> link.call(pagy.prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"')
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.license = 'MIT'
18
18
  s.require_paths = ['lib']
19
19
 
20
- s.files = `git ls-files -z`.split("\x0").select{|f| f.start_with?('lib', 'pagy.gemspec', 'LICENSE', 'README', 'images') }
20
+ s.files = `git ls-files -z`.split("\x0").select{|f| f.start_with?('lib', 'pagy.gemspec', 'LICENSE') }
21
21
 
22
22
 
23
23
  s.add_development_dependency 'bundler', '~> 1.16'
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: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Domizio Demichelis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-29 00:00:00.000000000 Z
11
+ date: 2018-04-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -133,11 +133,6 @@ extensions: []
133
133
  extra_rdoc_files: []
134
134
  files:
135
135
  - LICENSE.txt
136
- - README.md
137
- - images/efficiency-table.png
138
- - images/ips-chart.png
139
- - images/memory-chart.png
140
- - images/objects-chart.png
141
136
  - lib/locales/pagy.yml
142
137
  - lib/pagy.rb
143
138
  - lib/pagy/backend.rb
@@ -145,9 +140,6 @@ files:
145
140
  - lib/templates/nav.html.erb
146
141
  - lib/templates/nav.html.haml
147
142
  - lib/templates/nav.html.slim
148
- - lib/templates/nav_bootstrap.html.erb
149
- - lib/templates/nav_bootstrap.html.haml
150
- - lib/templates/nav_bootstrap.html.slim
151
143
  - pagy.gemspec
152
144
  homepage: https://github.com/ddnexus/pagy
153
145
  licenses:
data/README.md DELETED
@@ -1,93 +0,0 @@
1
- # Pagy
2
-
3
- Pagy is the ultimate pagination gem that outperforms the others in each and every benchmark and comparison.
4
-
5
- ### Benchmarks
6
-
7
- The best way to quickly get an idea about its features is comparing it to the other well known gems.
8
-
9
- The values shown in the charts below have been recorded while each gem was producing the exact same output: same environment conditions, same task, just different gems _(see the complete [Gems Comparison](http://ddnexus.github.io/pagination-comparison/gems.html))_
10
-
11
- #### Pagy is a lot faster
12
-
13
- ![IPS Chart](images/ips-chart.png)
14
-
15
- #### Pagy uses a lot less memory
16
-
17
- ![Memory Chart](images/memory-chart.png)
18
-
19
- #### Pagy is a lot simpler
20
-
21
- ![Objects Chart](images/objects-chart.png)
22
-
23
- #### Pagy is a lot more efficient
24
-
25
- ![Efficiency Table](images/efficiency-table.png)
26
-
27
- _The [IPS/Kb ratio](http://ddnexus.github.io/pagination-comparison/gems.html#efficiency-ratio) is calculated out of speed (IPS) and Memory (Kb): it shows how well each gem uses any Kb of memory it allocates/consumes._
28
-
29
- #### Pagy does not suffer the typical limitations of the other gems:
30
-
31
- - it works with collections/scopes that already used `limit` and `offset`
32
- - it works with both helpers or templates (your choice)
33
- - it raises real `Pagy::OutOfRangeError` exceptions that you can rescue from
34
- - it does not impose any difficult-to-override logic or output
35
-
36
- ### Features
37
-
38
- #### Straightforward code
39
-
40
- - Pagy is just ~120 lines of simple ruby, organized in 3 flat modules very easy to understand and use
41
- - it produces its own HTML, URLs, pluralization and interpolation with its own specialized and fast code
42
- - 100% of its methods are public API, accessible and overridable **right where you use them** (no need of monkey patching or subclassing)
43
-
44
- #### Totally agnostic
45
-
46
- - it doesn't need to know anything about your models, ORM or Storage, so it doesn't add any code to them
47
- - it works with all kind of collections, even pre-paginated, records, Arrays, JSON data... and just whatever you can count
48
- - it works with all Rack frameworks (Rails, Sinatra, Padrino, ecc.) out of the box
49
- - it works with any possible non-Rack envoronment by just overriding one or two one-liner methods
50
-
51
- #### Simple Usage
52
-
53
- You can use pagy in a quite familiar way:
54
-
55
- Paginate your collection in some controller:
56
-
57
- ```ruby
58
- @pagy, @records = pagy(Product.some_scope)
59
- ```
60
-
61
- Render the navigation links with a super-fast helper in some view:
62
-
63
- ```HTML+ERB
64
- <%= pagy_nav(@pagy) %>
65
- ```
66
-
67
- Or - if you prefer - render the navigation links with a template:
68
-
69
- ```HTML+ERB
70
- <%= render 'pagy/nav', locals: {pagy: @pagy} %>
71
- ```
72
-
73
- ## Support, Comments and Feature Requests
74
-
75
- [![Join the chat at https://gitter.im/ruby-pagy/Lobby](https://badges.gitter.im/ruby-pagy/Lobby.svg)](https://gitter.im/ruby-pagy/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
76
-
77
- ## Useful Links
78
-
79
- - [Documentation](https://ddnexus.github.io/pagy/index)
80
- - [Pagination Comparison App](http://github.com/ddnexus/pagination-comparison)
81
-
82
- ## Help Wanted
83
-
84
- Pagy is a fresh project and your help would be great. If you like it, you have a few options to contribute:
85
-
86
- - write a tutorial or a post or even just a tweet (pagy is young and needs to be known)
87
- - write a "How To" topic (the documentation is covering the basics and there is a lot of space for additions)
88
- - submit a pull request to make pagy even faster, save more memory or improve its usability
89
- - create an issue if anything should be improved/fixed
90
-
91
- ## License
92
-
93
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
Binary file
Binary file
Binary file
Binary file
@@ -1,24 +0,0 @@
1
- <%#
2
- This template is i18n-ready: if you don't use i18n, then you can replace the pagy_t
3
- calls with the actual strings ("&lsaquo; Prev", "Next &rsaquo;", "&hellip;").
4
-
5
- The link variable is set to a proc that returns the link tag.
6
- Usage: link.call( page_number [, text [, extra_attributes_string ]])
7
- -%>
8
- <% link = pagy_link_proc(pagy, 'class="page-link"') -%>
9
- <%# -%><nav aria-label="pager" class="pagination" role="navigation">
10
- <%# -%> <ul class="pagination">
11
- <% if pagy.prev -%> <li class="page-item prev"><%== link.call(pagy.prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"') %></li>
12
- <% else -%> <li class="page-item prev disabled"><a href="#" class="page-link"><%== pagy_t('pagy.nav.prev') %></a></li>
13
- <% end -%>
14
- <% pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36] -%>
15
- <% if item.is_a?(Integer) -%> <li class="page-item"><%== link.call(item) %></li>
16
- <% elsif item.is_a?(String) -%> <li class="page-item active"><%== link.call(item) %></li>
17
- <% elsif item == :gap -%> <li class="page-item disabled gap"><a href="#" class="page-link"><%== pagy_t('pagy.nav.gap') %></a></li>
18
- <% end -%>
19
- <% end -%>
20
- <% if pagy.next -%> <li class="page-item next"><%== link.call(pagy.next, pagy_t('pagy.nav.next'), 'aria-label="next"') %></li>
21
- <% else -%> <li class="page-item next disabled"><a href="#" class="page-link"><%== pagy_t('pagy.nav.next') %></a></li>
22
- <% end -%>
23
- <%# -%> </ul>
24
- <%# -%></nav>
@@ -1,34 +0,0 @@
1
- -# This template is i18n-ready: if you don't use i18n, then you can replace the pagy_t
2
- -# calls with the actual strings ("&lsaquo; Prev", "Next &rsaquo;", "&hellip;").
3
-
4
- -# The link variable is set to a proc that returns the link tag.
5
- -# Usage: link.call( page_number [, text [, extra_attributes_string ]])
6
-
7
- - link = pagy_link_proc(pagy, 'class="page-link"')
8
-
9
- %nav.pagination{"aria-label" => "pager", :role => "navigation"}
10
-
11
- %ul.pagination
12
-
13
- - if pagy.prev
14
- %li.page-item.prev!= link.call(pagy.prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"')
15
- - else
16
- %li.page-item.prev.disabled
17
- %a.page-link{:href => '#'}!= pagy_t('pagy.nav.prev')
18
-
19
- - pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
20
- - if item.is_a?(Integer) # page link
21
- %li.page-item!= link.call(item)
22
-
23
- - elsif item.is_a?(String) # current page
24
- %li.page-item.active!= link.call(item)
25
-
26
- - elsif item == :gap # page gap
27
- %li.page-item.disabled.gap
28
- %a.page-link{:href => "#"}!= pagy_t('pagy.nav.gap')
29
-
30
- - if pagy.next
31
- %li.page-item.next!= link.call(pagy.next, pagy_t('pagy.nav.next'), 'aria-label="next"')
32
- - else
33
- %li.page-item.next.disabled
34
- %a.page-link{:href => '#'}!= pagy_t('pagy.nav.next')
@@ -1,34 +0,0 @@
1
- / This template is i18n-ready: if you don't use i18n, then you can replace the pagy_t
2
- / calls with the actual strings ("&lsaquo; Prev", "Next &rsaquo;", "&hellip;").
3
-
4
- / The link variable is set to a proc that returns the link tag.
5
- / Usage: link.call( page_number [, text [, extra_attributes_string ]])
6
-
7
- - link = pagy_link_proc(pagy, 'class="page-link"')
8
-
9
- nav.pagination role="navigation" aria-label="pager"
10
-
11
- ul.pagination
12
-
13
- - if pagy.prev
14
- li.page-item.prev == link.call(pagy.prev, pagy_t('pagy.nav.prev'), 'aria-label="previous"')
15
- - else
16
- li.page-item.prev.disabled
17
- a.page-link href="#" == pagy_t('pagy.nav.prev')
18
-
19
- - pagy.series.each do |item| # series example: [1, :gap, 7, 8, "9", 10, 11, :gap, 36]
20
- - if item.is_a?(Integer) # page link
21
- li.page-item == link.call(item)
22
-
23
- - elsif item.is_a?(String) # current page
24
- li.page-item.active == link.call(item)
25
-
26
- - elsif item == :gap # page gap
27
- li.page-item.disabled.gap
28
- a.page-link href="#" == pagy_t('pagy.nav.gap')
29
-
30
- - if pagy.next
31
- li.page-item.next == link.call(pagy.next, pagy_t('pagy.nav.next'), 'aria-label="next"')
32
- - else
33
- li.page-item.next.disabled
34
- a.page-link href="#" == pagy_t('pagy.nav.next')