serega 0.19.0 → 0.20.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +5 -2
- data/VERSION +1 -1
- data/lib/serega/config.rb +0 -2
- data/lib/serega/errors.rb +9 -1
- data/lib/serega/object_serializer.rb +13 -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 +26 -2
- data/lib/serega/plugins/batch/lib/plugins_extensions/if.rb +31 -0
- 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 +21 -4
- 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 +26 -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 +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 11094f59dcd5d1d918604998ac267dbd13297bf0f70a9f3da5fd5ba74eb76b06
|
4
|
+
data.tar.gz: 97d1a419769b73937afde735e24210690e2f7702943d60db5be4252301e07255
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f9e3bfb207894f09c9c88658bad62e2a28e8b4d44648a74f807d332862b0cd7bdc67870f0d06786de0eb64537fd1a824c5d4f375406b71d18410b63c5a8c5320
|
7
|
+
data.tar.gz: 1171f2aabb7ce1c63a9e2f95f5413e9d80a882326ada4fac561b527c8a1adcc263ff19d6224eb070f0ebb333254ff48c9c7f56861ff6418732848cde3ffbc5b5
|
data/README.md
CHANGED
@@ -301,7 +301,7 @@ fields_as_string = 'first_name,enemy'
|
|
301
301
|
UserSerializer.new(only: fields).to_h(bruce)
|
302
302
|
UserSerializer.to_h(bruce, only: fields)
|
303
303
|
UserSerializer.to_h(bruce, only: fields_as_string)
|
304
|
-
# => raises Serega::AttributeNotExist
|
304
|
+
# => raises Serega::AttributeNotExist
|
305
305
|
|
306
306
|
# With no existing attribute and disabled validation
|
307
307
|
fields = %i[first_name enemy]
|
@@ -1074,7 +1074,10 @@ a single object.
|
|
1074
1074
|
|
1075
1075
|
- The `Serega::SeregaError` is a base error raised by this gem.
|
1076
1076
|
- The `Serega::AttributeNotExist` error is raised when validating attributes in
|
1077
|
-
`:only, :except, :with` modifiers
|
1077
|
+
`:only, :except, :with` modifiers. This error contains additional methods:
|
1078
|
+
|
1079
|
+
- `#serializer` - shows current serializer
|
1080
|
+
- `#attributes` - lists not existing attributes
|
1078
1081
|
|
1079
1082
|
## Release
|
1080
1083
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.20.1
|
data/lib/serega/config.rb
CHANGED
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:
|
@@ -70,6 +70,7 @@ class Serega
|
|
70
70
|
|
71
71
|
# Patched in:
|
72
72
|
# - plugin :if (conditionally skips attaching)
|
73
|
+
# - plugin :batch :if extension (removes prepared key)
|
73
74
|
def attach_final_value(final_value, point, container)
|
74
75
|
container[point.name] = final_value
|
75
76
|
end
|
@@ -79,11 +80,16 @@ class Serega
|
|
79
80
|
end
|
80
81
|
|
81
82
|
def relation_value(value, point)
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
83
|
+
child_serializer(point).serialize(value)
|
84
|
+
end
|
85
|
+
|
86
|
+
def child_serializer(point)
|
87
|
+
point.child_object_serializer.new(
|
88
|
+
context: context,
|
89
|
+
plan: point.child_plan,
|
90
|
+
many: point.many,
|
91
|
+
**opts
|
92
|
+
)
|
87
93
|
end
|
88
94
|
|
89
95
|
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
|
#
|
@@ -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
|
#
|
@@ -86,6 +105,11 @@ class Serega
|
|
86
105
|
serializer_class::SeregaAttribute.include(PluginsExtensions::Formatters::SeregaAttributeInstanceMethods)
|
87
106
|
end
|
88
107
|
|
108
|
+
if serializer_class.plugin_used?(:if)
|
109
|
+
require_relative "lib/plugins_extensions/if"
|
110
|
+
serializer_class::SeregaObjectSerializer.include(PluginsExtensions::If::ObjectSerializerInstanceMethods123)
|
111
|
+
end
|
112
|
+
|
89
113
|
if serializer_class.plugin_used?(:preloads)
|
90
114
|
require_relative "lib/plugins_extensions/preloads"
|
91
115
|
serializer_class::SeregaAttributeNormalizer.include(PluginsExtensions::Preloads::AttributeNormalizerInstanceMethods)
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Serega
|
4
|
+
module SeregaPlugins
|
5
|
+
module Batch
|
6
|
+
#
|
7
|
+
# Extensions (mini-plugins) that are enabled when :batch plugin used with other plugins
|
8
|
+
#
|
9
|
+
module PluginsExtensions
|
10
|
+
#
|
11
|
+
# Extension that is used when :if plugin is loaded
|
12
|
+
#
|
13
|
+
module If
|
14
|
+
#
|
15
|
+
# SeregaObjectSerializer additional/patched class methods
|
16
|
+
#
|
17
|
+
# @see Serega::SeregaObjectSerializer
|
18
|
+
#
|
19
|
+
module ObjectSerializerInstanceMethods123
|
20
|
+
private
|
21
|
+
|
22
|
+
# Removes key added by `batch` plugin at the start of serialization to preserve attributes ordering
|
23
|
+
def attach_final_value(value, point, container)
|
24
|
+
container.delete(point.name) if super == SeregaPlugins::If::KEY_SKIPPED
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -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
@@ -42,16 +42,32 @@ class Serega
|
|
42
42
|
# end
|
43
43
|
#
|
44
44
|
module If
|
45
|
+
# This value must be returned to identify that serialization key was skipped
|
46
|
+
KEY_SKIPPED = :_key_skipped_with_serega_if_plugin
|
47
|
+
|
45
48
|
# @return [Symbol] Plugin name
|
46
49
|
def self.plugin_name
|
47
50
|
:if
|
48
51
|
end
|
49
52
|
|
53
|
+
# Checks requirements to load plugin
|
54
|
+
#
|
55
|
+
# @param serializer_class [Class<Serega>] Current serializer class
|
56
|
+
# @param opts [Hash] plugin options
|
57
|
+
#
|
58
|
+
# @return [void]
|
59
|
+
#
|
60
|
+
def self.before_load_plugin(serializer_class, **opts)
|
61
|
+
if serializer_class.plugin_used?(:batch)
|
62
|
+
raise SeregaError, "Plugin #{plugin_name.inspect} must be loaded before the :batch plugin"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
50
66
|
#
|
51
67
|
# Applies plugin code to specific serializer
|
52
68
|
#
|
53
69
|
# @param serializer_class [Class<Serega>] Current serializer class
|
54
|
-
# @param _opts [Hash]
|
70
|
+
# @param _opts [Hash] Plugin options
|
55
71
|
#
|
56
72
|
# @return [void]
|
57
73
|
#
|
@@ -72,7 +88,7 @@ class Serega
|
|
72
88
|
# Adds config options and runs other callbacks after plugin was loaded
|
73
89
|
#
|
74
90
|
# @param serializer_class [Class<Serega>] Current serializer class
|
75
|
-
# @param opts [Hash]
|
91
|
+
# @param opts [Hash] Plugin options
|
76
92
|
#
|
77
93
|
# @return [void]
|
78
94
|
#
|
@@ -194,12 +210,13 @@ class Serega
|
|
194
210
|
private
|
195
211
|
|
196
212
|
def serialize_point(object, point, _container)
|
197
|
-
return unless point.satisfy_if_conditions?(object, context)
|
213
|
+
return KEY_SKIPPED unless point.satisfy_if_conditions?(object, context)
|
198
214
|
super
|
199
215
|
end
|
200
216
|
|
201
217
|
def attach_final_value(value, point, _container)
|
202
|
-
return unless point.satisfy_if_value_conditions?(value, context)
|
218
|
+
return KEY_SKIPPED unless point.satisfy_if_value_conditions?(value, context)
|
219
|
+
|
203
220
|
super
|
204
221
|
end
|
205
222
|
end
|
@@ -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,35 @@ 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
|
+
|
92
|
+
if serializer_class.plugin_used?(:batch)
|
93
|
+
raise SeregaError, "Plugin #{plugin_name.inspect} must be loaded before the :batch plugin"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
73
97
|
#
|
74
98
|
# Applies plugin code to specific serializer
|
75
99
|
#
|
76
100
|
# @param serializer_class [Class<Serega>] Current serializer class
|
77
|
-
# @param _opts [Hash]
|
101
|
+
# @param _opts [Hash] Plugin options
|
78
102
|
#
|
79
103
|
# @return [void]
|
80
104
|
#
|
@@ -104,7 +128,7 @@ class Serega
|
|
104
128
|
# Adds config options and runs other callbacks after plugin was loaded
|
105
129
|
#
|
106
130
|
# @param serializer_class [Class<Serega>] Current serializer class
|
107
|
-
# @param opts [Hash]
|
131
|
+
# @param opts [Hash] Plugin options
|
108
132
|
#
|
109
133
|
# @return [void]
|
110
134
|
#
|
@@ -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
|
#
|
@@ -60,11 +60,31 @@ class Serega
|
|
60
60
|
:root
|
61
61
|
end
|
62
62
|
|
63
|
+
# Checks requirements to load plugin
|
64
|
+
#
|
65
|
+
# @param serializer_class [Class<Serega>] Current serializer class
|
66
|
+
# @param opts [Hash] plugin options
|
67
|
+
#
|
68
|
+
# @return [void]
|
69
|
+
#
|
70
|
+
def self.before_load_plugin(serializer_class, **opts)
|
71
|
+
allowed_keys = %i[root root_one root_many]
|
72
|
+
opts.each_key do |key|
|
73
|
+
next if allowed_keys.include?(key)
|
74
|
+
|
75
|
+
raise SeregaError,
|
76
|
+
"Plugin #{plugin_name.inspect} does not accept the #{key.inspect} option. Allowed options:\n" \
|
77
|
+
" - :root [String, Symbol, nil] Specifies common root keyword used when serializing one or multiple objects\n" \
|
78
|
+
" - :root_one [String, Symbol, nil] Specifies root keyword used when serializing one object\n" \
|
79
|
+
" - :root_many [String, Symbol, nil] Specifies root keyword used when serializing multiple objects" \
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
63
83
|
#
|
64
84
|
# Applies plugin code to specific serializer
|
65
85
|
#
|
66
86
|
# @param serializer_class [Class<Serega>] Current serializer class
|
67
|
-
# @param _opts [Hash]
|
87
|
+
# @param _opts [Hash] Plugin options
|
68
88
|
#
|
69
89
|
# @return [void]
|
70
90
|
#
|
@@ -78,7 +98,7 @@ class Serega
|
|
78
98
|
# Adds config options and runs other callbacks after plugin was loaded
|
79
99
|
#
|
80
100
|
# @param serializer_class [Class<Serega>] Current serializer class
|
81
|
-
# @param opts [Hash]
|
101
|
+
# @param opts [Hash] Plugin options
|
82
102
|
#
|
83
103
|
# @return [void]
|
84
104
|
#
|
@@ -102,9 +122,9 @@ class Serega
|
|
102
122
|
#
|
103
123
|
# Configures response root key
|
104
124
|
#
|
105
|
-
# @param root [String, Symbol, nil] Specifies common root when serializing one or multiple objects
|
106
|
-
# @param one [String, Symbol, nil] Specifies root when serializing one object
|
107
|
-
# @param many [String, Symbol, nil] Specifies root when serializing multiple objects
|
125
|
+
# @param root [String, Symbol, nil] Specifies common root keyword used when serializing one or multiple objects
|
126
|
+
# @param one [String, Symbol, nil] Specifies root keyword used when serializing one object
|
127
|
+
# @param many [String, Symbol, nil] Specifies root keyword used when serializing multiple objects
|
108
128
|
#
|
109
129
|
# @return [Hash] Configured root names
|
110
130
|
#
|
@@ -27,7 +27,7 @@ class Serega
|
|
27
27
|
validate(serializer_class, with) if with
|
28
28
|
validate(serializer_class, except) if except
|
29
29
|
|
30
|
-
raise_errors if any_error?
|
30
|
+
raise_errors(serializer_class) if any_error?
|
31
31
|
end
|
32
32
|
|
33
33
|
private
|
@@ -66,12 +66,19 @@ class Serega
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def save_error(name)
|
69
|
-
|
70
|
-
error_attributes << full_attribute_name
|
69
|
+
error_attributes << build_full_attribute_name(*parents_names, name)
|
71
70
|
end
|
72
71
|
|
73
|
-
def
|
74
|
-
|
72
|
+
def build_full_attribute_name(*names)
|
73
|
+
head, *nested = *names
|
74
|
+
result = head.to_s # names are symbols, we need not frozen string
|
75
|
+
nested.each { |nested_name| result << "(" << nested_name.to_s }
|
76
|
+
nested.each { result << ")" }
|
77
|
+
result
|
78
|
+
end
|
79
|
+
|
80
|
+
def raise_errors(serializer_class)
|
81
|
+
raise Serega::AttributeNotExist.new("Not existing attributes: #{error_attributes.join(", ")}", serializer_class, error_attributes)
|
75
82
|
end
|
76
83
|
|
77
84
|
def any_error?
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: serega
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.20.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrey Glushkov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-02-25 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |
|
14
14
|
JSON Serializer
|
@@ -54,6 +54,7 @@ files:
|
|
54
54
|
- lib/serega/plugins/batch/lib/modules/plan_point.rb
|
55
55
|
- lib/serega/plugins/batch/lib/plugins_extensions/activerecord_preloads.rb
|
56
56
|
- lib/serega/plugins/batch/lib/plugins_extensions/formatters.rb
|
57
|
+
- lib/serega/plugins/batch/lib/plugins_extensions/if.rb
|
57
58
|
- lib/serega/plugins/batch/lib/plugins_extensions/preloads.rb
|
58
59
|
- lib/serega/plugins/batch/lib/validations/check_batch_opt_id_method.rb
|
59
60
|
- lib/serega/plugins/batch/lib/validations/check_batch_opt_loader.rb
|
@@ -140,7 +141,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
140
141
|
- !ruby/object:Gem::Version
|
141
142
|
version: '0'
|
142
143
|
requirements: []
|
143
|
-
rubygems_version: 3.
|
144
|
+
rubygems_version: 3.5.6
|
144
145
|
signing_key:
|
145
146
|
specification_version: 4
|
146
147
|
summary: JSON Serializer
|