ixtlan-babel 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/ixtlan/babel/factory.rb +3 -3
- data/lib/ixtlan/babel/hash_filter.rb +2 -2
- data/lib/ixtlan/babel/model_filter.rb +2 -2
- data/lib/ixtlan/babel/params_filter.rb +10 -3
- data/spec/#model_filter_spec.rb# +211 -0
- data/spec/hash_filter_spec.rb +7 -0
- data/spec/model_filter_spec.rb +9 -1
- data/spec/params_filter_spec.rb +1 -1
- metadata +3 -2
data/lib/ixtlan/babel/factory.rb
CHANGED
@@ -22,14 +22,14 @@ module Ixtlan
|
|
22
22
|
module Babel
|
23
23
|
class Factory
|
24
24
|
|
25
|
-
NANOSECONDS_IN_DAY =
|
25
|
+
NANOSECONDS_IN_DAY = 86400*10**6
|
26
26
|
|
27
27
|
TIME_TO_S = Proc.new do |t|
|
28
28
|
t.strftime('%Y-%m-%dT%H:%M:%S.') + ("%06d" % t.usec) + t.strftime('%z')
|
29
29
|
end
|
30
30
|
|
31
31
|
DATE_TIME_TO_S = Proc.new do |dt|
|
32
|
-
dt.strftime('%Y-%m-%dT%H:%M:%S.') + ("%06d" % (dt.sec_fraction
|
32
|
+
dt.strftime('%Y-%m-%dT%H:%M:%S.') + ("%06d" % (dt.sec_fraction * NANOSECONDS_IN_DAY ) ) + dt.strftime('%z')
|
33
33
|
end
|
34
34
|
|
35
35
|
DEFAULT_MAP = {
|
@@ -89,4 +89,4 @@ module Ixtlan
|
|
89
89
|
end
|
90
90
|
end
|
91
91
|
end
|
92
|
-
end
|
92
|
+
end
|
@@ -59,14 +59,21 @@ module Ixtlan
|
|
59
59
|
@context_or_options = context_or_options
|
60
60
|
self
|
61
61
|
end
|
62
|
+
|
62
63
|
def filter_it( data )
|
63
64
|
filter.options = self.class.config.single_options( @context_or_options )
|
65
|
+
data = data.dup
|
64
66
|
data = data[ filter.options[ :root ] ] if filter.options[ :root ]
|
65
67
|
keeps = {}
|
66
68
|
( filter.options[ :keep ] || [] ).each do |k|
|
67
|
-
|
69
|
+
keep = data[ k.to_s ] || data[ k.to_sym ]
|
70
|
+
keeps[ k.to_s ] = data.delete( k.to_s ) || data.delete( k.to_sym ) unless keep.is_a? Hash
|
71
|
+
end
|
72
|
+
filtered_data = filter.filter( data )
|
73
|
+
( filter.options[ :keep ] || [] ).each do |k|
|
74
|
+
keeps[ k.to_s ] = filtered_data.delete( k.to_s ) || filtered_data.delete( k.to_sym ) unless keeps.member?( k.to_s )
|
68
75
|
end
|
69
|
-
[
|
76
|
+
[ filtered_data, keeps ]
|
70
77
|
end
|
71
78
|
|
72
79
|
def new( data )
|
@@ -74,4 +81,4 @@ module Ixtlan
|
|
74
81
|
end
|
75
82
|
end
|
76
83
|
end
|
77
|
-
end
|
84
|
+
end
|
@@ -0,0 +1,211 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'virtus'
|
3
|
+
require 'ixtlan/babel/deserializer'
|
4
|
+
|
5
|
+
class Address
|
6
|
+
include Virtus
|
7
|
+
|
8
|
+
attribute :street, String
|
9
|
+
attribute :zipcode, String
|
10
|
+
end
|
11
|
+
class Area
|
12
|
+
include Virtus
|
13
|
+
|
14
|
+
attribute :code, String
|
15
|
+
attribute :iso, String
|
16
|
+
end
|
17
|
+
class PhoneNumber
|
18
|
+
include Virtus
|
19
|
+
|
20
|
+
attribute :prefix, Integer
|
21
|
+
attribute :number, String
|
22
|
+
attribute :area, Area
|
23
|
+
end
|
24
|
+
class Person
|
25
|
+
include Virtus
|
26
|
+
|
27
|
+
attribute :id, String
|
28
|
+
attribute :name, String
|
29
|
+
attribute :address, Address
|
30
|
+
attribute :phone_numbers, Array[PhoneNumber]
|
31
|
+
attribute :children_names, Array[Symbol]
|
32
|
+
end
|
33
|
+
|
34
|
+
describe Ixtlan::Babel::ModelFilter do
|
35
|
+
let( :person ) do
|
36
|
+
Person.new(
|
37
|
+
:id => 987,
|
38
|
+
:name => 'me and the corner',
|
39
|
+
:address => Address.new( :street => 'Foo 12', :zipcode => '12345' ),
|
40
|
+
:phone_numbers => [PhoneNumber.new(
|
41
|
+
:prefix => 12,
|
42
|
+
:number => '123',
|
43
|
+
:area => Area.new( :code => '001', :iso => 'us' )
|
44
|
+
)],
|
45
|
+
# # :children_names => [:adi, :aromal, :shreedev]
|
46
|
+
# # )
|
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
|
+
|
56
|
+
# # # travis produces [] and locally there is a nil - filter empty as well :(
|
57
|
+
|
58
|
+
attributes = result.attributes.delete_if { |k,v| v.nil? || v.empty? }
|
59
|
+
|
60
|
+
attributes.must_equal Hash[:id => person['id'], :name => person['name']]
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'should serialize and deserialize with root' do
|
64
|
+
json = serializer.to_json :root => 'my'
|
65
|
+
result = deserializer.from_json(json, :root => 'my')
|
66
|
+
|
67
|
+
# travis produces [] and locally there is a nil - filter empty as well :(
|
68
|
+
attributes = result.attributes.delete_if { |k,v| v.nil? || v.empty? }
|
69
|
+
|
70
|
+
attributes.must_equal Hash[:id => person['id'], :name => person['name']]
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'should serialize and deserialize a hash with include list' do
|
74
|
+
json = serializer.to_json(:include => ['address', 'phone_numbers'])
|
75
|
+
result = deserializer.from_json(json, :include => ['address', 'phone_numbers'])
|
76
|
+
result.object_id.wont_equal person.object_id
|
77
|
+
result.address.attributes.must_equal person.address.attributes
|
78
|
+
result.phone_numbers[0].area.must_be_nil
|
79
|
+
person.phone_numbers[0].area = nil
|
80
|
+
result.phone_numbers[0].attributes.must_equal person.phone_numbers[0].attributes
|
81
|
+
result.name.must_equal person.name
|
82
|
+
result.id.must_equal person.id
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'should serialize and deserialize with except' do
|
86
|
+
json = serializer.to_json(:except => ['id'])
|
87
|
+
result = deserializer.from_json(json, :except => ['id'])
|
88
|
+
|
89
|
+
expected = Hash[:name => person['name'], :address=>nil, :phone_numbers=>[], :id => nil]
|
90
|
+
|
91
|
+
# travis sees empty array and locally it is nil :(
|
92
|
+
result.phone_numbers ||= []
|
93
|
+
|
94
|
+
result.attributes.keys.dup.each do |k|
|
95
|
+
result.attributes[ k ].must_equal expected[ k ]
|
96
|
+
end
|
97
|
+
|
98
|
+
result = deserializer.from_json(json)
|
99
|
+
|
100
|
+
# travis sees empty array and locally it is nil :(
|
101
|
+
result.phone_numbers ||= []
|
102
|
+
|
103
|
+
result.attributes.keys.dup.each do |k|
|
104
|
+
result.attributes[ k ].must_equal expected[ k ]
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'should serialize and deserialize with only' do
|
109
|
+
json = serializer.to_json(:only => ['name'])
|
110
|
+
result = deserializer.from_json(json, :only => ['name'])
|
111
|
+
|
112
|
+
# travis sees empty array and locally it is nil :(
|
113
|
+
result.phone_numbers ||= []
|
114
|
+
|
115
|
+
expected = Hash[:name => person['name'], :address=>nil, :phone_numbers=>[], :id => nil]
|
116
|
+
result.attributes.keys.dup.each do |k|
|
117
|
+
result.attributes[ k ].must_equal expected[ k ]
|
118
|
+
end
|
119
|
+
|
120
|
+
result = deserializer.from_json(json)
|
121
|
+
|
122
|
+
# travis sees empty array and locally it is nil :(
|
123
|
+
result.phone_numbers ||= []
|
124
|
+
result.attributes.keys.dup.each do |k|
|
125
|
+
result.attributes[ k ].must_equal expected[ k ]
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'should serialize and deserialize with nested only' do
|
130
|
+
json = serializer.to_json(:include => { 'address' => {:only => ['street']}})
|
131
|
+
result = deserializer.from_json(json, :include => { 'address' => {:only => ['street']}})
|
132
|
+
|
133
|
+
json['phone_numbers'].must_be_nil
|
134
|
+
json['address']['zipcode'].must_be_nil
|
135
|
+
|
136
|
+
# travis produces [] and locally there is a nil :(
|
137
|
+
(result.phone_numbers || []).must_equal []
|
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 only (array includes)' do
|
146
|
+
json = serializer.to_json(:include => { 'address' => {:only => ['street']}})
|
147
|
+
result = deserializer.from_json(json, :include => ['address'])
|
148
|
+
|
149
|
+
json['phone_numbers'].must_be_nil
|
150
|
+
json['address']['zipcode'].must_be_nil
|
151
|
+
|
152
|
+
# travis produces [] and locally there is a nil :(
|
153
|
+
(result.phone_numbers || []).must_equal []
|
154
|
+
|
155
|
+
result.address.zipcode.must_be_nil
|
156
|
+
|
157
|
+
result.name.must_equal person.name
|
158
|
+
result.id.must_equal person.id
|
159
|
+
end
|
160
|
+
|
161
|
+
it 'should serialize and deserialize with nested except' do
|
162
|
+
json = serializer.to_json(:include => { 'address' => {:except => ['zipcode']}})
|
163
|
+
result = deserializer.from_json(json, :include => { 'address' => {:except => ['zipcode']}})
|
164
|
+
|
165
|
+
json['phone_numbers'].must_be_nil
|
166
|
+
json['address']['zipcode'].must_be_nil
|
167
|
+
|
168
|
+
# travis produces [] and locally there is a nil :(
|
169
|
+
(result.phone_numbers || []).must_equal []
|
170
|
+
|
171
|
+
result.address.zipcode.must_be_nil
|
172
|
+
|
173
|
+
result.name.must_equal person.name
|
174
|
+
result.id.must_equal person.id
|
175
|
+
end
|
176
|
+
|
177
|
+
it 'should serialize and deserialize with nested except (array includes)' do
|
178
|
+
json = serializer.to_json(:include => { 'address' => {:except => ['zipcode']}})
|
179
|
+
result = deserializer.from_json(json, :include => ['address'])
|
180
|
+
|
181
|
+
json['phone_numbers'].must_be_nil
|
182
|
+
json['address']['zipcode'].must_be_nil
|
183
|
+
|
184
|
+
# travis produces [] and locally there is a nil :(
|
185
|
+
(result.phone_numbers || []).must_equal []
|
186
|
+
|
187
|
+
result.address.zipcode.must_be_nil
|
188
|
+
|
189
|
+
result.name.must_equal person.name
|
190
|
+
result.id.must_equal person.id
|
191
|
+
end
|
192
|
+
|
193
|
+
it 'should serialize and deserialize with nested include' do
|
194
|
+
json = serializer.to_json(:include => { 'address' => {}, 'phone_numbers' => { :include => ['area']}})
|
195
|
+
result = deserializer.from_json(json, :include => { 'address' => {}, 'phone_numbers' => { :include => ['area']}})
|
196
|
+
|
197
|
+
result.object_id.wont_equal person.object_id
|
198
|
+
result.address.attributes.must_equal person.address.attributes
|
199
|
+
result.phone_numbers[0].area.attributes.must_equal person.phone_numbers[0].area.attributes
|
200
|
+
result.phone_numbers[0].prefix.must_equal person.phone_numbers[0].prefix
|
201
|
+
result.phone_numbers[0].number.must_equal person.phone_numbers[0].number
|
202
|
+
result.name.must_equal person.name
|
203
|
+
result.id.must_equal person.id
|
204
|
+
end
|
205
|
+
|
206
|
+
it 'should convert elements from arrays wth custom serializer' do
|
207
|
+
serializer.add_custom_serializers( "Symbol" => Proc.new {|v| v.to_s.capitalize } )
|
208
|
+
data = serializer.to_hash(:include => [ :children_names ])
|
209
|
+
data[ "children_names"].must_equal( ["Adi", "Aromal", "Shreedev"] )
|
210
|
+
end
|
211
|
+
end
|
data/spec/hash_filter_spec.rb
CHANGED
@@ -97,4 +97,11 @@ describe Ixtlan::Babel::HashFilter do
|
|
97
97
|
result = deserializer.from_json(json, :include => { 'address' => {}, 'phone_numbers' => { :include => ['area']}})
|
98
98
|
result.must_equal data
|
99
99
|
end
|
100
|
+
|
101
|
+
it 'should convert elements from arrays wth custom serializer' do
|
102
|
+
serializer.add_custom_serializers( "Symbol" => Proc.new {|v| v.to_s.capitalize } )
|
103
|
+
data['children_names'] = [:adi, :aromal, :shreedev]
|
104
|
+
d = serializer.to_hash(:include => [ :children_names ])
|
105
|
+
d[ "children_names"].must_equal( ["Adi", "Aromal", "Shreedev"] )
|
106
|
+
end
|
100
107
|
end
|
data/spec/model_filter_spec.rb
CHANGED
@@ -28,6 +28,7 @@ class Person
|
|
28
28
|
attribute :name, String
|
29
29
|
attribute :address, Address
|
30
30
|
attribute :phone_numbers, Array[PhoneNumber]
|
31
|
+
attribute :children_names, Array[Symbol]
|
31
32
|
end
|
32
33
|
|
33
34
|
describe Ixtlan::Babel::ModelFilter do
|
@@ -40,7 +41,8 @@ describe Ixtlan::Babel::ModelFilter do
|
|
40
41
|
:prefix => 12,
|
41
42
|
:number => '123',
|
42
43
|
:area => Area.new( :code => '001', :iso => 'us' )
|
43
|
-
)]
|
44
|
+
)],
|
45
|
+
:children_names => [:adi, :aromal, :shreedev]
|
44
46
|
)
|
45
47
|
end
|
46
48
|
|
@@ -199,4 +201,10 @@ describe Ixtlan::Babel::ModelFilter do
|
|
199
201
|
result.name.must_equal person.name
|
200
202
|
result.id.must_equal person.id
|
201
203
|
end
|
204
|
+
|
205
|
+
it 'should convert elements from arrays wth custom serializer' do
|
206
|
+
serializer.add_custom_serializers( "Symbol" => Proc.new {|v| v.to_s.capitalize } )
|
207
|
+
data = serializer.to_hash(:include => [ :children_names ])
|
208
|
+
data[ "children_names"].must_equal( ["Adi", "Aromal", "Shreedev"] )
|
209
|
+
end
|
202
210
|
end
|
data/spec/params_filter_spec.rb
CHANGED
@@ -41,7 +41,7 @@ describe Ixtlan::Babel::ParamsFilter do
|
|
41
41
|
|
42
42
|
it 'should filter a hash with keep' do
|
43
43
|
json = filter.use( :keep => ['id'] ).filter_it( data )
|
44
|
-
json[0].must_equal Hash[ '
|
44
|
+
json[0].must_equal Hash[ 'name' => data['name'] ]
|
45
45
|
json[1].must_equal Hash[ 'id' => data['id'] ]
|
46
46
|
end
|
47
47
|
|
metadata
CHANGED
@@ -2,14 +2,14 @@
|
|
2
2
|
name: ixtlan-babel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.3.
|
5
|
+
version: 0.3.2
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Christian Meier
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-02-19 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
@@ -127,6 +127,7 @@ files:
|
|
127
127
|
- spec/hash_filter_spec.rb~
|
128
128
|
- spec/spec_helper.rb
|
129
129
|
- spec/model_filter_with_methods_spec.rb
|
130
|
+
- spec/#model_filter_spec.rb#
|
130
131
|
- spec/params_filter_spec.rb~
|
131
132
|
- MIT-LICENSE
|
132
133
|
- README.md
|