active_model_serializers 0.10.0.rc2 → 0.10.0.rc3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.rubocop.yml +82 -0
- data/.rubocop_todo.yml +315 -0
- data/.simplecov +99 -0
- data/.travis.yml +8 -0
- data/CHANGELOG.md +9 -3
- data/Gemfile +39 -8
- data/README.md +55 -31
- data/Rakefile +29 -2
- data/active_model_serializers.gemspec +37 -13
- data/appveyor.yml +25 -0
- data/docs/README.md +29 -0
- data/docs/general/adapters.md +110 -0
- data/docs/general/configuration_options.md +11 -0
- data/docs/general/getting_started.md +73 -0
- data/docs/howto/add_pagination_links.md +112 -0
- data/docs/howto/add_root_key.md +51 -0
- data/docs/howto/outside_controller_use.md +42 -0
- data/lib/action_controller/serialization.rb +24 -33
- data/lib/active_model/serializable_resource.rb +70 -0
- data/lib/active_model/serializer.rb +50 -131
- data/lib/active_model/serializer/adapter.rb +84 -21
- data/lib/active_model/serializer/adapter/flatten_json.rb +9 -9
- data/lib/active_model/serializer/adapter/fragment_cache.rb +10 -13
- data/lib/active_model/serializer/adapter/json.rb +25 -28
- data/lib/active_model/serializer/adapter/json/fragment_cache.rb +2 -12
- data/lib/active_model/serializer/adapter/json_api.rb +100 -98
- data/lib/active_model/serializer/adapter/json_api/fragment_cache.rb +4 -14
- data/lib/active_model/serializer/adapter/json_api/pagination_links.rb +50 -0
- data/lib/active_model/serializer/adapter/null.rb +2 -8
- data/lib/active_model/serializer/array_serializer.rb +22 -17
- data/lib/active_model/serializer/association.rb +20 -0
- data/lib/active_model/serializer/associations.rb +97 -0
- data/lib/active_model/serializer/belongs_to_reflection.rb +10 -0
- data/lib/active_model/serializer/collection_reflection.rb +7 -0
- data/lib/active_model/serializer/configuration.rb +1 -0
- data/lib/active_model/serializer/fieldset.rb +7 -7
- data/lib/active_model/serializer/has_many_reflection.rb +10 -0
- data/lib/active_model/serializer/has_one_reflection.rb +10 -0
- data/lib/active_model/serializer/lint.rb +129 -0
- data/lib/active_model/serializer/railtie.rb +7 -0
- data/lib/active_model/serializer/reflection.rb +74 -0
- data/lib/active_model/serializer/singular_reflection.rb +7 -0
- data/lib/active_model/serializer/utils.rb +35 -0
- data/lib/active_model/serializer/version.rb +1 -1
- data/lib/active_model_serializers.rb +28 -14
- data/lib/generators/serializer/serializer_generator.rb +7 -7
- data/lib/generators/serializer/templates/{serializer.rb → serializer.rb.erb} +2 -2
- data/lib/tasks/rubocop.rake +0 -0
- data/test/action_controller/adapter_selector_test.rb +3 -3
- data/test/action_controller/explicit_serializer_test.rb +9 -9
- data/test/action_controller/json_api/linked_test.rb +179 -0
- data/test/action_controller/json_api/pagination_test.rb +116 -0
- data/test/action_controller/serialization_scope_name_test.rb +10 -6
- data/test/action_controller/serialization_test.rb +149 -112
- data/test/active_record_test.rb +9 -0
- data/test/adapter/fragment_cache_test.rb +11 -1
- data/test/adapter/json/belongs_to_test.rb +4 -5
- data/test/adapter/json/collection_test.rb +30 -21
- data/test/adapter/json/has_many_test.rb +20 -9
- data/test/adapter/json_api/belongs_to_test.rb +38 -38
- data/test/adapter/json_api/collection_test.rb +22 -23
- data/test/adapter/json_api/has_many_embed_ids_test.rb +2 -2
- data/test/adapter/json_api/has_many_explicit_serializer_test.rb +4 -4
- data/test/adapter/json_api/has_many_test.rb +54 -19
- data/test/adapter/json_api/has_one_test.rb +28 -8
- data/test/adapter/json_api/json_api_test.rb +37 -0
- data/test/adapter/json_api/linked_test.rb +75 -75
- data/test/adapter/json_api/pagination_links_test.rb +115 -0
- data/test/adapter/json_api/resource_type_config_test.rb +59 -0
- data/test/adapter/json_test.rb +18 -5
- data/test/adapter_test.rb +10 -11
- data/test/array_serializer_test.rb +63 -5
- data/test/capture_warnings.rb +65 -0
- data/test/fixtures/active_record.rb +56 -0
- data/test/fixtures/poro.rb +60 -29
- data/test/generators/scaffold_controller_generator_test.rb +1 -2
- data/test/generators/serializer_generator_test.rb +17 -12
- data/test/lint_test.rb +37 -0
- data/test/logger_test.rb +18 -0
- data/test/poro_test.rb +9 -0
- data/test/serializable_resource_test.rb +27 -0
- data/test/serializers/adapter_for_test.rb +123 -3
- data/test/serializers/association_macros_test.rb +36 -0
- data/test/serializers/associations_test.rb +70 -47
- data/test/serializers/attribute_test.rb +28 -4
- data/test/serializers/attributes_test.rb +8 -14
- data/test/serializers/cache_test.rb +58 -31
- data/test/serializers/fieldset_test.rb +3 -4
- data/test/serializers/meta_test.rb +42 -28
- data/test/serializers/root_test.rb +21 -0
- data/test/serializers/serializer_for_test.rb +1 -1
- data/test/support/rails_app.rb +21 -0
- data/test/support/serialization_testing.rb +13 -0
- data/test/support/simplecov.rb +6 -0
- data/test/support/stream_capture.rb +50 -0
- data/test/support/test_case.rb +5 -0
- data/test/test_helper.rb +41 -29
- data/test/utils/include_args_to_hash_test.rb +79 -0
- metadata +123 -17
- data/test/action_controller/json_api_linked_test.rb +0 -179
- data/test/action_controller/rescue_from_test.rb +0 -32
- data/test/serializers/urls_test.rb +0 -26
data/test/fixtures/poro.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
verbose = $VERBOSE
|
2
|
+
$VERBOSE = nil
|
1
3
|
class Model
|
2
4
|
FILE_DIGEST = Digest::MD5.hexdigest(File.open(__FILE__).read)
|
3
5
|
|
@@ -5,20 +7,16 @@ class Model
|
|
5
7
|
@_model_name ||= ActiveModel::Name.new(self)
|
6
8
|
end
|
7
9
|
|
8
|
-
def initialize(hash={})
|
10
|
+
def initialize(hash = {})
|
9
11
|
@attributes = hash
|
10
12
|
end
|
11
13
|
|
12
14
|
def cache_key
|
13
|
-
"#{self.class.name.downcase}/#{self.id}-#{self.updated_at}"
|
15
|
+
"#{self.class.name.downcase}/#{self.id}-#{self.updated_at.strftime("%Y%m%d%H%M%S%9N")}"
|
14
16
|
end
|
15
17
|
|
16
|
-
def
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
def updated_at
|
21
|
-
@attributes[:updated_at] ||= DateTime.now.to_time.to_i
|
18
|
+
def serializable_hash(options = nil)
|
19
|
+
@attributes
|
22
20
|
end
|
23
21
|
|
24
22
|
def read_attribute_for_serialization(name)
|
@@ -33,10 +31,9 @@ class Model
|
|
33
31
|
@attributes[:id] || @attributes['id'] || object_id
|
34
32
|
end
|
35
33
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
34
|
+
### Helper methods, not required to be serializable
|
35
|
+
#
|
36
|
+
# Convenience for adding @attributes readers and writers
|
40
37
|
def method_missing(meth, *args)
|
41
38
|
if meth.to_s =~ /^(.*)=$/
|
42
39
|
@attributes[$1.to_sym] = args[0]
|
@@ -46,6 +43,14 @@ class Model
|
|
46
43
|
super
|
47
44
|
end
|
48
45
|
end
|
46
|
+
|
47
|
+
def cache_key_with_digest
|
48
|
+
"#{cache_key}/#{FILE_DIGEST}"
|
49
|
+
end
|
50
|
+
|
51
|
+
def updated_at
|
52
|
+
@attributes[:updated_at] ||= DateTime.now.to_time
|
53
|
+
end
|
49
54
|
end
|
50
55
|
|
51
56
|
class Profile < Model
|
@@ -54,8 +59,6 @@ end
|
|
54
59
|
class ProfileSerializer < ActiveModel::Serializer
|
55
60
|
attributes :name, :description
|
56
61
|
|
57
|
-
urls :posts, :comments
|
58
|
-
|
59
62
|
def arguments_passed_in?
|
60
63
|
options[:my_options] == :accessible
|
61
64
|
end
|
@@ -63,13 +66,10 @@ end
|
|
63
66
|
|
64
67
|
class ProfilePreviewSerializer < ActiveModel::Serializer
|
65
68
|
attributes :name
|
66
|
-
|
67
|
-
urls :posts, :comments
|
68
69
|
end
|
69
70
|
|
70
71
|
Post = Class.new(Model)
|
71
72
|
Like = Class.new(Model)
|
72
|
-
Comment = Class.new(Model)
|
73
73
|
Author = Class.new(Model)
|
74
74
|
Bio = Class.new(Model)
|
75
75
|
Blog = Class.new(Model)
|
@@ -77,21 +77,28 @@ Role = Class.new(Model)
|
|
77
77
|
User = Class.new(Model)
|
78
78
|
Location = Class.new(Model)
|
79
79
|
Place = Class.new(Model)
|
80
|
+
Tag = Class.new(Model)
|
81
|
+
VirtualValue = Class.new(Model)
|
82
|
+
Comment = Class.new(Model) do
|
83
|
+
# Uses a custom non-time-based cache key
|
84
|
+
def cache_key
|
85
|
+
"#{self.class.name.downcase}/#{self.id}"
|
86
|
+
end
|
87
|
+
end
|
80
88
|
|
81
89
|
module Spam; end
|
82
90
|
Spam::UnrelatedLink = Class.new(Model)
|
83
91
|
|
84
92
|
PostSerializer = Class.new(ActiveModel::Serializer) do
|
85
|
-
cache key:'post', expires_in: 0.1, skip_digest: true
|
93
|
+
cache key: 'post', expires_in: 0.1, skip_digest: true
|
86
94
|
attributes :id, :title, :body
|
87
95
|
|
88
96
|
has_many :comments
|
89
97
|
belongs_to :blog
|
90
98
|
belongs_to :author
|
91
|
-
url :comments
|
92
99
|
|
93
100
|
def blog
|
94
|
-
Blog.new(id: 999, name:
|
101
|
+
Blog.new(id: 999, name: 'Custom blog')
|
95
102
|
end
|
96
103
|
|
97
104
|
def custom_options
|
@@ -121,11 +128,12 @@ CommentSerializer = Class.new(ActiveModel::Serializer) do
|
|
121
128
|
end
|
122
129
|
|
123
130
|
AuthorSerializer = Class.new(ActiveModel::Serializer) do
|
124
|
-
cache key:'writer', skip_digest: true
|
125
|
-
|
131
|
+
cache key: 'writer', skip_digest: true
|
132
|
+
attribute :id
|
133
|
+
attribute :name
|
126
134
|
|
127
|
-
has_many :posts
|
128
|
-
has_many :roles
|
135
|
+
has_many :posts
|
136
|
+
has_many :roles
|
129
137
|
has_one :bio
|
130
138
|
end
|
131
139
|
|
@@ -143,7 +151,7 @@ end
|
|
143
151
|
LikeSerializer = Class.new(ActiveModel::Serializer) do
|
144
152
|
attributes :id, :time
|
145
153
|
|
146
|
-
belongs_to :
|
154
|
+
belongs_to :likeable
|
147
155
|
end
|
148
156
|
|
149
157
|
LocationSerializer = Class.new(ActiveModel::Serializer) do
|
@@ -219,12 +227,35 @@ PostPreviewSerializer = Class.new(ActiveModel::Serializer) do
|
|
219
227
|
belongs_to :author, serializer: AuthorPreviewSerializer
|
220
228
|
end
|
221
229
|
|
222
|
-
|
230
|
+
PostWithTagsSerializer = Class.new(ActiveModel::Serializer) do
|
231
|
+
attributes :id
|
232
|
+
|
233
|
+
has_many :tags
|
234
|
+
end
|
235
|
+
|
236
|
+
PostWithCustomKeysSerializer = Class.new(ActiveModel::Serializer) do
|
223
237
|
attributes :id
|
238
|
+
|
239
|
+
has_many :comments, key: :reviews
|
240
|
+
belongs_to :author, key: :writer
|
241
|
+
has_one :blog, key: :site
|
224
242
|
end
|
225
243
|
|
226
|
-
|
227
|
-
|
228
|
-
|
244
|
+
VirtualValueSerializer = Class.new(ActiveModel::Serializer) do
|
245
|
+
attributes :id
|
246
|
+
|
247
|
+
has_many :reviews, virtual_value: [{ id: 1 }, { id: 2 }]
|
248
|
+
has_one :maker, virtual_value: { id: 1 }
|
249
|
+
|
250
|
+
def reviews
|
251
|
+
end
|
252
|
+
|
253
|
+
def maker
|
229
254
|
end
|
230
255
|
end
|
256
|
+
|
257
|
+
Spam::UnrelatedLinkSerializer = Class.new(ActiveModel::Serializer) do
|
258
|
+
cache only: [:id]
|
259
|
+
attributes :id
|
260
|
+
end
|
261
|
+
$VERBOSE = verbose
|
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'test_helper'
|
2
|
-
# require 'active_model/serializer/railtie'
|
3
2
|
|
4
3
|
class ResourceGeneratorTest < Rails::Generators::TestCase
|
5
4
|
destination File.expand_path('../../../tmp/generators', __FILE__)
|
@@ -19,6 +18,6 @@ class ResourceGeneratorTest < Rails::Generators::TestCase
|
|
19
18
|
def copy_routes
|
20
19
|
config_dir = File.join(destination_root, 'config')
|
21
20
|
FileUtils.mkdir_p(config_dir)
|
22
|
-
File.write(File.join(config_dir, 'routes.rb'), 'Rails.application.routes.draw {
|
21
|
+
File.write(File.join(config_dir, 'routes.rb'), 'Rails.application.routes.draw {}')
|
23
22
|
end
|
24
23
|
end
|
@@ -2,7 +2,7 @@ require 'test_helper'
|
|
2
2
|
require 'generators/serializer/serializer_generator'
|
3
3
|
|
4
4
|
class SerializerGeneratorTest < Rails::Generators::TestCase
|
5
|
-
destination File.expand_path(
|
5
|
+
destination File.expand_path('../../../tmp/generators', __FILE__)
|
6
6
|
setup :prepare_destination
|
7
7
|
|
8
8
|
tests Rails::Generators::SerializerGenerator
|
@@ -10,42 +10,47 @@ class SerializerGeneratorTest < Rails::Generators::TestCase
|
|
10
10
|
|
11
11
|
def test_generates_a_serializer
|
12
12
|
run_generator
|
13
|
-
assert_file
|
13
|
+
assert_file 'app/serializers/account_serializer.rb', /class AccountSerializer < ActiveModel::Serializer/
|
14
14
|
end
|
15
15
|
|
16
16
|
def test_generates_a_namespaced_serializer
|
17
|
-
run_generator [
|
18
|
-
assert_file
|
17
|
+
run_generator ['admin/account']
|
18
|
+
assert_file 'app/serializers/admin/account_serializer.rb', /class Admin::AccountSerializer < ActiveModel::Serializer/
|
19
19
|
end
|
20
20
|
|
21
21
|
def test_uses_application_serializer_if_one_exists
|
22
22
|
Object.const_set(:ApplicationSerializer, Class.new)
|
23
23
|
run_generator
|
24
|
-
assert_file
|
24
|
+
assert_file 'app/serializers/account_serializer.rb', /class AccountSerializer < ApplicationSerializer/
|
25
25
|
ensure
|
26
26
|
Object.send :remove_const, :ApplicationSerializer
|
27
27
|
end
|
28
28
|
|
29
29
|
def test_uses_given_parent
|
30
30
|
Object.const_set(:ApplicationSerializer, Class.new)
|
31
|
-
run_generator [
|
32
|
-
assert_file
|
31
|
+
run_generator ['Account', '--parent=MySerializer']
|
32
|
+
assert_file 'app/serializers/account_serializer.rb', /class AccountSerializer < MySerializer/
|
33
33
|
ensure
|
34
34
|
Object.send :remove_const, :ApplicationSerializer
|
35
35
|
end
|
36
36
|
|
37
37
|
def test_generates_attributes_and_associations
|
38
38
|
run_generator
|
39
|
-
assert_file
|
39
|
+
assert_file 'app/serializers/account_serializer.rb' do |serializer|
|
40
40
|
assert_match(/^ attributes :id, :name, :description$/, serializer)
|
41
|
-
assert_match(/^
|
41
|
+
assert_match(/^ has_one :business$/, serializer)
|
42
|
+
assert_match(/^end\n*\z/, serializer)
|
42
43
|
end
|
43
44
|
end
|
44
45
|
|
45
46
|
def test_with_no_attributes_does_not_add_extra_space
|
46
|
-
run_generator [
|
47
|
-
assert_file
|
48
|
-
|
47
|
+
run_generator ['account']
|
48
|
+
assert_file 'app/serializers/account_serializer.rb' do |content|
|
49
|
+
if RUBY_PLATFORM =~ /mingw/
|
50
|
+
assert_no_match(/\r\n\r\nend/, content)
|
51
|
+
else
|
52
|
+
assert_no_match(/\n\nend/, content)
|
53
|
+
end
|
49
54
|
end
|
50
55
|
end
|
51
56
|
end
|
data/test/lint_test.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module ActiveModel
|
4
|
+
class Serializer
|
5
|
+
class LintTest < Minitest::Test
|
6
|
+
include ActiveModel::Serializer::Lint::Tests
|
7
|
+
|
8
|
+
class CompliantResource
|
9
|
+
def serializable_hash(options = nil)
|
10
|
+
end
|
11
|
+
|
12
|
+
def read_attribute_for_serialization(name)
|
13
|
+
end
|
14
|
+
|
15
|
+
def as_json(options = nil)
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_json(options = nil)
|
19
|
+
end
|
20
|
+
|
21
|
+
def cache_key
|
22
|
+
end
|
23
|
+
|
24
|
+
def id
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.model_name
|
28
|
+
@_model_name ||= ActiveModel::Name.new(self)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def setup
|
33
|
+
@resource = CompliantResource.new
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/test/logger_test.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ActiveModelSerializers::LoggerTest < Minitest::Test
|
4
|
+
def test_logger_is_set_to_action_controller_logger_when_initializer_runs
|
5
|
+
assert_equal ActiveModelSerializers.logger, ActionController::Base.logger
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_logger_can_be_set
|
9
|
+
original_logger = ActiveModelSerializers.logger
|
10
|
+
logger = Logger.new(STDOUT)
|
11
|
+
|
12
|
+
ActiveModelSerializers.logger = logger
|
13
|
+
|
14
|
+
assert_equal ActiveModelSerializers.logger, logger
|
15
|
+
ensure
|
16
|
+
ActiveModelSerializers.logger = original_logger
|
17
|
+
end
|
18
|
+
end
|
data/test/poro_test.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
module ActiveModel
|
4
|
+
class SerializableResourceTest < Minitest::Test
|
5
|
+
def setup
|
6
|
+
@resource = Profile.new({ name: 'Name 1', description: 'Description 1', comments: 'Comments 1' })
|
7
|
+
@serializer = ProfileSerializer.new(@resource)
|
8
|
+
@adapter = ActiveModel::Serializer::Adapter.create(@serializer)
|
9
|
+
@serializable_resource = ActiveModel::SerializableResource.new(@resource)
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_serializable_resource_delegates_serializable_hash_to_the_adapter
|
13
|
+
options = nil
|
14
|
+
assert_equal @adapter.serializable_hash(options), @serializable_resource.serializable_hash(options)
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_serializable_resource_delegates_to_json_to_the_adapter
|
18
|
+
options = nil
|
19
|
+
assert_equal @adapter.to_json(options), @serializable_resource.to_json(options)
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_serializable_resource_delegates_as_json_to_the_adapter
|
23
|
+
options = nil
|
24
|
+
assert_equal @adapter.as_json(options), @serializable_resource.as_json(options)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -1,8 +1,15 @@
|
|
1
1
|
module ActiveModel
|
2
2
|
class Serializer
|
3
3
|
class AdapterForTest < Minitest::Test
|
4
|
+
UnknownAdapterError = ::ActiveModel::Serializer::Adapter::UnknownAdapterError
|
5
|
+
|
4
6
|
def setup
|
5
7
|
@previous_adapter = ActiveModel::Serializer.config.adapter
|
8
|
+
# Eager load adapters
|
9
|
+
ActiveModel::Serializer::Adapter.eager_load!
|
10
|
+
[:json_api, :flatten_json, :null, :json].each do |adapter_name|
|
11
|
+
ActiveModel::Serializer::Adapter.lookup(adapter_name)
|
12
|
+
end
|
6
13
|
end
|
7
14
|
|
8
15
|
def teardown
|
@@ -20,7 +27,7 @@ module ActiveModel
|
|
20
27
|
adapter = ActiveModel::Serializer.adapter
|
21
28
|
assert_equal ActiveModel::Serializer::Adapter::Null, adapter
|
22
29
|
ensure
|
23
|
-
|
30
|
+
ActiveModel::Serializer.config.adapter = @previous_adapter
|
24
31
|
end
|
25
32
|
|
26
33
|
def test_overwrite_adapter_with_class
|
@@ -33,7 +40,7 @@ module ActiveModel
|
|
33
40
|
def test_raises_exception_if_invalid_symbol_given
|
34
41
|
ActiveModel::Serializer.config.adapter = :unknown
|
35
42
|
|
36
|
-
assert_raises
|
43
|
+
assert_raises UnknownAdapterError do
|
37
44
|
ActiveModel::Serializer.adapter
|
38
45
|
end
|
39
46
|
end
|
@@ -41,10 +48,123 @@ module ActiveModel
|
|
41
48
|
def test_raises_exception_if_it_does_not_know_hot_to_infer_adapter
|
42
49
|
ActiveModel::Serializer.config.adapter = 42
|
43
50
|
|
44
|
-
assert_raises
|
51
|
+
assert_raises UnknownAdapterError do
|
45
52
|
ActiveModel::Serializer.adapter
|
46
53
|
end
|
47
54
|
end
|
55
|
+
|
56
|
+
def test_adapter_class_for_known_adapter
|
57
|
+
klass = ActiveModel::Serializer::Adapter.adapter_class(:json_api)
|
58
|
+
assert_equal ActiveModel::Serializer::Adapter::JsonApi, klass
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_adapter_class_for_unknown_adapter
|
62
|
+
assert_raises UnknownAdapterError do
|
63
|
+
ActiveModel::Serializer::Adapter.adapter_class(:json_simple)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_adapter_map
|
68
|
+
expected_adapter_map = {
|
69
|
+
'json'.freeze => ActiveModel::Serializer::Adapter::Json,
|
70
|
+
'json_api'.freeze => ActiveModel::Serializer::Adapter::JsonApi,
|
71
|
+
'flatten_json'.freeze => ActiveModel::Serializer::Adapter::FlattenJson,
|
72
|
+
'null'.freeze => ActiveModel::Serializer::Adapter::Null
|
73
|
+
}
|
74
|
+
assert_equal ActiveModel::Serializer::Adapter.adapter_map, expected_adapter_map
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_adapters
|
78
|
+
assert_equal ActiveModel::Serializer::Adapter.adapters.sort, [
|
79
|
+
'flatten_json'.freeze,
|
80
|
+
'json'.freeze,
|
81
|
+
'json_api'.freeze,
|
82
|
+
'null'.freeze
|
83
|
+
]
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_lookup_adapter_by_string_name
|
87
|
+
assert_equal ActiveModel::Serializer::Adapter.lookup('json'.freeze), ActiveModel::Serializer::Adapter::Json
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_lookup_adapter_by_symbol_name
|
91
|
+
assert_equal ActiveModel::Serializer::Adapter.lookup(:json), ActiveModel::Serializer::Adapter::Json
|
92
|
+
end
|
93
|
+
|
94
|
+
def test_lookup_adapter_by_class
|
95
|
+
klass = ActiveModel::Serializer::Adapter::Json
|
96
|
+
assert_equal ActiveModel::Serializer::Adapter.lookup(klass), klass
|
97
|
+
end
|
98
|
+
|
99
|
+
def test_lookup_adapter_from_environment_registers_adapter
|
100
|
+
ActiveModel::Serializer::Adapter.const_set(:AdapterFromEnvironment, Class.new)
|
101
|
+
klass = ::ActiveModel::Serializer::Adapter::AdapterFromEnvironment
|
102
|
+
name = 'adapter_from_environment'.freeze
|
103
|
+
assert_equal ActiveModel::Serializer::Adapter.lookup(name), klass
|
104
|
+
assert ActiveModel::Serializer::Adapter.adapters.include?(name)
|
105
|
+
ensure
|
106
|
+
ActiveModel::Serializer::Adapter.adapter_map.delete(name)
|
107
|
+
ActiveModel::Serializer::Adapter.send(:remove_const, :AdapterFromEnvironment)
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_lookup_adapter_for_unknown_name
|
111
|
+
assert_raises UnknownAdapterError do
|
112
|
+
ActiveModel::Serializer::Adapter.lookup(:json_simple)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_adapter
|
117
|
+
assert_equal ActiveModel::Serializer.config.adapter, :flatten_json
|
118
|
+
assert_equal ActiveModel::Serializer.adapter, ActiveModel::Serializer::Adapter::FlattenJson
|
119
|
+
end
|
120
|
+
|
121
|
+
def test_register_adapter
|
122
|
+
new_adapter_name = :foo
|
123
|
+
new_adapter_klass = Class.new
|
124
|
+
ActiveModel::Serializer::Adapter.register(new_adapter_name, new_adapter_klass)
|
125
|
+
assert ActiveModel::Serializer::Adapter.adapters.include?('foo'.freeze)
|
126
|
+
assert ActiveModel::Serializer::Adapter.lookup(:foo), new_adapter_klass
|
127
|
+
ensure
|
128
|
+
ActiveModel::Serializer::Adapter.adapter_map.delete(new_adapter_name.to_s)
|
129
|
+
end
|
130
|
+
|
131
|
+
def test_inherited_adapter_hooks_register_adapter
|
132
|
+
Object.const_set(:MyAdapter, Class.new)
|
133
|
+
my_adapter = MyAdapter
|
134
|
+
ActiveModel::Serializer::Adapter.inherited(my_adapter)
|
135
|
+
assert_equal ActiveModel::Serializer::Adapter.lookup(:my_adapter), my_adapter
|
136
|
+
ensure
|
137
|
+
ActiveModel::Serializer::Adapter.adapter_map.delete('my_adapter'.freeze)
|
138
|
+
Object.send(:remove_const, :MyAdapter)
|
139
|
+
end
|
140
|
+
|
141
|
+
def test_inherited_adapter_hooks_register_demodulized_adapter
|
142
|
+
Object.const_set(:MyNamespace, Module.new)
|
143
|
+
MyNamespace.const_set(:MyAdapter, Class.new)
|
144
|
+
my_adapter = MyNamespace::MyAdapter
|
145
|
+
ActiveModel::Serializer::Adapter.inherited(my_adapter)
|
146
|
+
assert_equal ActiveModel::Serializer::Adapter.lookup(:my_adapter), my_adapter
|
147
|
+
ensure
|
148
|
+
ActiveModel::Serializer::Adapter.adapter_map.delete('my_adapter'.freeze)
|
149
|
+
MyNamespace.send(:remove_const, :MyAdapter)
|
150
|
+
Object.send(:remove_const, :MyNamespace)
|
151
|
+
end
|
152
|
+
|
153
|
+
def test_inherited_adapter_hooks_register_subclass_of_registered_adapter
|
154
|
+
Object.const_set(:MyAdapter, Class.new)
|
155
|
+
my_adapter = MyAdapter
|
156
|
+
Object.const_set(:MySubclassedAdapter, Class.new(MyAdapter))
|
157
|
+
my_subclassed_adapter = MySubclassedAdapter
|
158
|
+
ActiveModel::Serializer::Adapter.inherited(my_adapter)
|
159
|
+
ActiveModel::Serializer::Adapter.inherited(my_subclassed_adapter)
|
160
|
+
assert_equal ActiveModel::Serializer::Adapter.lookup(:my_adapter), my_adapter
|
161
|
+
assert_equal ActiveModel::Serializer::Adapter.lookup(:my_subclassed_adapter), my_subclassed_adapter
|
162
|
+
ensure
|
163
|
+
ActiveModel::Serializer::Adapter.adapter_map.delete('my_adapter'.freeze)
|
164
|
+
ActiveModel::Serializer::Adapter.adapter_map.delete('my_subclassed_adapter'.freeze)
|
165
|
+
Object.send(:remove_const, :MyAdapter)
|
166
|
+
Object.send(:remove_const, :MySubclassedAdapter)
|
167
|
+
end
|
48
168
|
end
|
49
169
|
end
|
50
170
|
end
|