From 597765e3b0c1e5eae07cef4be14b59d00760e111 Mon Sep 17 00:00:00 2001 From: Tema Bolshakov Date: Thu, 28 Aug 2014 18:55:27 +0400 Subject: [PATCH] start implementing json_api adapter to understand how associations should work --- lib/active_model/serializer/adapter.rb | 1 + .../serializer/adapter/json_api_adapter.rb | 24 ++++++++++++++ test/adapter/json_api_adapter_test.rb | 31 +++++++++++++++++++ test/fixtures/poro.rb | 10 ++++++ test/test_helper.rb | 4 +++ 5 files changed, 70 insertions(+) create mode 100644 lib/active_model/serializer/adapter/json_api_adapter.rb create mode 100644 test/adapter/json_api_adapter_test.rb diff --git a/lib/active_model/serializer/adapter.rb b/lib/active_model/serializer/adapter.rb index b5fe211c..ae831bb3 100644 --- a/lib/active_model/serializer/adapter.rb +++ b/lib/active_model/serializer/adapter.rb @@ -4,6 +4,7 @@ module ActiveModel extend ActiveSupport::Autoload autoload :SimpleAdapter autoload :NullAdapter + autoload :JsonApiAdapter attr_reader :serializer diff --git a/lib/active_model/serializer/adapter/json_api_adapter.rb b/lib/active_model/serializer/adapter/json_api_adapter.rb new file mode 100644 index 00000000..5f5df719 --- /dev/null +++ b/lib/active_model/serializer/adapter/json_api_adapter.rb @@ -0,0 +1,24 @@ +module ActiveModel + class Serializer + class Adapter + class JsonApiAdapter < Adapter + def serializable_hash(options = {}) + hash = serializer.attributes.each_with_object({}) do |(attr, value), h| + h[attr] = value + end + + serializer.associations(only: [:id]).each_with_object({}) do |(attr, value), h| + case value + when ActiveModel::Serializer::ArraySerializer + # process has_many association + when ActiveModel::Serializer + # process belongs_to association + else + # what? + end + end + end + end + end + end +end diff --git a/test/adapter/json_api_adapter_test.rb b/test/adapter/json_api_adapter_test.rb new file mode 100644 index 00000000..c49a90c1 --- /dev/null +++ b/test/adapter/json_api_adapter_test.rb @@ -0,0 +1,31 @@ +require 'test_helper' + +module ActiveModel + class Serializer + class Adapter + class JsonApiTest < Minitest::Test + def setup + @post = ::Model.new(title: 'New Post', body: 'Body') + @first_comment = ::Model.new(id: 1, body: 'ZOMG A COMMENT') + @second_comment = ::Model.new(id: 2, body: 'ZOMG ANOTHER COMMENT') + @post.comments = [@first_comment, @second_comment] + @first_comment.post = @post + @second_comment.post = @post + + @post_serializer_class = def_serializer do + attributes :title, :body + has_many :comments + end + + @post_serializer = @post_serializer_class.new(@post) + @adapter = ActiveModel::Serializer::Adapter::JsonApiAdapter.new(@post_serializer) + end + + def test_includes_comment_ids + assert_equal(['1', '2'], @adapter.serializable_hash[:comments]) + end + end + end + end +end + diff --git a/test/fixtures/poro.rb b/test/fixtures/poro.rb index 00594811..8876a73d 100644 --- a/test/fixtures/poro.rb +++ b/test/fixtures/poro.rb @@ -10,6 +10,16 @@ class Model @attributes[name] end end + + def method_missing(meth, *args) + if meth.to_s =~ /^(.*)=$/ + @attributes[$1.to_sym] = args[0] + elsif @attributes.key?(meth) + @attributes[meth] + else + super + end + end end class Profile < Model diff --git a/test/test_helper.rb b/test/test_helper.rb index 3fd3776c..0f5c013b 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -25,3 +25,7 @@ ActionController::TestCase.class_eval do @routes = TestHelper::Routes end end + +def def_serializer(&block) + Class.new(ActiveModel::Serializer, &block) +end