Skip to content

Commit 0c16fe8

Browse files
committed
Introduce Adapter::Base
1 parent a309132 commit 0c16fe8

30 files changed

+158
-127
lines changed

.rubocop.yml

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -8,39 +8,6 @@ AllCops:
88
DisplayCopNames: true
99
DisplayStyleGuide: true
1010

11-
Style/IndentationConsistency:
12-
Exclude:
13-
- lib/active_model/serializer/adapter/attributes.rb
14-
- lib/active_model/serializer/adapter/fragment_cache.rb
15-
- lib/active_model/serializer/adapter/json.rb
16-
- lib/active_model/serializer/adapter/json/fragment_cache.rb
17-
- lib/active_model/serializer/adapter/json_api.rb
18-
- lib/active_model/serializer/adapter/json_api/fragment_cache.rb
19-
- lib/active_model/serializer/adapter/json_api/pagination_links.rb
20-
- lib/active_model/serializer/adapter/null.rb
21-
22-
Style/IndentationWidth:
23-
Exclude:
24-
- lib/active_model/serializer/adapter/attributes.rb
25-
- lib/active_model/serializer/adapter/fragment_cache.rb
26-
- lib/active_model/serializer/adapter/json.rb
27-
- lib/active_model/serializer/adapter/json/fragment_cache.rb
28-
- lib/active_model/serializer/adapter/json_api.rb
29-
- lib/active_model/serializer/adapter/json_api/fragment_cache.rb
30-
- lib/active_model/serializer/adapter/json_api/pagination_links.rb
31-
- lib/active_model/serializer/adapter/null.rb
32-
33-
Style/AccessModifierIndentation:
34-
Exclude:
35-
- lib/active_model/serializer/adapter/attributes.rb
36-
- lib/active_model/serializer/adapter/fragment_cache.rb
37-
- lib/active_model/serializer/adapter/json.rb
38-
- lib/active_model/serializer/adapter/json/fragment_cache.rb
39-
- lib/active_model/serializer/adapter/json_api.rb
40-
- lib/active_model/serializer/adapter/json_api/fragment_cache.rb
41-
- lib/active_model/serializer/adapter/json_api/pagination_links.rb
42-
- lib/active_model/serializer/adapter/null.rb
43-
4411
Lint/NestedMethodDefinition:
4512
Enabled: false
4613
Exclude:
Lines changed: 16 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,34 @@
11
module ActiveModel
22
class Serializer
3-
class Adapter
3+
module Adapter
44
UnknownAdapterError = Class.new(ArgumentError)
55
ADAPTER_MAP = {}
66
private_constant :ADAPTER_MAP if defined?(private_constant)
77
extend ActiveSupport::Autoload
8+
autoload :Base
89
autoload :Attributes
910
autoload :Null
1011
autoload :FragmentCache
1112
autoload :Json
1213
autoload :JsonApi
1314
autoload :CachedSerializer
1415

15-
def self.create(resource, options = {})
16-
override = options.delete(:adapter)
17-
klass = override ? adapter_class(override) : ActiveModel::Serializer.adapter
18-
klass.new(resource, options)
19-
end
16+
class << self # All methods are class functions
17+
def new(*args)
18+
fail ArgumentError, [args, caller[0]].inspect
19+
end
2020

21-
# @see ActiveModel::Serializer::Adapter.lookup
22-
def self.adapter_class(adapter)
23-
ActiveModel::Serializer::Adapter.lookup(adapter)
24-
end
21+
def create(resource, options = {})
22+
override = options.delete(:adapter)
23+
klass = override ? adapter_class(override) : ActiveModel::Serializer.adapter
24+
klass.new(resource, options)
25+
end
26+
27+
# @see ActiveModel::Serializer::Adapter.lookup
28+
def adapter_class(adapter)
29+
ActiveModel::Serializer::Adapter.lookup(adapter)
30+
end
2531

