diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d6cba9..4274e08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ### 1.5.1 (Next) * Your contribution here. +* [#74](https://github.com/ruby-grape/grape-active_model_serializers/pull/74): Add support for Sequel - [@drn](https://github.com/drn). * [#65](https://github.com/ruby-grape/grape-active_model_serializers/pull/65): Added Danger, PR linter - [@dblock](https://github.com/dblock). * [#63](https://github.com/ruby-grape/grape-active_model_serializers/pull/63): Pass adapter options through render - [@drn](https://github.com/drn). diff --git a/Gemfile b/Gemfile index 1423961..5ebdb78 100644 --- a/Gemfile +++ b/Gemfile @@ -10,5 +10,7 @@ else end group :test do + gem 'sqlite3' + gem 'sequel', '~> 4.37', require: false gem 'ruby-grape-danger', '~> 0.1.0', require: false end diff --git a/lib/grape-active_model_serializers/serializer_resolver.rb b/lib/grape-active_model_serializers/serializer_resolver.rb index b9949e3..13220a1 100644 --- a/lib/grape-active_model_serializers/serializer_resolver.rb +++ b/lib/grape-active_model_serializers/serializer_resolver.rb @@ -48,8 +48,9 @@ def resource_defined_class end def collection_class - return nil unless resource.respond_to?(:to_ary) - ActiveModel::Serializer.config.collection_serializer + if resource.respond_to?(:to_ary) || resource.respond_to?(:all) + ActiveModel::Serializer.config.collection_serializer + end end def namespace_inferred_class @@ -84,8 +85,10 @@ def resource_namespace end def resource_class - if resource.respond_to?(:to_ary) - resource.try(:klass) || resource.compact.first.class + if resource.respond_to?(:klass) + resource.klass + elsif resource.respond_to?(:to_ary) || resource.respond_to?(:all) + resource.first.class else resource.class end diff --git a/spec/integration/sequel_spec.rb b/spec/integration/sequel_spec.rb new file mode 100644 index 0000000..e2d6d4b --- /dev/null +++ b/spec/integration/sequel_spec.rb @@ -0,0 +1,68 @@ +require 'sequel' +require 'spec_helper' + +describe 'Sequel Integration' do + before do + DB = Sequel.sqlite unless defined?(DB) + DB.create_table(:users) do + primary_key :id + String :name + end + ActiveModelSerializers.config.adapter = :json + app.format :json + app.formatter :json, Grape::Formatter::ActiveModelSerializers + end + + after do + DB.drop_table(:users) + Object.send(:remove_const, :SequelUser) + Object.send(:remove_const, :SequelUserSerializer) + end + + let!(:model) { + SequelUser = Class.new(Sequel::Model(:users)) do + include ActiveModel::Serialization + def self.model_name + 'User' + end + end + } + let!(:serializer) { + SequelUserSerializer = Class.new(ActiveModel::Serializer) do + attributes :id, :name + end + } + let(:app) { Class.new(Grape::API) } + + context 'collection' do + let!(:users) { + [ + model.create(name: 'one'), + model.create(name: 'two') + ] + } + + it 'renders' do + app.get('/users') { render SequelUser.dataset } + response = get '/users' + expect(JSON.parse(response.body)).to eq( + 'users' => [ + { 'id' => 1, 'name' => 'one' }, + { 'id' => 2, 'name' => 'two' } + ] + ) + end + end + + context 'member' do + let!(:user) { model.create(name: 'name') } + + it 'renders' do + app.get('/user/1') { render SequelUser.first } + response = get '/user/1' + expect(JSON.parse(response.body)).to eq( + 'user' => { 'id' => 1, 'name' => 'name' } + ) + end + end +end