json_array_serializer 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +59 -17
- data/lib/json_array_serializer/version.rb +1 -1
- data/lib/json_array_serializer.rb +20 -18
- data/spec/json_array_serializer_spec.rb +162 -240
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 759b6374e0d2f2f6b141dc720a08e358445a31ca
|
4
|
+
data.tar.gz: e129f2d357544ff607187baf39b43855665b6dd9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b521b7344f0f00622f628a3f293640daffbf3fae68508aabe7cc7be34cf3c26ceaf2a23422cb6ad71ef4fce5a18a6811e5af7908fca6473b571f24be90b80033
|
7
|
+
data.tar.gz: ece9d5e2a0c7905cb41a32f0931518d10ef9db77bbc023918b352dd989d6f04eda4afda9cc3a5c7abbb8716c4c1d462b980c4a7283e7d1c266ec6e2e419325be
|
data/README.md
CHANGED
@@ -26,22 +26,9 @@ class Foo < ActiveRecord::Base
|
|
26
26
|
end
|
27
27
|
```
|
28
28
|
|
29
|
-
|
29
|
+
### Specifying Element Class
|
30
30
|
|
31
|
-
|
32
|
-
# A class to hold a collection of commands.
|
33
|
-
#
|
34
|
-
class CommandArray < JSONArraySerizalizer
|
35
|
-
def perform
|
36
|
-
each do |command|
|
37
|
-
result = system(command.program)
|
38
|
-
raise "Error" if !result && command.raise_exception
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
```
|
43
|
-
|
44
|
-
You can also pass in a class to load the individual JSON objects as when extending the base `JSONArraySerizalizer`.
|
31
|
+
You can pass a class to specify the type of the arrays elements.
|
45
32
|
|
46
33
|
```ruby
|
47
34
|
class Developer < OpenStruct
|
@@ -51,13 +38,68 @@ class Developer < OpenStruct
|
|
51
38
|
end
|
52
39
|
|
53
40
|
class Company < ActiveRecord::Base
|
54
|
-
serialize :developers, JSONArraySerializer.new(Developer)
|
41
|
+
serialize :developers, JSONArraySerializer.new(element_class: Developer)
|
55
42
|
end
|
56
43
|
```
|
57
44
|
|
58
|
-
The
|
45
|
+
The `element_class` you pass to `JSONArraySerializer.new` __must__ have the following two methods.
|
59
46
|
|
60
47
|
```
|
61
48
|
# A.new : Hash -> A
|
62
49
|
# a.to_h : -> Hash (where a is an instance of A)
|
63
50
|
```
|
51
|
+
|
52
|
+
### Specifying Array Class
|
53
|
+
|
54
|
+
You can pass a class to specify the type of the loaded array itself. This allows for serializing classes that act like arrays.
|
55
|
+
|
56
|
+
```ruby
|
57
|
+
class SongArray < Array
|
58
|
+
def play_all
|
59
|
+
each do |song|
|
60
|
+
queue song['name']
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
class Playlist < ActiveRecord::Base
|
66
|
+
serialize :songs, JSONArraySerializer.new(array_class: SongArray)
|
67
|
+
end
|
68
|
+
```
|
69
|
+
|
70
|
+
The `array_class` you pass to `JSONArraySerializer.new` __must__ have the following two methods.
|
71
|
+
|
72
|
+
```
|
73
|
+
# A.new : Array -> A
|
74
|
+
# a.to_a : -> Array (where a is an instance of A) ?????
|
75
|
+
```
|
76
|
+
|
77
|
+
### Specifying the Database Type
|
78
|
+
|
79
|
+
This gem allows you to save arrays on either Text/String columns or Array columns. The default is `:text`.
|
80
|
+
|
81
|
+
```ruby
|
82
|
+
serialize :foo, JSONArraySerializer.new # Will save to :text.
|
83
|
+
serialize :foo, JSONArraySerializer.new(column_type: :text) # Same as above.
|
84
|
+
serialize :foo, JSONArraySerializer.new(column_type: :array) # Saves to array column.
|
85
|
+
```
|
86
|
+
|
87
|
+
## Example
|
88
|
+
|
89
|
+
```ruby
|
90
|
+
class Developer < OpenStruct
|
91
|
+
def develop(name)
|
92
|
+
# Write code.
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
class DeveloperArray < Array
|
97
|
+
def develop
|
98
|
+
each { |d| d.develop }
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
class Company < ActiveRecord::Base
|
103
|
+
serialize :developers, JSONArraySerializer.new(array_class: DeveloperArray, element_class: Developer)
|
104
|
+
end
|
105
|
+
```
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'json'
|
2
2
|
require 'json_array_serializer/version'
|
3
3
|
|
4
|
-
class JSONArraySerializer
|
5
|
-
attr_accessor :element_class
|
4
|
+
class JSONArraySerializer
|
5
|
+
attr_accessor :element_class, :array_class
|
6
6
|
|
7
7
|
# Class -> void (hook)
|
8
8
|
# Sets up the new JSONArraySerializer with it's elements
|
@@ -14,44 +14,46 @@ class JSONArraySerializer < Array
|
|
14
14
|
# A.new : Hash -> A
|
15
15
|
# a.to_h : -> Hash (where a is an instance of A)
|
16
16
|
#
|
17
|
-
def initialize(element_class
|
17
|
+
def initialize(array_class: Array, element_class: Hash, column_type: :text)
|
18
|
+
@array_class = array_class
|
18
19
|
@element_class = element_class
|
19
20
|
@column_type = column_type
|
20
21
|
end
|
21
22
|
|
22
|
-
# [JSON String] || JSON String ->
|
23
|
+
# [JSON String] || JSON String -> array_class<element_class>
|
23
24
|
# Takes an array of JSON strings and loads them
|
24
25
|
# into an array of element_classes.
|
25
26
|
#
|
26
27
|
def load(data)
|
28
|
+
return data if data.nil?
|
29
|
+
|
27
30
|
array = case @column_type
|
28
31
|
when :array
|
29
|
-
data
|
32
|
+
data.map do |json|
|
33
|
+
hash = JSON.load(json)
|
34
|
+
(element_class == Hash) ? hash : element_class.new(hash)
|
35
|
+
end
|
30
36
|
when :string, :text
|
31
|
-
JSON.load(data)
|
37
|
+
JSON.load(data).map do |hash|
|
38
|
+
(element_class == Hash) ? hash : element_class.new(hash)
|
39
|
+
end
|
32
40
|
end
|
33
41
|
|
34
|
-
array
|
35
|
-
hash = JSON.load(json)
|
36
|
-
(element_class == Hash) ? hash : element_class.new(hash)
|
37
|
-
end
|
42
|
+
(array_class == Array) ? array : array_class.new(array)
|
38
43
|
end
|
39
44
|
|
40
|
-
#
|
45
|
+
# array_class<element_class> -> [JSON String] || JSON String
|
41
46
|
# Takes an array of element_classes and dumps them
|
42
47
|
# into JSON Strings, and returns the array of them.
|
43
48
|
#
|
44
|
-
def dump(
|
45
|
-
|
46
|
-
hash = (element_class == Hash) ? e : e.to_h
|
47
|
-
JSON.dump(hash)
|
48
|
-
end
|
49
|
+
def dump(data)
|
50
|
+
return data if data.nil?
|
49
51
|
|
50
52
|
case @column_type
|
51
53
|
when :array
|
52
|
-
|
54
|
+
data.to_a.map { |e| JSON.dump(e.to_h) }
|
53
55
|
when :string, :text
|
54
|
-
JSON.dump(
|
56
|
+
JSON.dump(data.to_a.map { |e| e.to_h })
|
55
57
|
end
|
56
58
|
end
|
57
59
|
end
|
@@ -1,296 +1,218 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe JSONArraySerializer do
|
4
|
+
let(:array) { Array.new(5, foo: 'bar', baz: 1337) }
|
5
|
+
let(:array_string) { JSON.dump(array) }
|
6
|
+
let(:serializer) { JSONArraySerializer.new }
|
4
7
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
+
describe '#load' do
|
9
|
+
it 'returns nil given nil' do
|
10
|
+
expect(serializer.load(nil)).to eq(nil)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'returns an empty array given an empty array' do
|
14
|
+
expect(serializer.load('[]')).to eq([])
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'returns an array of the same length as it\'s given' do
|
18
|
+
expect(serializer.load(array_string).length).to eq(array.length)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#dump' do
|
23
|
+
it 'returns nil given nil' do
|
24
|
+
expect(serializer.dump(nil)).to eq(nil)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'returns a string given an array' do
|
28
|
+
expect(serializer.dump(array)).to be_a(String)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'converts symbols to strings' do
|
33
|
+
symbol_array = [
|
34
|
+
{ foo: 'bar' },
|
35
|
+
{ name: 'nate', age: 21 },
|
36
|
+
{ ramble: 'rara', float: 21.13 },
|
37
|
+
{ symbol: :very_symbol },
|
38
|
+
{ hash: { 'foo' => 'bar' } },
|
39
|
+
{ symbol_hash: { foo: 'bar' } }
|
40
|
+
]
|
41
|
+
expected = symbol_array.map(&:stringify)
|
42
|
+
expect(serializer.load(serializer.dump(symbol_array))).to eq(expected)
|
8
43
|
end
|
9
44
|
|
10
|
-
context '
|
11
|
-
|
12
|
-
let(:serializer) { JSONArraySerializer.new }
|
45
|
+
context 'with default array_class (Array)' do
|
46
|
+
let(:serializer) { JSONArraySerializer.new }
|
13
47
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
48
|
+
describe '.new' do
|
49
|
+
it 'sets it\'s array class to Array' do
|
50
|
+
expect(serializer.array_class).to eq(Array)
|
18
51
|
end
|
52
|
+
end
|
19
53
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'returns an array of the same length as it\'s given' do
|
26
|
-
array = Array.new(5, "{}")
|
27
|
-
expect(serializer.load(JSON.dump(array)).length).to eq(array.length)
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'has elements that are in fact Hashs' do
|
31
|
-
array = Array.new(5, "{}")
|
32
|
-
expect(serializer.load(JSON.dump(array)).reject { |e| e.is_a? Hash }).to be_empty
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'loads arrays of JSON with data' do
|
36
|
-
array = Array.new(5, "{\"foo\":\"bar\",\"baz\":1337}")
|
37
|
-
expect(serializer.load(JSON.dump(array)).first).to eq({'foo' => 'bar', 'baz' => 1337})
|
38
|
-
end
|
54
|
+
describe '#load' do
|
55
|
+
it 'returns an instance of Array' do
|
56
|
+
expect(serializer.load(array_string)).to be_a(Array)
|
39
57
|
end
|
58
|
+
end
|
40
59
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
end
|
60
|
+
describe '#dump' do
|
61
|
+
it 'returns a string given an Array' do
|
62
|
+
expect(serializer.dump(array)).to be_a(String)
|
63
|
+
end
|
46
64
|
|
47
|
-
|
48
|
-
|
49
|
-
expect { JSON.load(serializer.dump(array)) }.not_to raise_error
|
50
|
-
end
|
65
|
+
it 'JSON can load it' do
|
66
|
+
expect { JSON.load(serializer.dump(array)) }.not_to raise_error
|
51
67
|
end
|
68
|
+
end
|
69
|
+
end
|
52
70
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
{ 'ramble' => 'rara', 'float' => 21.13 }
|
58
|
-
]
|
59
|
-
expect(serializer.load(serializer.dump(array))).to eq(array)
|
71
|
+
context 'with CustomArray array_class' do
|
72
|
+
class CustomArray
|
73
|
+
def initialize(array)
|
74
|
+
@arr = array
|
60
75
|
end
|
61
76
|
|
62
|
-
|
63
|
-
|
64
|
-
{ foo: 'bar' },
|
65
|
-
{ name: 'nate', age: 21 },
|
66
|
-
{ ramble: 'rara', float: 21.13 },
|
67
|
-
{ symbol: :very_symbol },
|
68
|
-
{ hash: { 'foo' => 'bar' } },
|
69
|
-
{ symbol_hash: { foo: 'bar' } }
|
70
|
-
]
|
71
|
-
expected = array.map(&:stringify)
|
72
|
-
expect(serializer.load(serializer.dump(array))).to eq(expected)
|
77
|
+
def to_a
|
78
|
+
@arr
|
73
79
|
end
|
74
80
|
end
|
75
81
|
|
76
|
-
|
77
|
-
let(:serializer) { JSONArraySerializer.new(OpenStruct) }
|
82
|
+
let(:serializer) { JSONArraySerializer.new(array_class: CustomArray) }
|
78
83
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
end
|
84
|
+
describe '.new' do
|
85
|
+
it 'sets it\'s array class to CustomArray' do
|
86
|
+
expect(serializer.array_class).to eq(CustomArray)
|
83
87
|
end
|
88
|
+
end
|
84
89
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
end
|
89
|
-
|
90
|
-
it 'returns an array of the same length as it\'s given' do
|
91
|
-
array = Array.new(5, "{}")
|
92
|
-
expect(serializer.load(JSON.dump(array)).length).to eq(array.length)
|
93
|
-
end
|
94
|
-
|
95
|
-
it 'has elements that are in fact OpenStructs' do
|
96
|
-
array = Array.new(5, "{}")
|
97
|
-
expect(serializer.load(JSON.dump(array)).reject { |e| e.is_a? OpenStruct }).to be_empty
|
98
|
-
end
|
99
|
-
|
100
|
-
it 'loads arrays of JSON with data' do
|
101
|
-
array = Array.new(5, "{\"foo\":\"bar\",\"baz\":1337}")
|
102
|
-
expect(serializer.load(JSON.dump(array)).first).to eq(OpenStruct.new(foo: 'bar', baz: 1337))
|
103
|
-
end
|
90
|
+
describe '#load' do
|
91
|
+
it 'returns an instance of CustomArray' do
|
92
|
+
expect(serializer.load(array_string)).to be_a(CustomArray)
|
104
93
|
end
|
94
|
+
end
|
105
95
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
96
|
+
describe '#dump' do
|
97
|
+
let(:custom_array) { CustomArray.new([{foo: 'bar'}, {}]) }
|
98
|
+
it 'returns a string given an CustomArray' do
|
99
|
+
expect(serializer.dump(custom_array)).to be_a(String)
|
100
|
+
end
|
111
101
|
|
112
|
-
|
113
|
-
|
114
|
-
expect { JSON.load(serializer.dump(array)) }.not_to raise_error
|
115
|
-
end
|
102
|
+
it 'JSON can load it' do
|
103
|
+
expect { JSON.load(serializer.dump(custom_array)) }.not_to raise_error
|
116
104
|
end
|
105
|
+
end
|
106
|
+
end
|
117
107
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
expect(serializer.load(serializer.dump(array))).to eq(array)
|
108
|
+
context 'with default element_class (Hash)' do
|
109
|
+
let(:serializer) { JSONArraySerializer.new }
|
110
|
+
|
111
|
+
describe '.new' do
|
112
|
+
it 'sets it\'s element class to a Hash' do
|
113
|
+
expect(serializer.element_class).to eq(Hash)
|
125
114
|
end
|
115
|
+
end
|
126
116
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
OpenStruct.new(name: 'nate', age: 21),
|
131
|
-
OpenStruct.new(ramble: 'rara', float: 21.13),
|
132
|
-
OpenStruct.new(symbol: :very_symbol),
|
133
|
-
OpenStruct.new(hash: { 'foo' => 'bar' }),
|
134
|
-
OpenStruct.new(symbol_hash: { foo: 'bar' })
|
135
|
-
]
|
136
|
-
expected = array.map(&:stringify_values)
|
137
|
-
expect(serializer.load(serializer.dump(array))).to eq(expected)
|
117
|
+
describe '#load' do
|
118
|
+
it 'has elements that are in fact Hashs' do
|
119
|
+
expect(serializer.load(array_string).reject { |e| e.is_a? Hash }).to be_empty
|
138
120
|
end
|
139
121
|
end
|
140
|
-
end
|
141
122
|
|
142
|
-
|
143
|
-
|
144
|
-
|
123
|
+
describe '#dump' do
|
124
|
+
it 'returns a string given an array of hashes' do
|
125
|
+
expect(serializer.dump(array)).to be_a(String)
|
126
|
+
end
|
145
127
|
|
146
|
-
|
147
|
-
|
148
|
-
expect(serializer.element_class).to eq(Hash)
|
149
|
-
end
|
128
|
+
it 'JSON can load it' do
|
129
|
+
expect { JSON.load(serializer.dump(array)) }.not_to raise_error
|
150
130
|
end
|
131
|
+
end
|
151
132
|
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
array = Array.new(5, "{\"foo\":\"bar\",\"baz\":1337}")
|
169
|
-
expect(serializer.load(array).first).to eq({'foo' => 'bar', 'baz' => 1337})
|
170
|
-
end
|
133
|
+
it 'dumps and loads equivalent arrays' do
|
134
|
+
hash_array = [
|
135
|
+
{ 'foo' => 'bar' },
|
136
|
+
{ 'name' => 'nate', 'age' => 21 },
|
137
|
+
{ 'ramble' => 'rara', 'float' => 21.13 }
|
138
|
+
]
|
139
|
+
expect(serializer.load(serializer.dump(hash_array))).to eq(hash_array)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
context 'with OpenStruct element_class' do
|
144
|
+
let(:serializer) { JSONArraySerializer.new(element_class: OpenStruct) }
|
145
|
+
|
146
|
+
describe '.new' do
|
147
|
+
it 'sets it\'s element class to a OpenStruct' do
|
148
|
+
expect(serializer.element_class).to eq(OpenStruct)
|
171
149
|
end
|
150
|
+
end
|
172
151
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
end
|
177
|
-
|
178
|
-
it 'returns an array of the same length as it\'s given' do
|
179
|
-
array = Array.new(5, {})
|
180
|
-
expect(serializer.dump(array).length).to eq(array.length)
|
181
|
-
end
|
182
|
-
|
183
|
-
it 'has elements that are JSON strings' do
|
184
|
-
array = Array.new(5, {foo: 'bar'})
|
185
|
-
expect {
|
186
|
-
serializer.dump(array).map { |e| JSON.load(e) }
|
187
|
-
}.not_to raise_error
|
188
|
-
end
|
189
|
-
|
190
|
-
it 'dumps hashes with data' do
|
191
|
-
array = Array.new(5, {foo: 'bar', baz: 1337})
|
192
|
-
expect(serializer.dump(array).first).to eq("{\"foo\":\"bar\",\"baz\":1337}")
|
193
|
-
end
|
152
|
+
describe '#load' do
|
153
|
+
it 'has elements that are in fact OpenStructs' do
|
154
|
+
expect(serializer.load(array_string).reject { |e| e.is_a? OpenStruct }).to be_empty
|
194
155
|
end
|
156
|
+
end
|
195
157
|
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
{ 'name' => 'nate', 'age' => 21 },
|
200
|
-
{ 'ramble' => 'rara', 'float' => 21.13 }
|
201
|
-
]
|
202
|
-
expect(serializer.load(serializer.dump(array))).to eq(array)
|
158
|
+
describe '#dump' do
|
159
|
+
it 'returns a string given an array of OpenStructs' do
|
160
|
+
expect(serializer.dump(array)).to be_a(String)
|
203
161
|
end
|
204
162
|
|
205
|
-
it '
|
206
|
-
array
|
207
|
-
{ foo: 'bar' },
|
208
|
-
{ name: 'nate', age: 21 },
|
209
|
-
{ ramble: 'rara', float: 21.13 },
|
210
|
-
{ symbol: :very_symbol },
|
211
|
-
{ hash: { 'foo' => 'bar' } },
|
212
|
-
{ symbol_hash: { foo: 'bar' } }
|
213
|
-
]
|
214
|
-
expected = array.map(&:stringify)
|
215
|
-
expect(serializer.load(serializer.dump(array))).to eq(expected)
|
163
|
+
it 'JSON can load it' do
|
164
|
+
expect { JSON.load(serializer.dump(array)) }.not_to raise_error
|
216
165
|
end
|
217
166
|
end
|
218
167
|
|
219
|
-
|
220
|
-
|
168
|
+
it 'dumps and loads equivalent arrays' do
|
169
|
+
open_struct_array = [
|
170
|
+
OpenStruct.new('foo' => 'bar'),
|
171
|
+
OpenStruct.new('name' => 'nate', 'age' => 21),
|
172
|
+
OpenStruct.new('ramble' => 'rara', 'float' => 21.13)
|
173
|
+
]
|
174
|
+
expect(serializer.load(serializer.dump(open_struct_array))).to eq(open_struct_array)
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
context 'with string/text column_type' do
|
179
|
+
let(:serializer) { JSONArraySerializer.new(column_type: :text) }
|
180
|
+
|
181
|
+
describe '#load' do
|
182
|
+
it 'loads arrays of JSON with data' do
|
183
|
+
expect(serializer.load(array_string).first).to eq({'foo' => 'bar', 'baz' => 1337})
|
184
|
+
end
|
185
|
+
end
|
221
186
|
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
end
|
187
|
+
describe '#dump' do
|
188
|
+
it 'returns a string given an array' do
|
189
|
+
expect(serializer.dump(array)).to be_a(String)
|
226
190
|
end
|
227
191
|
|
228
|
-
|
229
|
-
|
230
|
-
expect(serializer.load([])).to eq([])
|
231
|
-
end
|
232
|
-
|
233
|
-
it 'returns an array of the same length as it\'s given' do
|
234
|
-
array = Array.new(5, "{}")
|
235
|
-
expect(serializer.load(array).length).to eq(array.length)
|
236
|
-
end
|
237
|
-
|
238
|
-
it 'has elements that are in fact OpenStructs' do
|
239
|
-
array = Array.new(5, "{}")
|
240
|
-
expect(serializer.load(array).reject { |e| e.is_a? OpenStruct }).to be_empty
|
241
|
-
end
|
242
|
-
|
243
|
-
it 'loads arrays of JSON with data' do
|
244
|
-
array = Array.new(5, "{\"foo\":\"bar\",\"baz\":1337}")
|
245
|
-
expect(serializer.load(array).first).to eq(OpenStruct.new(foo: 'bar', baz: 1337))
|
246
|
-
end
|
192
|
+
it 'JSON can load it' do
|
193
|
+
expect { JSON.load(serializer.dump(array)) }.not_to raise_error
|
247
194
|
end
|
195
|
+
end
|
196
|
+
end
|
248
197
|
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
expect(serializer.dump(array).length).to eq(array.length)
|
257
|
-
end
|
258
|
-
|
259
|
-
it 'has elements that are JSON strings' do
|
260
|
-
array = Array.new(5, OpenStruct.new({foo: 'bar'}))
|
261
|
-
expect {
|
262
|
-
serializer.dump(array).map { |e| JSON.load(e) }
|
263
|
-
}.not_to raise_error
|
264
|
-
end
|
265
|
-
|
266
|
-
it 'dumps OpenStructs with data' do
|
267
|
-
array = Array.new(5, OpenStruct.new(foo: 'bar', baz: 1337))
|
268
|
-
expect(serializer.dump(array).first).to eq("{\"foo\":\"bar\",\"baz\":1337}")
|
269
|
-
end
|
198
|
+
context 'with array column_type' do
|
199
|
+
let(:serializer) { JSONArraySerializer.new(column_type: :array) }
|
200
|
+
let(:array_of_json) { Array.new(5, JSON.dump(foo: 'bar', baz: 1337)) }
|
201
|
+
|
202
|
+
describe '#load' do
|
203
|
+
it 'loads arrays of JSON with data' do
|
204
|
+
expect(serializer.load(array_of_json).first).to eq({'foo' => 'bar', 'baz' => 1337})
|
270
205
|
end
|
206
|
+
end
|
271
207
|
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
OpenStruct.new('name' => 'nate', 'age' => 21),
|
276
|
-
OpenStruct.new('ramble' => 'rara', 'float' => 21.13),
|
277
|
-
OpenStruct.new(symbol: 'rara', 'float' => 21.13)
|
278
|
-
]
|
279
|
-
expect(serializer.load(serializer.dump(array))).to eq(array)
|
208
|
+
describe '#dump' do
|
209
|
+
it 'returns an array given an array' do
|
210
|
+
expect(serializer.dump(array)).to be_a(Array)
|
280
211
|
end
|
281
212
|
|
282
|
-
it '
|
283
|
-
array
|
284
|
-
OpenStruct.new(foo: 'bar'),
|
285
|
-
OpenStruct.new(name: 'nate', age: 21),
|
286
|
-
OpenStruct.new(ramble: 'rara', float: 21.13),
|
287
|
-
OpenStruct.new(symbol: :very_symbol),
|
288
|
-
OpenStruct.new(hash: { 'foo' => 'bar' }),
|
289
|
-
OpenStruct.new(symbol_hash: { foo: 'bar' })
|
290
|
-
]
|
291
|
-
expected = array.map(&:stringify_values)
|
292
|
-
expect(serializer.load(serializer.dump(array))).to eq(expected)
|
213
|
+
it 'JSON can load it\'s elements' do
|
214
|
+
expect { serializer.dump(array).each { |s| JSON.load(s) } }.not_to raise_error
|
293
215
|
end
|
294
216
|
end
|
295
217
|
end
|
296
|
-
end
|
218
|
+
end
|