api_me 0.5.3 → 0.6.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e70094d4fd7b9ae7f7cfddc4dbfe9cec2e94d3ef
4
- data.tar.gz: 698e8957b40252211d1f6ee22ff5fa05ab19cb79
3
+ metadata.gz: 4e8bb2cb3b9c132ede191b0d7276d7cbeabf7252
4
+ data.tar.gz: 130bf19a960566c5dc4c5f6ab05cb78c387596ed
5
5
  SHA512:
6
- metadata.gz: b75592dd259a25e71a5ed7af2ff43be82aa51afb939c79ced4f249b76da2954c8c0bfd5ae4881cf748984ce50760935e5294a4f8466a9a143752e491057273b2
7
- data.tar.gz: e04298b570816de02a33a062241f234b0da3421d89bf6bad9668fd04bd083b5285c53c538c52ea3cadc4f8bb60d218388dfdd6c5ae7bc47f94ade02be659de07
6
+ metadata.gz: a52cc62640bb368b1e661fcdacb0c43f87fc93f99e5d87acaa421ad6fa90287f95326521255e4a5d442f7b5f111f4b0da4f920123d4d822e23b172fdafd627db
7
+ data.tar.gz: 77004d9ae0c8728fa094744ad96fb2c37dbb9b2318ba41ab7c37f35d08daddd9111aeb77438296d9050c14aa7d1b6509b10fe1751027def01690821e82661fcd
data/.editorconfig ADDED
@@ -0,0 +1,41 @@
1
+ # EditorConfig helps developers define and maintain consistent
2
+ # coding styles between different editors and IDEs
3
+ # editorconfig.org
4
+
5
+ root = true
6
+
7
+
8
+ [*]
9
+ end_of_line = lf
10
+ charset = utf-8
11
+ trim_trailing_whitespace = true
12
+ insert_final_newline = true
13
+ indent_style = space
14
+ indent_size = 2
15
+
16
+ [*.rb]
17
+ indent_style = space
18
+ indent_size = 2
19
+
20
+ [*.yml]
21
+ indent_style = space
22
+ indent_size = 2
23
+
24
+ [*.js]
25
+ indent_style = space
26
+ indent_size = 2
27
+
28
+ [*.hbs]
29
+ indent_style = space
30
+ indent_size = 2
31
+
32
+ [*.css]
33
+ indent_style = space
34
+ indent_size = 2
35
+
36
+ [*.html]
37
+ indent_style = space
38
+ indent_size = 2
39
+
40
+ [*.md]
41
+ trim_trailing_whitespace = false
data/lib/api_me.rb CHANGED
@@ -5,6 +5,7 @@ require 'kaminari'
5
5
 
6
6
  require 'api_me/version'
7
7
  require 'api_me/base_filter'
8
+ require 'api_me/sorting'
8
9
  require 'api_me/pagination'
9
10
 
10
11
  module ApiMe
@@ -67,7 +68,8 @@ module ApiMe
67
68
  def index
68
69
  @policy_scope = policy_scope(resource_scope)
69
70
  @filter_scope = filter_scope(@policy_scope)
70
- @pagination_object = ApiMe::Pagination.new(scope: @filter_scope, page_params: params[:page])
71
+ @sorted_scope = ApiMe::Sorting.new(scope: @filter_scope, sort_params: params[:sort]).results
72
+ @pagination_object = ApiMe::Pagination.new(scope: @sorted_scope, page_params: params[:page])
71
73
 
72
74
  render json: @pagination_object.results, each_serializer: serializer_klass, meta: { page: @pagination_object.page_meta }
73
75
  end
@@ -147,7 +149,7 @@ module ApiMe
147
149
  def resource_scope
148
150
  model_klass.all
149
151
  end
150
-
152
+
151
153
  def filter_scope(scope)
