paginate-responder 1.5.0 → 1.6.0.b0

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
  SHA1:
3
- metadata.gz: 98521af773941c3f0a5b2eca08ec3658433e3d0b
4
- data.tar.gz: 3d8cbe19193e14d23abaea15fa1a95b34fbd5274
3
+ metadata.gz: fa30c367c32405ca6cc56ccee9ab1cad82e8894b
4
+ data.tar.gz: 5dd939187d91b5af8c9c35ac483a9d3c56d0b092
5
5
  SHA512:
6
- metadata.gz: 6f43de22a9d8eabde4bab441f842d517f0b99c9c108a8895467674c89d2afea88c93d1e48102504b2740a84eaeb9186f6d2c06a26eb656c1dc10e9b48f8a0eb9
7
- data.tar.gz: f3756e605e2036a5bd5513b69743b94c0ee41476b1b8a59e3e5a6ce08e3e18aa96d107521b147b738b523649818e92c823896f1f1fd982538e67293c45b38cd6
6
+ metadata.gz: be00e015691aeadf0d5174ee2010cb7b73e40ffc9c9c79ee6a6cef87a1617c065d85cd747f03d27d1f8ac99c6915ec7d526ecf06b3e38b6b428072c6a4a67747
7
+ data.tar.gz: 404cf3ad70bbfd40ee53a0c30268ccaaa922257022345f1d12d387580ec94a91d20726623032497fe2f16090edde4200ec7cba48f3d2e320adaf378dd5c7f323
data/.travis.yml CHANGED
@@ -1,16 +1,22 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - '2.3.0'
5
- - '2.2'
6
- - '2.1'
4
+ - '2.3.1'
5
+ - '2.2.5'
6
+ - '2.1.10'
7
7
  env:
8
8
  - GEM=will_paginate
9
9
  - GEM=kaminari
10
10
  gemfile:
11
- - gemfiles/Gemfile.rails-4-1
12
- - gemfiles/Gemfile.rails-4-2
13
- - gemfiles/Gemfile.rails-head
11
+ - gemfiles/rails_3_2.gemfile
12
+ - gemfiles/rails_4_2.gemfile
13
+ - gemfiles/rails_5_0.gemfile
14
+ - gemfiles/rails_head.gemfile
14
15
  matrix:
16
+ exclude:
17
+ - rvm: '2.1.10'
18
+ gemfile: gemfiles/rails_5_0.gemfile
19
+ - rvm: '2.1.10'
20
+ gemfile: gemfiles/rails_head.gemfile
15
21
  allow_failures:
16
- - gemfile: gemfiles/Gemfile.rails-head
22
+ - gemfile: gemfiles/rails_head.gemfile
data/Appraisals ADDED
@@ -0,0 +1,15 @@
1
+ appraise "rails-3-2" do
2
+ gem 'rails', '~> 3.2.0'
3
+ end
4
+
5
+ appraise "rails-4-2" do
6
+ gem 'rails', '~> 4.2.0'
7
+ end
8
+
9
+ appraise "rails-5-0" do
10
+ gem 'rails', '~> 5.0.0'
11
+ end
12
+
13
+ appraise "rails-head" do
14
+ gem 'rails', github: 'rails/rails'
15
+ end
data/Gemfile CHANGED
@@ -2,9 +2,3 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in paginate-responder.gemspec
4
4
  gemspec
5
-
6
- group :development do
7
- gem 'actionpack', require: false
8
- gem 'activerecord', require: false
9
- gem 'responders', '~> 2.0', require: false
10
- end
data/Rakefile CHANGED
@@ -1,11 +1,7 @@
1
- require "bundler/gem_tasks"
2
- require 'rake/testtask'
1
+ require 'rubygems'
2
+ require 'bundler/setup'
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
3
5
 
