jsom-pagination 0.1.1 → 0.2.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: 83137a4848a276bed8f982609a3b7de765a311718d983db6a7694f9abe99327d
4
- data.tar.gz: c427e98b74e1c00c5d40f5546c943455c5c42ffddf1aa5ee2c037c03997a996a
3
+ metadata.gz: 27b6274de4e4cdc7a40b3b729be4b541648402b89a5d1226339df372c6d5926f
4
+ data.tar.gz: c19be09cfa6e72aae8cd725d102999f5b40fafd56d2973405d4c9b40615342bb
5
5
  SHA512:
6
- metadata.gz: 5b0067520185211ad3bee63fff7d60aedb109985680bc59e63f7c10600f41ae8e65ce787652f445d2df54b377b87ed8569d4f5b80f3db7a409a31815005b08dd
7
- data.tar.gz: '00596d4aeb84d6f19ce513debfcca21a00314f5145c2ec8d9bfa8b627551081c0bff5c6c0a4036ec795535e0f62628a651da2587df1bacfdd0c8d9228928134e'
6
+ metadata.gz: cb5be3723a23a0c13769a65aa9f0bdc73106348e14c3a970823435641764a2748837f0e8cb282830f652dc7dcc5ddb35c4f0c3aaf3d9e3408f9b52082d4340ad
7
+ data.tar.gz: e1a3c291ca065a5fad11ae3705d1a60117ca36d82cfe4803f2f16d52d6f276396bc67860e56793f46a75be7527b488ecfa54733d25f1802829099f8a9e97eece
@@ -8,13 +8,17 @@ jobs:
8
8
  build:
9
9
  name: Build + Publish
10
10
  runs-on: ubuntu-latest
11
+ strategy:
12
+ matrix:
13
+ ruby-version: ['2.7', '3.0']
11
14
 
12
15
  steps:
13
16
  - uses: actions/checkout@v2
14
- - name: Set up Ruby 2.7.1
15
- uses: actions/setup-ruby@v1
17
+ - name: Set up Ruby
18
+ uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
16
19
  with:
17
- ruby-version: 2.7.1
20
+ ruby-version: ${{ matrix.ruby-version }}
21
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
18
22
  - name: Run tests
19
23
  run: |
20
24
  bundle install
@@ -10,20 +10,24 @@ jobs:
10
10
  build:
11
11
  name: Build + Test
12
12
  runs-on: ubuntu-latest
13
+ strategy:
14
+ matrix:
15
+ ruby-version: ['2.7', '3.0']
13
16
 
14
17
  steps:
15
18
  - uses: actions/checkout@v2
16
- - name: Set up Ruby 2.7.1
17
- uses: actions/setup-ruby@v1
19
+ - name: Set up Ruby
20
+ uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
18
21
  with:
19
- ruby-version: 2.7.1
22
+ ruby-version: ${{ matrix.ruby-version }}
23
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
20
24
  - name: Run tests
21
25
  run: |
22
26
  bundle install
23
27
  CI=true bundle exec rspec
