ixtlan-babel 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +1 -1
- data/lib/ixtlan/babel/hash_filter.rb +4 -2
- data/lib/ixtlan/babel/params_filter.rb +39 -3
- data/lib/ixtlan/babel/serializer.rb +28 -3
- data/spec/hash_filter_spec.rb +1 -1
- data/spec/model_filter_with_dsl_spec.rb +173 -0
- data/spec/params_filter_dsl_spec.rb +134 -0
- data/spec/params_filter_dsl_spec.rb~ +113 -0
- data/spec/params_filter_spec.rb +3 -3
- data/spec/spec_helper.rb +1 -0
- metadata +46 -55
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f025bd8665c42f07f792f3fb8a28331a62e47274
|
4
|
+
data.tar.gz: 4c3df0b63c0574acc37ec06cd33e9f18e0c1c809
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 8b5267f3135e38b8053da3d39a30a87093ccd11f0c9e2837c3264b346dffd96613a17031f3d6ef5e98a34657652475452f12c96bcdcc81484f21021f01ce2dec
|
7
|
+
data.tar.gz: f1be049f637b3dd246fb4f8353f71662e3e3bfd8fe806d3514c82b74f80e839723ed9345b4d5e2cce38c6d290397d2f9eaf59bd36b7bfcff3d61b2bc6713a494
|
data/Gemfile
CHANGED
@@ -51,8 +51,10 @@ module Ixtlan
|
|
51
51
|
result[ k ] = filter_data( v,
|
52
52
|
context[ k ] ) if context.include?( k )
|
53
53
|
when Array
|
54
|
-
|
55
|
-
|
54
|
+
if context.allowed?( k ) || context.include?( k )
|
55
|
+
result[ k ] = filter_array( v,
|
56
|
+
context[ k ] )
|
57
|
+
end
|
56
58
|
else
|
57
59
|
result[ k ] = serialize( v ) if context.allowed?( k )
|
58
60
|
end
|
@@ -45,12 +45,42 @@ module Ixtlan
|
|
45
45
|
config.default_context_key(default)
|
46
46
|
end
|
47
47
|
|
48
|
-
def self.add_context(key, options =
|
49
|
-
config[key] = options
|
48
|
+
def self.add_context( key = :single, options = nil, &block )
|
49
|
+
current = config[key] = options || { :only => [] }
|
50
|
+
@context = key
|
51
|
+
yield if block
|
52
|
+
current[ :keep ] = @keep if @keep
|
53
|
+
current.merge!( @allow ) if @allow
|
54
|
+
current[ :root ] = @root
|
55
|
+
ensure
|
56
|
+
@context = nil
|
57
|
+
@allow = nil
|
58
|
+
@keep = nil
|
59
|
+
@root = nil
|
50
60
|
end
|
51
61
|
|
52
62
|
def self.root( root )
|
53
|
-
|
63
|
+
if @context
|
64
|
+
@root = root
|
65
|
+
else
|
66
|
+
config.root = root
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.keep( *args )
|
71
|
+
@keep = *args
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.only( *args )
|
75
|
+
result = {}
|
76
|
+
if args.last.is_a? Hash
|
77
|
+
result[ :include ] = args.last
|
78
|
+
result[ :only ] = args[ 0..-2 ]
|
79
|
+
else
|
80
|
+
result[ :only ] = args
|
81
|
+
end
|
82
|
+
@allow = result
|
83
|
+
result
|
54
84
|
end
|
55
85
|
|
56
86
|
public
|
@@ -72,6 +102,10 @@ module Ixtlan
|
|
72
102
|
@model.send( :new, params )
|
73
103
|
end
|
74
104
|
|
105
|
+
def []( key )
|
106
|
+
params[ key ]
|
107
|
+
end
|
108
|
+
|
75
109
|
def params
|
76
110
|
@data[ :params ]
|
77
111
|
end
|
@@ -105,6 +139,8 @@ module Ixtlan
|
|
105
139
|
( filter.options[ :keep ] || [] ).each do |k|
|
106
140
|
keeps[ k.to_s ] = filtered_data.delete( k.to_s ) ||
|
107
141
|
filtered_data.delete( k.to_sym ) unless keeps.member?( k.to_s )
|
142
|
+
# just make sure we have an entry for each keeps key
|
143
|
+
keeps[ k.to_s ] ||= nil
|
108
144
|
end
|
109
145
|
FilterResult.new( @model_class, filtered_data, keeps )
|
110
146
|
end
|
@@ -77,12 +77,37 @@ module Ixtlan
|
|
77
77
|
config.default_context_key(single, collection)
|
78
78
|
end
|
79
79
|
|
80
|
-
def self.add_context(key, options =
|
81
|
-
config[key] = options
|
80
|
+
def self.add_context(key = :single, options = nil, &block)
|
81
|
+
current = config[key] = options || { :only => Array.new }
|
82
|
+
@only = nil
|
83
|
+
@root = nil
|
84
|
+
@context = key
|
85
|
+
yield if block
|
86
|
+
current.merge!( @only ) if @only
|
87
|
+
current[ :root ] = @root
|
88
|
+
ensure
|
89
|
+
@context = nil
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.only( *args )
|
93
|
+
args.flatten!
|
94
|
+
result = { :only => Array.new }
|
95
|
+
if args.last.is_a? Hash
|
96
|
+
result[ :include ] = args.last
|
97
|
+
result[ :methods ] = args[ 0..-2 ]
|
98
|
+
else
|
99
|
+
result[ :methods ] = args
|
100
|
+
end
|
101
|
+
@only = result
|
102
|
+
result
|
82
103
|
end
|
83
104
|
|
84
105
|
def self.root( root )
|
85
|
-
|
106
|
+
if @context
|
107
|
+
@root = root
|
108
|
+
else
|
109
|
+
config.root = root
|
110
|
+
end
|
86
111
|
end
|
87
112
|
|
88
113
|
public
|
data/spec/hash_filter_spec.rb
CHANGED
@@ -0,0 +1,173 @@
|
|
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
|
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'ixtlan/babel/params_filter'
|
3
|
+
|
4
|
+
class A; end
|
5
|
+
class AFilter < Ixtlan::Babel::ParamsFilter
|
6
|
+
|
7
|
+
end
|
8
|
+
|
9
|
+
class Hash
|
10
|
+
def attributes
|
11
|
+
self
|
12
|
+
end
|
13
|
+
def method_missing(method)
|
14
|
+
self[method.to_s]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe Ixtlan::Babel::ParamsFilter do
|
19
|
+
let(:data) do
|
20
|
+
{
|
21
|
+
'id' => 987,
|
22
|
+
'name' => 'me and the corner',
|
23
|
+
'address' => { 'street' => 'Foo 12', 'zipcode' => '12345' },
|
24
|
+
'list' => [1,2,3,4],
|
25
|
+
'phone_numbers' => {
|
26
|
+
'prefix' => 12,
|
27
|
+
'number' => '123',
|
28
|
+
'area' => { 'code' => '001', 'iso' => 'us'}
|
29
|
+
}
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
let(:factory) { Ixtlan::Babel::Factory.new }
|
34
|
+
let(:filter) { factory.new_filter( A ) }
|
35
|
+
let(:deserializer) { Ixtlan::Babel::Deserializer.new(Hash) }
|
36
|
+
|
37
|
+
it 'should filter a hash' do
|
38
|
+
AFilter.add_context( :plain )
|
39
|
+
result = filter.use( :plain ).filter_it( data )
|
40
|
+
result.params.must_equal Hash[]
|
41
|
+
result.size.must_equal 1
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should filter a hash with keep' do
|
45
|
+
class AFilter
|
46
|
+
add_context( :keep ) do
|
47
|
+
keep :id
|
48
|
+
end
|
49
|
+
end
|
50
|
+
result = filter.use( :keep ).filter_it( data )
|
51
|
+
result.params.must_equal Hash[]
|
52
|
+
result.id.must_equal data['id']
|
53
|
+
result.size.must_equal 2
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should filter a hash with root' do
|
57
|
+
class AFilter
|
58
|
+
add_context( :root ) do
|
59
|
+
root 'my'
|
60
|
+
only :id, :name
|
61
|
+
end
|
62
|
+
end
|
63
|
+
result = filter.use( :root ).filter_it( 'my' => data )
|
64
|
+
result.params.must_equal Hash[ 'id' => data['id'], 'name' => data['name'] ]
|
65
|
+
result.size.must_equal 1
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'should filter a nested object' do
|
69
|
+
class AFilter
|
70
|
+
add_context( :nested ) do
|
71
|
+
only( :id, :name,
|
72
|
+
:address => only( :street, :zipcode),
|
73
|
+
:phone_numbers => only( :prefix, :number ) )
|
74
|
+
end
|
75
|
+
end
|
76
|
+
result = filter.use( :nested ).filter_it( data )
|
77
|
+
|
78
|
+
data['phone_numbers'].delete('area')
|
79
|
+
data.delete('list')
|
80
|
+
result.params.must_equal Hash[data]
|
81
|
+
result.size.must_equal 1
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'should filter a hash with only' do
|
85
|
+
class AFilter
|
86
|
+
add_context( :only ) do
|
87
|
+
only :name
|
88
|
+
end
|
89
|
+
end
|
90
|
+
result = filter.use( :only ).filter_it( data )
|
91
|
+
result.params.must_equal Hash['name' => data['name']]
|
92
|
+
result.size.must_equal 1
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'should filter a hash with only and keep' do
|
96
|
+
class AFilter
|
97
|
+
add_context( :only_and_keep ) do
|
98
|
+
keep :id
|
99
|
+
only :name
|
100
|
+
end
|
101
|
+
end
|
102
|
+
result = filter.use( :only_and_keep ).filter_it( data )
|
103
|
+
result.params.must_equal Hash['name' => data['name']]
|
104
|
+
result.id.must_equal data['id']
|
105
|
+
result.size.must_equal 2
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'should filter a hash with nested only' do
|
109
|
+
class AFilter
|
110
|
+
add_context( :filtered_nested ) do
|
111
|
+
only :id, :name, :list, :address => only( :street )
|
112
|
+
end
|
113
|
+
end
|
114
|
+
result = filter.use( :filtered_nested ).filter_it( data )
|
115
|
+
data.delete('phone_numbers')
|
116
|
+
data['address'].delete('zipcode')
|
117
|
+
result.params.must_equal Hash[data]
|
118
|
+
result.size.must_equal 1
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'should filter a hash with deep nested include' do
|
122
|
+
class AFilter
|
123
|
+
add_context( :deep_nested ) do
|
124
|
+
only( :id, :name, :list,
|
125
|
+
:address => only( :street, :zipcode),
|
126
|
+
:phone_numbers => only( :prefix, :number,
|
127
|
+
:area => only( :code, :iso ) ) )
|
128
|
+
end
|
129
|
+
end
|
130
|
+
result = filter.use( :deep_nested ).filter_it( data )
|
131
|
+
result.params.must_equal Hash[data]
|
132
|
+
result.size.must_equal 1
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'ixtlan/babel/params_filter'
|
3
|
+
|
4
|
+
class A; end
|
5
|
+
class AFilter < Ixtlan::Babel::ParamsFilter
|
6
|
+
|
7
|
+
end
|
8
|
+
|
9
|
+
class Hash
|
10
|
+
def attributes
|
11
|
+
self
|
12
|
+
end
|
13
|
+
def method_missing(method)
|
14
|
+
self[method.to_s]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe Ixtlan::Babel::ParamsFilter do
|
19
|
+
let(:data) do
|
20
|
+
{
|
21
|
+
'id' => 987,
|
22
|
+
'name' => 'me and the corner',
|
23
|
+
'address' => { 'street' => 'Foo 12', 'zipcode' => '12345' },
|
24
|
+
'phone_numbers' => {
|
25
|
+
'prefix' => 12,
|
26
|
+
'number' => '123',
|
27
|
+
'area' => { 'code' => '001', 'iso' => 'us'}
|
28
|
+
}
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
let(:factory) { Ixtlan::Babel::Factory.new }
|
33
|
+
let(:filter) { factory.new_filter( A ) }
|
34
|
+
let(:deserializer) { Ixtlan::Babel::Deserializer.new(Hash) }
|
35
|
+
|
36
|
+
it 'should filter a hash' do
|
37
|
+
result = filter.filter_it( data )
|
38
|
+
result.params.must_equal Hash[ 'id' => data['id'], 'name' => data['name'] ]
|
39
|
+
result.size.must_equal 1
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'should filter a hash with keep' do
|
43
|
+
result = filter.use( :keep => ['id'] ).filter_it( data )
|
44
|
+
result.params.must_equal Hash[ 'name' => data['name'] ]
|
45
|
+
result.id.must_equal data['id']
|
46
|
+
result.size.must_equal 2
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should filter a hash with root' do
|
50
|
+
result = filter.use( :root => 'my' ).filter_it( 'my' => data )
|
51
|
+
result.params.must_equal Hash[ 'id' => data['id'], 'name' => data['name'] ]
|
52
|
+
result.size.must_equal 1
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'should filter a hash with include list' do
|
56
|
+
result = filter.use( :include => ['address',
|
57
|
+
'phone_numbers'] ).filter_it( data )
|
58
|
+
|
59
|
+
data['phone_numbers'].delete('area')
|
60
|
+
result.params.must_equal Hash[data]
|
61
|
+
result.size.must_equal 1
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'should filter a hash with except' do
|
65
|
+
result = filter.use( :except => ['id'] ).filter_it( data )
|
66
|
+
result.params.must_equal Hash['name' => data['name']]
|
67
|
+
result.size.must_equal 1
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should filter a hash with except and keep' do
|
71
|
+
result = filter.use( :except => ['id'], :keep => ['id'] ).filter_it( data )
|
72
|
+
result.params.must_equal Hash['name' => data['name']]
|
73
|
+
result.id.must_equal data['id']
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'should filter a hash with only' do
|
77
|
+
result = filter.use( :only => ['name'] ).filter_it( data )
|
78
|
+
result.params.must_equal Hash['name' => data['name']]
|
79
|
+
result.size.must_equal 1
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'should filter a hash with only and keep' do
|
83
|
+
result = filter.use( :only => ['name'], :keep => ['id'] ).filter_it( data )
|
84
|
+
result.params.must_equal Hash['name' => data['name']]
|
85
|
+
result.id.must_equal data['id']
|
86
|
+
result.size.must_equal 2
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'should filter a hash with nested only' do
|
90
|
+
result = filter.use( :include => { 'address' =>
|
91
|
+
{:only => ['street']}} ).filter_it( data )
|
92
|
+
data.delete('phone_numbers')
|
93
|
+
data['address'].delete('zipcode')
|
94
|
+
result.params.must_equal Hash[data]
|
95
|
+
result.size.must_equal 1
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'should filter a hash with nested except' do
|
99
|
+
result = filter.use( :include => { 'address' =>
|
100
|
+
{:except => ['zipcode']}} ).filter_it( data )
|
101
|
+
data.delete('phone_numbers')
|
102
|
+
data['address'].delete('zipcode')
|
103
|
+
result.params.must_equal Hash[data]
|
104
|
+
result.size.must_equal 1
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'should filter a hash with nested include' do
|
108
|
+
result = filter.use( :include => { 'address' => {}, 'phone_numbers' =>
|
109
|
+
{ :include => ['area']}} ).filter_it( data )
|
110
|
+
result.params.must_equal Hash[data]
|
111
|
+
result.size.must_equal 1
|
112
|
+
end
|
113
|
+
end
|
data/spec/params_filter_spec.rb
CHANGED
@@ -42,7 +42,7 @@ describe Ixtlan::Babel::ParamsFilter do
|
|
42
42
|
it 'should filter a hash with keep' do
|
43
43
|
result = filter.use( :keep => ['id'] ).filter_it( data )
|
44
44
|
result.params.must_equal Hash[ 'name' => data['name'] ]
|
45
|
-
result
|
45
|
+
result.id.must_equal data['id']
|
46
46
|
result.size.must_equal 2
|
47
47
|
end
|
48
48
|
|
@@ -70,7 +70,7 @@ describe Ixtlan::Babel::ParamsFilter do
|
|
70
70
|
it 'should filter a hash with except and keep' do
|
71
71
|
result = filter.use( :except => ['id'], :keep => ['id'] ).filter_it( data )
|
72
72
|
result.params.must_equal Hash['name' => data['name']]
|
73
|
-
result
|
73
|
+
result.id.must_equal data['id']
|
74
74
|
end
|
75
75
|
|
76
76
|
it 'should filter a hash with only' do
|
@@ -82,7 +82,7 @@ describe Ixtlan::Babel::ParamsFilter do
|
|
82
82
|
it 'should filter a hash with only and keep' do
|
83
83
|
result = filter.use( :only => ['name'], :keep => ['id'] ).filter_it( data )
|
84
84
|
result.params.must_equal Hash['name' => data['name']]
|
85
|
-
result
|
85
|
+
result.id.must_equal data['id']
|
86
86
|
result.size.must_equal 2
|
87
87
|
end
|
88
88
|
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,94 +1,83 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ixtlan-babel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.5.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Christian Meier
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-12-12 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rake
|
16
15
|
version_requirements: !ruby/object:Gem::Requirement
|
17
16
|
requirements:
|
18
|
-
- -
|
17
|
+
- - ~>
|
19
18
|
- !ruby/object:Gem::Version
|
20
19
|
version: '10.0'
|
21
|
-
none: false
|
22
20
|
requirement: !ruby/object:Gem::Requirement
|
23
21
|
requirements:
|
24
|
-
- -
|
22
|
+
- - ~>
|
25
23
|
- !ruby/object:Gem::Version
|
26
24
|
version: '10.0'
|
27
|
-
none: false
|
28
25
|
prerelease: false
|
29
26
|
type: :development
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: minitest
|
32
29
|
version_requirements: !ruby/object:Gem::Requirement
|
33
30
|
requirements:
|
34
|
-
- -
|
31
|
+
- - ~>
|
35
32
|
- !ruby/object:Gem::Version
|
36
33
|
version: '4.0'
|
37
|
-
none: false
|
38
34
|
requirement: !ruby/object:Gem::Requirement
|
39
35
|
requirements:
|
40
|
-
- -
|
36
|
+
- - ~>
|
41
37
|
- !ruby/object:Gem::Version
|
42
38
|
version: '4.0'
|
43
|
-
none: false
|
44
39
|
prerelease: false
|
45
40
|
type: :development
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: virtus
|
48
43
|
version_requirements: !ruby/object:Gem::Requirement
|
49
44
|
requirements:
|
50
|
-
- -
|
45
|
+
- - ~>
|
51
46
|
- !ruby/object:Gem::Version
|
52
47
|
version: '0.5'
|
53
|
-
none: false
|
54
48
|
requirement: !ruby/object:Gem::Requirement
|
55
49
|
requirements:
|
56
|
-
- -
|
50
|
+
- - ~>
|
57
51
|
- !ruby/object:Gem::Version
|
58
52
|
version: '0.5'
|
59
|
-
none: false
|
60
53
|
prerelease: false
|
61
54
|
type: :development
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: multi_json
|
64
57
|
version_requirements: !ruby/object:Gem::Requirement
|
65
58
|
requirements:
|
66
|
-
- -
|
59
|
+
- - ~>
|
67
60
|
- !ruby/object:Gem::Version
|
68
61
|
version: '1.6'
|
69
|
-
none: false
|
70
62
|
requirement: !ruby/object:Gem::Requirement
|
71
63
|
requirements:
|
72
|
-
- -
|
64
|
+
- - ~>
|
73
65
|
- !ruby/object:Gem::Version
|
74
66
|
version: '1.6'
|
75
|
-
none: false
|
76
67
|
prerelease: false
|
77
68
|
type: :development
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: json
|
80
71
|
version_requirements: !ruby/object:Gem::Requirement
|
81
72
|
requirements:
|
82
|
-
- -
|
73
|
+
- - ~>
|
83
74
|
- !ruby/object:Gem::Version
|
84
75
|
version: '1.7'
|
85
|
-
none: false
|
86
76
|
requirement: !ruby/object:Gem::Requirement
|
87
77
|
requirements:
|
88
|
-
- -
|
78
|
+
- - ~>
|
89
79
|
- !ruby/object:Gem::Version
|
90
80
|
version: '1.7'
|
91
|
-
none: false
|
92
81
|
prerelease: false
|
93
82
|
type: :development
|
94
83
|
description: babel offers a filter for hashes and with that comes json/yaml/xml de/serialization of models which provides a hash representationi. possible models are activerecord, activemodel, resources from datamapper, virtus
|
@@ -99,68 +88,70 @@ extensions: []
|
|
99
88
|
extra_rdoc_files: []
|
100
89
|
files:
|
101
90
|
- lib/ixtlan-babel.rb
|
102
|
-
- lib/ixtlan/babel/dm_validation_errors_serializer.rb~
|
103
|
-
- lib/ixtlan/babel/context.rb~
|
104
|
-
- lib/ixtlan/babel/filter_config.rb~
|
105
|
-
- lib/ixtlan/babel/context.rb
|
106
|
-
- lib/ixtlan/babel/hash_only_filter.rb~
|
107
|
-
- lib/ixtlan/babel/hash_filter.rb
|
108
|
-
- lib/ixtlan/babel/abstract_filter.rb~
|
109
|
-
- lib/ixtlan/babel/serializer.rb~
|
110
|
-
- lib/ixtlan/babel/serializer.rb
|
111
|
-
- lib/ixtlan/babel/factory.rb~
|
112
91
|
- lib/ixtlan/babel/config.rb~
|
92
|
+
- lib/ixtlan/babel/filter_config.rb
|
93
|
+
- lib/ixtlan/babel/params_filter.rb~
|
94
|
+
- lib/ixtlan/babel/model_filter.rb
|
95
|
+
- lib/ixtlan/babel/dm_validation_errors_serializer.rb~
|
96
|
+
- lib/ixtlan/babel/hash_filter.rb~
|
113
97
|
- lib/ixtlan/babel/params_filter.rb
|
98
|
+
- lib/ixtlan/babel/serializer.rb~
|
114
99
|
- lib/ixtlan/babel/factory.rb
|
100
|
+
- lib/ixtlan/babel/abstract_filter.rb~
|
101
|
+
- lib/ixtlan/babel/hash_only_filter.rb~
|
102
|
+
- lib/ixtlan/babel/context.rb
|
103
|
+
- lib/ixtlan/babel/dm_validation_errors_serializer.rb
|
115
104
|
- lib/ixtlan/babel/model_filter.rb~
|
116
|
-
- lib/ixtlan/babel/
|
117
|
-
- lib/ixtlan/babel/
|
118
|
-
- lib/ixtlan/babel/
|
105
|
+
- lib/ixtlan/babel/serializer.rb
|
106
|
+
- lib/ixtlan/babel/filter_config.rb~
|
107
|
+
- lib/ixtlan/babel/context.rb~
|
119
108
|
- lib/ixtlan/babel/abstract_filter.rb
|
120
|
-
- lib/ixtlan/babel/
|
121
|
-
- lib/ixtlan/babel/hash_filter.rb
|
122
|
-
- spec/
|
109
|
+
- lib/ixtlan/babel/factory.rb~
|
110
|
+
- lib/ixtlan/babel/hash_filter.rb
|
111
|
+
- spec/params_filter_dsl_spec.rb
|
112
|
+
- spec/model_filter_spec.rb~
|
113
|
+
- spec/params_filter_spec.rb~
|
114
|
+
- spec/model_filter_with_methods_spec.rb~
|
123
115
|
- spec/params_filter_spec.rb
|
124
|
-
- spec/
|
116
|
+
- spec/params_filter_dsl_spec.rb~
|
125
117
|
- spec/hash_filter_spec.rb~
|
118
|
+
- spec/model_filter_with_dsl_spec.rb
|
119
|
+
- spec/model_filter_with_methods_spec.rb
|
126
120
|
- spec/spec_helper.rb
|
127
|
-
- spec/model_filter_with_methods.spec.rb~
|
128
|
-
- spec/params_filter_spec.rb~
|
129
121
|
- spec/hash_filter_spec.rb
|
130
|
-
- spec/
|
131
|
-
- spec/model_filter_spec.rb
|
122
|
+
- spec/model_filter_with_methods.spec.rb~
|
123
|
+
- spec/model_filter_spec.rb
|
132
124
|
- MIT-LICENSE
|
133
125
|
- README.md
|
134
126
|
- Gemfile
|
135
127
|
homepage: https://github.com/mkristian/ixtlan-babel
|
136
128
|
licenses:
|
137
129
|
- MIT
|
130
|
+
metadata: {}
|
138
131
|
post_install_message:
|
139
132
|
rdoc_options: []
|
140
133
|
require_paths:
|
141
134
|
- lib
|
142
135
|
required_ruby_version: !ruby/object:Gem::Requirement
|
143
136
|
requirements:
|
144
|
-
- -
|
137
|
+
- - '>='
|
145
138
|
- !ruby/object:Gem::Version
|
146
|
-
version:
|
147
|
-
MA==
|
148
|
-
none: false
|
139
|
+
version: '0'
|
149
140
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
150
141
|
requirements:
|
151
|
-
- -
|
142
|
+
- - '>='
|
152
143
|
- !ruby/object:Gem::Version
|
153
|
-
version:
|
154
|
-
MA==
|
155
|
-
none: false
|
144
|
+
version: '0'
|
156
145
|
requirements: []
|
157
146
|
rubyforge_project:
|
158
|
-
rubygems_version: 1.
|
147
|
+
rubygems_version: 2.1.9
|
159
148
|
signing_key:
|
160
|
-
specification_version:
|
149
|
+
specification_version: 4
|
161
150
|
summary: babel offers a filter for hashes and with that comes json/yaml/xml de/serialization of models which provides a hash representation
|
162
151
|
test_files:
|
163
|
-
- spec/
|
152
|
+
- spec/params_filter_dsl_spec.rb
|
164
153
|
- spec/params_filter_spec.rb
|
154
|
+
- spec/model_filter_with_dsl_spec.rb
|
165
155
|
- spec/model_filter_with_methods_spec.rb
|
166
156
|
- spec/hash_filter_spec.rb
|
157
|
+
- spec/model_filter_spec.rb
|