4
- Rake::TestTask.new do |t|
5
- t.libs.push "test"
6
- t.test_files = FileList['test/*_test.rb']
7
- t.verbose = true
8
- end
9
-
10
- task :default => :test
11
- task :spec => :test
6
+ RSpec::Core::RakeTask.new(:spec)
7
+ task default: :spec
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 3.2.0"
6
+
7
+ gemspec :path => "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 4.2.0"
6
+
7
+ gemspec :path => "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 5.0.0"
6
+
7
+ gemspec :path => "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", :github => "rails/rails"
6
+
7
+ gemspec :path => "../"
@@ -1,17 +1,12 @@
1
1
  require 'rack-link_headers'
2
2
 
3
3
  module Responders
4
- autoload :PaginateResponder, 'responders/paginate_responder'
4
+ require 'responders/paginate_responder'
5
5
  end
6
6
 
7
7
  module PaginateResponder
8
- autoload :VERSION, 'paginate-responder/version'
9
- autoload :Paginator, 'paginate-responder/paginator'
10
-
11
- module Adapter
12
- autoload :Base, 'paginate-responder/adapter/base'
13
- end
8
+ require 'paginate-responder/version'
9
+ require 'paginate-responder/base'
10
+ require 'paginate-responder/will_paginate_adapter'
11
+ require 'paginate-responder/kaminari_adapter'
14
12
  end
15
-
16
- require 'paginate-responder/adapter/paginate_adapter'
17
- require 'paginate-responder/adapter/kaminari_adapter'
@@ -0,0 +1,129 @@
1
+ module PaginateResponder
2
+ class Base
3
+ attr_reader :responder, :resource
4
+
5
+ def initialize(responder)
6
+ @responder = responder
7
+ @resource = responder.resource
8
+ end
9
+
10
+ def request
11
+ responder.request
12
+ end
13
+
14
+ def controller
15
+ responder.controller
16
+ end
17
+
18
+ def response
19
+ controller.response
20
+ end
21
+
22
+ def paginate!
23
+ @resource = paginate
24
+
25
+ update
26
+
27
+ @resource
28
+ end
29
+
30
+ protected
31
+
32
+ def paginate
33
+ resource
34
+ end
35
+
36
+ def update
37
+ link! 'first', page: first_page if first_page
38
+ link! 'prev', page: prev_page if prev_page
39
+ link! 'next', page: next_page if next_page
40
+ link! 'last', page: last_page if last_page
41
+
42
+ response.headers["X-Total-Pages"] = total_pages.to_s if total_pages
43
+ response.headers["X-Total-Count"] = total_count.to_s if total_count
44
+ response.headers["X-Per-Page"] = per_page.to_s if per_page
45
+ end
46
+
47
+ def page
48
+ @page ||= begin
49
+ val ||= controller.page if controller.respond_to? :page
50
+ val ||= controller.params[:page]
51
+ val ||= first_page
52
+ cast_page val
53
+ end
54
+ end
55
+
56
+ def cast_page(page)
57
+ Integer(page)
58
+ end
59
+
60
+ def per_page
61
+ @per_page ||= begin
62
+ val ||= controller.per_page if controller.respond_to? :per_page
63
+ val ||= controller.params[:per_page].try(:to_i)
64
+ val ||= default_per_page
65
+ val < 1 ? 1 : (val > max_per_page) ? max_per_page : val
66
+ end
67
+ end
68
+
69
+ def max_per_page
70
+ @max_per_page ||= begin
71
+ val ||= controller.max_per_page if controller.respond_to? :max_per_page
72
+ val ||= default_max_per_page
73
+ val
74
+ end
75
+ end
76
+
77
+ def first_page
78
+ 1
79
+ end
80
+
81
+ def prev_page
82
+ page - 1 if page > 1
83
+ end
84
+
85
+ def next_page
86
+ page + 1 if total_pages && page < total_pages
87
+ end
88
+
89
+ def last_page
90
+ total_pages
91
+ end
92
+
93
+ def total_pages
94
+ nil
95
+ end
96
+
97
+ def total_count
98
+ nil
99
+ end
100
+
101
+ def default_per_page
102
+ 50
103
+ end
104
+
105
+ def default_max_per_page
106
+ 100
107
+ end
108
+
109
+ private
110
+
111
+ def link!(rel, params)
112
+ if request.params.key?(:per_page)
113
+ params = {per_page: per_page}.merge(params)
114
+ end
115
+
116
+ params = request.params.merge(params)
117
+
118
+ url = controller.url_for(params)
119
+
120
+ response.link(url, rel: rel)
121
+ end
122
+
123
+ class << self
124
+ def suitable?(resource)
125
+ false
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,37 @@
1
+ module PaginateResponder
2
+ #
3
+ # Pagination adapter for kaminari.
4
+ #
5
+ class KaminariAdapter < Base
6
+ def paginate
7
+ resource.page(page).per(per_page)
8
+ end
9
+
10
+ def default_per_page
11
+ Kaminari.config.default_per_page
12
+ end
13
+
14
+ def default_max_per_page
15
+ Kaminari.config.max_per_page
16
+ end
17
+
18
+ def total_pages
19
+ return resource.total_pages if resource.respond_to? :total_pages
20
+ return resource.num_pages if resource.respond_to? :num_pages
21
+ end
22
+
23
+ def total_count
24
+ resource.total_count if resource.respond_to? :total_count
25
+ end
26
+
27
+ class << self
28
+ def suitable?(resource, responder)
29
+ resource.respond_to?(:page) and not resource.respond_to?(:paginate)
30
+ end
31
+ end
32
+ end
33
+
34
+ if defined?(:Kaminari)
35
+ ::Responders::PaginateResponder.register KaminariAdapter
36
+ end
37
+ end
@@ -1,9 +1,9 @@
1
1
  module PaginateResponder
