Skip to content

Commit 4e4403b

Browse files
authored
Update 0.9-stable release to work with ruby 2.6 & 2.7 (#2446)
* Allow serializer_for to accept String instead of just class objects * Update test to reference Minitest::Test as base instead * Update Gemfile to handle RUBY_VERSION > 2.5 * Update render text to render plain as text is depreciated * Update test_helper to require rails-controller-testing for rails 5 and above * Patch serializer_for method to support ruby 2.5 > changes on const_get * Add new test for complex namespace scenario which does not work when upgraded to ruby 2.5 > * Update build_serializer_class_list to handle associations with namespace
1 parent ff1a36f commit 4e4403b

File tree

8 files changed

+82
-9
lines changed

8 files changed

+82
-9
lines changed

Gemfile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ source 'https://rubygems.org'
22

33
gemspec
44

5-
version = ENV["RAILS_VERSION"] || "4.2"
5+
default_rails_version = RUBY_VERSION > '2.5' ? '5.2' : '4.2'
6+
version = ENV['RAILS_VERSION'] || default_rails_version
67

78
if version == 'master'
89
gem 'rack', github: 'rack/rack'
@@ -27,6 +28,7 @@ else
2728
gem 'activemodel', gem_version
2829
gem 'actionpack', gem_version
2930
gem 'activerecord', gem_version, group: :test
31+
gem 'rails-controller-testing' if version > '4.2'
3032
end
3133

3234
if RUBY_VERSION < '2'

lib/active_model/serializer.rb

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,14 @@ def serializer_for(resource, options = {})
6666
ArraySerializer
6767
end
6868
else
69-
klass_name = build_serializer_class(resource, options)
70-
Serializer.serializers_cache.fetch_or_store(klass_name) do
71-
_const_get(klass_name)
72-
end
69+
search_list = build_serializer_class_list(resource, options)
70+
result = search_list.map do |klass_name|
71+
Serializer.serializers_cache.fetch_or_store(klass_name) do
72+
_const_get(klass_name)
73+
end
74+
end
75+
76+
result.find { |serializer| !serializer.nil? }
7377
end
7478
end
7579

@@ -118,11 +122,22 @@ def strip_attribute(attr)
118122
attr
119123
end
120124

125+
def build_serializer_class_list(resource, options)
126+
list = []
127+
list << build_serializer_class(resource, options)
128+
list << build_serializer_class(resource, {})
129+
list << build_serializer_class(resource.class.name.demodulize, {})
130+
end
131+
121132
def build_serializer_class(resource, options)
122133
"".tap do |klass_name|
123134
klass_name << "#{options[:namespace]}::" if options[:namespace]
124135
klass_name << options[:prefix].to_s.classify if options[:prefix]
125-
klass_name << "#{resource.class.name}Serializer"
136+
if resource.is_a?(String)
137+
klass_name << "#{resource}Serializer"
138+
else
139+
klass_name << "#{resource.class.name}Serializer"
140+
end
126141
end
127142
end
128143

test/fixtures/poro.rb

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,19 @@ def read_attribute_for_serialization(name)
1818
###
1919
## Models
2020
###
21+
22+
module TestNamespace2
23+
class Test < Model
24+
attr_writer :sub_test
25+
26+
def sub_test
27+
@sub_test ||= TestNamespace2::SubTest.new(name: 'N1', description: 'D1')
28+
end
29+
end
30+
31+
class SubTest < Model; end
32+
end
33+
2134
class User < Model
2235
def profile
2336
@profile ||= Profile.new(name: 'N1', description: 'D1')
@@ -101,6 +114,24 @@ class Video < Model
101114
###
102115
## Serializers
103116
###
117+
118+
module TestNamespace2
119+
class TestSerializer < ActiveModel::Serializer
120+
attributes :name, :email
121+
122+
has_one :sub_test
123+
end
124+
125+
class SubTestSerializer < ActiveModel::Serializer
126+
def description
127+
description = object.read_attribute_for_serialization(:description)
128+
scope ? "#{description} - #{scope}" : description
129+
end
130+
131+
attributes :name, :description
132+
end
133+
end
134+
104135
class UserSerializer < ActiveModel::Serializer
105136
attributes :name, :email
106137

test/integration/action_controller/serialization_test_case_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ def render_using_serializer
99
end
1010

1111
def render_text
12-
render text: 'ok'
12+
render plain: 'ok'
1313
end
1414

1515
def render_template

test/test_helper.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
require 'minitest/autorun'
33
require 'active_model_serializers'
44
require 'fixtures/poro'
5+
require 'rails-controller-testing'
6+
Rails::Controller::Testing.install
57

68
# Ensure backward compatibility with Minitest 4
79
Minitest::Test = MiniTest::Unit::TestCase unless defined?(Minitest::Test)

test/unit/active_model/array_serializer/serialization_test.rb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,29 @@ def test_serializer_for_array_returns_appropriate_type
4949
def object.serializer_class; CustomSerializer; end
5050

5151
assert_equal CustomSerializer, Serializer.serializer_for(object)
52+
assert_equal CustomSerializer, Serializer.serializer_for('Custom')
53+
end
54+
end
55+
56+
class ModelSerializationNamespaceTest < Minitest::Test
57+
def test_namespace
58+
test1 = TestNamespace2::Test.new(name: 'Test 1', email: '[email protected]', gender: 'M')
59+
test2 = TestNamespace2::Test.new(name: 'Test 2', email: '[email protected]', gender: 'M')
60+
sub_test1 = TestNamespace2::SubTest.new(name: 'Name 1', description: 'Description 1', comments: 'Comments 1')
61+
sub_test2 = TestNamespace2::SubTest.new(name: 'Name 2', description: 'Description 2', comments: 'Comments 2')
62+
test1.sub_test = sub_test1
63+
test2.sub_test = sub_test2
64+
65+
array = [test1, test2]
66+
serializer = ArraySerializer.new(array)
67+
68+
expected = [
69+
{ name: 'Test 1', email: '[email protected]', sub_test: { name: 'Name 1', description: 'Description 1' }},
70+
{ name: 'Test 1', email: '[email protected]', sub_test: { name: 'Name 2', description: 'Description 2' }}
71+
]
72+
73+
assert_equal expected, serializer.serializable_array
74+
assert_equal expected, serializer.as_json
5275
end
5376
end
5477

test/unit/active_model/serializer/has_many_polymorphic_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
module ActiveModel
44
class Serializer
5-
class HasManyPolymorphicTest < ActiveModel::TestCase
5+
class HasManyPolymorphicTest < Minitest::Test
66
def setup
77
@association = MailSerializer._associations[:attachments]
88
@old_association = @association.dup

test/unit/active_model/serializer/has_one_polymorphic_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
module ActiveModel
44
class Serializer
5-
class HasOnePolymorphicTest < ActiveModel::TestCase
5+
class HasOnePolymorphicTest < Minitest::Test
66
def setup
77
@association = InterviewSerializer._associations[:attachment]
88
@old_association = @association.dup

0 commit comments

Comments
 (0)