152
154
  filter_klass.new(
153
155
  scope: scope,
@@ -158,7 +160,7 @@ module ApiMe
158
160
  def params_klass_symbol
159
161
  model_klass.name.demodulize.underscore.to_sym
160
162
  end
161
-
163
+
162
164
  def filters_hash
163
165
  ids_filter_hash = params[:ids] ? { ids: params[:ids] } : {}
164
166
  (filter_params || {}).merge(ids_filter_hash)
@@ -17,7 +17,6 @@ module ApiMe
17
17
 
18
18
  def page_meta
19
19
  return Hash.new unless paging?
20
-
21
20
  {
22
21
  size: page_size.nil? ? default_page_size : page_size,
23
22
  offset: page_offset,
@@ -30,7 +29,7 @@ module ApiMe
30
29
  protected
31
30
 
32
31
  def page
33
- self.scope = scope.page(self.page_offset ? page_offset : 1)
32
+ self.scope = Kaminari.paginate_array(scope).page(self.page_offset ? page_offset : 1)
34
33
  self
35
34
  end
36
35
 
@@ -38,7 +37,6 @@ module ApiMe
38
37
  if page_size
39
38
  self.scope = scope.per(page_size)
40
39
  end
41
-
42
40
  self
43
41
  end
44
42
 
@@ -51,5 +49,6 @@ module ApiMe
51
49
  def paging?
52
50
  page_size || page_offset
53
51
  end
52
+
54
53
  end
55
54
  end
@@ -0,0 +1,57 @@
1
+ module ApiMe
2
+ class Sorting
3
+ attr_accessor :sort_criteria, :sort_reverse, :scope
4
+
5
+ def initialize(scope:, sort_params:)
6
+ self.scope = scope
7
+
8
+ if sort_params
9
+ self.sort_criteria = sort_params[:criteria]
10
+ self.sort_reverse = sort_params[:reverse]
11
+ end
12
+ end
13
+
14
+ def results
15
+ sorting? ? sort.scope : scope
16
+ end
17
+
18
+ def sort_meta
19
+ return Hash.new unless sorting?
20
+ {
21
+ criteria: sort_criteria.is_blank? || sort_criteria === "" ? default_sort_criteria : sort_criteria,
22
+ reverse: sort_reverse,
23
+ record_count: scope.size,
24
+ total_records: scope.total_count,
25
+ }
26
+ end
27
+
28
+ protected
29
+
30
+ def sort
31
+ unless sort_criteria === ""
32
+ sort_p = sort_criteria
33
+ if sort_reverse === "true"
34
+ self.scope = scope.sort_by {|scope| scope[sort_p]}.reverse!
35
+ else
36
+ self.scope = scope.sort_by {|scope| scope[sort_p]}
37
+ end
38
+ self.scope
39
+ else
40
+ default_sort_criteria
41
+ sort.scope
42
+ end
43
+ self
44
+ end
45
+
46
+ private
47
+
48
+ def default_sort_criteria
49
+ sort_criteria = "id"
50
+ end
51
+
52
+ def sorting?
53
+ sort_criteria || sort_reverse
54
+ end
55
+
56
+ end
57
+ end
@@ -1,3 +1,3 @@
1
1
  module ApiMe
2
- VERSION = '0.5.3'
2
+ VERSION = '0.6.0'
3
3
  end
@@ -137,4 +137,26 @@ describe 'Posts API' do
137
137
 
138
138
  expect(json['posts'].length).to eq(filtered_posts.count)
139
139
  end
140
+
141
+ it 'sends posts reverse sorted by id' do
142
+ 20.times do |i|
143
+ Post.create(name: 'Post' + i.to_s)
144
+ end
145
+
146
+ get '/api/v1/posts?sort%5Bcriteria%5D=id&sort%5Breverse%5D=true'
147
+ json = JSON.parse(last_response.body)
148
+ expect(json['posts'].last['name']).to eq('Post0')
149
+ end
150
+
151
+ it 'sends posts reverse sorted by id and paginated with a size of 10 and an offset of 1' do
152
+ 20.times do |i|
153
+ Post.create(name: 'Post' + i.to_s)
154
+ end
155
+
156
+ get '/api/v1/posts?page%5Boffset%5D=1&page%5Bsize%5D=10&sort%5Bcriteria%5D=id&sort%5Breverse%5D=true'
157
+ json = JSON.parse(last_response.body)
158
+ expect(json['posts'].first['name']).to eq('Post19')
159
+ expect(json['posts'].length).to eq(10)
160
+ end
161
+
140
162
  end
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.5.3
4
+ version: 0.6.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: 2016-05-20 00:00:00.000000000 Z
12
+ date: 2016-05-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -173,6 +173,7 @@ executables: []
173
173
  extensions: []
174
174
  extra_rdoc_files: []
175
175
  files:
176
+ - ".editorconfig"
176
177
  - ".gitignore"
177
178
  - ".rubocop.yml"
178
179
  - ".ruby-version"
@@ -187,6 +188,7 @@ files:
187
188
  - lib/api_me/base_filter.rb
188
189
  - lib/api_me/engine.rb
189
190
  - lib/api_me/pagination.rb
191
+ - lib/api_me/sorting.rb
190
192
  - lib/api_me/version.rb
191
193
  - lib/generators/api_me/controller/USAGE
192
194
  - lib/generators/api_me/controller/controller_generator.rb