serega 0.2.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/lib/serega/config.rb +65 -23
- data/lib/serega/errors.rb +12 -0
- data/lib/serega/json/adapter.rb +17 -0
- data/lib/serega/json/json.rb +17 -0
- data/lib/serega/json/oj.rb +17 -0
- data/lib/serega/map.rb +23 -13
- data/lib/serega/plugins/context_metadata/context_metadata.rb +31 -8
- data/lib/serega/plugins/formatters/formatters.rb +26 -4
- data/lib/serega/plugins/hide_nil/hide_nil.rb +1 -1
- data/lib/serega/plugins/lazy/lazy.rb +53 -0
- data/lib/serega/plugins/metadata/meta_attribute.rb +1 -1
- data/lib/serega/plugins/metadata/metadata.rb +27 -2
- data/lib/serega/plugins/preloads/preloads.rb +47 -11
- data/lib/serega/plugins/root/root.rb +45 -5
- data/lib/serega/plugins/string_modifiers/string_modifiers.rb +6 -6
- data/lib/serega/validations/attribute/check_opt_delegate.rb +3 -3
- data/lib/serega/validations/attribute/check_opt_hide.rb +1 -1
- data/lib/serega/validations/attribute/check_opt_key.rb +1 -1
- data/lib/serega/validations/attribute/check_opt_many.rb +1 -1
- data/lib/serega/validations/check_attribute_params.rb +2 -2
- data/lib/serega/validations/check_initiate_params.rb +21 -8
- data/lib/serega/validations/check_serialize_params.rb +16 -10
- data/lib/serega/{plugins/validate_modifiers/validate.rb → validations/initiate/check_modifiers.rb} +3 -6
- data/lib/serega/validations/utils/check_allowed_keys.rb +1 -1
- data/lib/serega/validations/utils/check_opt_is_bool.rb +1 -1
- data/lib/serega/validations/utils/check_opt_is_hash.rb +1 -1
- data/lib/serega/validations/utils/check_opt_is_string_or_symbol.rb +1 -1
- data/lib/serega.rb +29 -36
- metadata +8 -6
- data/lib/serega/plugins/validate_modifiers/validate_modifiers.rb +0 -44
- data/lib/serega/utils/as_json.rb +0 -35
- data/lib/serega/utils/to_json.rb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1aec10f062296a0af1d3f6b445f189ab2d84a145a8ed3cf0d52c81aa0c4f2c69
|
4
|
+
data.tar.gz: 1038ea10d7ea09b25d8f74b0561319d6f518a447121686ed689ff16385ec8806
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8d568f45860671e760f56f67fd8206b2476b97ee5d415e881f23c9226285ef5b99a87b12ebd5da552664b6cd345ccb90cf7d43e10ed2a563ef436159f81afec5
|
7
|
+
data.tar.gz: 3100f9a6bd3b8fba77175677d4e53c01abf467cf2c57a5c1eea6a71ac2fbd73e7d2c0b0ff7071a032acdd73e6b37af37cc3259421e4fc58a96d5400fdea215ed
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.4.0
|
data/lib/serega/config.rb
CHANGED
@@ -7,39 +7,81 @@ class Serega
|
|
7
7
|
# Core class that stores serializer configuration
|
8
8
|
#
|
9
9
|
class SeregaConfig
|
10
|
-
|
11
|
-
|
10
|
+
# :nocov: We can't use both :oj and :json adapters together
|
11
|
+
DEFAULTS = {
|
12
|
+
plugins: [],
|
13
|
+
initiate_keys: %i[only with except check_initiate_params].freeze,
|
14
|
+
attribute_keys: %i[key value serializer many hide const delegate].freeze,
|
15
|
+
serialize_keys: %i[context many].freeze,
|
16
|
+
check_initiate_params: true,
|
17
|
+
max_cached_map_per_serializer_count: 0,
|
18
|
+
to_json: SeregaJSON.adapter == :oj ? SeregaJSON::OjDump : SeregaJSON::JSONDump,
|
19
|
+
from_json: SeregaJSON.adapter == :oj ? SeregaJSON::OjLoad : SeregaJSON::JSONLoad
|
20
|
+
}.freeze
|
21
|
+
# :nocov:
|
12
22
|
|
13
|
-
|
23
|
+
module SeregaConfigInstanceMethods
|
14
24
|
attr_reader :opts
|
15
25
|
|
16
26
|
#
|
17
|
-
# Initializes new config instance
|
18
|
-
# remove possibility of accidental overwriting of parent/nested configs.
|
27
|
+
# Initializes new config instance.
|
19
28
|
#
|
20
29
|
# @param opts [Hash] Initial config options
|
21
30
|
#
|
22
|
-
def initialize(opts =
|
31
|
+
def initialize(opts = nil)
|
32
|
+
opts ||= DEFAULTS
|
23
33
|
@opts = SeregaUtils::EnumDeepDup.call(opts)
|
24
34
|
end
|
25
35
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
36
|
+
def plugins
|
37
|
+
opts.fetch(:plugins)
|
38
|
+
end
|
39
|
+
|
40
|
+
def initiate_keys
|
41
|
+
opts.fetch(:initiate_keys)
|
42
|
+
end
|
43
|
+
|
44
|
+
def attribute_keys
|
45
|
+
opts.fetch(:attribute_keys)
|
46
|
+
end
|
47
|
+
|
48
|
+
def serialize_keys
|
49
|
+
opts.fetch(:serialize_keys)
|
50
|
+
end
|
51
|
+
|
52
|
+
def check_initiate_params
|
53
|
+
opts.fetch(:check_initiate_params)
|
54
|
+
end
|
55
|
+
|
56
|
+
def check_initiate_params=(value)
|
57
|
+
raise SeregaError, "Must have boolean value, #{value.inspect} provided" if (value != true) && (value != false)
|
58
|
+
opts[:check_initiate_params] = value
|
59
|
+
end
|
60
|
+
|
61
|
+
def max_cached_map_per_serializer_count
|
62
|
+
opts.fetch(:max_cached_map_per_serializer_count)
|
63
|
+
end
|
64
|
+
|
65
|
+
def max_cached_map_per_serializer_count=(value)
|
66
|
+
raise SeregaError, "Must have Integer value, #{value.inspect} provided" unless value.is_a?(Integer)
|
67
|
+
opts[:max_cached_map_per_serializer_count] = value
|
68
|
+
end
|
69
|
+
|
70
|
+
def to_json
|
71
|
+
opts.fetch(:to_json)
|
72
|
+
end
|
73
|
+
|
74
|
+
def to_json=(value)
|
75
|
+
opts[:to_json] = value
|
76
|
+
end
|
77
|
+
|
78
|
+
def from_json
|
79
|
+
opts.fetch(:from_json)
|
80
|
+
end
|
81
|
+
|
82
|
+
def from_json=(value)
|
83
|
+
opts[:from_json] = value
|
84
|
+
end
|
43
85
|
end
|
44
86
|
|
45
87
|
include SeregaConfigInstanceMethods
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Serega
|
4
|
+
# A generic exception Serega uses.
|
5
|
+
class SeregaError < StandardError; end
|
6
|
+
|
7
|
+
# AttributeNotExist is raised when serializer is initiated using not existing attribute
|
8
|
+
# Example:
|
9
|
+
# UserSerializer.new(only: 'FOO', except: 'FOO', with: 'FOO')
|
10
|
+
# UserSerializer.to_h(user, only: 'FOO', except: 'FOO', with: 'FOO' )
|
11
|
+
class AttributeNotExist < SeregaError; end
|
12
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Serega
|
4
|
+
module SeregaJSON
|
5
|
+
class OjDump
|
6
|
+
def self.call(data)
|
7
|
+
::Oj.dump(data, mode: :compat)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class OjLoad
|
12
|
+
def self.call(json_string)
|
13
|
+
::Oj.load(json_string)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/serega/map.rb
CHANGED
@@ -4,24 +4,34 @@ class Serega
|
|
4
4
|
class SeregaMap
|
5
5
|
module ClassMethods
|
6
6
|
def call(opts)
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
@cache[cache_key] ||= begin
|
11
|
-
modifiers = {
|
12
|
-
only: opts&.[](:only) || FROZEN_EMPTY_HASH,
|
13
|
-
except: opts&.[](:except) || FROZEN_EMPTY_HASH,
|
14
|
-
with: opts&.[](:with) || FROZEN_EMPTY_HASH
|
15
|
-
}
|
7
|
+
max_cache_size = serializer_class.config.max_cached_map_per_serializer_count
|
8
|
+
return map_for(opts) if max_cache_size.zero?
|
16
9
|
|
17
|
-
|
18
|
-
@cache.shift if @cache.length >= serializer_class.config[:max_cached_map_per_serializer_count]
|
19
|
-
end
|
20
|
-
end
|
10
|
+
cached_map_for(opts, max_cache_size)
|
21
11
|
end
|
22
12
|
|
23
13
|
private
|
24
14
|
|
15
|
+
def map_for(opts)
|
16
|
+
construct_map(serializer_class, **modifiers(opts))
|
17
|
+
end
|
18
|
+
|
19
|
+
def cached_map_for(opts, max_cache_size)
|
20
|
+
@cache ||= {}
|
21
|
+
cache_key = opts.to_s
|
22
|
+
map = @cache[cache_key] ||= map_for(opts)
|
23
|
+
@cache.shift if @cache.length > max_cache_size
|
24
|
+
map
|
25
|
+
end
|
26
|
+
|
27
|
+
def modifiers(opts)
|
28
|
+
{
|
29
|
+
only: opts[:only] || FROZEN_EMPTY_HASH,
|
30
|
+
except: opts[:except] || FROZEN_EMPTY_HASH,
|
31
|
+
with: opts[:with] || FROZEN_EMPTY_HASH
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
25
35
|
def construct_map(serializer_class, only:, except:, with:)
|
26
36
|
serializer_class.attributes.each_with_object([]) do |(name, attribute), map|
|
27
37
|
next unless attribute.visible?(only: only, except: except, with: with)
|
@@ -14,23 +14,46 @@ class Serega
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def self.load_plugin(serializer_class, **_opts)
|
17
|
+
serializer_class::SeregaConfig.include(ConfigInstanceMethods)
|
17
18
|
serializer_class::SeregaConvert.include(SeregaConvertInstanceMethods)
|
18
|
-
serializer_class::CheckSerializeParams.
|
19
|
+
serializer_class::CheckSerializeParams.include(CheckSerializeParamsInstanceMethods)
|
19
20
|
end
|
20
21
|
|
21
22
|
def self.after_load_plugin(serializer_class, **opts)
|
22
23
|
config = serializer_class.config
|
23
24
|
meta_key = opts[:context_metadata_key] || DEFAULT_CONTEXT_METADATA_KEY
|
24
|
-
config[
|
25
|
-
config
|
25
|
+
config.opts[:context_metadata] = {key: meta_key}
|
26
|
+
config.serialize_keys << meta_key
|
26
27
|
end
|
27
28
|
|
28
|
-
|
29
|
-
|
29
|
+
class ContextMetadataConfig
|
30
|
+
attr_reader :opts
|
31
|
+
|
32
|
+
def initialize(opts)
|
33
|
+
@opts = opts
|
34
|
+
end
|
35
|
+
|
36
|
+
def key
|
37
|
+
opts.fetch(:key)
|
38
|
+
end
|
39
|
+
|
40
|
+
def key=(value)
|
41
|
+
opts[:key] = value
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
module ConfigInstanceMethods
|
46
|
+
def context_metadata
|
47
|
+
ContextMetadataConfig.new(opts.fetch(:context_metadata))
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
module CheckSerializeParamsInstanceMethods
|
52
|
+
def check_opts
|
30
53
|
super
|
31
54
|
|
32
|
-
meta_key = serializer_class.config
|
33
|
-
SeregaValidations::
|
55
|
+
meta_key = self.class.serializer_class.config.context_metadata.key
|
56
|
+
SeregaValidations::Utils::CheckOptIsHash.call(opts, meta_key)
|
34
57
|
end
|
35
58
|
end
|
36
59
|
|
@@ -44,7 +67,7 @@ class Serega
|
|
44
67
|
private
|
45
68
|
|
46
69
|
def add_context_metadata(hash)
|
47
|
-
context_metadata_key = self.class.serializer_class.config
|
70
|
+
context_metadata_key = self.class.serializer_class.config.context_metadata.key
|
48
71
|
return unless context_metadata_key
|
49
72
|
|
50
73
|
metadata = opts[context_metadata_key]
|
@@ -8,13 +8,35 @@ class Serega
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def self.load_plugin(serializer_class, **_opts)
|
11
|
+
serializer_class::SeregaConfig.include(ConfigInstanceMethods)
|
11
12
|
serializer_class::SeregaAttribute.include(AttributeInstanceMethods)
|
12
13
|
end
|
13
14
|
|
14
|
-
def self.after_load_plugin(serializer_class, **
|
15
|
+
def self.after_load_plugin(serializer_class, **opts)
|
15
16
|
config = serializer_class.config
|
16
|
-
config[
|
17
|
-
config[:
|
17
|
+
config.opts[:formatters] = {}
|
18
|
+
config.formatters.add(opts[:formatters] || {})
|
19
|
+
config.attribute_keys << :format
|
20
|
+
end
|
21
|
+
|
22
|
+
class FormattersConfig
|
23
|
+
attr_reader :opts
|
24
|
+
|
25
|
+
def initialize(opts)
|
26
|
+
@opts = opts
|
27
|
+
end
|
28
|
+
|
29
|
+
def add(formatters)
|
30
|
+
formatters.each_pair do |key, value|
|
31
|
+
opts[key] = value
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
module ConfigInstanceMethods
|
37
|
+
def formatters
|
38
|
+
FormattersConfig.new(opts.fetch(:formatters))
|
39
|
+
end
|
18
40
|
end
|
19
41
|
|
20
42
|
module AttributeInstanceMethods
|
@@ -43,7 +65,7 @@ class Serega
|
|
43
65
|
value = original_block.call(object, context)
|
44
66
|
|
45
67
|
if formatter.is_a?(Symbol)
|
46
|
-
self.class.serializer_class.config.
|
68
|
+
self.class.serializer_class.config.formatters.opts.fetch(formatter).call(value)
|
47
69
|
else
|
48
70
|
formatter.call(value)
|
49
71
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Serega
|
4
|
+
module SeregaPlugins
|
5
|
+
module Lazy
|
6
|
+
def self.plugin_name
|
7
|
+
:lazy
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.before_load_plugin(serializer_class, **opts)
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.load_plugin(serializer_class, **_opts)
|
14
|
+
serializer_class.extend(ClassMethods)
|
15
|
+
serializer_class.include(InstanceMethods)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.after_load_plugin(serializer_class, **_opts)
|
19
|
+
serializer_class.config.attribute_keys << :lazy
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module ClassMethods
|
24
|
+
def lazy(key:, buffer:, resolver:)
|
25
|
+
@lazy[key] = { buffer: buffer, resolver: resolver }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
module InstanceMethods
|
30
|
+
def initialize(*args, **kwargs)
|
31
|
+
super
|
32
|
+
@lazy = {}
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_h(*args, **kwargs)
|
36
|
+
result = super
|
37
|
+
lazy.each_key do |key, |
|
38
|
+
buffer = lazy.delete(key) # { val => [paths], val2 => [paths2] }
|
39
|
+
buffer_values = self.class.lazy[key][:resolver].(buffer.keys)
|
40
|
+
|
41
|
+
buffer_values.each do |key, resolved_value|
|
42
|
+
paths = buffer[key]
|
43
|
+
paths.each do |path|
|
44
|
+
result.dig(path[0, -2])
|
45
|
+
replace(result, buffer_values)
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
register_plugin(Metadata.plugin_name, Metadata)
|
52
|
+
end
|
53
|
+
end
|
@@ -61,7 +61,7 @@ class Serega
|
|
61
61
|
|
62
62
|
def check(path, opts, block)
|
63
63
|
CheckPath.call(path)
|
64
|
-
CheckOpts.call(opts, self.class.serializer_class.config
|
64
|
+
CheckOpts.call(opts, self.class.serializer_class.config.metadata.attribute_keys)
|
65
65
|
CheckBlock.call(block)
|
66
66
|
end
|
67
67
|
end
|
@@ -8,11 +8,18 @@ class Serega
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def self.before_load_plugin(serializer_class, **opts)
|
11
|
-
|
11
|
+
if serializer_class.plugin_used?(:root)
|
12
|
+
root = serializer_class.config.root
|
13
|
+
root.one = opts[:root_one] if opts.key?(:root_one)
|
14
|
+
root.many = opts[:root_many] if opts.key?(:root_many)
|
15
|
+
else
|
16
|
+
serializer_class.plugin(:root, **opts)
|
17
|
+
end
|
12
18
|
end
|
13
19
|
|
14
20
|
def self.load_plugin(serializer_class, **_opts)
|
15
21
|
serializer_class.extend(ClassMethods)
|
22
|
+
serializer_class::SeregaConfig.include(ConfigInstanceMethods)
|
16
23
|
serializer_class::SeregaConvert.include(SeregaConvertInstanceMethods)
|
17
24
|
|
18
25
|
require_relative "./meta_attribute"
|
@@ -28,7 +35,25 @@ class Serega
|
|
28
35
|
end
|
29
36
|
|
30
37
|
def self.after_load_plugin(serializer_class, **_opts)
|
31
|
-
serializer_class.config[
|
38
|
+
serializer_class.config.opts[:metadata] = {attribute_keys: %i[path hide_nil hide_empty]}
|
39
|
+
end
|
40
|
+
|
41
|
+
class MetadataConfig
|
42
|
+
attr_reader :opts
|
43
|
+
|
44
|
+
def initialize(opts)
|
45
|
+
@opts = opts
|
46
|
+
end
|
47
|
+
|
48
|
+
def attribute_keys
|
49
|
+
opts.fetch(:attribute_keys)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
module ConfigInstanceMethods
|
54
|
+
def metadata
|
55
|
+
MetadataConfig.new(opts.fetch(:metadata))
|
56
|
+
end
|
32
57
|
end
|
33
58
|
|
34
59
|
module ClassMethods
|
@@ -6,6 +6,12 @@ class Serega
|
|
6
6
|
# Plugin adds `.preloads` method to find relations that must be preloaded
|
7
7
|
#
|
8
8
|
module Preloads
|
9
|
+
DEFAULT_CONFIG = {
|
10
|
+
auto_preload_attributes_with_delegate: false,
|
11
|
+
auto_preload_attributes_with_serializer: false,
|
12
|
+
auto_hide_attributes_with_preload: false
|
13
|
+
}.freeze
|
14
|
+
|
9
15
|
# @return [Symbol] plugin name
|
10
16
|
def self.plugin_name
|
11
17
|
:preloads
|
@@ -22,6 +28,7 @@ class Serega
|
|
22
28
|
def self.load_plugin(serializer_class, **_opts)
|
23
29
|
serializer_class.include(InstanceMethods)
|
24
30
|
serializer_class::SeregaAttribute.include(AttributeMethods)
|
31
|
+
serializer_class::SeregaConfig.include(ConfigInstanceMethods)
|
25
32
|
|
26
33
|
serializer_class::CheckAttributeParams.include(CheckAttributeParamsInstanceMethods)
|
27
34
|
|
@@ -35,12 +42,14 @@ class Serega
|
|
35
42
|
|
36
43
|
def self.after_load_plugin(serializer_class, **opts)
|
37
44
|
config = serializer_class.config
|
38
|
-
config
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
45
|
+
config.attribute_keys << :preload << :preload_path
|
46
|
+
|
47
|
+
preloads_opts = DEFAULT_CONFIG.merge(opts.slice(*DEFAULT_CONFIG.keys))
|
48
|
+
config.opts[:preloads] = {}
|
49
|
+
preloads_config = config.preloads
|
50
|
+
preloads_config.auto_preload_attributes_with_delegate = preloads_opts[:auto_preload_attributes_with_delegate]
|
51
|
+
preloads_config.auto_preload_attributes_with_serializer = preloads_opts[:auto_preload_attributes_with_serializer]
|
52
|
+
preloads_config.auto_hide_attributes_with_preload = preloads_opts[:auto_hide_attributes_with_preload]
|
44
53
|
end
|
45
54
|
|
46
55
|
# Adds #preloads instance method
|
@@ -51,6 +60,35 @@ class Serega
|
|
51
60
|
end
|
52
61
|
end
|
53
62
|
|
63
|
+
class PreloadsConfig
|
64
|
+
attr_reader :opts
|
65
|
+
|
66
|
+
def initialize(opts)
|
67
|
+
@opts = opts
|
68
|
+
end
|
69
|
+
|
70
|
+
%i[
|
71
|
+
auto_preload_attributes_with_delegate
|
72
|
+
auto_preload_attributes_with_serializer
|
73
|
+
auto_hide_attributes_with_preload
|
74
|
+
].each do |method_name|
|
75
|
+
define_method(method_name) do
|
76
|
+
opts.fetch(method_name)
|
77
|
+
end
|
78
|
+
|
79
|
+
define_method("#{method_name}=") do |value|
|
80
|
+
raise SeregaError, "Must have boolean value, #{value.inspect} provided" if (value != true) && (value != false)
|
81
|
+
opts[method_name] = value
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
module ConfigInstanceMethods
|
87
|
+
def preloads
|
88
|
+
PreloadsConfig.new(opts.fetch(:preloads))
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
54
92
|
# Adds #preloads and #preloads_path Attribute instance method
|
55
93
|
module AttributeMethods
|
56
94
|
def preloads
|
@@ -75,9 +113,7 @@ class Serega
|
|
75
113
|
private
|
76
114
|
|
77
115
|
def auto_hide_attribute_with_preloads?
|
78
|
-
|
79
|
-
|
80
|
-
auto = self.class.serializer_class.config[:preloads][:auto_hide_attributes_with_preload]
|
116
|
+
auto = self.class.serializer_class.config.preloads.auto_hide_attributes_with_preload
|
81
117
|
@auto_hide_attribute_with_preloads = auto && !preloads.nil? && (preloads != false) && (preloads != {})
|
82
118
|
end
|
83
119
|
|
@@ -86,9 +122,9 @@ class Serega
|
|
86
122
|
preloads =
|
87
123
|
if preloads_provided
|
88
124
|
opts[:preload]
|
89
|
-
elsif relation? && self.class.serializer_class.config
|
125
|
+
elsif relation? && self.class.serializer_class.config.preloads.auto_preload_attributes_with_serializer
|
90
126
|
key
|
91
|
-
elsif opts.key?(:delegate) && self.class.serializer_class.config
|
127
|
+
elsif opts.key?(:delegate) && self.class.serializer_class.config.preloads.auto_preload_attributes_with_delegate
|
92
128
|
opts[:delegate].fetch(:to)
|
93
129
|
end
|
94
130
|
|
@@ -12,12 +12,17 @@ class Serega
|
|
12
12
|
|
13
13
|
def self.load_plugin(serializer_class, **_opts)
|
14
14
|
serializer_class.extend(ClassMethods)
|
15
|
+
serializer_class::SeregaConfig.include(SeregaConfigInstanceMethods)
|
15
16
|
serializer_class::SeregaConvert.include(SeregaConvertInstanceMethods)
|
16
17
|
end
|
17
18
|
|
18
19
|
def self.after_load_plugin(serializer_class, **opts)
|
19
|
-
serializer_class.
|
20
|
-
|
20
|
+
config = serializer_class.config
|
21
|
+
default = opts[:root] || ROOT_DEFAULT
|
22
|
+
one = (opts[:root_one] || default).to_sym
|
23
|
+
many = (opts[:root_many] || default).to_sym
|
24
|
+
config.opts[:root] = {one: one, many: many}
|
25
|
+
config.serialize_keys << :root
|
21
26
|
end
|
22
27
|
|
23
28
|
module ClassMethods
|
@@ -37,7 +42,42 @@ class Serega
|
|
37
42
|
one = one.to_sym if one
|
38
43
|
many = many.to_sym if many
|
39
44
|
|
40
|
-
config
|
45
|
+
config.root = {one: one, many: many}
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
class RootConfig
|
50
|
+
attr_reader :opts
|
51
|
+
|
52
|
+
def initialize(opts)
|
53
|
+
@opts = opts
|
54
|
+
end
|
55
|
+
|
56
|
+
def one
|
57
|
+
opts.fetch(:one)
|
58
|
+
end
|
59
|
+
|
60
|
+
def many
|
61
|
+
opts.fetch(:many)
|
62
|
+
end
|
63
|
+
|
64
|
+
def one=(value)
|
65
|
+
opts[:one] = value
|
66
|
+
end
|
67
|
+
|
68
|
+
def many=(value)
|
69
|
+
opts[:many] = value
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
module SeregaConfigInstanceMethods
|
74
|
+
def root
|
75
|
+
RootConfig.new(opts.fetch(:root))
|
76
|
+
end
|
77
|
+
|
78
|
+
def root=(value)
|
79
|
+
root.one = value.fetch(:one)
|
80
|
+
root.many = value.fetch(:many)
|
41
81
|
end
|
42
82
|
end
|
43
83
|
|
@@ -54,8 +94,8 @@ class Serega
|
|
54
94
|
def build_root(opts)
|
55
95
|
return opts[:root] if opts.key?(:root)
|
56
96
|
|
57
|
-
|
58
|
-
many? ?
|
97
|
+
root = self.class.serializer_class.config.root
|
98
|
+
many? ? root.many : root.one
|
59
99
|
end
|
60
100
|
end
|
61
101
|
end
|
@@ -16,13 +16,13 @@ class Serega
|
|
16
16
|
private
|
17
17
|
|
18
18
|
def prepare_modifiers(opts)
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
19
|
+
parsed_opts =
|
20
|
+
opts.each_with_object({}) do |(key, value), obj|
|
21
|
+
value = ParseStringModifiers.call(value) if (key == :only) || (key == :except) || (key == :with)
|
22
|
+
obj[key] = value
|
23
|
+
end
|
24
24
|
|
25
|
-
super
|
25
|
+
super(parsed_opts)
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
@@ -25,7 +25,7 @@ class Serega
|
|
25
25
|
private
|
26
26
|
|
27
27
|
def check_opt_delegate(opts)
|
28
|
-
|
28
|
+
Utils::CheckOptIsHash.call(opts, :delegate)
|
29
29
|
|
30
30
|
delegate_opts = opts[:delegate]
|
31
31
|
check_opt_delegate_to(delegate_opts)
|
@@ -36,13 +36,13 @@ class Serega
|
|
36
36
|
to_exist = delegate_opts.key?(:to)
|
37
37
|
raise SeregaError, "Option :delegate must have a :to option" unless to_exist
|
38
38
|
|
39
|
-
|
39
|
+
Utils::CheckOptIsStringOrSymbol.call(delegate_opts, :to)
|
40
40
|
end
|
41
41
|
|
42
42
|
def check_opt_delegate_allow_nil(delegate_opts)
|
43
43
|
return unless delegate_opts.key?(:allow_nil)
|
44
44
|
|
45
|
-
|
45
|
+
Utils::CheckOptIsBool.call(delegate_opts, :allow_nil)
|
46
46
|
end
|
47
47
|
|
48
48
|
def check_usage_with_other_params(opts, block)
|
@@ -25,7 +25,7 @@ class Serega
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def check_opts
|
28
|
-
|
28
|
+
Utils::CheckAllowedKeys.call(opts, allowed_opts_keys)
|
29
29
|
|
30
30
|
Attribute::CheckOptConst.call(opts, block)
|
31
31
|
Attribute::CheckOptDelegate.call(opts, block)
|
@@ -41,7 +41,7 @@ class Serega
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def allowed_opts_keys
|
44
|
-
self.class.serializer_class.config
|
44
|
+
self.class.serializer_class.config.attribute_keys
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
@@ -3,23 +3,36 @@
|
|
3
3
|
class Serega
|
4
4
|
module SeregaValidations
|
5
5
|
class CheckInitiateParams
|
6
|
-
module
|
7
|
-
|
8
|
-
|
6
|
+
module InstanceMethods
|
7
|
+
attr_reader :opts
|
8
|
+
|
9
|
+
def initialize(opts)
|
10
|
+
@opts = opts
|
11
|
+
end
|
12
|
+
|
13
|
+
def validate
|
14
|
+
check_allowed_keys
|
15
|
+
check_modifiers
|
9
16
|
end
|
10
17
|
|
11
18
|
private
|
12
19
|
|
13
|
-
def
|
14
|
-
|
20
|
+
def check_allowed_keys
|
21
|
+
Utils::CheckAllowedKeys.call(opts, serializer_class.config.initiate_keys)
|
22
|
+
end
|
23
|
+
|
24
|
+
def check_modifiers
|
25
|
+
Initiate::CheckModifiers.call(serializer_class, opts[:only])
|
26
|
+
Initiate::CheckModifiers.call(serializer_class, opts[:except])
|
27
|
+
Initiate::CheckModifiers.call(serializer_class, opts[:with])
|
15
28
|
end
|
16
29
|
|
17
|
-
def
|
18
|
-
serializer_class
|
30
|
+
def serializer_class
|
31
|
+
self.class.serializer_class
|
19
32
|
end
|
20
33
|
end
|
21
34
|
|
22
|
-
|
35
|
+
include InstanceMethods
|
23
36
|
extend Serega::SeregaHelpers::SerializerClassHelper
|
24
37
|
end
|
25
38
|
end
|
@@ -3,26 +3,32 @@
|
|
3
3
|
class Serega
|
4
4
|
module SeregaValidations
|
5
5
|
class CheckSerializeParams
|
6
|
-
module
|
7
|
-
|
8
|
-
|
6
|
+
module InstanceMethods
|
7
|
+
attr_reader :opts
|
8
|
+
|
9
|
+
def initialize(opts)
|
10
|
+
@opts = opts
|
11
|
+
end
|
12
|
+
|
13
|
+
def validate
|
14
|
+
check_opts
|
9
15
|
end
|
10
16
|
|
11
17
|
private
|
12
18
|
|
13
|
-
def check_opts
|
14
|
-
|
19
|
+
def check_opts
|
20
|
+
Utils::CheckAllowedKeys.call(opts, serializer_class.config.serialize_keys)
|
15
21
|
|
16
|
-
|
17
|
-
|
22
|
+
Utils::CheckOptIsHash.call(opts, :context)
|
23
|
+
Utils::CheckOptIsBool.call(opts, :many)
|
18
24
|
end
|
19
25
|
|
20
|
-
def
|
21
|
-
serializer_class
|
26
|
+
def serializer_class
|
27
|
+
self.class.serializer_class
|
22
28
|
end
|
23
29
|
end
|
24
30
|
|
25
|
-
|
31
|
+
include InstanceMethods
|
26
32
|
extend Serega::SeregaHelpers::SerializerClassHelper
|
27
33
|
end
|
28
34
|
end
|
data/lib/serega/{plugins/validate_modifiers/validate.rb → validations/initiate/check_modifiers.rb}
RENAMED
@@ -1,12 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class Serega
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
module SeregaPlugins
|
8
|
-
module ValidateModifiers
|
9
|
-
class Validate
|
4
|
+
module SeregaValidations
|
5
|
+
module Initiate
|
6
|
+
class CheckModifiers
|
10
7
|
class << self
|
11
8
|
def call(serializer_class, fields)
|
12
9
|
return unless fields
|
data/lib/serega.rb
CHANGED
@@ -4,9 +4,6 @@ require_relative "serega/version"
|
|
4
4
|
|
5
5
|
# Parent class for your serializers
|
6
6
|
class Serega
|
7
|
-
# A generic exception Serega uses.
|
8
|
-
class SeregaError < StandardError; end
|
9
|
-
|
10
7
|
# @return [Hash] frozen hash
|
11
8
|
FROZEN_EMPTY_HASH = {}.freeze
|
12
9
|
|
@@ -14,11 +11,11 @@ class Serega
|
|
14
11
|
FROZEN_EMPTY_ARRAY = [].freeze
|
15
12
|
end
|
16
13
|
|
14
|
+
require_relative "serega/errors"
|
17
15
|
require_relative "serega/helpers/serializer_class_helper"
|
18
16
|
require_relative "serega/utils/enum_deep_dup"
|
19
17
|
require_relative "serega/utils/to_hash"
|
20
|
-
require_relative "serega/
|
21
|
-
require_relative "serega/utils/as_json"
|
18
|
+
require_relative "serega/json/adapter"
|
22
19
|
|
23
20
|
require_relative "serega/attribute"
|
24
21
|
require_relative "serega/validations/utils/check_allowed_keys"
|
@@ -34,6 +31,7 @@ require_relative "serega/validations/attribute/check_opt_key"
|
|
34
31
|
require_relative "serega/validations/attribute/check_opt_many"
|
35
32
|
require_relative "serega/validations/attribute/check_opt_serializer"
|
36
33
|
require_relative "serega/validations/attribute/check_opt_value"
|
34
|
+
require_relative "serega/validations/initiate/check_modifiers"
|
37
35
|
require_relative "serega/validations/check_attribute_params"
|
38
36
|
require_relative "serega/validations/check_initiate_params"
|
39
37
|
require_relative "serega/validations/check_serialize_params"
|
@@ -45,25 +43,19 @@ require_relative "serega/map"
|
|
45
43
|
require_relative "serega/plugins"
|
46
44
|
|
47
45
|
class Serega
|
48
|
-
@config = SeregaConfig.new
|
49
|
-
{
|
50
|
-
plugins: [],
|
51
|
-
initiate_keys: %i[only with except],
|
52
|
-
attribute_keys: %i[key value serializer many hide const delegate],
|
53
|
-
serialize_keys: %i[context many],
|
54
|
-
max_cached_map_per_serializer_count: 50,
|
55
|
-
to_json: ->(data) { SeregaUtils::ToJSON.call(data) }
|
56
|
-
}
|
57
|
-
)
|
46
|
+
@config = SeregaConfig.new
|
58
47
|
|
48
|
+
# Validates `Serializer.attribute` params
|
59
49
|
check_attribute_params_class = Class.new(SeregaValidations::CheckAttributeParams)
|
60
50
|
check_attribute_params_class.serializer_class = self
|
61
51
|
const_set(:CheckAttributeParams, check_attribute_params_class)
|
62
52
|
|
53
|
+
# Validates `Serializer#new` params
|
63
54
|
check_initiate_params_class = Class.new(SeregaValidations::CheckInitiateParams)
|
64
55
|
check_initiate_params_class.serializer_class = self
|
65
56
|
const_set(:CheckInitiateParams, check_initiate_params_class)
|
66
57
|
|
58
|
+
# Validates `serializer#call(obj, PARAMS)` params
|
67
59
|
check_serialize_params_class = Class.new(SeregaValidations::CheckSerializeParams)
|
68
60
|
check_serialize_params_class.serializer_class = self
|
69
61
|
const_set(:CheckSerializeParams, check_serialize_params_class)
|
@@ -138,7 +130,7 @@ class Serega
|
|
138
130
|
plugin.after_load_plugin(self, **opts) if plugin.respond_to?(:after_load_plugin)
|
139
131
|
|
140
132
|
# Store attached plugins, so we can check it is loaded later
|
141
|
-
config
|
133
|
+
config.plugins << (plugin.respond_to?(:plugin_name) ? plugin.plugin_name : plugin)
|
142
134
|
|
143
135
|
plugin
|
144
136
|
end
|
@@ -157,7 +149,7 @@ class Serega
|
|
157
149
|
else name
|
158
150
|
end
|
159
151
|
|
160
|
-
config
|
152
|
+
config.plugins.include?(plugin_name)
|
161
153
|
end
|
162
154
|
|
163
155
|
#
|
@@ -184,7 +176,7 @@ class Serega
|
|
184
176
|
end
|
185
177
|
|
186
178
|
def call(object, opts = FROZEN_EMPTY_HASH)
|
187
|
-
initiate_keys = config
|
179
|
+
initiate_keys = config.initiate_keys
|
188
180
|
new(opts.slice(*initiate_keys)).to_h(object, opts.except(*initiate_keys))
|
189
181
|
end
|
190
182
|
|
@@ -193,13 +185,12 @@ class Serega
|
|
193
185
|
end
|
194
186
|
|
195
187
|
def to_json(object, opts = FROZEN_EMPTY_HASH)
|
196
|
-
initiate_keys = config
|
188
|
+
initiate_keys = config.initiate_keys
|
197
189
|
new(opts.slice(*initiate_keys)).to_json(object, opts.except(*initiate_keys))
|
198
190
|
end
|
199
191
|
|
200
192
|
def as_json(object, opts = FROZEN_EMPTY_HASH)
|
201
|
-
|
202
|
-
new(opts.slice(*initiate_keys)).as_json(object, opts.except(*initiate_keys))
|
193
|
+
config.from_json.call(to_json(object, opts))
|
203
194
|
end
|
204
195
|
end
|
205
196
|
|
@@ -217,9 +208,8 @@ class Serega
|
|
217
208
|
# @param with [Array, Hash, String, Symbol] Attributes (usually hidden) to serialize additionally
|
218
209
|
#
|
219
210
|
def initialize(opts = FROZEN_EMPTY_HASH)
|
220
|
-
|
221
|
-
|
222
|
-
@opts = opts
|
211
|
+
@opts = opts == FROZEN_EMPTY_HASH ? opts : prepare_modifiers(opts)
|
212
|
+
self.class::CheckInitiateParams.new(@opts).validate if opts.fetch(:check_initiate_params) { config.check_initiate_params }
|
223
213
|
end
|
224
214
|
|
225
215
|
#
|
@@ -231,7 +221,7 @@ class Serega
|
|
231
221
|
# @return [Hash] Serialization result
|
232
222
|
#
|
233
223
|
def call(object, opts = {})
|
234
|
-
self.class::CheckSerializeParams.
|
224
|
+
self.class::CheckSerializeParams.new(opts).validate
|
235
225
|
opts[:context] ||= {}
|
236
226
|
|
237
227
|
self.class::SeregaConvert.call(object, **opts, map: map)
|
@@ -249,37 +239,40 @@ class Serega
|
|
249
239
|
#
|
250
240
|
# @return [Hash] Serialization result
|
251
241
|
#
|
252
|
-
def to_json(object, opts =
|
242
|
+
def to_json(object, opts = {})
|
253
243
|
hash = to_h(object, opts)
|
254
|
-
|
244
|
+
config.to_json.call(hash)
|
255
245
|
end
|
256
246
|
|
257
247
|
#
|
258
248
|
# Serializes provided object as json (uses only JSON-compatible types)
|
259
|
-
# When you later serialize/
|
249
|
+
# When you later serialize/de-serialize it from JSON you should receive
|
260
250
|
# equal object
|
261
251
|
#
|
262
252
|
# @param object [Object] Serialized object
|
263
253
|
#
|
264
254
|
# @return [Hash] Serialization result
|
265
255
|
#
|
266
|
-
def as_json(object, opts =
|
267
|
-
|
268
|
-
|
256
|
+
def as_json(object, opts = {})
|
257
|
+
json = to_json(object, opts)
|
258
|
+
config.from_json.call(json)
|
269
259
|
end
|
270
260
|
|
271
261
|
private
|
272
262
|
|
263
|
+
def config
|
264
|
+
self.class.config
|
265
|
+
end
|
266
|
+
|
273
267
|
def map
|
274
268
|
@map ||= self.class::SeregaMap.call(opts)
|
275
269
|
end
|
276
270
|
|
277
271
|
def prepare_modifiers(opts)
|
278
|
-
{
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
}
|
272
|
+
opts.each_with_object({}) do |(key, value), obj|
|
273
|
+
value = SeregaUtils::ToHash.call(value) if (key == :only) || (key == :except) || (key == :with)
|
274
|
+
obj[key] = value
|
275
|
+
end
|
283
276
|
end
|
284
277
|
end
|
285
278
|
|
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.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrey Glushkov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-09-20 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description:
|
14
14
|
email:
|
@@ -23,7 +23,11 @@ files:
|
|
23
23
|
- lib/serega/config.rb
|
24
24
|
- lib/serega/convert.rb
|
25
25
|
- lib/serega/convert_item.rb
|
26
|
+
- lib/serega/errors.rb
|
26
27
|
- lib/serega/helpers/serializer_class_helper.rb
|
28
|
+
- lib/serega/json/adapter.rb
|
29
|
+
- lib/serega/json/json.rb
|
30
|
+
- lib/serega/json/oj.rb
|
27
31
|
- lib/serega/map.rb
|
28
32
|
- lib/serega/plugins.rb
|
29
33
|
- lib/serega/plugins/activerecord_preloads/activerecord_preloads.rb
|
@@ -31,6 +35,7 @@ files:
|
|
31
35
|
- lib/serega/plugins/context_metadata/context_metadata.rb
|
32
36
|
- lib/serega/plugins/formatters/formatters.rb
|
33
37
|
- lib/serega/plugins/hide_nil/hide_nil.rb
|
38
|
+
- lib/serega/plugins/lazy/lazy.rb
|
34
39
|
- lib/serega/plugins/metadata/meta_attribute.rb
|
35
40
|
- lib/serega/plugins/metadata/metadata.rb
|
36
41
|
- lib/serega/plugins/metadata/validations/check_block.rb
|
@@ -49,12 +54,8 @@ files:
|
|
49
54
|
- lib/serega/plugins/root/root.rb
|
50
55
|
- lib/serega/plugins/string_modifiers/parse_string_modifiers.rb
|
51
56
|
- lib/serega/plugins/string_modifiers/string_modifiers.rb
|
52
|
-
- lib/serega/plugins/validate_modifiers/validate.rb
|
53
|
-
- lib/serega/plugins/validate_modifiers/validate_modifiers.rb
|
54
|
-
- lib/serega/utils/as_json.rb
|
55
57
|
- lib/serega/utils/enum_deep_dup.rb
|
56
58
|
- lib/serega/utils/to_hash.rb
|
57
|
-
- lib/serega/utils/to_json.rb
|
58
59
|
- lib/serega/validations/attribute/check_block.rb
|
59
60
|
- lib/serega/validations/attribute/check_name.rb
|
60
61
|
- lib/serega/validations/attribute/check_opt_const.rb
|
@@ -67,6 +68,7 @@ files:
|
|
67
68
|
- lib/serega/validations/check_attribute_params.rb
|
68
69
|
- lib/serega/validations/check_initiate_params.rb
|
69
70
|
- lib/serega/validations/check_serialize_params.rb
|
71
|
+
- lib/serega/validations/initiate/check_modifiers.rb
|
70
72
|
- lib/serega/validations/utils/check_allowed_keys.rb
|
71
73
|
- lib/serega/validations/utils/check_opt_is_bool.rb
|
72
74
|
- lib/serega/validations/utils/check_opt_is_hash.rb
|
@@ -1,44 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class Serega
|
4
|
-
module SeregaPlugins
|
5
|
-
module ValidateModifiers
|
6
|
-
def self.plugin_name
|
7
|
-
:validate_modifiers
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.load_plugin(serializer_class, **_opts)
|
11
|
-
serializer_class.include(InstanceMethods)
|
12
|
-
require_relative "./validate"
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.after_load_plugin(serializer_class, **opts)
|
16
|
-
serializer_class.config[:validate_modifiers] = {auto: opts.fetch(:auto, true)}
|
17
|
-
end
|
18
|
-
|
19
|
-
module InstanceMethods
|
20
|
-
# Raises error if some modifiers are invalid
|
21
|
-
def validate_modifiers
|
22
|
-
@modifiers_validated ||= begin
|
23
|
-
Validate.call(self.class, opts[:only])
|
24
|
-
Validate.call(self.class, opts[:except])
|
25
|
-
Validate.call(self.class, opts[:with])
|
26
|
-
true
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
def initialize(opts)
|
33
|
-
super
|
34
|
-
validate_modifiers if self.class.config[:validate_modifiers][:auto]
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
module InstanceMethods
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
register_plugin(ValidateModifiers.plugin_name, ValidateModifiers)
|
43
|
-
end
|
44
|
-
end
|
data/lib/serega/utils/as_json.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class Serega
|
4
|
-
module SeregaUtils
|
5
|
-
class AsJSON
|
6
|
-
DOUBLE_QUOTE = '"'
|
7
|
-
|
8
|
-
class << self
|
9
|
-
def call(data, to_json:)
|
10
|
-
case data
|
11
|
-
when Hash
|
12
|
-
data.each_with_object({}) do |(key, value), new_data|
|
13
|
-
new_key = key.to_s
|
14
|
-
new_value = call(value, to_json: to_json)
|
15
|
-
new_data[new_key] = new_value
|
16
|
-
end
|
17
|
-
when Array
|
18
|
-
data.map { |value| call(value, to_json: to_json) }
|
19
|
-
when NilClass, Integer, Float, String, TrueClass, FalseClass
|
20
|
-
data
|
21
|
-
when Symbol
|
22
|
-
data.to_s
|
23
|
-
else
|
24
|
-
res = to_json.call(data)
|
25
|
-
if res.start_with?(DOUBLE_QUOTE) && res.end_with?(DOUBLE_QUOTE)
|
26
|
-
res.delete_prefix!(DOUBLE_QUOTE)
|
27
|
-
res.delete_suffix!(DOUBLE_QUOTE)
|
28
|
-
end
|
29
|
-
res
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
data/lib/serega/utils/to_json.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class Serega
|
4
|
-
module SeregaUtils
|
5
|
-
class ToJSON
|
6
|
-
class << self
|
7
|
-
def call(data)
|
8
|
-
json_adapter.dump(data)
|
9
|
-
end
|
10
|
-
|
11
|
-
private
|
12
|
-
|
13
|
-
def json_adapter
|
14
|
-
@json_adapter ||= begin
|
15
|
-
require "json"
|
16
|
-
::JSON
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|