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: 
         |