24
- - name: Upload report
25
- run: |
26
- mv ./coverage/coverage.xml cobertura.xml
27
- bash <(curl -Ls https://coverage.codacy.com/get.sh) report
28
- env:
29
- CODACY_PROJECT_TOKEN: ${{secrets.CODACY_PROJECT_TOKEN}}
28
+ # - name: Upload report
29
+ # run: |
30
+ # mv ./coverage/coverage.xml cobertura.xml
31
+ # bash <(curl -Ls https://coverage.codacy.com/get.sh) report
32
+ # env:
33
+ # CODACY_PROJECT_TOKEN: ${{secrets.CODACY_PROJECT_TOKEN}}
data/.gitignore CHANGED
@@ -13,3 +13,8 @@
13
13
  .DS_Store
14
14
  package.json
15
15
  package-lock.json
16
+
17
+ #rubocop qa-tools default rules
18
+ .rubocop-https*
19
+
20
+ /jsom-pagination*.gem
@@ -0,0 +1,12 @@
1
+ # These are all the cops that are disabled in the default configuration.
2
+
3
+ Style/Copyright:
4
+ Enabled: false
5
+
6
+ Metrics/BlockLength:
7
+ Exclude:
8
+ - "spec/**/*_spec.rb"
9
+
10
+ Metrics/ModuleLength:
11
+ Exclude:
12
+ - "spec/**/*_spec.rb"
data/.rubocop.yml CHANGED
@@ -1,9 +1,11 @@
1
- inherit_from: .rubocop_todo.yml
1
+ inherit_from:
2
+ - https://raw.githubusercontent.com/yousty/qa-tools/master/rubocop/base/.rubocop.yml # common enabled rules
3
+ - https://raw.githubusercontent.com/yousty/qa-tools/master/rubocop/base/.rubocop.disabled.yml # common disabled rules
4
+ - .rubocop.disabled.yml # project specific disabled rules
2
5
 
3
- Metrics/BlockLength:
4
- Exclude:
5
- - "spec/**/*_spec.rb"
6
+ # project specific overwritten rules
6
7
 
7
- Metrics/ModuleLength:
8
- Exclude:
9
- - "spec/**/*_spec.rb"
8
+ # example:
9
+ # Layout/LineLength:
10
+ # Max: 100
11
+ # AllowHeredoc: true
data/README.md CHANGED
@@ -1,6 +1,7 @@
1
1
  # JSOM::Pagination
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/jsom-pagination.svg)](https://badge.fury.io/rb/jsom-pagination)
4
+ ![Tests](https://github.com/useo-pl/jsom-pagination/workflows/Run%20tests/badge.svg?branch=master&event=push)
4
5
  [![Codacy Badge](https://api.codacy.com/project/badge/Grade/bc98c8c017c64b70a11ca79aea6c3e3c)](https://app.codacy.com/gh/useo-pl/jsom-pagination?utm_source=github.com&utm_medium=referral&utm_content=useo-pl/jsom-pagination&utm_campaign=Badge_Grade_Dashboard)
5
6
  [![Codacy Badge](https://app.codacy.com/project/badge/Coverage/eab277bd1f694da88691a2e645adbe96)](https://www.codacy.com/gh/useo-pl/jsom-pagination?utm_source=github.com&utm_medium=referral&utm_content=useo-pl/jsom-pagination&utm_campaign=Badge_Coverage)
6
7
 
@@ -81,6 +82,88 @@ options = { meta: paginated.meta.to_h, links: paginated.links.to_h }
81
82
  render json: serializer.new(paginated.items, options)
82
83
  ```
83
84
 
85
+ ### Summary
86
+
87
+ Using the information above, you can put everything all together by using [jsom-pagination](https://github.com/useo-pl/jsom-pagination) in a ruby framework of your choice.
88
+
89
+ Below is an illustration in [Rails](https://rubyonrails.org/):
90
+
91
+ ```ruby
92
+ # app/controllers/concerns/paginable.rb
93
+ module Paginable
94
+ extend ActiveSupport::Concern
95
+
96
+ def paginator
97
+ JSOM::Pagination::Paginator.new
98
+ end
99
+
100
+ def pagination_params
101
+ params.permit![:page] # defaults to 20 pages
102
+ end
103
+
104
+ def paginate(collection)
105
+ paginator.call(collection, params: pagination_params, base_url: request.url)
106
+ end
107
+
108
+ def render_collection(paginated)
109
+ options = {
110
+ # meta: paginated.meta.to_h, # Will get total pages, total count, etc.
111
+ links: paginated.links.to_h
112
+ }
113
+ paginated_result = serializer.new(paginated.items, options)
114
+
115
+ render json: paginated_result
116
+ end
117
+ end
118
+ ```
119
+
120
+ ```ruby
121
+ # app/controllers/articles_controllers.rb
122
+ class ArtclesController < ApplicationController
123
+ include Paginable
124
+
125
+ def index
126
+ articles = articles = Article.order('created_at DESC')
127
+ paginated = paginate(articles)
128
+
129
+ articles.present? ? render_collection(paginated) : :not_found
130
+ end
131
+
132
+ private
133
+
134
+ def serializer
135
+ ArticleSerializer
136
+ end
137
+ end
138
+ ```
139
+
140
+ The response from the paginated json will look like below:
141
+
142
+ ```json
143
+ {
144
+ "data": [
145
+ {
146
+ "id": "5404329",
147
+ "type": "article",
148
+ "attributes": {
149
+ "author": "Canan Ercan",
150
+ "copies": 10000,
151
+ "publisher": "Webster & Canan Publishers",
152
+ "price": "700"
153
+ }
154
+ }
155
+ ],
156
+ "links": {
157
+ "first": "http://127.0.0.1:3000/api/v1/articles",
158
+ "prev": "http://127.0.0.1:3000/api/v1/articles?page[number]=349",
159
+ "self": "http://127.0.0.1:3000/api/v1/articles?page[number]=350",
160
+ "next": "http://127.0.0.1:3000/api/v1/articles?page[number]=351",
161
+ "last": "http://127.0.0.1:3000/api/v1/articles?page[number]=352"
162
+ }
163
+ }
164
+ ```
165
+
166
+
84
167
  ## Development
85
168
 
86
169
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -30,15 +30,17 @@ Gem::Specification.new do |spec|
30
30
  # that have been added into git.
31
31
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
32
32
  `git ls-files -z`.split("\x0").reject do |f|
33
- f.match(%r{^(test|spec|features)/})
33
+ f.match(%r{^(test|spec|features|Gemfile\.lock)/?})
34
34
  end
35
35
  end
36
36
  spec.bindir = 'exe'
37
37
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
38
38
  spec.require_paths = ['lib']
39
39
 
40
- spec.add_dependency 'dry-struct', '~>1.3.0'
41
- spec.add_dependency 'pagy', '~>3.8.3'
40
+ spec.add_dependency 'dry-struct', '~>1.3'
41
+ spec.add_dependency 'pagy', '~>4.0'
42
+ spec.add_dependency 'rack'
43
+ spec.add_dependency 'addressable', '~> 2.3', '>= 2.3.7'
42
44
 
43
45
  spec.add_development_dependency 'simplecov'
44
46
  spec.add_development_dependency 'simplecov-cobertura'
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'rack/utils'
4
+ require 'addressable'
3
5
  module JSOM
4
6
  module Pagination
5
7
  class Links
@@ -30,12 +32,23 @@ module JSOM
30
32
  attr_reader :page, :total_pages, :url
31
33
 
32
34
  def initialize(page:, url:, total_pages:)
33
- @url = url
35
+ @url = parse_url(url)
34
36
  @page = page
35
37
  @total_pages = total_pages
36
38
  generate_links
37
39
  end
38
40
 
41
+ def parse_url(url)
42
+ uri = Addressable::URI.parse(url)
43
+
44
+ url_params = Rack::Utils.parse_nested_query(
45
+ uri.query
46
+ ).delete_if { |key, _value| key == 'page' }
47
+ uri.query = to_query(url_params)
48
+ uri.query = nil if uri.query.empty?
49
+ uri
50
+ end
51
+
39
52
  def generate_links
40
53
  if page.number > 1
41
54
  @first = generate_url(1)
@@ -50,7 +63,8 @@ module JSOM
50
63
  end
51
64
 
52
65
  def generate_url(page_number)
53
- [url, url_params(page_number)].reject(&:empty?).join('?')
66
+ separator = url.to_s.include?('?') ? '&' : '?'
67
+ [url.to_s, url_params(page_number)].reject(&:empty?).join(separator)
54
68
  end
55
69
 
56
70
  def url_params(page_number)
@@ -61,12 +75,16 @@ module JSOM
61
75
  to_query(url_params)
62
76
  end
63
77
 
64
- def to_query(obj, namespace = nil)
78
+ def to_query(obj, namespace = '')
65
79
  query = obj.collect do |key, value|
66
80
  if value.is_a?(Hash)
67
- to_query(value, namespace ? "#{namespace}[#{key}]" : key)
81
+ to_query(value, namespace.empty? ? key : "#{namespace}[#{key}]")
68
82
  else
69
- ["#{namespace}[#{key}]", value].join('=')
83
+ if namespace.empty?
84
+ [key, value].join('=')
85
+ else
86
+ ["#{namespace}[#{key}]", value].join('=')
87
+ end
70
88
  end
71
89
  end.compact
72
90
 
@@ -19,7 +19,7 @@ module JSOM
19
19
  attr_reader :page
20
20
 
21
21
  def pagy_custom(collection, page:)
22
- pagy = Pagy.new(count: collection.count, page: page.number, items: page.size)
22
+ pagy = Pagy.new(count: collection.size, page: page.number, items: page.size)
23
23
  paginated =
24
24
  if collection.is_a?(Array)
25
25
  collection[pagy.offset, pagy.items]
@@ -2,6 +2,6 @@
2
2
 
3
3
  module JSOM
4
4
  module Pagination
5
- VERSION = '0.1.1'
5
+ VERSION = '0.2.0'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsom-pagination
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sebastian Wilgosz
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-09-13 00:00:00.000000000 Z
11
+ date: 2022-04-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-struct
@@ -16,28 +16,62 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.3.0
19
+ version: '1.3'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.3.0
26
+ version: '1.3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: pagy
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 3.8.3
33
+ version: '4.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 3.8.3
40
+ version: '4.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rack
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: addressable
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '2.3'
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 2.3.7
65
+ type: :runtime
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "~>"
70
+ - !ruby/object:Gem::Version
71
+ version: '2.3'
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 2.3.7
41
75
  - !ruby/object:Gem::Dependency
42
76
  name: simplecov
43
77
  requirement: !ruby/object:Gem::Requirement
@@ -79,13 +113,13 @@ files:
79
113
  - ".github/workflows/gem-test.yml"
80
114
  - ".gitignore"
81
115
  - ".rspec"
116
+ - ".rubocop.disabled.yml"
82
117
  - ".rubocop.yml"
83
118
  - ".ruby-gemset"
84
119
  - ".ruby-version"
85
120
  - ".travis.yml"
86
121
  - CODE_OF_CONDUCT.md
87
122
  - Gemfile
88
- - Gemfile.lock
89
123
  - LICENSE.txt
90
124
  - README.md
91
125
  - Rakefile
@@ -124,7 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
124
158
  - !ruby/object:Gem::Version
125
159
  version: '0'
126
160
  requirements: []
127
- rubygems_version: 3.1.2
161
+ rubygems_version: 3.2.3
128
162
  signing_key:
129
163
  specification_version: 4
130
164
  summary: A pagination support for JSON:API based web applications.
data/Gemfile.lock DELETED
@@ -1,75 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- jsom-pagination (0.1.1)
5
- dry-struct (~> 1.3.0)
6
- pagy (~> 3.8.3)
7
-
8
- GEM
9
- remote: https://rubygems.org/
10
- specs:
11
- concurrent-ruby (1.1.7)
12
- diff-lcs (1.4.4)
13
- docile (1.3.2)
14
- dry-configurable (0.11.6)
15
- concurrent-ruby (~> 1.0)
16
- dry-core (~> 0.4, >= 0.4.7)
17
- dry-equalizer (~> 0.2)
18
- dry-container (0.7.2)
19
- concurrent-ruby (~> 1.0)
20
- dry-configurable (~> 0.1, >= 0.1.3)
21
- dry-core (0.4.9)
22
- concurrent-ruby (~> 1.0)
23
- dry-equalizer (0.3.0)
24
- dry-inflector (0.2.0)
25
- dry-logic (1.0.7)
26
- concurrent-ruby (~> 1.0)
27
- dry-core (~> 0.2)
28
- dry-equalizer (~> 0.2)
29
- dry-struct (1.3.0)
30
- dry-core (~> 0.4, >= 0.4.4)
31
- dry-equalizer (~> 0.3)
32
- dry-types (~> 1.3)
33
- ice_nine (~> 0.11)
34
- dry-types (1.4.0)
35
- concurrent-ruby (~> 1.0)
36
- dry-container (~> 0.3)
37
- dry-core (~> 0.4, >= 0.4.4)
38
- dry-equalizer (~> 0.3)
39
- dry-inflector (~> 0.1, >= 0.1.2)
40
- dry-logic (~> 1.0, >= 1.0.2)
41
- ice_nine (0.11.2)
42
- pagy (3.8.3)
43
- rake (12.3.3)
44
- rspec (3.9.0)
45
- rspec-core (~> 3.9.0)
46
- rspec-expectations (~> 3.9.0)
47
- rspec-mocks (~> 3.9.0)
48
- rspec-core (3.9.2)
49
- rspec-support (~> 3.9.3)
50
- rspec-expectations (3.9.2)
51
- diff-lcs (>= 1.2.0, < 2.0)
52
- rspec-support (~> 3.9.0)
53
- rspec-mocks (3.9.1)
54
- diff-lcs (>= 1.2.0, < 2.0)
55
- rspec-support (~> 3.9.0)
56
- rspec-support (3.9.3)
57
- simplecov (0.19.0)
58
- docile (~> 1.1)
59
- simplecov-html (~> 0.11)
60
- simplecov-cobertura (1.4.0)
61
- simplecov (~> 0.8)
62
- simplecov-html (0.12.2)
63
-
64
- PLATFORMS
65
- ruby
66
-
67
- DEPENDENCIES
68
- jsom-pagination!
69
- rake (~> 12.0)
70
- rspec (~> 3.0)
71
- simplecov
72
- simplecov-cobertura
73
-
74
- BUNDLED WITH
75
- 2.1.4