serega 0.18.0 → 0.20.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +169 -152
- data/VERSION +1 -1
- data/lib/serega/attribute.rb +6 -1
- data/lib/serega/attribute_normalizer.rb +31 -1
- data/lib/serega/config.rb +1 -3
- data/lib/serega/errors.rb +9 -1
- data/lib/serega/object_serializer.rb +12 -7
- data/lib/serega/plan_point.rb +24 -16
- data/lib/serega/plugins/activerecord_preloads/activerecord_preloads.rb +9 -5
- data/lib/serega/plugins/batch/batch.rb +22 -3
- data/lib/serega/plugins/batch/lib/modules/attribute_normalizer.rb +0 -2
- data/lib/serega/plugins/batch/lib/validations/check_opt_batch.rb +1 -1
- data/lib/serega/plugins/camel_case/camel_case.rb +20 -2
- data/lib/serega/plugins/context_metadata/context_metadata.rb +13 -4
- data/lib/serega/plugins/depth_limit/depth_limit.rb +20 -2
- data/lib/serega/plugins/explicit_many_option/explicit_many_option.rb +1 -1
- data/lib/serega/plugins/formatters/formatters.rb +13 -4
- data/lib/serega/plugins/if/if.rb +2 -2
- data/lib/serega/plugins/metadata/meta_attribute.rb +1 -1
- data/lib/serega/plugins/metadata/metadata.rb +4 -4
- data/lib/serega/plugins/preloads/lib/preloads_config.rb +1 -1
- data/lib/serega/plugins/preloads/preloads.rb +22 -2
- data/lib/serega/plugins/presenter/presenter.rb +2 -2
- data/lib/serega/plugins/root/root.rb +25 -5
- data/lib/serega/plugins/string_modifiers/string_modifiers.rb +1 -1
- data/lib/serega/validations/initiate/check_modifiers.rb +12 -5
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.20.0
|
data/lib/serega/attribute.rb
CHANGED
@@ -21,6 +21,10 @@ class Serega
|
|
21
21
|
# @return [Boolean, nil] Attribute :many option
|
22
22
|
attr_reader :many
|
23
23
|
|
24
|
+
# Attribute :default option
|
25
|
+
# @return [Object, nil] Attribute :default option
|
26
|
+
attr_reader :default
|
27
|
+
|
24
28
|
# Attribute :hide option
|
25
29
|
# @return [Boolean, nil] Attribute :hide option
|
26
30
|
attr_reader :hide
|
@@ -108,9 +112,10 @@ class Serega
|
|
108
112
|
|
109
113
|
def set_normalized_vars(normalizer)
|
110
114
|
@name = normalizer.name
|
115
|
+
@many = normalizer.many
|
116
|
+
@default = normalizer.default
|
111
117
|
@value_block = normalizer.value_block
|
112
118
|
@hide = normalizer.hide
|
113
|
-
@many = normalizer.many
|
114
119
|
@serializer = normalizer.serializer
|
115
120
|
end
|
116
121
|
end
|
@@ -86,6 +86,19 @@ class Serega
|
|
86
86
|
@serializer = prepare_serializer
|
87
87
|
end
|
88
88
|
|
89
|
+
#
|
90
|
+
# Shows the default attribute value. It is a value that replaces found nils.
|
91
|
+
#
|
92
|
+
# When custom :default is not specified, we set empty array as default when `many: true` specified
|
93
|
+
#
|
94
|
+
# @return [Object] Attribute default value
|
95
|
+
#
|
96
|
+
def default
|
97
|
+
return @default if instance_variable_defined?(:@default)
|
98
|
+
|
99
|
+
@default = prepare_default
|
100
|
+
end
|
101
|
+
|
89
102
|
private
|
90
103
|
|
91
104
|
def prepare_name
|
@@ -97,11 +110,14 @@ class Serega
|
|
97
110
|
# - plugin :formatters (wraps resulted block in formatter block and formats :const values)
|
98
111
|
#
|
99
112
|
def prepare_value_block
|
100
|
-
|
113
|
+
value_block =
|
114
|
+
prepare_init_block ||
|
101
115
|
prepare_value_option_block ||
|
102
116
|
prepare_const_block ||
|
103
117
|
prepare_delegate_block ||
|
104
118
|
prepare_keyword_block
|
119
|
+
|
120
|
+
prepare_value_block_with_default(value_block)
|
105
121
|
end
|
106
122
|
|
107
123
|
#
|
@@ -158,6 +174,20 @@ class Serega
|
|
158
174
|
end
|
159
175
|
end
|
160
176
|
|
177
|
+
def prepare_value_block_with_default(callable)
|
178
|
+
default_value = default
|
179
|
+
return callable if default_value.nil?
|
180
|
+
|
181
|
+
proc { |obj, ctx|
|
182
|
+
res = callable.call(obj, ctx)
|
183
|
+
res.nil? ? default_value : res
|
184
|
+
}
|
185
|
+
end
|
186
|
+
|
187
|
+
def prepare_default
|
188
|
+
init_opts.fetch(:default) { many ? FROZEN_EMPTY_ARRAY : nil }
|
189
|
+
end
|
190
|
+
|
161
191
|
def prepare_delegate_block
|
162
192
|
delegate = init_opts[:delegate]
|
163
193
|
return unless delegate
|
data/lib/serega/config.rb
CHANGED
@@ -1,7 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "forwardable"
|
4
|
-
|
5
3
|
class Serega
|
6
4
|
#
|
7
5
|
# Stores serialization config
|
@@ -15,7 +13,7 @@ class Serega
|
|
15
13
|
DEFAULTS = {
|
16
14
|
plugins: [],
|
17
15
|
initiate_keys: %i[only with except check_initiate_params].freeze,
|
18
|
-
attribute_keys: %i[method value serializer many hide const delegate].freeze,
|
16
|
+
attribute_keys: %i[method value serializer many hide const delegate default].freeze,
|
19
17
|
serialize_keys: %i[context many].freeze,
|
20
18
|
check_attribute_name: true,
|
21
19
|
check_initiate_params: true,
|
data/lib/serega/errors.rb
CHANGED
@@ -11,5 +11,13 @@ class Serega
|
|
11
11
|
# @example
|
12
12
|
# Serega.new(only: 'FOO')
|
13
13
|
# # => Attribute 'FOO' not exists (Serega::AttributeNotExist)
|
14
|
-
class AttributeNotExist < SeregaError
|
14
|
+
class AttributeNotExist < SeregaError
|
15
|
+
attr_reader :serializer, :attributes
|
16
|
+
|
17
|
+
def initialize(message = nil, serializer = nil, attributes = nil)
|
18
|
+
super(message)
|
19
|
+
@serializer = serializer
|
20
|
+
@attributes = attributes
|
21
|
+
end
|
22
|
+
end
|
15
23
|
end
|
@@ -38,8 +38,8 @@ class Serega
|
|
38
38
|
|
39
39
|
private
|
40
40
|
|
41
|
-
def serialize_array(
|
42
|
-
|
41
|
+
def serialize_array(objects)
|
42
|
+
objects.map { |object| serialize_object(object) }
|
43
43
|
end
|
44
44
|
|
45
45
|
# Patched in:
|
@@ -79,11 +79,16 @@ class Serega
|
|
79
79
|
end
|
80
80
|
|
81
81
|
def relation_value(value, point)
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
82
|
+
child_serializer(point).serialize(value)
|
83
|
+
end
|
84
|
+
|
85
|
+
def child_serializer(point)
|
86
|
+
point.child_object_serializer.new(
|
87
|
+
context: context,
|
88
|
+
plan: point.child_plan,
|
89
|
+
many: point.many,
|
90
|
+
**opts
|
91
|
+
)
|
87
92
|
end
|
88
93
|
|
89
94
|
def array?(object, many)
|
data/lib/serega/plan_point.rb
CHANGED
@@ -9,8 +9,6 @@ class Serega
|
|
9
9
|
# SeregaPlanPoint instance methods
|
10
10
|
#
|
11
11
|
module InstanceMethods
|
12
|
-
extend Forwardable
|
13
|
-
|
14
12
|
# Link to current plan this point belongs to
|
15
13
|
# @return [SeregaAttribute] Current plan
|
16
14
|
attr_reader :plan
|
@@ -27,20 +25,6 @@ class Serega
|
|
27
25
|
# @return [Hash] Attributes to serialize
|
28
26
|
attr_reader :modifiers
|
29
27
|
|
30
|
-
# @!method name
|
31
|
-
# Attribute `name`
|
32
|
-
# @see SeregaAttribute::AttributeInstanceMethods#name
|
33
|
-
# @!method value
|
34
|
-
# Attribute `value` block
|
35
|
-
# @see SeregaAttribute::AttributeInstanceMethods#value
|
36
|
-
# @!method many
|
37
|
-
# Attribute `many` option
|
38
|
-
# @see SeregaAttribute::AttributeInstanceMethods#many
|
39
|
-
# @!method serializer
|
40
|
-
# Attribute `serializer` option
|
41
|
-
# @see SeregaAttribute::AttributeInstanceMethods#serializer
|
42
|
-
def_delegators :@attribute, :name, :value, :many, :serializer
|
43
|
-
|
44
28
|
#
|
45
29
|
# Initializes plan point
|
46
30
|
#
|
@@ -60,6 +44,30 @@ class Serega
|
|
60
44
|
set_normalized_vars
|
61
45
|
end
|
62
46
|
|
47
|
+
# Attribute `value`
|
48
|
+
# @see SeregaAttribute::AttributeInstanceMethods#value
|
49
|
+
def value(obj, ctx)
|
50
|
+
attribute.value(obj, ctx)
|
51
|
+
end
|
52
|
+
|
53
|
+
# Attribute `name`
|
54
|
+
# @see SeregaAttribute::AttributeInstanceMethods#value
|
55
|
+
def name
|
56
|
+
attribute.name
|
57
|
+
end
|
58
|
+
|
59
|
+
# Attribute `many` option
|
60
|
+
# @see SeregaAttribute::AttributeInstanceMethods#many
|
61
|
+
def many
|
62
|
+
attribute.many
|
63
|
+
end
|
64
|
+
|
65
|
+
# Attribute `serializer` option
|
66
|
+
# @see SeregaAttribute::AttributeInstanceMethods#serializer
|
67
|
+
def serializer
|
68
|
+
attribute.serializer
|
69
|
+
end
|
70
|
+
|
63
71
|
#
|
64
72
|
# @return [SeregaObjectSerializer] object serializer for child plan
|
65
73
|
#
|
@@ -54,17 +54,21 @@ class Serega
|
|
54
54
|
# Checks requirements to load plugin
|
55
55
|
#
|
56
56
|
# @param serializer_class [Class<Serega>] Current serializer class
|
57
|
-
# @param
|
57
|
+
# @param opts [Hash] plugin options
|
58
58
|
#
|
59
59
|
# @return [void]
|
60
60
|
#
|
61
|
-
def self.before_load_plugin(serializer_class, **
|
61
|
+
def self.before_load_plugin(serializer_class, **opts)
|
62
|
+
opts.each_key do |key|
|
63
|
+
raise SeregaError, "Plugin #{plugin_name.inspect} does not accept the #{key.inspect} option. No options are allowed"
|
64
|
+
end
|
65
|
+
|
62
66
|
unless serializer_class.plugin_used?(:preloads)
|
63
|
-
raise SeregaError, "Please load
|
67
|
+
raise SeregaError, "Plugin #{plugin_name.inspect} must be loaded after the :preloads plugin. Please load the :preloads plugin first"
|
64
68
|
end
|
65
69
|
|
66
70
|
if serializer_class.plugin_used?(:batch)
|
67
|
-
raise SeregaError, "Plugin
|
71
|
+
raise SeregaError, "Plugin #{plugin_name.inspect} must be loaded before the :batch plugin"
|
68
72
|
end
|
69
73
|
end
|
70
74
|
|
@@ -72,7 +76,7 @@ class Serega
|
|
72
76
|
# Applies plugin code to specific serializer
|
73
77
|
#
|
74
78
|
# @param serializer_class [Class<Serega>] Current serializer class
|
75
|
-
# @param _opts [Hash]
|
79
|
+
# @param _opts [Hash] Plugin options
|
76
80
|
#
|
77
81
|
# @return [void]
|
78
82
|
#
|
@@ -14,7 +14,7 @@ class Serega
|
|
14
14
|
# end
|
15
15
|
#
|
16
16
|
# class UserSerializer < AppSerializer
|
17
|
-
# attribute :comments_count, batch: { loader: CommentsCountBatchLoader, default: 0
|
17
|
+
# attribute :comments_count, batch: { loader: CommentsCountBatchLoader }, default: 0
|
18
18
|
# attribute :company, serializer: CompanySerializer, batch: { loader: UserCompanyBatchLoader }
|
19
19
|
# end
|
20
20
|
#
|
@@ -25,11 +25,30 @@ class Serega
|
|
25
25
|
:batch
|
26
26
|
end
|
27
27
|
|
28
|
+
# Checks requirements to load plugin
|
29
|
+
#
|
30
|
+
# @param serializer_class [Class<Serega>] Current serializer class
|
31
|
+
# @param opts [Hash] plugin options
|
32
|
+
#
|
33
|
+
# @return [void]
|
34
|
+
#
|
35
|
+
def self.before_load_plugin(serializer_class, **opts)
|
36
|
+
allowed_keys = %i[auto_hide id_method]
|
37
|
+
opts.each_key do |key|
|
38
|
+
next if allowed_keys.include?(key)
|
39
|
+
|
40
|
+
raise SeregaError,
|
41
|
+
"Plugin #{plugin_name.inspect} does not accept the #{key.inspect} option. Allowed options:\n" \
|
42
|
+
" - :auto_hide [Boolean] - Marks attribute as hidden when it has :batch loader specified\n" \
|
43
|
+
" - :id_method [Symbol, #call] - Specified the default method to use to find object identifier"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
28
47
|
#
|
29
48
|
# Applies plugin code to specific serializer
|
30
49
|
#
|
31
50
|
# @param serializer_class [Class<Serega>] Current serializer class
|
32
|
-
# @param _opts [Hash]
|
51
|
+
# @param _opts [Hash] Plugin options
|
33
52
|
#
|
34
53
|
# @return [void]
|
35
54
|
#
|
@@ -60,7 +79,7 @@ class Serega
|
|
60
79
|
# Runs callbacks after plugin was attached
|
61
80
|
#
|
62
81
|
# @param serializer_class [Class<Serega>] Current serializer class
|
63
|
-
# @param opts [Hash]
|
82
|
+
# @param opts [Hash] Plugin options
|
64
83
|
#
|
65
84
|
# @return [void]
|
66
85
|
#
|
@@ -47,8 +47,6 @@ class Serega
|
|
47
47
|
id_method = batch[:id_method] || self.class.serializer_class.config.batch.id_method
|
48
48
|
id_method = prepare_batch_id_method(id_method)
|
49
49
|
|
50
|
-
default = batch.fetch(:default) { many ? FROZEN_EMPTY_ARRAY : nil }
|
51
|
-
|
52
50
|
{loader: loader, id_method: id_method, default: default}
|
53
51
|
end
|
54
52
|
|
@@ -23,7 +23,7 @@ class Serega
|
|
23
23
|
SeregaValidations::Utils::CheckOptIsHash.call(opts, :batch)
|
24
24
|
|
25
25
|
batch = opts[:batch]
|
26
|
-
SeregaValidations::Utils::CheckAllowedKeys.call(batch, %i[id_method loader
|
26
|
+
SeregaValidations::Utils::CheckAllowedKeys.call(batch, %i[id_method loader], :batch)
|
27
27
|
|
28
28
|
check_batch_opt_id_method(batch, serializer_class)
|
29
29
|
check_batch_opt_loader(batch, serializer_class)
|
@@ -48,11 +48,29 @@ class Serega
|
|
48
48
|
:camel_case
|
49
49
|
end
|
50
50
|
|
51
|
+
# Checks requirements to load plugin
|
52
|
+
#
|
53
|
+
# @param serializer_class [Class<Serega>] Current serializer class
|
54
|
+
# @param opts [Hash] plugin options
|
55
|
+
#
|
56
|
+
# @return [void]
|
57
|
+
#
|
58
|
+
def self.before_load_plugin(serializer_class, **opts)
|
59
|
+
allowed_keys = %i[transform]
|
60
|
+
opts.each_key do |key|
|
61
|
+
next if allowed_keys.include?(key)
|
62
|
+
|
63
|
+
raise SeregaError,
|
64
|
+
"Plugin #{plugin_name.inspect} does not accept the #{key.inspect} option. Allowed options:\n" \
|
65
|
+
" - :transform [#call] - Custom transformation"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
51
69
|
#
|
52
70
|
# Applies plugin code to specific serializer
|
53
71
|
#
|
54
72
|
# @param serializer_class [Class<Serega>] Current serializer class
|
55
|
-
# @param _opts [Hash]
|
73
|
+
# @param _opts [Hash] Plugin options
|
56
74
|
#
|
57
75
|
# @return [void]
|
58
76
|
#
|
@@ -66,7 +84,7 @@ class Serega
|
|
66
84
|
# Adds config options and runs other callbacks after plugin was loaded
|
67
85
|
#
|
68
86
|
# @param serializer_class [Class<Serega>] Current serializer class
|
69
|
-
# @param opts [Hash]
|
87
|
+
# @param opts [Hash] Plugin options
|
70
88
|
#
|
71
89
|
# @return [void]
|
72
90
|
#
|
@@ -30,13 +30,22 @@ class Serega
|
|
30
30
|
# Checks requirements and loads additional plugins
|
31
31
|
#
|
32
32
|
# @param serializer_class [Class<Serega>] Current serializer class
|
33
|
-
# @param opts [Hash]
|
33
|
+
# @param opts [Hash] Plugin options
|
34
34
|
#
|
35
35
|
# @return [void]
|
36
36
|
#
|
37
37
|
def self.before_load_plugin(serializer_class, **opts)
|
38
|
+
allowed_keys = %i[context_metadata_key]
|
39
|
+
opts.each_key do |key|
|
40
|
+
next if allowed_keys.include?(key)
|
41
|
+
|
42
|
+
raise SeregaError,
|
43
|
+
"Plugin #{plugin_name.inspect} does not accept the #{key.inspect} option. Allowed options:\n" \
|
44
|
+
" - :context_metadata_key [Symbol] - The key name that must be used to add metadata. Default is :meta."
|
45
|
+
end
|
46
|
+
|
38
47
|
unless serializer_class.plugin_used?(:root)
|
39
|
-
raise SeregaError, "
|
48
|
+
raise SeregaError, "Plugin #{plugin_name.inspect} must be loaded after the :root plugin. Please load the :root plugin first"
|
40
49
|
end
|
41
50
|
end
|
42
51
|
|
@@ -44,7 +53,7 @@ class Serega
|
|
44
53
|
# Applies plugin code to specific serializer
|
45
54
|
#
|
46
55
|
# @param serializer_class [Class<Serega>] Current serializer class
|
47
|
-
# @param _opts [Hash]
|
56
|
+
# @param _opts [Hash] Plugin options
|
48
57
|
#
|
49
58
|
# @return [void]
|
50
59
|
#
|
@@ -58,7 +67,7 @@ class Serega
|
|
58
67
|
# Adds config options and runs other callbacks after plugin was loaded
|
59
68
|
#
|
60
69
|
# @param serializer_class [Class<Serega>] Current serializer class
|
61
|
-
# @param opts [Hash]
|
70
|
+
# @param opts [Hash] Plugin options
|
62
71
|
#
|
63
72
|
# @return [void]
|
64
73
|
#
|
@@ -41,11 +41,29 @@ class Serega
|
|
41
41
|
:depth_limit
|
42
42
|
end
|
43
43
|
|
44
|
+
# Checks requirements
|
45
|
+
#
|
46
|
+
# @param serializer_class [Class<Serega>] Current serializer class
|
47
|
+
# @param opts [Hash] Plugin options
|
48
|
+
#
|
49
|
+
# @return [void]
|
50
|
+
#
|
51
|
+
def self.before_load_plugin(serializer_class, **opts)
|
52
|
+
allowed_keys = %i[limit]
|
53
|
+
opts.each_key do |key|
|
54
|
+
next if allowed_keys.include?(key)
|
55
|
+
|
56
|
+
raise SeregaError,
|
57
|
+
"Plugin #{plugin_name.inspect} does not accept the #{key.inspect} option. Allowed options:\n" \
|
58
|
+
" - :limit [Integer] - Maximum serialization depth."
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
44
62
|
#
|
45
63
|
# Applies plugin code to specific serializer
|
46
64
|
#
|
47
65
|
# @param serializer_class [Class<Serega>] Current serializer class
|
48
|
-
# @param _opts [Hash]
|
66
|
+
# @param _opts [Hash] Plugin options
|
49
67
|
#
|
50
68
|
# @return [void]
|
51
69
|
#
|
@@ -58,7 +76,7 @@ class Serega
|
|
58
76
|
# Adds config options and runs other callbacks after plugin was loaded
|
59
77
|
#
|
60
78
|
# @param serializer_class [Class<Serega>] Current serializer class
|
61
|
-
# @param opts [Hash]
|
79
|
+
# @param opts [Hash] Plugin options
|
62
80
|
#
|
63
81
|
# @return [void]
|
64
82
|
#
|
@@ -51,13 +51,22 @@ class Serega
|
|
51
51
|
# Checks requirements and loads additional plugins
|
52
52
|
#
|
53
53
|
# @param serializer_class [Class<Serega>] Current serializer class
|
54
|
-
# @param opts [Hash]
|
54
|
+
# @param opts [Hash] Plugin options
|
55
55
|
#
|
56
56
|
# @return [void]
|
57
57
|
#
|
58
58
|
def self.before_load_plugin(serializer_class, **opts)
|
59
|
+
allowed_keys = %i[formatters]
|
60
|
+
opts.each_key do |key|
|
61
|
+
next if allowed_keys.include?(key)
|
62
|
+
|
63
|
+
raise SeregaError,
|
64
|
+
"Plugin #{plugin_name.inspect} does not accept the #{key.inspect} option. Allowed options:\n" \
|
65
|
+
" - :formatters [Hash<Symbol, #call>] - Formatters (names and according callable values)"
|
66
|
+
end
|
67
|
+
|
59
68
|
if serializer_class.plugin_used?(:batch)
|
60
|
-
raise SeregaError, "Plugin
|
69
|
+
raise SeregaError, "Plugin #{plugin_name.inspect} must be loaded before the :batch plugin"
|
61
70
|
end
|
62
71
|
end
|
63
72
|
|
@@ -65,7 +74,7 @@ class Serega
|
|
65
74
|
# Applies plugin code to specific serializer
|
66
75
|
#
|
67
76
|
# @param serializer_class [Class<Serega>] Current serializer class
|
68
|
-
# @param _opts [Hash]
|
77
|
+
# @param _opts [Hash] Plugin options
|
69
78
|
#
|
70
79
|
# @return [void]
|
71
80
|
#
|
@@ -79,7 +88,7 @@ class Serega
|
|
79
88
|
# Adds config options and runs other callbacks after plugin was loaded
|
80
89
|
#
|
81
90
|
# @param serializer_class [Class<Serega>] Current serializer class
|
82
|
-
# @param opts [Hash]
|
91
|
+
# @param opts [Hash] Plugin options
|
83
92
|
#
|
84
93
|
# @return [void]
|
85
94
|
#
|
data/lib/serega/plugins/if/if.rb
CHANGED
@@ -51,7 +51,7 @@ class Serega
|
|
51
51
|
# Applies plugin code to specific serializer
|
52
52
|
#
|
53
53
|
# @param serializer_class [Class<Serega>] Current serializer class
|
54
|
-
# @param _opts [Hash]
|
54
|
+
# @param _opts [Hash] Plugin options
|
55
55
|
#
|
56
56
|
# @return [void]
|
57
57
|
#
|
@@ -72,7 +72,7 @@ class Serega
|
|
72
72
|
# Adds config options and runs other callbacks after plugin was loaded
|
73
73
|
#
|
74
74
|
# @param serializer_class [Class<Serega>] Current serializer class
|
75
|
-
# @param opts [Hash]
|
75
|
+
# @param opts [Hash] Plugin options
|
76
76
|
#
|
77
77
|
# @return [void]
|
78
78
|
#
|
@@ -46,13 +46,13 @@ class Serega
|
|
46
46
|
# Checks requirements and loads additional plugins
|
47
47
|
#
|
48
48
|
# @param serializer_class [Class<Serega>] Current serializer class
|
49
|
-
# @param _opts [Hash]
|
49
|
+
# @param _opts [Hash] Plugin options
|
50
50
|
#
|
51
51
|
# @return [void]
|
52
52
|
#
|
53
53
|
def self.before_load_plugin(serializer_class, **_opts)
|
54
54
|
unless serializer_class.plugin_used?(:root)
|
55
|
-
raise SeregaError, "
|
55
|
+
raise SeregaError, "Plugin #{plugin_name.inspect} must be loaded after the :root plugin. Please load the :root plugin first"
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
@@ -60,7 +60,7 @@ class Serega
|
|
60
60
|
# Applies plugin code to specific serializer
|
61
61
|
#
|
62
62
|
# @param serializer_class [Class<Serega>] Current serializer class
|
63
|
-
# @param _opts [Hash]
|
63
|
+
# @param _opts [Hash] Plugin options
|
64
64
|
#
|
65
65
|
# @return [void]
|
66
66
|
#
|
@@ -87,7 +87,7 @@ class Serega
|
|
87
87
|
# Adds config options and runs other callbacks after plugin was loaded
|
88
88
|
#
|
89
89
|
# @param serializer_class [Class<Serega>] Current serializer class
|
90
|
-
# @param _opts [Hash]
|
90
|
+
# @param _opts [Hash] Plugin options
|
91
91
|
#
|
92
92
|
# @return [void]
|
93
93
|
#
|
@@ -51,7 +51,7 @@ class Serega
|
|
51
51
|
opts.fetch(method_name)
|
52
52
|
end
|
53
53
|
|
54
|
-
define_method("#{method_name}=") do |value|
|
54
|
+
define_method(:"#{method_name}=") do |value|
|
55
55
|
raise SeregaError, "Must have boolean value, #{value.inspect} provided" if (value != true) && (value != false)
|
56
56
|
opts[method_name] = value
|
57
57
|
end
|
@@ -70,11 +70,31 @@ class Serega
|
|
70
70
|
:preloads
|
71
71
|
end
|
72
72
|
|
73
|
+
# Checks requirements to load plugin
|
74
|
+
#
|
75
|
+
# @param serializer_class [Class<Serega>] Current serializer class
|
76
|
+
# @param opts [Hash] plugin options
|
77
|
+
#
|
78
|
+
# @return [void]
|
79
|
+
#
|
80
|
+
def self.before_load_plugin(serializer_class, **opts)
|
81
|
+
allowed_keys = DEFAULT_CONFIG.keys
|
82
|
+
opts.each_key do |key|
|
83
|
+
next if allowed_keys.include?(key)
|
84
|
+
|
85
|
+
raise SeregaError,
|
86
|
+
"Plugin #{plugin_name.inspect} does not accept the #{key.inspect} option. Allowed options:\n" \
|
87
|
+
" - :auto_preload_attributes_with_delegate [Boolean] - Automatically adds `preload: <delegate_to>` option to attributes with :delegate option specified\n" \
|
88
|
+
" - :auto_preload_attributes_with_serializer [Boolean] - Automatically adds `preload: <attribute_name>` option to attributes with :serializer option specified\n" \
|
89
|
+
" - :auto_hide_attributes_with_preload [Boolean] - Automatically adds `hide: true` option to attributes with :preload option (specified manually or added automatically)"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
73
93
|
#
|
74
94
|
# Applies plugin code to specific serializer
|
75
95
|
#
|
76
96
|
# @param serializer_class [Class<Serega>] Current serializer class
|
77
|
-
# @param _opts [Hash]
|
97
|
+
# @param _opts [Hash] Plugin options
|
78
98
|
#
|
79
99
|
# @return [void]
|
80
100
|
#
|
@@ -104,7 +124,7 @@ class Serega
|
|
104
124
|
# Adds config options and runs other callbacks after plugin was loaded
|
105
125
|
#
|
106
126
|
# @param serializer_class [Class<Serega>] Current serializer class
|
107
|
-
# @param opts [Hash]
|
127
|
+
# @param opts [Hash] Plugin options
|
108
128
|
#
|
109
129
|
# @return [void]
|
110
130
|
#
|
@@ -29,7 +29,7 @@ class Serega
|
|
29
29
|
# Applies plugin code to specific serializer
|
30
30
|
#
|
31
31
|
# @param serializer_class [Class<Serega>] Current serializer class
|
32
|
-
# @param _opts [Hash]
|
32
|
+
# @param _opts [Hash] Plugin options
|
33
33
|
#
|
34
34
|
# @return [void]
|
35
35
|
#
|
@@ -42,7 +42,7 @@ class Serega
|
|
42
42
|
# Runs callbacks after plugin was attached
|
43
43
|
#
|
44
44
|
# @param serializer_class [Class<Serega>] Current serializer class
|
45
|
-
# @param _opts [Hash]
|
45
|
+
# @param _opts [Hash] Plugin options
|
46
46
|
#
|
47
47
|
# @return [void]
|
48
48
|
#
|