26-
# Only the Adapter class has these methods.
27-
# None of the sublasses have them.
28-
class << ActiveModel::Serializer::Adapter
2932
# @return Hash<adapter_name, adapter_class>
3033
def adapter_map
3134
ADAPTER_MAP
@@ -80,57 +83,6 @@ def find_by_name(adapter_name)
8083
end
8184
private :find_by_name
8285
end
83-
84-
# Automatically register adapters when subclassing
85-
def self.inherited(subclass)
86-
ActiveModel::Serializer::Adapter.register(subclass)
87-
end
88-
89-
attr_reader :serializer, :instance_options
90-
91-
def initialize(serializer, options = {})
92-
@serializer = serializer
93-
@instance_options = options
94-
end
95-
96-
def serializable_hash(options = nil)
97-
raise NotImplementedError, 'This is an abstract method. Should be implemented at the concrete adapter.'
98-
end
99-
100-
def as_json(options = nil)
101-
hash = serializable_hash(options)
102-
include_meta(hash)
103-
hash
104-
end
105-
106-
def fragment_cache(*args)
107-
raise NotImplementedError, 'This is an abstract method. Should be implemented at the concrete adapter.'
108-
end
109-
110-
def cache_check(serializer)
111-
CachedSerializer.new(serializer).cache_check(self) do
112-
yield
113-
end
114-
end
115-
116-
private
117-
118-
def meta
119-
serializer.meta if serializer.respond_to?(:meta)
120-
end
121-
122-
def meta_key
123-
serializer.meta_key || 'meta'.freeze
124-
end
125-
126-
def root
127-
serializer.json_key.to_sym if serializer.json_key
128-
end
129-
130-
def include_meta(json)
131-
json[meta_key] = meta if meta
132-
json
133-
end
13486
end
13587
end
13688
end

lib/active_model/serializer/adapter/attributes.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
class ActiveModel::Serializer::Adapter::Attributes < ActiveModel::Serializer::Adapter
1+
module ActiveModel
2+
class Serializer
3+
module Adapter
4+
class Attributes < Base
25
def serializable_hash(options = nil)
36
options ||= {}
47
if serializer.respond_to?(:each)
@@ -47,4 +50,7 @@ def fragment_cache(cached_hash, non_cached_hash)
4750
def include_meta(json)
4851
json
4952
end
53+
end
54+
end
55+
end
5056
end
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
module ActiveModel
2+
class Serializer
3+
module Adapter
4+
class Base
5+
# Automatically register adapters when subclassing
6+
def self.inherited(subclass)
7+
ActiveModel::Serializer::Adapter.register(subclass)
8+
end
9+
10+
attr_reader :serializer, :instance_options
11+
12+
def initialize(serializer, options = {})
13+
@serializer = serializer
14+
@instance_options = options
15+
end
16+
17+
def serializable_hash(_options = nil)
18+
fail NotImplementedError, 'This is an abstract method. Should be implemented at the concrete adapter.'
19+
end
20+
21+
def as_json(options = nil)
22+
hash = serializable_hash(options)
23+
include_meta(hash)
24+
hash
25+
end
26+
27+
def fragment_cache(*_args)
28+
fail NotImplementedError, 'This is an abstract method. Should be implemented at the concrete adapter.'
29+
end
30+
31+
def cache_check(serializer)
32+
CachedSerializer.new(serializer).cache_check(self) do
33+
yield
34+
end
35+
end
36+
37+
private
38+
39+
def meta
40+
serializer.meta if serializer.respond_to?(:meta)
41+
end
42+
43+
def meta_key
44+
serializer.meta_key || 'meta'.freeze
45+
end
46+
47+
def root
48+
serializer.json_key.to_sym if serializer.json_key
49+
end
50+
51+
def include_meta(json)
52+
json[meta_key] = meta if meta
53+
json
54+
end
55+
end
56+
end
57+
end
58+
end

lib/active_model/serializer/adapter/cached_serializer.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module ActiveModel
22
class Serializer
3-
class Adapter
3+
module Adapter
44
class CachedSerializer
55
def initialize(serializer)
66
@cached_serializer = serializer

lib/active_model/serializer/adapter/fragment_cache.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
class ActiveModel::Serializer::Adapter::FragmentCache
1+
module ActiveModel
2+
class Serializer
3+
module Adapter
4+
class FragmentCache
25
attr_reader :serializer
36

47
def initialize(adapter, serializer, options)
@@ -76,4 +79,7 @@ def fragment_serializer(name, klass)
7679
def to_valid_const_name(name)
7780
name.gsub('::', '_')
7881
end
82+
end
83+
end
84+
end
7985
end

