zenaton 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/lib/zenaton/services/serializer.rb +106 -52
- data/lib/zenaton/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: db17bf2caf28d2e2c9f8c610e0c882f53543af959af846e63f25dc4b9cf71d88
|
4
|
+
data.tar.gz: 28ae921a4fcfd86ab11c726238db69350341190fae32e897dc1c518562baec64
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5974cd83124ff35a036dce13e4800095f2a3c37923a6c568b5315140f44fb62390858545403ed52873a29ff432b7e785ed20c80c29e5fe467b75274ae40745ac
|
7
|
+
data.tar.gz: 548fc102b9aa3861efa4cb538845589f02ab32baefabd7821201cdb2992b01cbb07b90a75294a04032c036a70db2d06477880bb7a6f579ec228574607d893abe
|
data/Gemfile.lock
CHANGED
@@ -28,14 +28,10 @@ module Zenaton
|
|
28
28
|
@decoded = []
|
29
29
|
value = {}
|
30
30
|
raise ArgumentError, 'Procs cannot be serialized' if data.is_a?(Proc)
|
31
|
-
if
|
32
|
-
value[KEY_ARRAY] = encode_array(data)
|
33
|
-
elsif data.is_a?(Hash)
|
34
|
-
value[KEY_ARRAY] = encode_hash(data)
|
35
|
-
elsif basic_type?(data)
|
31
|
+
if basic_type?(data)
|
36
32
|
value[KEY_DATA] = data
|
37
33
|
else
|
38
|
-
value[KEY_OBJECT] =
|
34
|
+
value[KEY_OBJECT] = encode_to_store(data)
|
39
35
|
end
|
40
36
|
value[KEY_STORE] = @encoded
|
41
37
|
value.to_json
|
@@ -53,17 +49,13 @@ module Zenaton
|
|
53
49
|
return decode_enumerable(parsed_json[KEY_ARRAY])
|
54
50
|
when KEY_OBJECT
|
55
51
|
id = parsed_json[KEY_OBJECT][ID_PREFIX.length..-1].to_i
|
56
|
-
return
|
52
|
+
return decode_from_store(id, @encoded[id])
|
57
53
|
end
|
58
54
|
end
|
59
55
|
# rubocop:enable Metrics/MethodLength
|
60
56
|
|
61
57
|
private
|
62
58
|
|
63
|
-
def array_type?(data)
|
64
|
-
data.is_a?(Array) || data.is_a?(Hash)
|
65
|
-
end
|
66
|
-
|
67
59
|
def basic_type?(data)
|
68
60
|
data.is_a?(String) \
|
69
61
|
|| data.is_a?(Integer) \
|
@@ -73,82 +65,144 @@ module Zenaton
|
|
73
65
|
|| data.nil?
|
74
66
|
end
|
75
67
|
|
76
|
-
def encode_array(array)
|
77
|
-
array.map { |elem| encode_value(elem) }
|
78
|
-
end
|
79
|
-
|
80
|
-
def encode_hash(hash)
|
81
|
-
transform_values(hash) { |value| encode_value(value) }
|
82
|
-
end
|
83
|
-
|
84
68
|
def encode_value(value)
|
85
69
|
raise ArgumentError, 'Procs cannot be serialized' if value.is_a?(Proc)
|
86
|
-
if
|
87
|
-
encode_array(value)
|
88
|
-
elsif value.is_a?(Hash)
|
89
|
-
encode_hash(value)
|
90
|
-
elsif basic_type?(value)
|
70
|
+
if basic_type?(value)
|
91
71
|
value
|
92
72
|
else
|
93
|
-
|
73
|
+
encode_to_store(value)
|
94
74
|
end
|
95
75
|
end
|
96
76
|
|
97
|
-
def
|
77
|
+
def encode_to_store(object)
|
98
78
|
id = @decoded.index(object)
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
79
|
+
return store_id(id) if id
|
80
|
+
store_and_encode(object)
|
81
|
+
end
|
82
|
+
|
83
|
+
def store_and_encode(object)
|
84
|
+
id = @decoded.length
|
85
|
+
@decoded[id] = object
|
86
|
+
@encoded[id] = encoded_object_by_type(object)
|
87
|
+
store_id(id)
|
88
|
+
end
|
89
|
+
|
90
|
+
def store_id(id)
|
107
91
|
"#{ID_PREFIX}#{id}"
|
108
92
|
end
|
109
93
|
|
110
|
-
def
|
111
|
-
|
112
|
-
|
113
|
-
|
94
|
+
def encoded_object_by_type(object)
|
95
|
+
case object
|
96
|
+
when Array
|
97
|
+
encode_array(object)
|
98
|
+
when Hash
|
99
|
+
encode_hash(object)
|
100
|
+
else
|
101
|
+
encode_object(object)
|
102
|
+
end
|
114
103
|
end
|
115
104
|
|
116
|
-
def
|
117
|
-
|
118
|
-
|
119
|
-
|
105
|
+
def encode_object(object)
|
106
|
+
{
|
107
|
+
KEY_OBJECT_NAME => object.class.name,
|
108
|
+
KEY_OBJECT_PROPERTIES => encode_legacy_hash(@properties.from(object))
|
109
|
+
}
|
110
|
+
end
|
111
|
+
|
112
|
+
def encode_array(array)
|
113
|
+
{
|
114
|
+
KEY_ARRAY => array.map(&method(:encode_value))
|
115
|
+
}
|
116
|
+
end
|
117
|
+
|
118
|
+
def encode_hash(hash)
|
119
|
+
{
|
120
|
+
KEY_ARRAY => transform_values(hash, &method(:encode_value))
|
121
|
+
}
|
120
122
|
end
|
121
123
|
|
122
|
-
def
|
123
|
-
|
124
|
+
def encode_legacy_hash(hash)
|
125
|
+
transform_values(hash, &method(:encode_value))
|
124
126
|
end
|
125
127
|
|
126
|
-
def
|
127
|
-
|
128
|
+
def store_id?(string)
|
129
|
+
string.is_a?(String) \
|
130
|
+
&& string.start_with?(ID_PREFIX) \
|
131
|
+
&& string[ID_PREFIX.length..-1].to_i <= @encoded.length
|
128
132
|
end
|
129
133
|
|
130
134
|
# rubocop:disable Metrics/MethodLength
|
131
135
|
def decode_element(value)
|
132
|
-
if
|
136
|
+
if store_id?(value)
|
133
137
|
id = value[ID_PREFIX.length..-1].to_i
|
134
138
|
encoded = @encoded[id]
|
135
|
-
|
139
|
+
decode_from_store(id, encoded)
|
136
140
|
elsif value.is_a?(Array)
|
137
|
-
|
141
|
+
decode_legacy_array(value)
|
138
142
|
elsif value.is_a?(Hash)
|
139
|
-
|
143
|
+
decode_legacy_hash(value)
|
140
144
|
else
|
141
145
|
value
|
142
146
|
end
|
143
147
|
end
|
144
148
|
# rubocop:enable Metrics/MethodLength
|
145
149
|
|
146
|
-
def
|
150
|
+
def decode_enumerable(enumerable)
|
151
|
+
return decode_legacy_array(enumerable) if enumerable.is_a?(Array)
|
152
|
+
return decode_legacy_hash(enumerable) if enumerable.is_a?(Hash)
|
153
|
+
raise ArgumentError, 'Unknown type'
|
154
|
+
end
|
155
|
+
|
156
|
+
def decode_legacy_array(array)
|
157
|
+
array.map(&method(:decode_element))
|
158
|
+
end
|
159
|
+
|
160
|
+
def decode_legacy_hash(hash)
|
161
|
+
transform_values(hash, &method(:decode_element))
|
162
|
+
end
|
163
|
+
|
164
|
+
def decode_array(id, array)
|
165
|
+
@decoded[id] = object = []
|
166
|
+
object.concat(array.map(&method(:decode_element)))
|
167
|
+
end
|
168
|
+
|
169
|
+
def decode_hash(id, hash)
|
170
|
+
@decoded[id] = {}
|
171
|
+
hash.each do |key, value|
|
172
|
+
@decoded[id][key] = decode_element(value)
|
173
|
+
end
|
174
|
+
@decoded[id]
|
175
|
+
end
|
176
|
+
|
177
|
+
def decode_from_store(id, encoded)
|
147
178
|
decoded = @decoded[id]
|
148
179
|
return decoded if decoded
|
180
|
+
case encoded[KEY_ARRAY]
|
181
|
+
when Array
|
182
|
+
decode_array(id, encoded[KEY_ARRAY])
|
183
|
+
when Hash
|
184
|
+
decode_hash(id, encoded[KEY_ARRAY])
|
185
|
+
else
|
186
|
+
decode_object(id, encoded)
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
def decoded_object_by_type(id, encoded)
|
191
|
+
enumerable = encoded[KEY_ARRAY]
|
192
|
+
case enumerable
|
193
|
+
when Array
|
194
|
+
decode_array(id, enumerable)
|
195
|
+
when Hash
|
196
|
+
decode_hash(id, enumerable)
|
197
|
+
else
|
198
|
+
decode_object(id, encoded)
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
def decode_object(id, encoded_object)
|
149
203
|
object = @properties.blank_instance(encoded_object[KEY_OBJECT_NAME])
|
150
204
|
@decoded[id] = object
|
151
|
-
properties =
|
205
|
+
properties = decode_legacy_hash(encoded_object[KEY_OBJECT_PROPERTIES])
|
152
206
|
@properties.set(object, properties)
|
153
207
|
end
|
154
208
|
|
data/lib/zenaton/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zenaton
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zenaton
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-08-
|
11
|
+
date: 2018-08-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|