json_array_serializer 0.0.2 → 0.0.3
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/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
|