ixtlan-babel 0.1.2 → 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.
@@ -0,0 +1,167 @@
1
+ require 'spec_helper'
2
+ require 'virtus'
3
+
4
+ class Address
5
+ include Virtus
6
+
7
+ attribute :street, String
8
+ attribute :zipcode, String
9
+ end
10
+ class Area
11
+ include Virtus
12
+
13
+ attribute :code, String
14
+ attribute :iso, String
15
+ end
16
+ class PhoneNumber
17
+ include Virtus
18
+
19
+ attribute :prefix, Integer
20
+ attribute :number, String
21
+ attribute :area, Area
22
+ end
23
+ class Person
24
+ include Virtus
25
+
26
+ attribute :id, String
27
+ attribute :name, String
28
+ attribute :address, Address
29
+ attribute :phone_numbers, Array[PhoneNumber]
30
+ end
31
+
32
+ describe Ixtlan::Babel::ModelFilter do
33
+ let( :person ) do
34
+ Person.new(
35
+ :id => 987,
36
+ :name => 'me and the corner',
37
+ :address => Address.new( :street => 'Foo 12', :zipcode => '12345' ),
38
+ :phone_numbers => [PhoneNumber.new(
39
+ :prefix => 12,
40
+ :number => '123',
41
+ :area => Area.new( :code => '001', :iso => 'us' )
42
+ )]
43
+ )
44
+ end
45
+
46
+ let(:serializer) { Ixtlan::Babel::Serializer.new( person ) }
47
+ let(:deserializer) { Ixtlan::Babel::Deserializer.new( Person ) }
48
+
49
+ it 'should serialize and deserialize without root' do
50
+ json = serializer.to_json
51
+ result = deserializer.from_json(json)
52
+ attributes = result.attributes.delete_if { |k,v| v.nil? }
53
+ attributes.must_equal Hash[:id => person['id'], :name => person['name']]
54
+ end
55
+
56
+ it 'should serialize and deserialize with root' do
57
+ json = serializer.to_json :root => :my
58
+ result = deserializer.from_json(json, :root => :my)
59
+ attributes = result.attributes.delete_if { |k,v| v.nil? }
60
+ attributes.must_equal Hash[:id => person['id'], :name => person['name']]
61
+ end
62
+
63
+ it 'should serialize and deserialize a hash with include list' do
64
+ json = serializer.to_json(:include => ['address', 'phone_numbers'])
65
+ result = deserializer.from_json(json, :include => ['address', 'phone_numbers'])
66
+ result.object_id.wont_equal person.object_id
67
+ result.address.attributes.must_equal person.address.attributes
68
+ result.phone_numbers[0].area.must_be_nil
69
+ person.phone_numbers[0].area = nil
70
+ result.phone_numbers[0].attributes.must_equal person.phone_numbers[0].attributes
71
+ result.name.must_equal person.name
72
+ result.id.must_equal person.id
73
+ end
74
+
75
+ it 'shouldserialize and deserialize with except' do
76
+ json = serializer.to_json(:except => ['id'])
77
+ result = deserializer.from_json(json, :except => ['id'])
78
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :phone_numbers=>nil, :id => nil]
79
+ result = deserializer.from_json(json)
80
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :phone_numbers=>nil, :id => nil]
81
+ end
82
+
83
+ it 'should serialize and deserialize with only' do
84
+ json = serializer.to_json(:only => ['name'])
85
+ result = deserializer.from_json(json, :only => ['name'])
86
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :phone_numbers=>nil, :id => nil]
87
+ result = deserializer.from_json(json)
88
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :phone_numbers=>nil, :id => nil]
89
+ end
90
+
91
+ it 'should serialize and deserialize with nested only' do
92
+ json = serializer.to_json(:include => { 'address' => {:only => ['street']}})
93
+ result = deserializer.from_json(json, :include => { 'address' => {:only => ['street']}})
94
+
95
+ result.phone_numbers.must_be_nil
96
+ result.phone_numbers = nil
97
+ person.phone_numbers = nil
98
+
99
+ result.address.zipcode.must_be_nil
100
+ result.address.zipcode = nil
101
+ person.address.zipcode = nil
102
+
103
+ result.name.must_equal person.name
104
+ result.id.must_equal person.id
105
+ end
106
+
107
+ it 'should serialize and deserialize with nested only (array includes)' do
108
+ json = serializer.to_json(:include => { 'address' => {:only => ['street']}})
109
+ result = deserializer.from_json(json, :include => ['address'])
110
+
111
+ result.phone_numbers.must_be_nil
112
+ result.phone_numbers = nil
113
+ person.phone_numbers = nil
114
+
115
+ result.address.zipcode.must_be_nil
116
+ result.address.zipcode = nil
117
+ person.address.zipcode = nil
118
+
119
+ result.name.must_equal person.name
120
+ result.id.must_equal person.id
121
+ end
122
+
123
+ it 'should serialize and deserialize with nested except' do
124
+ json = serializer.to_json(:include => { 'address' => {:except => ['zipcode']}})
125
+ result = deserializer.from_json(json, :include => { 'address' => {:except => ['zipcode']}})
126
+
127
+ result.phone_numbers.must_be_nil
128
+ result.phone_numbers = nil
129
+ person.phone_numbers = nil
130
+
131
+ result.address.zipcode.must_be_nil
132
+ result.address.zipcode = nil
133
+ person.address.zipcode = nil
134
+
135
+ result.name.must_equal person.name
136
+ result.id.must_equal person.id
137
+ end
138
+
139
+ it 'should serialize and deserialize with nested except (array includes)' do
140
+ json = serializer.to_json(:include => { 'address' => {:except => ['zipcode']}})
141
+ result = deserializer.from_json(json, :include => ['address'])
142
+
143
+ result.phone_numbers.must_be_nil
144
+ result.phone_numbers = nil
145
+ person.phone_numbers = nil
146
+
147
+ result.address.zipcode.must_be_nil
148
+ result.address.zipcode = nil
149
+ person.address.zipcode = nil
150
+
151
+ result.name.must_equal person.name
152
+ result.id.must_equal person.id
153
+ end
154
+
155
+ it 'should serialize and deserialize with nested include' do
156
+ json = serializer.to_json(:include => { 'address' => {}, 'phone_numbers' => { :include => ['area']}})
157
+ result = deserializer.from_json(json, :include => { 'address' => {}, 'phone_numbers' => { :include => ['area']}})
158
+
159
+ result.object_id.wont_equal person.object_id
160
+ result.address.attributes.must_equal person.address.attributes
161
+ result.phone_numbers[0].area.attributes.must_equal person.phone_numbers[0].area.attributes
162
+ result.phone_numbers[0].prefix.must_equal person.phone_numbers[0].prefix
163
+ result.phone_numbers[0].number.must_equal person.phone_numbers[0].number
164
+ result.name.must_equal person.name
165
+ result.id.must_equal person.id
166
+ end
167
+ end
@@ -0,0 +1,184 @@
1
+ require 'spec_helper'
2
+ require 'virtus'
3
+
4
+ class Address2
5
+ include Virtus
6
+
7
+ attribute :street, String
8
+ attribute :zipcode, String
9
+ end
10
+ class Area2
11
+ include Virtus
12
+
13
+ attribute :code, String
14
+ attribute :iso, String
15
+ end
16
+ class PhoneNumber2
17
+ include Virtus
18
+
19
+ attribute :prefix, Integer
20
+ attribute :number, String
21
+ attribute :area, Area2
22
+ end
23
+ class Person2
24
+ include Virtus
25
+
26
+ attribute :id, String
27
+ attribute :name, String
28
+ attribute :address, Address2
29
+
30
+ attr_accessor :phone_numbers, :age, :children_names
31
+
32
+ def phone_numbers
33
+ @phone_numbers ||= [PhoneNumber2.new(
34
+ :prefix => 12,
35
+ :number => '123',
36
+ :area => Area2.new( :code => '001', :iso => 'us' ) )]
37
+ end
38
+
39
+ def age
40
+ @age ||= 123
41
+ end
42
+
43
+ def children_names
44
+ @children_names ||= ['anna', 'jack', 'rama', 'mia']
45
+ end
46
+
47
+ def children_ages
48
+ @children_ages ||= [12, 3, 6, 9]
49
+ end
50
+ end
51
+
52
+ describe Ixtlan::Babel::ModelFilter.to_s + ':with_methods' do
53
+ let( :person ) do
54
+ Person2.new( :id => 987,
55
+ :name => 'me and the corner',
56
+ :address => Address2.new( :street => 'Foo 12', :zipcode => '12345' ) )
57
+ end
58
+
59
+ let(:serializer) { Ixtlan::Babel::Serializer.new( person ) }
60
+ let(:deserializer) { Ixtlan::Babel::Deserializer.new( Person2 ) }
61
+
62
+ it 'should serialize and deserialize with methods' do
63
+ json = serializer.to_json(:include => [:age, :children_names, :children_ages])
64
+ data = JSON.parse(json)
65
+ data['age'].must_equal 123
66
+ data['children_names'].must_equal ['anna', 'jack', 'rama', 'mia']
67
+ data['children_ages'].must_equal [12, 3, 6, 9]
68
+ result = deserializer.from_json(json)
69
+ attributes = result.attributes.delete_if { |k,v| v.nil? }
70
+ attributes.must_equal Hash[:id => person['id'], :name => person['name']]
71
+ end
72
+
73
+ it 'should serialize and deserialize without root' do
74
+ json = serializer.to_json
75
+ result = deserializer.from_json(json)
76
+ attributes = result.attributes.delete_if { |k,v| v.nil? }
77
+ attributes.must_equal Hash[:id => person['id'], :name => person['name']]
78
+ end
79
+
80
+ it 'should serialize and deserialize with root' do
81
+ json = serializer.to_json :root => 'my'
82
+ result = deserializer.from_json(json, :root => 'my')
83
+ attributes = result.attributes.delete_if { |k,v| v.nil? }
84
+ attributes.must_equal Hash[:id => person['id'], :name => person['name']]
85
+ end
86
+
87
+ it 'should serialize and deserialize a hash with include list' do
88
+ json = serializer.to_json(:include => ['address', 'phone_numbers'])
89
+ data = JSON.parse(json)
90
+ data['phone_numbers'][0]['prefix'].must_equal 12
91
+ data['phone_numbers'][0]['number'].must_equal '123'
92
+ result = deserializer.from_json(json, :include => ['address', 'phone_numbers'])
93
+ result.object_id.wont_equal person.object_id
94
+ result.address.attributes.must_equal person.address.attributes
95
+ result.phone_numbers[0].area.must_be_nil
96
+ person.phone_numbers[0].area = nil
97
+ result.phone_numbers[0].prefix.must_equal person.phone_numbers[0].prefix
98
+ result.phone_numbers[0].number.must_equal person.phone_numbers[0].number
99
+ result.name.must_equal person.name
100
+ result.id.must_equal person.id
101
+ end
102
+
103
+ it 'shouldserialize and deserialize with except' do
104
+ json = serializer.to_json(:except => ['id'])
105
+ result = deserializer.from_json(json, :except => ['id'])
106
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :id => nil]
107
+ result = deserializer.from_json(json)
108
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :id => nil]
109
+ end
110
+
111
+ it 'should serialize and deserialize with only' do
112
+ json = serializer.to_json(:only => ['name'])
113
+ result = deserializer.from_json(json, :only => ['name'])
114
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :id => nil]
115
+ result = deserializer.from_json(json)
116
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :id => nil]
117
+ end
118
+
119
+ it 'should serialize and deserialize with nested only' do
120
+ json = serializer.to_json(:include => { 'address' => {:only => ['street']}})
121
+ result = deserializer.from_json(json, :include => { 'address' => {:only => ['street']}})
122
+
123
+ json['phone_numbers'].must_be_nil
124
+ json['address']['zipcode'].must_be_nil
125
+
126
+ result.address.zipcode.must_be_nil
127
+
128
+ result.name.must_equal person.name
129
+ result.id.must_equal person.id
130
+ end
131
+
132
+ it 'should serialize and deserialize with nested only (array includes)' do
133
+ json = serializer.to_json(:include => { 'address' => {:only => ['street']}})
134
+ result = deserializer.from_json(json, :include => ['address'])
135
+
136
+ json['phone_numbers'].must_be_nil
137
+ json['address']['zipcode'].must_be_nil
138
+
139
+ result.address.zipcode.must_be_nil
140
+
141
+ result.name.must_equal person.name
142
+ result.id.must_equal person.id
143
+ end
144
+
145
+ it 'should serialize and deserialize with nested except' do
146
+ json = serializer.to_json(:include => { 'address' => {:except => ['zipcode']}})
147
+ result = deserializer.from_json(json, :include => { 'address' => {:except => ['zipcode']}})
148
+
149
+ json['phone_numbers'].must_be_nil
150
+ json['address']['zipcode'].must_be_nil
151
+
152
+ result.address.zipcode.must_be_nil
153
+
154
+ result.name.must_equal person.name
155
+ result.id.must_equal person.id
156
+ end
157
+
158
+ it 'should serialize and deserialize with nested except (array includes)' do
159
+ json = serializer.to_json(:include => { 'address' => {:except => ['zipcode']}})
160
+ result = deserializer.from_json(json, :include => ['address'])
161
+
162
+ json['phone_numbers'].must_be_nil
163
+ json['address']['zipcode'].must_be_nil
164
+
165
+ result.address.zipcode.must_be_nil
166
+
167
+ result.name.must_equal person.name
168
+ result.id.must_equal person.id
169
+ end
170
+
171
+ it 'should serialize and deserialize with nested include' do
172
+ json = serializer.to_json(:include => { 'address' => {}, 'phone_numbers' => { :include => ['area']}})
173
+ result = deserializer.from_json(json, :include => { 'address' => {}, 'phone_numbers' => { :include => ['area']}})
174
+
175
+ result.object_id.wont_equal person.object_id
176
+ result.address.attributes.must_equal person.address.attributes
177
+ result.phone_numbers[0].area.code.must_equal person.phone_numbers[0].area.code
178
+ result.phone_numbers[0].area.iso.must_equal person.phone_numbers[0].area.iso
179
+ result.phone_numbers[0].prefix.must_equal person.phone_numbers[0].prefix
180
+ result.phone_numbers[0].number.must_equal person.phone_numbers[0].number
181
+ result.name.must_equal person.name
182
+ result.id.must_equal person.id
183
+ end
184
+ end
@@ -0,0 +1,170 @@
1
+ require 'spec_helper'
2
+ require 'virtus'
3
+
4
+ class Address
5
+ include Virtus
6
+
7
+ attribute :street, String
8
+ attribute :zipcode, String
9
+ end
10
+ class Area
11
+ include Virtus
12
+
13
+ attribute :code, String
14
+ attribute :iso, String
15
+ end
16
+ class PhoneNumber
17
+ include Virtus
18
+
19
+ attribute :prefix, Integer
20
+ attribute :number, String
21
+ attribute :area, Area
22
+ end
23
+ class Person
24
+ include Virtus
25
+
26
+ attribute :id, String
27
+ attribute :name, String
28
+ attribute :address, Address
29
+
30
+ def phone_numbers
31
+ [PhoneNumber.new(
32
+ :prefix => 12,
33
+ :number => '123',
34
+ :area => Area.new( :code => '001', :iso => 'us' )]
35
+ end
36
+
37
+ def age
38
+ 123
39
+ end
40
+ end
41
+
42
+ describe Ixtlan::Babel::ModelFilter + ':with_methods' do
43
+ let( :person ) do
44
+ Person.new( :id => 987,
45
+ :name => 'me and the corner',
46
+ :address => Address.new( :street => 'Foo 12', :zipcode => '12345' ) )
47
+ end
48
+
49
+ let(:serializer) { Ixtlan::Babel::Serializer.new( person ) }
50
+ let(:deserializer) { Ixtlan::Babel::Deserializer.new( Person ) }
51
+
52
+ it 'should serialize and deserialize without root' do
53
+ json = serializer.to_json
54
+ result = deserializer.from_json(json)
55
+ attributes = result.attributes.delete_if { |k,v| v.nil? }
56
+ attributes.must_equal Hash[:id => person['id'], :name => person['name']]
57
+ end
58
+
59
+ it 'should serialize and deserialize with root' do
60
+ json = serializer.to_json :root => :my
61
+ result = deserializer.from_json(json, :root => :my)
62
+ attributes = result.attributes.delete_if { |k,v| v.nil? }
63
+ attributes.must_equal Hash[:id => person['id'], :name => person['name']]
64
+ end
65
+
66
+ it 'should serialize and deserialize a hash with include list' do
67
+ json = serializer.to_json(:include => ['address', 'phone_numbers'])
68
+ result = deserializer.from_json(json, :include => ['address', 'phone_numbers'])
69
+ result.object_id.wont_equal person.object_id
70
+ result.address.attributes.must_equal person.address.attributes
71
+ result.phone_numbers[0].area.must_be_nil
72
+ person.phone_numbers[0].area = nil
73
+ result.phone_numbers[0].attributes.must_equal person.phone_numbers[0].attributes
74
+ result.name.must_equal person.name
75
+ result.id.must_equal person.id
76
+ end
77
+
78
+ it 'shouldserialize and deserialize with except' do
79
+ json = serializer.to_json(:except => ['id'])
80
+ result = deserializer.from_json(json, :except => ['id'])
81
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :phone_numbers=>nil, :id => nil]
82
+ result = deserializer.from_json(json)
83
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :phone_numbers=>nil, :id => nil]
84
+ end
85
+
86
+ it 'should serialize and deserialize with only' do
87
+ json = serializer.to_json(:only => ['name'])
88
+ result = deserializer.from_json(json, :only => ['name'])
89
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :phone_numbers=>nil, :id => nil]
90
+ result = deserializer.from_json(json)
91
+ result.attributes.must_equal Hash[:name => person['name'], :address=>nil, :phone_numbers=>nil, :id => nil]
92
+ end
93
+
94
+ it 'should serialize and deserialize with nested only' do
95
+ json = serializer.to_json(:include => { 'address' => {:only => ['street']}})
96
+ result = deserializer.from_json(json, :include => { 'address' => {:only => ['street']}})
97
+
98
+ result.phone_numbers.must_be_nil
99
+ result.phone_numbers = nil
100
+ person.phone_numbers = nil
101
+
102
+ result.address.zipcode.must_be_nil
103
+ result.address.zipcode = nil
104
+ person.address.zipcode = nil
105
+
106
+ result.name.must_equal person.name
107
+ result.id.must_equal person.id
108
+ end
109
+
110
+ it 'should serialize and deserialize with nested only (array includes)' do
111
+ json = serializer.to_json(:include => { 'address' => {:only => ['street']}})
112
+ result = deserializer.from_json(json, :include => ['address'])
113
+
114
+ result.phone_numbers.must_be_nil
115
+ result.phone_numbers = nil
116
+ person.phone_numbers = nil
117
+
118
+ result.address.zipcode.must_be_nil
119
+ result.address.zipcode = nil
120
+ person.address.zipcode = nil
121
+
122
+ result.name.must_equal person.name
123
+ result.id.must_equal person.id
124
+ end
125
+
126
+ it 'should serialize and deserialize with nested except' do
127
+ json = serializer.to_json(:include => { 'address' => {:except => ['zipcode']}})
128
+ result = deserializer.from_json(json, :include => { 'address' => {:except => ['zipcode']}})
129
+
130
+ result.phone_numbers.must_be_nil
131
+ result.phone_numbers = nil
132
+ person.phone_numbers = nil
133
+
134
+ result.address.zipcode.must_be_nil
135
+ result.address.zipcode = nil
136
+ person.address.zipcode = nil
137
+
138
+ result.name.must_equal person.name
139
+ result.id.must_equal person.id
140
+ end
141
+
142
+ it 'should serialize and deserialize with nested except (array includes)' do
143
+ json = serializer.to_json(:include => { 'address' => {:except => ['zipcode']}})
144
+ result = deserializer.from_json(json, :include => ['address'])
145
+
146
+ result.phone_numbers.must_be_nil
147
+ result.phone_numbers = nil
148
+ person.phone_numbers = nil
149
+
150
+ result.address.zipcode.must_be_nil
151
+ result.address.zipcode = nil
152
+ person.address.zipcode = nil
153
+
154
+ result.name.must_equal person.name
155
+ result.id.must_equal person.id
156
+ end
157
+
158
+ it 'should serialize and deserialize with nested include' do
159
+ json = serializer.to_json(:include => { 'address' => {}, 'phone_numbers' => { :include => ['area']}})
160
+ result = deserializer.from_json(json, :include => { 'address' => {}, 'phone_numbers' => { :include => ['area']}})
161
+
162
+ result.object_id.wont_equal person.object_id
163
+ result.address.attributes.must_equal person.address.attributes
164
+ result.phone_numbers[0].area.attributes.must_equal person.phone_numbers[0].area.attributes
165
+ result.phone_numbers[0].prefix.must_equal person.phone_numbers[0].prefix
166
+ result.phone_numbers[0].number.must_equal person.phone_numbers[0].number
167
+ result.name.must_equal person.name
168
+ result.id.must_equal person.id
169
+ end
170
+ end