ixtlan-babel 0.3.1 → 0.3.2
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.
- 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
|