From 7143eb8301216d03922314d0b6785dd5b458edc3 Mon Sep 17 00:00:00 2001 From: Santiago Pastorino Date: Mon, 1 Jul 2013 14:04:25 -0700 Subject: [PATCH] Serialize just attributes --- lib/active_model/serializer.rb | 43 +++++++++++++++++++++++++++++ test/serializer/attributes_test.rb | 44 ++++++++++++++++++++++++++++++ test/test_helper.rb | 5 ++++ 3 files changed, 92 insertions(+) create mode 100644 lib/active_model/serializer.rb create mode 100644 test/serializer/attributes_test.rb create mode 100644 test/test_helper.rb diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb new file mode 100644 index 00000000..0c2f3860 --- /dev/null +++ b/lib/active_model/serializer.rb @@ -0,0 +1,43 @@ +module ActiveModel + class Serializer + class << self + def inherited(base) + base._attributes = {} + end + + attr_accessor :_attributes + + def attributes(*attrs) + @_attributes = attrs.map(&:to_s) + + attrs.each do |attr| + define_method attr do + object.read_attribute_for_serialization(attr) + end + end + end + end + + def initialize(object) + @object = object + end + attr_accessor :object + + alias read_attribute_for_serialization send + + def attributes + self.class._attributes.each_with_object({}) do |name, hash| + hash[name] = send(name) + end + end + + def serializable_hash(options={}) + return nil if object.nil? + attributes + end + + def as_json(options={}) + serializable_hash + end + end +end diff --git a/test/serializer/attributes_test.rb b/test/serializer/attributes_test.rb new file mode 100644 index 00000000..bff76e41 --- /dev/null +++ b/test/serializer/attributes_test.rb @@ -0,0 +1,44 @@ +require 'newbase/test_helper' +require 'newbase/active_model/serializer' + +module SerializerTest + module Attributes + class Model + def initialize(hash={}) + @attributes = hash + end + + def read_attribute_for_serialization(name) + @attributes[name] + end + end + + class ModelSerializer < ActiveModel::Serializer + attributes :attr1, :attr2 + end + + class Test < ActiveModel::TestCase + def setup + model = Model.new({ :attr1 => 'value1', :attr2 => 'value2', :attr3 => 'value3' }) + @model_serializer = ModelSerializer.new(model) + end + + def test_attributes_definition + assert_equal(['attr1', 'attr2'], + @model_serializer.class._attributes) + end + + def test_attributes_serialization_using_serializable_hash + assert_equal({ + 'attr1' => 'value1', 'attr2' => 'value2' + }, @model_serializer.serializable_hash) + end + + def test_attributes_serialization_using_as_json + assert_equal({ + 'attr1' => 'value1', 'attr2' => 'value2' + }, @model_serializer.as_json) + end + end + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 00000000..59932deb --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,5 @@ +ENV['RAILS_ENV'] = 'test' + +require 'bundler/setup' +require 'rails' +require 'rails/test_help'