lib/active_model/serializer/adapter/json.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
class ActiveModel::Serializer::Adapter::Json < ActiveModel::Serializer::Adapter
1+
module ActiveModel
2+
class Serializer
3+
module Adapter
4+
class Json < Base
25
extend ActiveSupport::Autoload
36
autoload :FragmentCache
47

@@ -12,4 +15,7 @@ def serializable_hash(options = nil)
1215
def fragment_cache(cached_hash, non_cached_hash)
1316
ActiveModel::Serializer::Adapter::Json::FragmentCache.new.fragment_cache(cached_hash, non_cached_hash)
1417
end
18+
end
19+
end
20+
end
1521
end
Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
1-
class ActiveModel::Serializer::Adapter::Json::FragmentCache
1+
module ActiveModel
2+
class Serializer
3+
module Adapter
4+
class Json
5+
class FragmentCache
26
def fragment_cache(cached_hash, non_cached_hash)
37
non_cached_hash.merge cached_hash
48
end
9+
end
10+
end
11+
end
12+
end
513
end

lib/active_model/serializer/adapter/json_api.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
class ActiveModel::Serializer::Adapter::JsonApi < ActiveModel::Serializer::Adapter
1+
module ActiveModel
2+
class Serializer
3+
module Adapter
4+
class JsonApi < Base
25
extend ActiveSupport::Autoload
36
autoload :PaginationLinks
47
autoload :FragmentCache
@@ -157,4 +160,7 @@ def _included_for(serializer, includes)
157160
def links_for(serializer, options)
158161
JsonApi::PaginationLinks.new(serializer.object, options[:context]).serializable_hash(options)
159162
end
163+
end
164+
end
165+
end
160166
end

lib/active_model/serializer/adapter/json_api/fragment_cache.rb

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
class ActiveModel::Serializer::Adapter::JsonApi::FragmentCache
1+
module ActiveModel
2+
class Serializer
3+
module Adapter
4+
class JsonApi
5+
class FragmentCache
26
def fragment_cache(root, cached_hash, non_cached_hash)
37
hash = {}
48
core_cached = cached_hash.first
@@ -10,4 +14,8 @@ def fragment_cache(root, cached_hash, non_cached_hash)
1014

1115
hash.deep_merge no_root_non_cache.deep_merge no_root_cache
1216
end
17+
end
18+
end
19+
end
20+
end
1321
end

lib/active_model/serializer/adapter/json_api/pagination_links.rb

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
class ActiveModel::Serializer::Adapter::JsonApi::PaginationLinks
1+
module ActiveModel
2+
class Serializer
3+
module Adapter
4+
class JsonApi
5+
class PaginationLinks
26
FIRST_PAGE = 1
37

48
attr_reader :collection, :context
@@ -47,4 +51,8 @@ def original_url
4751
def query_parameters
4852
@query_parameters ||= context.query_parameters
4953
end
54+
end
55+
end
56+
end
57+
end
5058
end
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
1-
class ActiveModel::Serializer::Adapter::Null < ActiveModel::Serializer::Adapter
1+
module ActiveModel
2+
class Serializer
3+
module Adapter
4+
class Null < Base
25
def serializable_hash(options = nil)
36
{}
47
end
8+
end
9+
end
10+
end
511
end

test/adapter/fragment_cache_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
require 'test_helper'
22
module ActiveModel
33
class Serializer
4-
class Adapter
4+
module Adapter
55
class FragmentCacheTest < Minitest::Test
66
def setup
77
@spam = Spam::UnrelatedLink.new(id: 'spam-id-1')

test/adapter/json/belongs_to_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 Adapter
5+
module Adapter
66
class Json
77
class BelongsToTest < Minitest::Test
88
def setup

test/adapter/json/collection_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 Adapter
5+
module Adapter
66
class Json
77
class Collection < Minitest::Test
88
def setup

test/adapter/json/has_many_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 Adapter
5+
module Adapter
66
class Json
77
class HasManyTestTest < Minitest::Test
88
def setup

test/adapter/json_api/belongs_to_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 Adapter
5+
module Adapter
66
class JsonApi
77
class BelongsToTest < Minitest::Test
88
def setup

0 commit comments

Comments
 (0)