2
2
  module VERSION
3
3
  MAJOR = 1
4
- MINOR = 5
4
+ MINOR = 6
5
5
  PATCH = 0
6
- STAGE = nil
6
+ STAGE = :b0
7
7
 
8
8
  def self.to_s
9
9
  [MAJOR, MINOR, PATCH, STAGE].reject(&:nil?).join '.'
@@ -0,0 +1,36 @@
1
+ module PaginateResponder
2
+ #
3
+ # Pagination adapter for will_paginate.
4
+ #
5
+ class WillPaginateAdapter < Base
6
+ def paginate
7
+ resource.paginate page: page, per_page: per_page
8
+ end
9
+
10
+ def total_pages
11
+ resource.total_pages if resource.respond_to? :total_pages
12
+ end
13
+
14
+ def total_count
15
+ resource.total_entries if resource.respond_to? :total_entries
16
+ end
17
+
18
+ def default_per_page
19
+ 50
20
+ end
21
+
22
+ def default_max_per_page
23
+ 50
24
+ end
25
+
26
+ class << self
27
+ def suitable?(resource, responder)
28
+ resource.respond_to? :paginate
29
+ end
30
+ end
31
+ end
32
+
33
+ if defined?(:WillPaginate)
34
+ ::Responders::PaginateResponder.register WillPaginateAdapter
35
+ end
36
+ end
@@ -1,12 +1,32 @@
1
1
  module Responders
2
-
3
2
  module PaginateResponder
4
-
5
3
  def to_format
6
- if get?
7
- @resource = ::PaginateResponder::Paginator.new(self).paginate!
8
- end
4
+ paginate! if get?
5
+
9
6
  super
10
7
  end
8
+
9
+ private
10
+
11
+ def paginate!
12
+ adapter = ::Responders::PaginateResponder.find(self)
13
+ @resource = adapter.new(self).paginate! if adapter
14
+ end
15
+
16
+ class << self
17
+ def register(adapter)
18
+ adapters << adapter
19
+ end
20
+
21
+ def adapters
22
+ @adpaters ||= ::Set.new
23
+ end
24
+
25
+ def find(responder)
26
+ adapters.find do |adapter|
27
+ adapter.suitable?(responder.resource, responder)
28
+ end
29
+ end
30
+ end
11
31
  end
