From ad0859e26222db89ee99c43f2a778722cd18fb2c Mon Sep 17 00:00:00 2001 From: Jordan Faust Date: Mon, 1 Sep 2014 13:44:22 -0500 Subject: [PATCH] Add DSL for urls --- lib/active_model/serializer.rb | 10 ++++++++++ test/fixtures/poro.rb | 3 +++ test/serializers/urls_test.rb | 26 ++++++++++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 test/serializers/urls_test.rb diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 05a79900..a8d0339d 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -9,11 +9,13 @@ module ActiveModel class << self attr_accessor :_attributes attr_accessor :_associations + attr_accessor :_urls end def self.inherited(base) base._attributes = [] base._associations = {} + base._urls = [] end def self.attributes(*attrs) @@ -62,6 +64,14 @@ module ActiveModel end end + def self.url(attr) + @_urls.push attr + end + + def self.urls(*attrs) + @_urls.concat attrs + end + def self.serializer_for(resource) if resource.respond_to?(:to_ary) config.array_serializer diff --git a/test/fixtures/poro.rb b/test/fixtures/poro.rb index 8359fcb7..e493bd54 100644 --- a/test/fixtures/poro.rb +++ b/test/fixtures/poro.rb @@ -31,6 +31,8 @@ end class ProfileSerializer < ActiveModel::Serializer attributes :name, :description + + urls :posts, :comments end Post = Class.new(Model) @@ -40,6 +42,7 @@ PostSerializer = Class.new(ActiveModel::Serializer) do attributes :title, :body, :id has_many :comments + url :comments end CommentSerializer = Class.new(ActiveModel::Serializer) do diff --git a/test/serializers/urls_test.rb b/test/serializers/urls_test.rb new file mode 100644 index 00000000..05b33fa5 --- /dev/null +++ b/test/serializers/urls_test.rb @@ -0,0 +1,26 @@ +require 'test_helper' + +module ActiveModel + class Serializer + class UrlsTest < Minitest::Test + + def setup + @profile = Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' }) + @post = Post.new({ title: 'New Post', body: 'Body' }) + @comment = Comment.new({ id: 1, body: 'ZOMG A COMMENT' }) + @post.comments = [@comment] + + @profile_serializer = ProfileSerializer.new(@profile) + @post_serializer = PostSerializer.new(@post) + end + + def test_urls_definition + assert_equal([:posts, :comments], @profile_serializer.class._urls) + end + + def test_url_definition + assert_equal([:comments], @post_serializer.class._urls) + end + end + end +end