Skip to content

Commit 0c13956

Browse files
committed
Merge pull request #610 from bolshakov/feature/array_serializer
ArraySerializer
2 parents 35e17b5 + a548138 commit 0c13956

File tree

6 files changed

+90
-20
lines changed

6 files changed

+90
-20
lines changed

lib/active_model/serializer.rb

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
module ActiveModel
22
class Serializer
3+
extend ActiveSupport::Autoload
4+
autoload :Configuration
5+
autoload :ArraySerializer
6+
include Configuration
7+
38
class << self
49
attr_accessor :_attributes
510
attr_accessor :_associations
@@ -56,24 +61,14 @@ def self.associate(type, attrs) #:nodoc:
5661
end
5762
end
5863

59-
if RUBY_VERSION >= '2.0'
60-
def self.serializer_for(resource)
61-
if resource.respond_to?(:to_ary)
62-
ArraySerializer
63-
else
64-
begin
65-
Object.const_get "#{resource.class.name}Serializer"
66-
rescue NameError
67-
nil
68-
end
69-
end
70-
end
71-
else
72-
def self.serializer_for(resource)
73-
if resource.respond_to?(:to_ary)
74-
ArraySerializer
75-
else
76-
"#{resource.class.name}Serializer".safe_constantize
64+
def self.serializer_for(resource)
65+
if resource.respond_to?(:to_ary)
66+
config.array_serializer
67+
else
68+
serializer_name = "#{resource.class.name}Serializer"
69+
70+
if Object.const_defined?(serializer_name)
71+
Object.const_get(serializer_name)
7772
end
7873
end
7974
end
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module ActiveModel
2+
class Serializer
3+
class ArraySerializer
4+
5+
end
6+
end
7+
end
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
module ActiveModel
2+
class Serializer
3+
module Configuration
4+
include ActiveSupport::Configurable
5+
extend ActiveSupport::Concern
6+
7+
included do |base|
8+
base.config.array_serializer = ActiveModel::Serializer::ArraySerializer
9+
end
10+
end
11+
end
12+
end

lib/active_model_serializers.rb

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
require "active_model"
22
require "active_model/serializer/version"
3-
43
require "active_model/serializer"
5-
64
require "active_model/serializer/adapter/null_adapter"
75

86
begin
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
require 'test_helper'
2+
3+
module ActiveModel
4+
class Serializer
5+
class ConfigurationTest < Minitest::Test
6+
def test_array_serializer
7+
assert_equal ActiveModel::Serializer::ArraySerializer, ActiveModel::Serializer.config.array_serializer
8+
end
9+
end
10+
end
11+
end
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
require 'test_helper'
2+
3+
module ActiveModel
4+
class Serializer
5+
class SerializerForTest < Minitest::Test
6+
class ArraySerializerTest < Minitest::Test
7+
def setup
8+
@array = [1, 2, 3]
9+
@previous_array_serializer = ActiveModel::Serializer.config.array_serializer
10+
end
11+
12+
def teardown
13+
ActiveModel::Serializer.config.array_serializer = @previous_array_serializer
14+
end
15+
16+
def test_serializer_for_array
17+
serializer = ActiveModel::Serializer.serializer_for(@array)
18+
assert_equal ActiveModel::Serializer.config.array_serializer, serializer
19+
end
20+
21+
def test_overwritten_serializer_for_array
22+
new_array_serializer = Class.new
23+
ActiveModel::Serializer.config.array_serializer = new_array_serializer
24+
serializer = ActiveModel::Serializer.serializer_for(@array)
25+
assert_equal new_array_serializer, serializer
26+
end
27+
end
28+
29+
class SerializerTest < Minitest::Test
30+
def setup
31+
@profile = Profile.new
32+
@model = ::Model.new
33+
end
34+
35+
def test_serializer_for_existing_serializer
36+
serializer = ActiveModel::Serializer.serializer_for(@profile)
37+
assert_equal ProfileSerializer, serializer
38+
end
39+
40+
def test_serializer_for_not_existing_serializer
41+
serializer = ActiveModel::Serializer.serializer_for(@model)
42+
assert_equal nil, serializer
43+
end
44+
end
45+
end
46+
end
47+
end

0 commit comments

Comments
 (0)