From 1ea83c8bee0bb2f1bb64e64e99b0049c9e854219 Mon Sep 17 00:00:00 2001 From: Steve Klabnik Date: Wed, 9 Jul 2014 16:51:30 -0400 Subject: [PATCH] Implement a NullAdapter. This adapter basically doesn't do anything, and just serializes the attributes into plain old JSON. --- lib/active_model/serializer.rb | 13 ++++++++++ .../serializer/adapter/null_adapter.rb | 17 +++++++++++++ lib/active_model_serializers.rb | 1 + test/adapters/null_adapter_test.rb | 24 +++++++++++++++++++ test/fixtures/poro.rb | 8 +++++++ 5 files changed, 63 insertions(+) create mode 100644 lib/active_model/serializer/adapter/null_adapter.rb create mode 100644 test/adapters/null_adapter_test.rb diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 7ebab753..0216861b 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -10,6 +10,13 @@ module ActiveModel def self.attributes(*attrs) @_attributes.concat attrs + + + attrs.each do |attr| + define_method attr do + object.read_attribute_for_serialization(attr) + end unless method_defined?(attr) + end end attr_accessor :object @@ -17,5 +24,11 @@ module ActiveModel def initialize(object) @object = object end + + def attributes + self.class._attributes.dup.each_with_object({}) do |name, hash| + hash[name] = send(name) + end + end end end diff --git a/lib/active_model/serializer/adapter/null_adapter.rb b/lib/active_model/serializer/adapter/null_adapter.rb new file mode 100644 index 00000000..dc343c22 --- /dev/null +++ b/lib/active_model/serializer/adapter/null_adapter.rb @@ -0,0 +1,17 @@ +module ActiveModel + class Serializer + class Adapter + class NullAdapter + def initialize(serializer) + @serializer = serializer + end + + def to_json + @serializer.attributes.each_with_object({}) do |(attr, value), h| + h[attr] = value + end.to_json + end + end + end + end +end diff --git a/lib/active_model_serializers.rb b/lib/active_model_serializers.rb index dc50937f..27c254ba 100644 --- a/lib/active_model_serializers.rb +++ b/lib/active_model_serializers.rb @@ -3,3 +3,4 @@ require "active_model/serializer/version" require "active_model/serializer" +require "active_model/serializer/adapter/null_adapter" diff --git a/test/adapters/null_adapter_test.rb b/test/adapters/null_adapter_test.rb new file mode 100644 index 00000000..b50e9e12 --- /dev/null +++ b/test/adapters/null_adapter_test.rb @@ -0,0 +1,24 @@ +require 'test_helper' + +module ActiveModel + class Serializer + class Adapter + class NullAdapterTest < Minitest::Test + def setup + @profile = Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' }) + @profile_serializer = ProfileSerializer.new(@profile) + + @adapter = NullAdapter.new(@profile_serializer) + end + + def test_null_adapter + assert_equal('{"name":"Name 1","description":"Description 1"}', + @adapter.to_json) + +JSON + end + end + end + end +end + diff --git a/test/fixtures/poro.rb b/test/fixtures/poro.rb index 76252231..00594811 100644 --- a/test/fixtures/poro.rb +++ b/test/fixtures/poro.rb @@ -2,6 +2,14 @@ class Model def initialize(hash={}) @attributes = hash end + + def read_attribute_for_serialization(name) + if name == :id || name == 'id' + object_id + else + @attributes[name] + end + end end class Profile < Model