restpack_serializer 0.4.25 → 0.4.26
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/README.md +17 -0
- data/lib/restpack_serializer/options.rb +21 -1
- data/lib/restpack_serializer/serializable/attributes.rb +1 -1
- data/lib/restpack_serializer/serializable/paging.rb +2 -0
- data/lib/restpack_serializer/serializable/sortable.rb +14 -0
- data/lib/restpack_serializer/serializable.rb +2 -0
- data/lib/restpack_serializer/version.rb +1 -1
- data/spec/fixtures/db.rb +2 -0
- data/spec/fixtures/serializers.rb +1 -0
- data/spec/serializable/options_spec.rb +27 -0
- data/spec/serializable/paging_spec.rb +22 -0
- data/spec/serializable/serializer_spec.rb +4 -0
- data/spec/serializable/sortable_spec.rb +14 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 25923489c94e8e3dfc5b1406afddb1de14555e30
|
4
|
+
data.tar.gz: ba2c8686002cb5d6223df146d00d6a050a66b8b3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 02e14de37827c4b899aa05e5d8bae3e8c5a6a3cb2348d2666bf4861933c3b6149e90df576fb10d2f541bb0a868fcc88de004fbe0b321377f1e94c281c30f04c3
|
7
|
+
data.tar.gz: 11dda7d263ad9263051518a7516c6bfa0f23575128b62d09889c4839db48c2caf6ce481091415a642c51b8d9ef4b8e1bfcc632e79e688b00b68db0db25be94b2
|
data/README.md
CHANGED
@@ -345,6 +345,23 @@ Side-loading is available when filtering:
|
|
345
345
|
|
346
346
|
* http://restpack-serializer-sample.herokuapp.com/api/v1/albums.json?artist_ids=2,3&include=artists,songs
|
347
347
|
|
348
|
+
## Sorting
|
349
|
+
|
350
|
+
Sorting attributes can be defined with the `can_sort_by` option:
|
351
|
+
|
352
|
+
```ruby
|
353
|
+
class Account
|
354
|
+
include RestPack::Serializer
|
355
|
+
attributes :id, :application_id, :created_by, :name, :href
|
356
|
+
|
357
|
+
can_sort_by :id, :name
|
358
|
+
end
|
359
|
+
```
|
360
|
+
|
361
|
+
* http://restpack-serializer-sample.herokuapp.com/api/v1/albums.json?sort=id
|
362
|
+
* http://restpack-serializer-sample.herokuapp.com/api/v1/albums.json?sort=-name
|
363
|
+
* http://restpack-serializer-sample.herokuapp.com/api/v1/albums.json?sort=name,-id
|
364
|
+
|
348
365
|
## Running Tests
|
349
366
|
|
350
367
|
`bundle`
|
@@ -1,7 +1,8 @@
|
|
1
1
|
module RestPack::Serializer
|
2
2
|
class Options
|
3
3
|
attr_accessor :page, :page_size, :include, :filters, :serializer,
|
4
|
-
:model_class, :scope, :context, :include_links
|
4
|
+
:model_class, :scope, :context, :include_links,
|
5
|
+
:sorting
|
5
6
|
|
6
7
|
def initialize(serializer, params = {}, scope = nil, context = {})
|
7
8
|
params.symbolize_keys! if params.respond_to?(:symbolize_keys!)
|
@@ -10,6 +11,7 @@ module RestPack::Serializer
|
|
10
11
|
@page_size = RestPack::Serializer.config.page_size
|
11
12
|
@include = []
|
12
13
|
@filters = filters_from_params(params, serializer)
|
14
|
+
@sorting = sorting_from_params(params, serializer)
|
13
15
|
@serializer = serializer
|
14
16
|
@model_class = serializer.model_class
|
15
17
|
@scope = scope || model_class.send(:all)
|
@@ -42,6 +44,11 @@ module RestPack::Serializer
|
|
42
44
|
@filters.sort.map {|k,v| "#{k}=#{v.join(',')}" }.join('&')
|
43
45
|
end
|
44
46
|
|
47
|
+
def sorting_as_url_params
|
48
|
+
sorting_values = sorting.map { |k, v| v == :asc ? k : "-#{k}" }.join(',')
|
49
|
+
"sort=#{sorting_values}"
|
50
|
+
end
|
51
|
+
|
45
52
|
private
|
46
53
|
|
47
54
|
def filters_from_params(params, serializer)
|
@@ -53,5 +60,18 @@ module RestPack::Serializer
|
|
53
60
|
end
|
54
61
|
filters
|
55
62
|
end
|
63
|
+
|
64
|
+
def sorting_from_params(params, serializer)
|
65
|
+
sort_values = params[:sort] && params[:sort].split(',')
|
66
|
+
return {} if sort_values.blank? || serializer.serializable_sorting_attributes.blank?
|
67
|
+
sorting_parameters = {}
|
68
|
+
|
69
|
+
sort_values.each do |sort_value|
|
70
|
+
sort_order = sort_value[0] == '-' ? :desc : :asc
|
71
|
+
sort_value = sort_value.gsub(/\A\-/, '').downcase.to_sym
|
72
|
+
sorting_parameters[sort_value] = sort_order if serializer.serializable_sorting_attributes.include?(sort_value)
|
73
|
+
end
|
74
|
+
sorting_parameters
|
75
|
+
end
|
56
76
|
end
|
57
77
|
end
|
@@ -2,7 +2,7 @@ module RestPack::Serializer::Attributes
|
|
2
2
|
extend ActiveSupport::Concern
|
3
3
|
|
4
4
|
def default_href
|
5
|
-
"#{RestPack::Serializer.config.href_prefix}/#{self.class.key}/#{@model.
|
5
|
+
"#{RestPack::Serializer.config.href_prefix}/#{self.class.key}/#{@model.to_param}"
|
6
6
|
end
|
7
7
|
|
8
8
|
module ClassMethods
|
@@ -8,6 +8,7 @@ module RestPack::Serializer::Paging
|
|
8
8
|
|
9
9
|
def page_with_options(options)
|
10
10
|
page = options.scope_with_filters.page(options.page).per(options.page_size)
|
11
|
+
page = page.reorder(options.sorting) if options.sorting.any?
|
11
12
|
|
12
13
|
result = RestPack::Serializer::Result.new
|
13
14
|
result.resources[self.key] = serialize_page(page, options)
|
@@ -58,6 +59,7 @@ module RestPack::Serializer::Paging
|
|
58
59
|
params << "page=#{page}" unless page == 1
|
59
60
|
params << "page_size=#{options.page_size}" unless options.default_page_size?
|
60
61
|
params << "include=#{options.include.join(',')}" if options.include.any?
|
62
|
+
params << options.sorting_as_url_params if options.sorting.any?
|
61
63
|
params << options.filters_as_url_params if options.filters.any?
|
62
64
|
|
63
65
|
url += '?' + params.join('&') if params.any?
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module RestPack::Serializer::Sortable
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
module ClassMethods
|
5
|
+
attr_reader :serializable_sorting_attributes
|
6
|
+
|
7
|
+
def can_sort_by(*attributes)
|
8
|
+
@serializable_sorting_attributes = []
|
9
|
+
attributes.each do |attribute|
|
10
|
+
@serializable_sorting_attributes << attribute.to_sym
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -7,6 +7,7 @@ require_relative "serializable/resource"
|
|
7
7
|
require_relative "serializable/single"
|
8
8
|
require_relative "serializable/side_loading"
|
9
9
|
require_relative "serializable/symbolizer"
|
10
|
+
require_relative "serializable/sortable"
|
10
11
|
|
11
12
|
module RestPack
|
12
13
|
module Serializer
|
@@ -26,6 +27,7 @@ module RestPack
|
|
26
27
|
include RestPack::Serializer::Attributes
|
27
28
|
include RestPack::Serializer::Filterable
|
28
29
|
include RestPack::Serializer::SideLoading
|
30
|
+
include RestPack::Serializer::Sortable
|
29
31
|
|
30
32
|
class InvalidInclude < Exception; end
|
31
33
|
|
data/spec/fixtures/db.rb
CHANGED
@@ -59,6 +59,33 @@ describe RestPack::Serializer::Options do
|
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
+
context 'with sorting parameters' do
|
63
|
+
describe 'with no params' do
|
64
|
+
let(:params) { { } }
|
65
|
+
it { subject.sorting.should == {} }
|
66
|
+
end
|
67
|
+
describe 'with a sorting value' do
|
68
|
+
let(:params) { { 'sort' => 'Title' } }
|
69
|
+
it { subject.sorting.should == { title: :asc } }
|
70
|
+
it { subject.sorting_as_url_params.should == 'sort=title' }
|
71
|
+
end
|
72
|
+
describe 'with a descending sorting value' do
|
73
|
+
let(:params) { { 'sort' => '-title' } }
|
74
|
+
it { subject.sorting.should == { title: :desc } }
|
75
|
+
it { subject.sorting_as_url_params.should == 'sort=-title' }
|
76
|
+
end
|
77
|
+
describe 'with multiple sorting values' do
|
78
|
+
let(:params) { { 'sort' => '-Title,ID' } }
|
79
|
+
it { subject.sorting.should == { title: :desc, id: :asc } }
|
80
|
+
it { subject.sorting_as_url_params.should == 'sort=-title,id' }
|
81
|
+
end
|
82
|
+
describe 'with a not allowed sorting value' do
|
83
|
+
let(:params) { { 'sort' => '-title,album_id,id' } }
|
84
|
+
it { subject.sorting.should == { title: :desc, id: :asc } }
|
85
|
+
it { subject.sorting_as_url_params.should == 'sort=-title,id' }
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
62
89
|
context 'scopes' do
|
63
90
|
describe 'with default scope' do
|
64
91
|
it { subject.scope.should == MyApp::Song.all }
|
@@ -180,6 +180,28 @@ describe RestPack::Serializer::Paging do
|
|
180
180
|
end
|
181
181
|
end
|
182
182
|
|
183
|
+
context 'when sorting' do
|
184
|
+
context 'with no sorting' do
|
185
|
+
let(:params) { {} }
|
186
|
+
|
187
|
+
it "uses the model's sorting" do
|
188
|
+
page[:songs].first[:id].to_i.should < page[:songs].last[:id].to_i
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
context 'with descending title sorting' do
|
193
|
+
let(:params) { { sort: '-title' } }
|
194
|
+
|
195
|
+
it 'returns a page with sorted songs' do
|
196
|
+
page[:songs].first[:title].should > page[:songs].last[:title]
|
197
|
+
end
|
198
|
+
|
199
|
+
it 'includes the sorting in page hrefs' do
|
200
|
+
page[:meta][:songs][:next_href].should == '/songs?page=2&sort=-title'
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
183
205
|
context "with custom scope" do
|
184
206
|
before do
|
185
207
|
FactoryGirl.create(:album, year: 1930)
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RestPack::Serializer::Sortable do
|
4
|
+
class CustomSerializer
|
5
|
+
include RestPack::Serializer
|
6
|
+
attributes :a, :b, :c
|
7
|
+
|
8
|
+
can_sort_by :a, :c
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'captures the specified sorting attributes' do
|
12
|
+
CustomSerializer.serializable_sorting_attributes.should == [:a, :c]
|
13
|
+
end
|
14
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: restpack_serializer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.26
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gavin Joyce
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-06-
|
11
|
+
date: 2014-06-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -231,6 +231,7 @@ files:
|
|
231
231
|
- lib/restpack_serializer/serializable/resource.rb
|
232
232
|
- lib/restpack_serializer/serializable/side_loading.rb
|
233
233
|
- lib/restpack_serializer/serializable/single.rb
|
234
|
+
- lib/restpack_serializer/serializable/sortable.rb
|
234
235
|
- lib/restpack_serializer/serializable/symbolizer.rb
|
235
236
|
- lib/restpack_serializer/version.rb
|
236
237
|
- restpack_serializer.gemspec
|
@@ -249,6 +250,7 @@ files:
|
|
249
250
|
- spec/serializable/side_loading/has_many_spec.rb
|
250
251
|
- spec/serializable/side_loading/side_loading_spec.rb
|
251
252
|
- spec/serializable/single_spec.rb
|
253
|
+
- spec/serializable/sortable_spec.rb
|
252
254
|
- spec/spec_helper.rb
|
253
255
|
- spec/support/factory.rb
|
254
256
|
homepage: https://github.com/RestPack
|
@@ -290,6 +292,7 @@ test_files:
|
|
290
292
|
- spec/serializable/side_loading/has_many_spec.rb
|
291
293
|
- spec/serializable/side_loading/side_loading_spec.rb
|
292
294
|
- spec/serializable/single_spec.rb
|
295
|
+
- spec/serializable/sortable_spec.rb
|
293
296
|
- spec/spec_helper.rb
|
294
297
|
- spec/support/factory.rb
|
295
298
|
has_rdoc:
|