zenaton 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|