12
32
  end
@@ -20,12 +20,17 @@ Gem::Specification.new do |gem|
20
20
 
21
21
  gem.add_dependency 'rack-link_headers', '>= 2.2'
22
22
 
23
- gem.add_development_dependency 'rake'
24
23
  gem.add_development_dependency 'actionpack', '>= 3.2.0'
25
24
  gem.add_development_dependency 'activerecord', '>= 3.2.0'
25
+ gem.add_development_dependency 'appraisal'
26
+ gem.add_development_dependency 'kaminari'
27
+ gem.add_development_dependency 'pry'
28
+ gem.add_development_dependency 'pry-byebug'
29
+ gem.add_development_dependency 'rake'
30
+ gem.add_development_dependency 'responders'
31
+ gem.add_development_dependency 'rspec'
32
+ gem.add_development_dependency 'rspec-rails'
26
33
  gem.add_development_dependency 'sqlite3'
27
- gem.add_development_dependency 'minitest'
28
- gem.add_development_dependency 'minitest-reporters'
29
34
  gem.add_development_dependency 'will_paginate'
30
- gem.add_development_dependency 'kaminari'
35
+ gem.add_development_dependency 'test-unit'
31
36
  end
@@ -0,0 +1,158 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Responders::PaginateResponder, type: :controller do
4
+ case $gem
5
+ when 'will_paginate'
6
+ let(:array_resource) do
7
+ ('AA'..'zz').to_a
8
+ end
9
+ when 'kaminari'
10
+ let(:array_resource) do
11
+ Kaminari.paginate_array ('AA'..'zz').to_a
12
+ end
13
+ end
14
+
15
+ before do
16
+ if ActiveRecord::VERSION::MAJOR >= 4
17
+ self.resource = ArModel.all
18
+ else
19
+ self.resource = ArModel.scoped
20
+ end
21
+ end
22
+
23
+ let(:response) { action.call; @response }
24
+ let(:json) { JSON.parse response.body }
25
+ let(:params) { {format: :json} }
26
+
27
+ if ActionPack::VERSION::MAJOR >= 5
28
+ let(:action) { -> { get :index, params: params } }
29
+ else
30
+ let(:action) { -> { get :index, params } }
31
+ end
32
+
33
+ context 'with AR resource' do
34
+ it { expect(json).to eq (1..50).to_a }
35
+
36
+ describe '?page' do
37
+ let(:params) { super().merge page: 2 }
38
+
39
+ it { expect(json).to eq (51..100).to_a }
40
+ end
41
+
42
+ describe '?per_page' do
43
+ let(:params) { super().merge per_page: 10 }
44
+
45
+ it { expect(json).to eq (1..10).to_a }
46
+ end
47
+
48
+ describe '?per_page&page' do
49
+ let(:params) { super().merge page: 2, per_page: 10 }
50
+
51
+ it { expect(json).to eq (11..20).to_a }
52
+ end
53
+ end
54
+
55
+ context 'with array resource' do
56
+ before { @controller.resource = array_resource }
57
+
58
+ it { expect(json).to eq ('AA'..'zz').to_a[0..49] }
59
+
60
+ describe '?page' do
61
+ let(:params) { super().merge page: 2 }
62
+
63
+ it { expect(json).to eq ('AA'..'zz').to_a[50..99] }
64
+ end
65
+
66
+ describe '?per_page' do
67
+ let(:params) { super().merge per_page: 10 }
68
+
69
+ it { expect(json).to eq ('AA'..'zz').to_a[0..9] }
70
+ end
71
+
72
+ describe '?per_page&page' do
73
+ let(:params) { super().merge page: 2, per_page: 10 }
74
+
75
+ it { expect(json).to eq ('AA'..'zz').to_a[10..19] }
76
+ end
77
+ end
78
+
79
+ context 'with AR association' do
80
+ before { @controller.resource = ArModel.find(1).ar_assoc_models }
81
+
82
+ it { expect(json).to eq (1..5).to_a }
83
+ end
84
+
85
+ describe 'links' do
86
+ subject { response.links.map{|l| [l[:params][:rel], l[:url]]}.to_h }
87
+
88
+ it { expect(subject.size).to eq 3 }
89
+ it { is_expected.to include 'first' => 'http://test.host/index.json?page=1' }
90
+ it { is_expected.to include 'next' => 'http://test.host/index.json?page=2' }
91
+ it { is_expected.to include 'last' => 'http://test.host/index.json?page=14' }
92
+
93
+ context '?page' do
94
+ let(:params) { super().merge page: 2 }
95
+
96
+ it { expect(subject.size).to eq 4 }
97
+ it { is_expected.to include 'first' => 'http://test.host/index.json?page=1' }
98
+ it { is_expected.to include 'prev' => 'http://test.host/index.json?page=1' }
99
+ it { is_expected.to include 'next' => 'http://test.host/index.json?page=3' }
100
+ it { is_expected.to include 'last' => 'http://test.host/index.json?page=14' }
101
+ end
102
+
103
+ context '?page=5' do
104
+ let(:params) { super().merge page: 5 }
105
+
106
+ it { expect(subject.size).to eq 4 }
107
+ it { is_expected.to include 'first' => 'http://test.host/index.json?page=1' }
108
+ it { is_expected.to include 'prev' => 'http://test.host/index.json?page=4' }
109
+ it { is_expected.to include 'next' => 'http://test.host/index.json?page=6' }
110
+ it { is_expected.to include 'last' => 'http://test.host/index.json?page=14' }
111
+ end
112
+
113
+ context '?page last' do
114
+ let(:params) { super().merge page: 14 }
115
+
116
+ it { expect(subject.size).to eq 3 }
117
+ it { is_expected.to include 'first' => 'http://test.host/index.json?page=1' }
118
+ it { is_expected.to include 'prev' => 'http://test.host/index.json?page=13' }
119
+ it { is_expected.to include 'last' => 'http://test.host/index.json?page=14' }
120
+ end
121
+
122
+ context '?page before last' do
123
+ let(:params) { super().merge page: 13 }
124
+
125
+ it { expect(subject.size).to eq 4 }
126
+ it { is_expected.to include 'first' => 'http://test.host/index.json?page=1' }
127
+ it { is_expected.to include 'prev' => 'http://test.host/index.json?page=12' }
128
+ it { is_expected.to include 'next' => 'http://test.host/index.json?page=14' }
129
+ it { is_expected.to include 'last' => 'http://test.host/index.json?page=14' }
130
+ end
131
+
132
+ context '?per_page' do
133
+ let(:params) { super().merge page: 1, per_page: 10 }
134
+
135
+ it { expect(subject.size).to eq 3 }
136
+ it { is_expected.to include 'first' => 'http://test.host/index.json?page=1&per_page=10' }
137
+ it { is_expected.to include 'next' => 'http://test.host/index.json?page=2&per_page=10' }
138
+ it { is_expected.to include 'last' => 'http://test.host/index.json?page=68&per_page=10' }
139
+ end
140
+
141
+ context '?per_page above max per page limit' do
142
+ let(:params) { super().merge page: 1, per_page: 100 }
143
+
144
+ it { expect(subject.size).to eq 3 }
145
+ it { is_expected.to include 'first' => 'http://test.host/index.json?page=1&per_page=50' }
146
+ it { is_expected.to include 'next' => 'http://test.host/index.json?page=2&per_page=50' }
147
+ it { is_expected.to include 'last' => 'http://test.host/index.json?page=14&per_page=50' }
148
+ end
149
+ end
150
+
151
+ describe 'headers' do
152
+ subject { response.headers.to_h }
153
+
154
+ it { is_expected.to include 'X-Total-Pages' => '14' }
155
+ it { is_expected.to include 'X-Total-Count' => '676' }
156
+ it { is_expected.to include 'X-Per-Page' => '50' }
157
+ end
158
+ end