ixtlan-babel 0.5.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +4 -1
- data/MIT-LICENSE +1 -1
- data/README.md +3 -14
- data/Rakefile +27 -0
- data/lib/ixtlan-babel.rb +0 -21
- data/lib/ixtlan-babel.rb~ +1 -0
- data/lib/ixtlan/babel/common_filters.rb +21 -0
- data/lib/ixtlan/babel/common_filters.rb~ +14 -0
- data/lib/ixtlan/babel/factory.rb +36 -56
- data/lib/ixtlan/babel/factory.rb~ +39 -59
- data/lib/ixtlan/babel/hash_filter.rb +125 -44
- data/lib/ixtlan/babel/hash_filter.rb~ +149 -40
- data/lib/ixtlan/babel/model_filter.rb~ +114 -52
- data/lib/ixtlan/babel/model_serializer.rb +103 -0
- data/lib/ixtlan/babel/model_serializer.rb~ +104 -0
- data/spec/hash_filter_spec.rb +71 -102
- data/spec/model_serializer_spec.rb +159 -0
- data/spec/model_serializer_spec.rb~ +158 -0
- data/spec/spec_helper.rb +5 -3
- data/spec/spec_helper.rb~ +8 -0
- metadata +53 -72
- data/lib/ixtlan/babel/abstract_filter.rb +0 -46
- data/lib/ixtlan/babel/context.rb +0 -67
- data/lib/ixtlan/babel/dm_validation_errors_serializer.rb +0 -8
- data/lib/ixtlan/babel/filter_config.rb +0 -74
- data/lib/ixtlan/babel/model_filter.rb +0 -79
- data/lib/ixtlan/babel/params_filter.rb +0 -149
- data/lib/ixtlan/babel/serializer.rb +0 -186
- data/spec/model_filter_spec.rb +0 -131
- data/spec/model_filter_with_dsl_spec.rb +0 -173
- data/spec/model_filter_with_methods_spec.rb +0 -151
- data/spec/params_filter_dsl_spec.rb +0 -134
- data/spec/params_filter_spec.rb +0 -113
data/spec/model_filter_spec.rb
DELETED
@@ -1,131 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'virtus'
|
3
|
-
require 'ixtlan/babel/serializer'
|
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
|
-
|
51
|
-
it 'should serialize and deserialize without root' do
|
52
|
-
json = serializer.to_json
|
53
|
-
result = MultiJson.load(json)
|
54
|
-
result.must_equal Hash['id' => person['id'], 'name' => person['name']]
|
55
|
-
end
|
56
|
-
|
57
|
-
it 'should serialize and deserialize with root' do
|
58
|
-
json = serializer.to_json :root => 'my'
|
59
|
-
result = MultiJson.load(json)[ 'my' ]
|
60
|
-
result.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 = MultiJson.load(json)
|
66
|
-
result.must_equal Hash[ "id"=>"987",
|
67
|
-
"name"=>"me and the corner",
|
68
|
-
"address"=>{
|
69
|
-
"street"=>"Foo 12",
|
70
|
-
"zipcode"=>"12345"
|
71
|
-
},
|
72
|
-
"phone_numbers"=> [ {"prefix"=>12,
|
73
|
-
"number"=>"123" } ] ]
|
74
|
-
end
|
75
|
-
|
76
|
-
it 'should serialize and deserialize with except' do
|
77
|
-
json = serializer.to_json(:except => ['id'])
|
78
|
-
result = MultiJson.load(json)
|
79
|
-
result.must_equal Hash['name' => person['name']]
|
80
|
-
end
|
81
|
-
|
82
|
-
it 'should serialize and deserialize with only' do
|
83
|
-
json = serializer.to_json(:only => ['name'])
|
84
|
-
result = MultiJson.load(json)
|
85
|
-
|
86
|
-
result.must_equal Hash['name' => person['name']]
|
87
|
-
end
|
88
|
-
|
89
|
-
it 'should serialize and deserialize with nested only' do
|
90
|
-
json = serializer.to_json(:include => { 'address' => {:only => ['street']}})
|
91
|
-
result = MultiJson.load(json)
|
92
|
-
result.must_equal Hash[ "id"=>"987",
|
93
|
-
"name"=>"me and the corner",
|
94
|
-
"address"=>{ "street"=>"Foo 12" } ]
|
95
|
-
end
|
96
|
-
|
97
|
-
it 'should serialize and deserialize with nested except' do
|
98
|
-
json = serializer.to_json(:include =>
|
99
|
-
{ 'address' => {:except => ['zipcode']}})
|
100
|
-
result = MultiJson.load(json)
|
101
|
-
result.must_equal Hash[ "id"=>"987",
|
102
|
-
"name"=>"me and the corner",
|
103
|
-
"address"=>{ "street"=>"Foo 12" } ]
|
104
|
-
end
|
105
|
-
|
106
|
-
it 'should serialize and deserialize with nested include' do
|
107
|
-
json = serializer.to_json( :include => {
|
108
|
-
'address' => {},
|
109
|
-
'phone_numbers' => { :include => ['area'] }
|
110
|
-
} )
|
111
|
-
result = MultiJson.load(json)
|
112
|
-
result.must_equal Hash[ "id"=>"987",
|
113
|
-
"name"=>"me and the corner",
|
114
|
-
"address"=>{ "street"=>"Foo 12",
|
115
|
-
"zipcode"=>"12345" },
|
116
|
-
"phone_numbers"=>[ { "prefix"=>12,
|
117
|
-
"number"=>"123",
|
118
|
-
"area"=>{
|
119
|
-
"code"=>"001",
|
120
|
-
"iso"=>"us"
|
121
|
-
}
|
122
|
-
} ] ]
|
123
|
-
end
|
124
|
-
|
125
|
-
it 'should convert elements from arrays wth custom serializer' do
|
126
|
-
serializer.add_custom_serializers( "Symbol" =>
|
127
|
-
Proc.new {|v| v.to_s.capitalize } )
|
128
|
-
data = serializer.to_hash(:include => [ :children_names ])
|
129
|
-
data[ "children_names"].must_equal( ["Adi", "Aromal", "Shreedev"] )
|
130
|
-
end
|
131
|
-
end
|
@@ -1,173 +0,0 @@
|
|
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',
|
57
|
-
:zipcode => '12345' ) )
|
58
|
-
end
|
59
|
-
|
60
|
-
let( :serializer ) { factory.new_serializer( person ) }
|
61
|
-
|
62
|
-
let( :factory ) { Ixtlan::Babel::Factory.new }
|
63
|
-
|
64
|
-
it 'should serialize and deserialize with methods' do
|
65
|
-
class Person2Serializer < Ixtlan::Babel::Serializer
|
66
|
-
add_context( :nested ) do
|
67
|
-
only :id, :name, :age, :children_names, :children_ages
|
68
|
-
end
|
69
|
-
end
|
70
|
-
json = serializer.use( :nested ).to_json
|
71
|
-
result = MultiJson.load(json)
|
72
|
-
result.must_equal Hash[ "id"=>"987",
|
73
|
-
"name"=>"me and the corner",
|
74
|
-
"age"=>123,
|
75
|
-
"children_names"=> [ "anna",
|
76
|
-
"jack",
|
77
|
-
"rama",
|
78
|
-
"mia" ],
|
79
|
-
"children_ages"=>[ 12, 3, 6, 9 ] ]
|
80
|
-
end
|
81
|
-
|
82
|
-
it 'should serialize and deserialize without root' do
|
83
|
-
class Person2Serializer < Ixtlan::Babel::Serializer
|
84
|
-
add_context( :plain ) do
|
85
|
-
only :id, :name
|
86
|
-
end
|
87
|
-
end
|
88
|
-
json = serializer.use( :plain ).to_json
|
89
|
-
result = MultiJson.load(json)
|
90
|
-
result.must_equal Hash[ "id"=>"987", "name"=>"me and the corner" ]
|
91
|
-
end
|
92
|
-
|
93
|
-
it 'should serialize and deserialize with root' do
|
94
|
-
class Person2Serializer < Ixtlan::Babel::Serializer
|
95
|
-
add_context( :root ) do
|
96
|
-
root 'my'
|
97
|
-
only :id, :name
|
98
|
-
end
|
99
|
-
end
|
100
|
-
json = serializer.use( :root ).to_json
|
101
|
-
result = MultiJson.load(json)[ 'my' ]
|
102
|
-
result.must_equal Hash[ "id"=>"987", "name"=>"me and the corner" ]
|
103
|
-
end
|
104
|
-
|
105
|
-
it 'should serialize and deserialize a hash with include list' do
|
106
|
-
class Person2Serializer < Ixtlan::Babel::Serializer
|
107
|
-
add_context( :deep_nested) do
|
108
|
-
only( :id, :name,
|
109
|
-
:address => only( :street, :zipcode ),
|
110
|
-
:phone_numbers => only( :prefix, :number ) )
|
111
|
-
end
|
112
|
-
end
|
113
|
-
json = serializer.use( :deep_nested ).to_json
|
114
|
-
result = MultiJson.load(json)
|
115
|
-
result.must_equal Hash[ "id"=>"987", "name"=>"me and the corner" ,
|
116
|
-
"address"=> {
|
117
|
-
"street"=>"Foo 12",
|
118
|
-
"zipcode"=>"12345"
|
119
|
-
},
|
120
|
-
"phone_numbers"=> [ { "prefix"=>12,
|
121
|
-
"number"=>"123" } ] ]
|
122
|
-
end
|
123
|
-
|
124
|
-
it 'should serialize and deserialize with only' do
|
125
|
-
class Person2Serializer < Ixtlan::Babel::Serializer
|
126
|
-
add_context( :only ) do
|
127
|
-
only :name
|
128
|
-
end
|
129
|
-
end
|
130
|
-
json = serializer.use( :only ).to_json
|
131
|
-
result = MultiJson.load(json)
|
132
|
-
result.must_equal Hash[ "name"=>"me and the corner" ]
|
133
|
-
end
|
134
|
-
|
135
|
-
it 'should serialize and deserialize with nested only' do
|
136
|
-
class Person2Serializer < Ixtlan::Babel::Serializer
|
137
|
-
add_context( :nested_only ) do
|
138
|
-
only :address => only( :street )
|
139
|
-
end
|
140
|
-
end
|
141
|
-
json = serializer.use( :nested_only ).to_json
|
142
|
-
result = MultiJson.load(json)
|
143
|
-
result.must_equal Hash[ "address"=> {
|
144
|
-
"street"=>"Foo 12"
|
145
|
-
} ]
|
146
|
-
end
|
147
|
-
|
148
|
-
it 'should serialize and deserialize with nested include' do
|
149
|
-
class Person2Serializer < Ixtlan::Babel::Serializer
|
150
|
-
add_context( :nested_deep ) do
|
151
|
-
only( :id, :name,
|
152
|
-
:address => only( :street, :zipcode ),
|
153
|
-
:phone_numbers => only( :prefix,
|
154
|
-
:number,
|
155
|
-
:area => only( :code, :iso) ) )
|
156
|
-
end
|
157
|
-
end
|
158
|
-
json = serializer.use( :nested_deep ).to_json
|
159
|
-
result = MultiJson.load(json)
|
160
|
-
result.must_equal Hash[ "id"=>"987", "name"=>"me and the corner" ,
|
161
|
-
"address"=> {
|
162
|
-
"street"=>"Foo 12",
|
163
|
-
"zipcode"=>"12345"
|
164
|
-
},
|
165
|
-
"phone_numbers"=> [ { "prefix"=>12,
|
166
|
-
"number"=>"123",
|
167
|
-
"area"=> {
|
168
|
-
"code"=>"001",
|
169
|
-
"iso"=>"us"
|
170
|
-
}
|
171
|
-
} ] ]
|
172
|
-
end
|
173
|
-
end
|
@@ -1,151 +0,0 @@
|
|
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',
|
57
|
-
:zipcode => '12345' ) )
|
58
|
-
end
|
59
|
-
|
60
|
-
let(:serializer) { Ixtlan::Babel::Serializer.new( person ) }
|
61
|
-
|
62
|
-
it 'should serialize and deserialize with methods' do
|
63
|
-
json = serializer.to_json( :include =>
|
64
|
-
[:age, :children_names, :children_ages])
|
65
|
-
result = MultiJson.load(json)
|
66
|
-
result.must_equal Hash[ "id"=>"987",
|
67
|
-
"name"=>"me and the corner",
|
68
|
-
"age"=>123,
|
69
|
-
"children_names"=> [ "anna",
|
70
|
-
"jack",
|
71
|
-
"rama",
|
72
|
-
"mia" ],
|
73
|
-
"children_ages"=>[ 12, 3, 6, 9 ] ]
|
74
|
-
end
|
75
|
-
|
76
|
-
it 'should serialize and deserialize without root' do
|
77
|
-
json = serializer.to_json
|
78
|
-
result = MultiJson.load(json)
|
79
|
-
result.must_equal Hash[ "id"=>"987", "name"=>"me and the corner" ]
|
80
|
-
end
|
81
|
-
|
82
|
-
it 'should serialize and deserialize with root' do
|
83
|
-
json = serializer.to_json :root => 'my'
|
84
|
-
result = MultiJson.load(json)[ 'my' ]
|
85
|
-
result.must_equal Hash[ "id"=>"987", "name"=>"me and the corner" ]
|
86
|
-
end
|
87
|
-
|
88
|
-
it 'should serialize and deserialize a hash with include list' do
|
89
|
-
json = serializer.to_json(:include => ['address', 'phone_numbers'])
|
90
|
-
result = MultiJson.load(json)
|
91
|
-
result.must_equal Hash[ "id"=>"987", "name"=>"me and the corner" ,
|
92
|
-
"address"=> {
|
93
|
-
"street"=>"Foo 12",
|
94
|
-
"zipcode"=>"12345"
|
95
|
-
},
|
96
|
-
"phone_numbers"=> [ { "prefix"=>12,
|
97
|
-
"number"=>"123" } ] ]
|
98
|
-
end
|
99
|
-
|
100
|
-
it 'shouldserialize and deserialize with except' do
|
101
|
-
json = serializer.to_json(:except => ['id'])
|
102
|
-
result = MultiJson.load(json)
|
103
|
-
result.must_equal Hash[ "name"=>"me and the corner" ]
|
104
|
-
end
|
105
|
-
|
106
|
-
it 'should serialize and deserialize with only' do
|
107
|
-
json = serializer.to_json(:only => ['name'])
|
108
|
-
result = MultiJson.load(json)
|
109
|
-
result.must_equal Hash[ "name"=>"me and the corner" ]
|
110
|
-
end
|
111
|
-
|
112
|
-
it 'should serialize and deserialize with nested only' do
|
113
|
-
json = serializer.to_json(:include => { 'address' => {
|
114
|
-
:only => ['street'] } } )
|
115
|
-
result = MultiJson.load(json)
|
116
|
-
result.must_equal Hash[ "id"=>"987", "name"=>"me and the corner" ,
|
117
|
-
"address"=> {
|
118
|
-
"street"=>"Foo 12"
|
119
|
-
} ]
|
120
|
-
end
|
121
|
-
|
122
|
-
it 'should serialize and deserialize with nested except' do
|
123
|
-
json = serializer.to_json(:include => {
|
124
|
-
'address' => {:except => ['zipcode'] } } )
|
125
|
-
result = MultiJson.load(json)
|
126
|
-
result.must_equal Hash[ "id"=>"987", "name"=>"me and the corner" ,
|
127
|
-
"address"=> {
|
128
|
-
"street"=>"Foo 12"
|
129
|
-
} ]
|
130
|
-
end
|
131
|
-
|
132
|
-
it 'should serialize and deserialize with nested include' do
|
133
|
-
json = serializer.to_json(:include => {
|
134
|
-
'address' => {},
|
135
|
-
'phone_numbers' => { :include => ['area'] }
|
136
|
-
} )
|
137
|
-
result = MultiJson.load(json)
|
138
|
-
result.must_equal Hash[ "id"=>"987", "name"=>"me and the corner" ,
|
139
|
-
"address"=> {
|
140
|
-
"street"=>"Foo 12",
|
141
|
-
"zipcode"=>"12345"
|
142
|
-
},
|
143
|
-
"phone_numbers"=> [ { "prefix"=>12,
|
144
|
-
"number"=>"123",
|
145
|
-
"area"=> {
|
146
|
-
"code"=>"001",
|
147
|
-
"iso"=>"us"
|
148
|
-
}
|
149
|
-
} ] ]
|
150
|
-
end
|
151
|
-
end
|