api_me 0.4.1 → 0.5.0
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 +4 -4
- data/.ruby-version +1 -1
- data/.travis.yml +0 -2
- data/Gemfile +1 -0
- data/api_me.gemspec +1 -0
- data/lib/api_me.rb +5 -2
- data/lib/api_me/pagination.rb +55 -0
- data/lib/api_me/version.rb +1 -1
- data/spec/acceptance/api/v1/posts_spec.rb +106 -1
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 02a356aba53a5aadcbbccb6dd04d7e4e5cc3cb51
|
4
|
+
data.tar.gz: c544bba077a0144161f4bf585e6d77a39cfb9d79
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 03ff2f340a021a3d81363cda80165971cb42dccd0375ea80142f42ab08ac6fff4b265cd733b76c9e816f8295c5a4eec3540c844d4c29ececf598368a91fe5f48
|
7
|
+
data.tar.gz: 9eda9a733e53c50b7dcde5df28d7771eec648bd55ce21f35fd0167432e3e9a44f19ec7eb4ed238cb5df9f73c37dba6baf3c747fdccf40d00c83bcb53cd99faab
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.1.
|
1
|
+
2.1.5
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/api_me.gemspec
CHANGED
@@ -23,6 +23,7 @@ Gem::Specification.new do |s|
|
|
23
23
|
s.add_runtime_dependency 'pundit', '~> 1.0'
|
24
24
|
s.add_runtime_dependency 'active_model_serializers', '~> 0.8.0'
|
25
25
|
s.add_runtime_dependency 'search_object', '~> 1.0'
|
26
|
+
s.add_runtime_dependency 'kaminari', '~> 0.16.3'
|
26
27
|
|
27
28
|
s.add_development_dependency 'combustion', '~> 0.5.1'
|
28
29
|
s.add_development_dependency 'rspec-rails', '~> 3'
|
data/lib/api_me.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
require 'active_support/concern'
|
2
2
|
require 'pundit'
|
3
3
|
require 'search_object'
|
4
|
+
require 'kaminari'
|
4
5
|
|
5
6
|
require 'api_me/version'
|
6
7
|
require 'api_me/base_filter'
|
8
|
+
require 'api_me/pagination'
|
7
9
|
|
8
10
|
module ApiMe
|
9
11
|
extend ActiveSupport::Concern
|
@@ -65,12 +67,13 @@ module ApiMe
|
|
65
67
|
def index
|
66
68
|
ids_filter_hash = params[:ids] ? { ids: params[:ids] } : {}
|
67
69
|
@scoped_objects = policy_scope(resource_scope)
|
68
|
-
@
|
70
|
+
@filter_object = filter_klass.new(
|
69
71
|
scope: @scoped_objects,
|
70
72
|
filters: (filter_params || {}).merge(ids_filter_hash)
|
71
73
|
)
|
74
|
+
@pagination_object = ApiMe::Pagination.new(scope: @filter_object.results, page_params: params[:page])
|
72
75
|
|
73
|
-
render json: @
|
76
|
+
render json: @pagination_object.results, each_serializer: serializer_klass, meta: { page: @pagination_object.page_meta }
|
74
77
|
end
|
75
78
|
|
76
79
|
def show
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module ApiMe
|
2
|
+
class Pagination
|
3
|
+
attr_accessor :page_size, :page_offset, :scope
|
4
|
+
|
5
|
+
def initialize(scope:, page_params:)
|
6
|
+
self.scope = scope
|
7
|
+
|
8
|
+
if page_params
|
9
|
+
self.page_size = page_params[:size]
|
10
|
+
self.page_offset = page_params[:offset]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def results
|
15
|
+
paging? ? page.per.scope : scope
|
16
|
+
end
|
17
|
+
|
18
|
+
def page_meta
|
19
|
+
return Hash.new unless paging?
|
20
|
+
|
21
|
+
{
|
22
|
+
size: page_size.nil? ? default_page_size : page_size,
|
23
|
+
offset: page_offset,
|
24
|
+
record_count: scope.size,
|
25
|
+
total_records: scope.total_count,
|
26
|
+
total_pages: scope.total_pages
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
protected
|
31
|
+
|
32
|
+
def page
|
33
|
+
self.scope = scope.page(self.page_offset ? page_offset : 1)
|
34
|
+
self
|
35
|
+
end
|
36
|
+
|
37
|
+
def per
|
38
|
+
if page_size
|
39
|
+
self.scope = scope.per(page_size)
|
40
|
+
end
|
41
|
+
|
42
|
+
self
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def default_page_size
|
48
|
+
Kaminari.config.default_per_page
|
49
|
+
end
|
50
|
+
|
51
|
+
def paging?
|
52
|
+
page_size || page_offset
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
data/lib/api_me/version.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe '
|
3
|
+
describe 'Posts API' do
|
4
4
|
it 'sends the list of posts using the default filter' do
|
5
5
|
posts = [
|
6
6
|
Post.create(name: 'test'),
|
@@ -15,6 +15,111 @@ describe 'Users API' do
|
|
15
15
|
expect(json['posts'].length).to eq(posts.count)
|
16
16
|
end
|
17
17
|
|
18
|
+
it 'is paging with page offset using default page size and restricting size' do
|
19
|
+
40.times do
|
20
|
+
Post.create(name: 'page item')
|
21
|
+
end
|
22
|
+
|
23
|
+
get '/api/v1/posts?page%5Boffset%5D=1'
|
24
|
+
json = JSON.parse(last_response.body)
|
25
|
+
expect(json['posts'].length).to eq(25)
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'is page offset of 2 working for size of 40 default page size of 25' do
|
30
|
+
40.times do
|
31
|
+
Post.create(name: 'page item')
|
32
|
+
end
|
33
|
+
|
34
|
+
get '/api/v1/posts?page%5Boffset%5D=2'
|
35
|
+
json = JSON.parse(last_response.body)
|
36
|
+
expect(json['posts'].length).to eq(15)
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'is page offset of -1 working for size of 40 default page size of 25' do
|
41
|
+
#min page offset is 1, anything less gets converted to 1 and results in page size records
|
42
|
+
40.times do
|
43
|
+
Post.create(name: 'page item')
|
44
|
+
end
|
45
|
+
|
46
|
+
get '/api/v1/posts?page%5Boffset%5D=-1'
|
47
|
+
json = JSON.parse(last_response.body)
|
48
|
+
expect(json['posts'].length).to eq(25)
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'is page offset of 3 working for size of 40 default page size of 25' do
|
53
|
+
#overflow on page offset will result in 0 records
|
54
|
+
40.times do
|
55
|
+
Post.create(name: 'page item')
|
56
|
+
end
|
57
|
+
|
58
|
+
get '/api/v1/posts?page%5Boffset%5D=3'
|
59
|
+
json = JSON.parse(last_response.body)
|
60
|
+
expect(json['posts'].length).to eq(0)
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'is page size of 10 working for default offset of 1' do
|
65
|
+
#overflow on page offset will result in 0 records
|
66
|
+
40.times do
|
67
|
+
Post.create(name: 'page item')
|
68
|
+
end
|
69
|
+
|
70
|
+
get '/api/v1/posts?page%5Bsize%5D=10'
|
71
|
+
json = JSON.parse(last_response.body)
|
72
|
+
expect(json['posts'].length).to eq(10)
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'is page size working when the value is negative' do
|
77
|
+
#overflow on page offset will result in 0 records
|
78
|
+
40.times do
|
79
|
+
Post.create(name: 'page item')
|
80
|
+
end
|
81
|
+
|
82
|
+
get '/api/v1/posts?page%5Bsize%5D=-10'
|
83
|
+
json = JSON.parse(last_response.body)
|
84
|
+
expect(json['posts'].length).to eq(25)
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'is page size working when the value is higher than the total record count' do
|
89
|
+
#overflow on page offset will result in 0 records
|
90
|
+
40.times do
|
91
|
+
Post.create(name: 'page item')
|
92
|
+
end
|
93
|
+
|
94
|
+
get '/api/v1/posts?page%5Bsize%5D=100'
|
95
|
+
json = JSON.parse(last_response.body)
|
96
|
+
expect(json['posts'].length).to eq(40)
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'is the result all records when no page paramas are sent' do
|
100
|
+
#overflow on page offset will result in 0 records
|
101
|
+
100.times do
|
102
|
+
Post.create(name: 'page item')
|
103
|
+
end
|
104
|
+
|
105
|
+
get '/api/v1/posts'
|
106
|
+
json = JSON.parse(last_response.body)
|
107
|
+
expect(json['posts'].length).to eq(100)
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'restricts page_size when max_per_page config is less' do
|
112
|
+
100.times do
|
113
|
+
Post.create(name: 'page item')
|
114
|
+
end
|
115
|
+
|
116
|
+
Kaminari.config.max_per_page = 10
|
117
|
+
|
118
|
+
get '/api/v1/posts?page%5Bsize%5D=100'
|
119
|
+
json = JSON.parse(last_response.body)
|
120
|
+
expect(json['posts'].length).to eq(10)
|
121
|
+
end
|
122
|
+
|
18
123
|
it 'sends posts filtered by ids' do
|
19
124
|
all_posts = [
|
20
125
|
Post.create(name: 'test'),
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: api_me
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Clopton
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2016-02-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -81,6 +81,20 @@ dependencies:
|
|
81
81
|
- - "~>"
|
82
82
|
- !ruby/object:Gem::Version
|
83
83
|
version: '1.0'
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: kaminari
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - "~>"
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: 0.16.3
|
91
|
+
type: :runtime
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - "~>"
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: 0.16.3
|
84
98
|
- !ruby/object:Gem::Dependency
|
85
99
|
name: combustion
|
86
100
|
requirement: !ruby/object:Gem::Requirement
|
@@ -171,6 +185,7 @@ files:
|
|
171
185
|
- config.ru
|
172
186
|
- lib/api_me.rb
|
173
187
|
- lib/api_me/base_filter.rb
|
188
|
+
- lib/api_me/pagination.rb
|
174
189
|
- lib/api_me/version.rb
|
175
190
|
- lib/generators/api_me/controller/USAGE
|
176
191
|
- lib/generators/api_me/controller/controller_generator.rb
|