ixtlan-babel 0.3.5 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,3 +1,6 @@
1
- source :rubygems
1
+ source 'https://rubygems.org'
2
2
 
3
3
  gemspec
4
+
5
+ gem 'copyright-header', '~> 1.0', :platform => :mri
6
+
@@ -28,7 +28,7 @@ module Ixtlan
28
28
  def options
29
29
  @options || {}
30
30
  end
31
-
31
+
32
32
  def add_custom_serializers( map )
33
33
  @map = map
34
34
  end
@@ -40,7 +40,7 @@ module Ixtlan
40
40
  data
41
41
  end
42
42
  end
43
-
43
+
44
44
  end
45
45
  end
46
- end
46
+ end
@@ -4,5 +4,5 @@ class DataMapper::Validations::ValidationErrorsSerializer < Ixtlan::Babel::Seria
4
4
  def to_hash( o = nil)
5
5
  @model_or_models.to_hash
6
6
  end
7
-
7
+
8
8
  end
@@ -32,7 +32,7 @@ module Ixtlan
32
32
  DATE_TIME_TO_S = Proc.new do |dt|
33
33
  dt.strftime('%Y-%m-%dT%H:%M:%S.') + ("%06d" % (dt.sec_fraction * NANOSECONDS_IN_DAY ) )[0..6] + dt.strftime('%z')
34
34
  end
35
-
35
+
36
36
  DEFAULT_MAP = {
37
37
  'DateTime' => DATE_TIME_TO_S,
38
38
  'ActiveSupport::TimeWithZone' => TIME_TO_S,
@@ -57,7 +57,8 @@ module Ixtlan
57
57
  def new_serializer( resource )
58
58
  if resource.respond_to?(:model)
59
59
  model = resource.model
60
- elsif resource.respond_to?( :collect) && !resource.respond_to?( :to_hash)
60
+ elsif resource.respond_to?( :collect) &&
61
+ !resource.respond_to?( :to_hash)
61
62
  if resource.empty?
62
63
  return EmptyArraySerializer.new
63
64
  else
@@ -22,7 +22,7 @@ require 'ixtlan/babel/context'
22
22
  module Ixtlan
23
23
  module Babel
24
24
  class FilterConfig
25
-
25
+
26
26
  private
27
27
 
28
28
  def context
@@ -32,7 +32,7 @@ module Ixtlan
32
32
  def context_options( context_or_options )
33
33
  if context_or_options
34
34
  case context_or_options
35
- when Symbol
35
+ when Symbol
36
36
  if opts = context[ context_or_options ]
37
37
  opts.dup
38
38
  end
@@ -44,7 +44,7 @@ module Ixtlan
44
44
 
45
45
  public
46
46
 
47
- def default_context_key( single = :single,
47
+ def default_context_key( single = :single,
48
48
  collection = :collection )
49
49
  @single, @collection = single, collection
50
50
  end
@@ -58,15 +58,17 @@ module Ixtlan
58
58
  end
59
59
 
60
60
  def single_options( context_or_options )
61
- context_options( context_or_options ) || context[ default_context_key[ 0 ] ] || {}
61
+ context_options( context_or_options ) ||
62
+ context[ default_context_key[ 0 ] ] || {}
62
63
  end
63
64
 
64
65
  def collection_options( context_or_options )
65
- context_options( context_or_options ) || context[ default_context_key[ 1 ] ] || {}
66
+ context_options( context_or_options ) ||
67
+ context[ default_context_key[ 1 ] ] || {}
66
68
  end
67
69
 
68
70
  attr_accessor :root
69
71
 
70
72
  end
71
73
  end
72
- end
74
+ end
@@ -25,7 +25,7 @@ module Ixtlan
25
25
 
26
26
  def filter( data )
27
27
  if data
28
- filter_data( data,
28
+ filter_data( data,
29
29
  Context.new( options ) )
30
30
  end
31
31
  end
@@ -33,7 +33,7 @@ module Ixtlan
33
33
  private
34
34
 
35
35
  def filter_array( array, options )
36
- array.collect do |item|
36
+ array.collect do |item|
37
37
  if item.is_a?( Array ) || item.is_a?( Hash )
38
38
  filter_data( item, options )
39
39
  else
@@ -48,9 +48,11 @@ module Ixtlan
48
48
  k = k.to_s
49
49
  case v
50
50
  when Hash
51
- result[ k ] = filter_data( v, context[ k ] ) if context.include?( k )
51
+ result[ k ] = filter_data( v,
52
+ context[ k ] ) if context.include?( k )
52
53
  when Array
53
- result[ k ] = filter_array( v, context[ k ] ) if context.include?( k )
54
+ result[ k ] = filter_array( v,
55
+ context[ k ] ) if context.include?( k )
54
56
  else
55
57
  result[ k ] = serialize( v ) if context.allowed?( k )
56
58
  end
@@ -28,7 +28,7 @@ module Ixtlan
28
28
  data = block.call( model )
29
29
  filter_data( model, data,
30
30
  Context.new( options ),
31
- &block )
31
+ &block )
32
32
  end
33
33
  end
34
34
 
@@ -54,16 +54,22 @@ module Ixtlan
54
54
 
55
55
  def filter_data(model, data, context, &block)
56
56
  setup_data(model, data, context)
57
-
57
+
58
58
  result = {}
59
59
  data.each do |k,v|
60
60
  k = k.to_s
61
61
  if v.respond_to? :attributes
62
- result[ k ] = filter_data( v, block.call(v), context[ k ], &block ) if context.include?( k )
62
+ result[ k ] = filter_data( v,
63
+ block.call(v),
64
+ context[ k ],
65
+ &block ) if context.include?( k )
63
66
  elsif v.is_a? Array
64
- result[ k ] = filter_array( v, context[ k ], &block ) if context.include?( k )
67
+ result[ k ] = filter_array( v,
68
+ context[ k ],
69
+ &block ) if context.include?( k )
65
70
  else
66
- result[ k ] = serialize( v ) if context.allowed?( k ) && ! v.respond_to?( :attributes )
71
+ result[ k ] = serialize( v ) if context.allowed?( k ) &&
72
+ ! v.respond_to?( :attributes )
67
73
  end
68
74
  end
69
75
  result
@@ -60,6 +60,37 @@ module Ixtlan
60
60
  self
61
61
  end
62
62
 
63
+ class FilterResult
64
+
65
+ def initialize( model, params, keeps )
66
+ @model = model
67
+ @data = keeps
68
+ @data[ :params ] = params
69
+ end
70
+
71
+ def new_model
72
+ @model.send( :new, params )
73
+ end
74
+
75
+ def params
76
+ @data[ :params ]
77
+ end
78
+
79
+ def method_missing( method, *args )
80
+ if respond_to?( method )
81
+ @data[ method ] || @data[ method.to_s ]
82
+ elsif @data.respond_to?( method )
83
+ @data.send( method, *args )
84
+ else
85
+ super
86
+ end
87
+ end
88
+
89
+ def respond_to?( method )
90
+ @data.key?( method ) || @data.key?( method.to_s )
91
+ end
92
+ end
93
+
63
94
  def filter_it( data )
64
95
  filter.options = self.class.config.single_options( @context_or_options )
65
96
  data = data.dup
@@ -67,17 +98,15 @@ module Ixtlan
67
98
  keeps = {}
68
99
  ( filter.options[ :keep ] || [] ).each do |k|
69
100
  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
101
+ keeps[ k.to_s ] = data.delete( k.to_s ) ||
102
+ data.delete( k.to_sym ) unless keep.is_a? Hash
71
103
  end
72
104
  filtered_data = filter.filter( data )
73
105
  ( 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 )
106
+ keeps[ k.to_s ] = filtered_data.delete( k.to_s ) ||
107
+ filtered_data.delete( k.to_sym ) unless keeps.member?( k.to_s )
75
108
  end
76
- [ filtered_data, keeps ]
77
- end
78
-
79
- def new( data )
80
- @model_class.new( filter( data ) )
109
+ FilterResult.new( @model_class, filtered_data, keeps )
81
110
  end
82
111
  end
83
112
  end
@@ -37,7 +37,7 @@ module Ixtlan
37
37
  def initialize(model_or_models)
38
38
  @model_or_models = model_or_models
39
39
  end
40
-
40
+
41
41
  def respond_to?(method)
42
42
  @model_or_models.respond_to?(method)
43
43
  end
@@ -45,7 +45,7 @@ module Ixtlan
45
45
  def method_missing(method, *args, &block)
46
46
  @model_or_models.send(method, *args, &block)
47
47
  end
48
-
48
+
49
49
  def add_custom_serializers(map)
50
50
  filter.add_custom_serializers(map)
51
51
  end
@@ -57,7 +57,7 @@ module Ixtlan
57
57
  end
58
58
 
59
59
  def filter
60
- @filter ||= @model_or_models.is_a?( Hash ) ? HashFilter.new : ModelFilter.new
60
+ @filter ||= ModelFilter.new
61
61
  end
62
62
 
63
63
  protected
@@ -119,7 +119,8 @@ module Ixtlan
119
119
  private :setup_filter
120
120
 
121
121
  def collection?
122
- @is_collection ||= @model_or_models.respond_to?(:collect) && ! @model_or_models.is_a?(Hash)
122
+ @is_collection ||= @model_or_models.respond_to?(:collect) &&
123
+ ! @model_or_models.is_a?(Hash)
123
124
  end
124
125
  private :collection?
125
126
 
@@ -139,7 +140,7 @@ module Ixtlan
139
140
  def to_yaml(options = nil)
140
141
  to_hash(options).to_yaml
141
142
  end
142
-
143
+
143
144
  protected
144
145
 
145
146
  def attr(model)
@@ -154,7 +155,7 @@ module Ixtlan
154
155
  else
155
156
  filter.filter( model ){ |model| attr(model) }
156
157
  end
157
- end
158
+ end
158
159
  end
159
160
  end
160
161
  end
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
- require 'ixtlan/babel/deserializer'
3
2
 
4
3
  class Hash
5
4
  def attributes
@@ -16,17 +15,17 @@ describe Ixtlan::Babel::HashFilter do
16
15
  'id' => 987,
17
16
  'name' => 'me and the corner',
18
17
  'address' => { 'street' => 'Foo 12', 'zipcode' => '12345' },
19
- 'phone_numbers' => {
20
- 'prefix' => 12,
18
+ 'phone_numbers' => {
19
+ 'prefix' => 12,
21
20
  'number' => '123',
22
21
  'area' => { 'code' => '001', 'iso' => 'us'}
23
22
  }
24
23
  }
25
24
  class Hash
26
- def self.new(hash = nil, &block)
25
+ def self.new(hash = nil, &block)
27
26
  if hash
28
27
  self[hash]
29
- else
28
+ else
30
29
  super &block
31
30
  end
32
31
  end
@@ -35,7 +34,26 @@ describe Ixtlan::Babel::HashFilter do
35
34
  end
36
35
 
37
36
  let(:serializer) { Ixtlan::Babel::Serializer.new(data) }
38
- let(:deserializer) { Ixtlan::Babel::Deserializer.new(Hash) }
37
+ let(:deserializer) do
38
+ f = Ixtlan::Babel::HashFilter.new
39
+ def f.from_json( json, options = nil )
40
+ data = MultiJson.load(json)
41
+ self.options = options || {}
42
+ if data.is_a? Array
43
+ if filter.options[:root]
44
+ data.collect do |d|
45
+ Hash.new( self.filter( d[ self.options[:root] ] ) )
46
+ end
47
+ else
48
+ data.collect{ |d| Hash.new( self.filter( d ) ) }
49
+ end
50
+ else
51
+ data = data[ self.options[:root] ] if self.options[:root]
52
+ Hash.new( self.filter( data ) )
53
+ end
54
+ end
55
+ f
56
+ end
39
57
 
40
58
  it 'should serialize and deserialize a hash' do
41
59
  json = serializer.to_json
@@ -47,25 +65,26 @@ describe Ixtlan::Babel::HashFilter do
47
65
  json = serializer.to_json :root => 'my'
48
66
  result = deserializer.from_json(json, :root => 'my')
49
67
  result.must_equal Hash['id' => data['id'], 'name' => data['name']]
50
- end
68
+ end
51
69
 
52
70
  it 'should serialize and deserialize a hash with include list' do
53
- json = serializer.to_json(:include => ['address', 'phone_numbers'])
54
- result = deserializer.from_json(json, :include => ['address', 'phone_numbers'])
71
+ json = serializer.to_json(:include => ['address', 'phone_numbers'])
72
+ result = deserializer.from_json(json, :include =>
73
+ ['address', 'phone_numbers'])
55
74
  data['phone_numbers'].delete('area')
56
75
  result.must_equal Hash[data]
57
76
  end
58
77
 
59
78
  it 'should serialize and deserialize a hash with except' do
60
- json = serializer.to_json(:except => ['id'])
61
- result = deserializer.from_json(json, :except => ['id'])
79
+ json = serializer.to_json(:except => ['id'])
80
+ result = deserializer.from_json(json, :except => ['id'])
62
81
  result.must_equal Hash['name' => data['name']]
63
- result = deserializer.from_json(json)
82
+ result = deserializer.from_json(json)
64
83
  result.must_equal Hash['name' => data['name']]
65
84
  end
66
85
 
67
86
  it 'should serialize and deserialize a hash with only' do
68
- json = serializer.to_json(:only => ['name'])
87
+ json = serializer.to_json(:only => ['name'])
69
88
  result = deserializer.from_json(json, :only => ['name'])
70
89
  result.must_equal Hash['name' => data['name']]
71
90
  result = deserializer.from_json(json)
@@ -76,30 +95,37 @@ describe Ixtlan::Babel::HashFilter do
76
95
  json = serializer.to_json(:include => { 'address' => {:only => ['street']}})
77
96
  data.delete('phone_numbers')
78
97
  data['address'].delete('zipcode')
79
- result = deserializer.from_json(json, :include => { 'address' => {:only => ['street']}})
98
+ result = deserializer.from_json(json, :include =>
99
+ { 'address' => {:only => ['street']}})
80
100
  result.must_equal data
81
101
  result = deserializer.from_json(json, :include => ['address'])
82
102
  result.must_equal data
83
103
  end
84
104
 
85
105
  it 'should serialize and deserialize a hash with nested except' do
86
- json = serializer.to_json(:include => { 'address' => {:except => ['zipcode']}})
106
+ json = serializer.to_json(:include => { 'address' =>
107
+ {:except => ['zipcode']}})
87
108
  data.delete('phone_numbers')
88
109
  data['address'].delete('zipcode')
89
- result = deserializer.from_json(json, :include => { 'address' => {:except => ['zipcode']}})
110
+ result = deserializer.from_json(json, :include => { 'address' =>
111
+ {:except => ['zipcode']}})
90
112
  result.must_equal data
91
113
  result = deserializer.from_json(json, :include => ['address'])
92
114
  result.must_equal data
93
115
  end
94
116
 
95
117
  it 'should serialize and deserialize a hash with nested include' do
96
- json = serializer.to_json(:include => { 'address' => {}, 'phone_numbers' => { :include => ['area']}})
97
- result = deserializer.from_json(json, :include => { 'address' => {}, 'phone_numbers' => { :include => ['area']}})
118
+ json = serializer.to_json(:include => { 'address' => {},
119
+ 'phone_numbers' => { :include => ['area']}})
120
+ result = deserializer.from_json(json, :include => { 'address' => {},
121
+ 'phone_numbers' => {
122
+ :include => ['area']}})
98
123
  result.must_equal data
99
124
  end
100
125
 
101
126
  it 'should convert elements from arrays wth custom serializer' do
102
- serializer.add_custom_serializers( "Symbol" => Proc.new {|v| v.to_s.capitalize } )
127
+ serializer.add_custom_serializers( "Symbol" =>
128
+ Proc.new {|v| v.to_s.capitalize } )
103
129
  data['children_names'] = [:adi, :aromal, :shreedev]
104
130
  d = serializer.to_hash(:include => [ :children_names ])
105
131
  d[ "children_names"].must_equal( ["Adi", "Aromal", "Shreedev"] )
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
  require 'virtus'
3
- require 'ixtlan/babel/deserializer'
3
+ require 'ixtlan/babel/serializer'
4
4
 
5
5
  class Address
6
6
  include Virtus
@@ -12,7 +12,7 @@ class Area
12
12
  include Virtus
13
13
 
14
14
  attribute :code, String
15
- attribute :iso, String
15
+ attribute :iso, String
16
16
  end
17
17
  class PhoneNumber
18
18
  include Virtus
@@ -37,8 +37,8 @@ describe Ixtlan::Babel::ModelFilter do
37
37
  :id => 987,
38
38
  :name => 'me and the corner',
39
39
  :address => Address.new( :street => 'Foo 12', :zipcode => '12345' ),
40
- :phone_numbers => [PhoneNumber.new(
41
- :prefix => 12,
40
+ :phone_numbers => [PhoneNumber.new(
41
+ :prefix => 12,
42
42
  :number => '123',
43
43
  :area => Area.new( :code => '001', :iso => 'us' )
44
44
  )],
@@ -47,168 +47,84 @@ describe Ixtlan::Babel::ModelFilter do
47
47
  end
48
48
 
49
49
  let(:serializer) { Ixtlan::Babel::Serializer.new( person ) }
50
- let(:deserializer) { Ixtlan::Babel::Deserializer.new( Person ) }
51
50
 
52
51
  it 'should serialize and deserialize without root' do
53
52
  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
- attributes = result.attributes.delete_if { |k,v| v.nil? || v.empty? }
58
-
59
- attributes.must_equal Hash[:id => person['id'], :name => person['name']]
53
+ result = MultiJson.load(json)
54
+ result.must_equal Hash['id' => person['id'], 'name' => person['name']]
60
55
  end
61
56
 
62
57
  it 'should serialize and deserialize with root' do
63
58
  json = serializer.to_json :root => 'my'
64
- result = deserializer.from_json(json, :root => 'my')
65
-
66
- # travis produces [] and locally there is a nil - filter empty as well :(
67
- attributes = result.attributes.delete_if { |k,v| v.nil? || v.empty? }
68
-
69
- attributes.must_equal Hash[:id => person['id'], :name => person['name']]
70
- end
59
+ result = MultiJson.load(json)[ 'my' ]
60
+ result.must_equal Hash['id' => person['id'], 'name' => person['name']]
61
+ end
71
62
 
72
63
  it 'should serialize and deserialize a hash with include list' do
73
- json = serializer.to_json(:include => ['address', 'phone_numbers'])
74
- result = deserializer.from_json(json, :include => ['address', 'phone_numbers'])
75
- result.object_id.wont_equal person.object_id
76
- result.address.attributes.must_equal person.address.attributes
77
- result.phone_numbers[0].area.must_be_nil
78
- person.phone_numbers[0].area = nil
79
- result.phone_numbers[0].attributes.must_equal person.phone_numbers[0].attributes
80
- result.name.must_equal person.name
81
- result.id.must_equal person.id
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" } ] ]
82
74
  end
83
75
 
84
76
  it 'should serialize and deserialize with except' do
85
- json = serializer.to_json(:except => ['id'])
86
- result = deserializer.from_json(json, :except => ['id'])
87
-
88
- expected = Hash[:name => person['name'], :address=>nil, :phone_numbers=>[], :id => nil, :children_names => []]
89
-
90
- # travis sees empty array and locally it is nil :(
91
- result.phone_numbers ||= []
92
- result.children_names ||= []
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
- result.children_names ||= []
103
-
104
- result.attributes.keys.dup.each do |k|
105
- result.attributes[ k ].must_equal expected[ k ]
106
- end
77
+ json = serializer.to_json(:except => ['id'])
78
+ result = MultiJson.load(json)
79
+ result.must_equal Hash['name' => person['name']]
107
80
  end
108
81
 
109
82
  it 'should serialize and deserialize with only' do
110
- json = serializer.to_json(:only => ['name'])
111
- result = deserializer.from_json(json, :only => ['name'])
112
-
113
- # travis sees empty array and locally it is nil :(
114
- result.phone_numbers ||= []
115
- result.children_names ||= []
116
-
117
- expected = Hash[:name => person['name'], :address=>nil, :phone_numbers=>[], :id => nil, :children_names => []]
118
- result.attributes.keys.dup.each do |k|
119
- result.attributes[ k ].must_equal expected[ k ]
120
- end
121
-
122
- result = deserializer.from_json(json)
123
-
124
- # travis sees empty array and locally it is nil :(
125
- result.phone_numbers ||= []
126
- result.children_names ||= []
83
+ json = serializer.to_json(:only => ['name'])
84
+ result = MultiJson.load(json)
127
85
 
128
- result.attributes.keys.dup.each do |k|
129
- result.attributes[ k ].must_equal expected[ k ]
130
- end
86
+ result.must_equal Hash['name' => person['name']]
131
87
  end
132
88
 
133
89
  it 'should serialize and deserialize with nested only' do
134
90
  json = serializer.to_json(:include => { 'address' => {:only => ['street']}})
135
- result = deserializer.from_json(json, :include => { 'address' => {:only => ['street']}})
136
-
137
- json['phone_numbers'].must_be_nil
138
- json['address']['zipcode'].must_be_nil
139
-
140
- # travis produces [] and locally there is a nil :(
141
- (result.phone_numbers || []).must_equal []
142
-
143
- result.address.zipcode.must_be_nil
144
-
145
- result.name.must_equal person.name
146
- result.id.must_equal person.id
147
- end
148
-
149
- it 'should serialize and deserialize with nested only (array includes)' do
150
- json = serializer.to_json(:include => { 'address' => {:only => ['street']}})
151
- result = deserializer.from_json(json, :include => ['address'])
152
-
153
- json['phone_numbers'].must_be_nil
154
- json['address']['zipcode'].must_be_nil
155
-
156
- # travis produces [] and locally there is a nil :(
157
- (result.phone_numbers || []).must_equal []
158
-
159
- result.address.zipcode.must_be_nil
160
-
161
- result.name.must_equal person.name
162
- result.id.must_equal person.id
91
+ result = MultiJson.load(json)
92
+ result.must_equal Hash[ "id"=>"987",
93
+ "name"=>"me and the corner",
94
+ "address"=>{ "street"=>"Foo 12" } ]
163
95
  end
164
96
 
165
97
  it 'should serialize and deserialize with nested except' do
166
- json = serializer.to_json(:include => { 'address' => {:except => ['zipcode']}})
167
- result = deserializer.from_json(json, :include => { 'address' => {:except => ['zipcode']}})
168
-
169
- json['phone_numbers'].must_be_nil
170
- json['address']['zipcode'].must_be_nil
171
-
172
- # travis produces [] and locally there is a nil :(
173
- (result.phone_numbers || []).must_equal []
174
-
175
- result.address.zipcode.must_be_nil
176
-
177
- result.name.must_equal person.name
178
- result.id.must_equal person.id
179
- end
180
-
181
- it 'should serialize and deserialize with nested except (array includes)' do
182
- json = serializer.to_json(:include => { 'address' => {:except => ['zipcode']}})
183
- result = deserializer.from_json(json, :include => ['address'])
184
-
185
- json['phone_numbers'].must_be_nil
186
- json['address']['zipcode'].must_be_nil
187
-
188
- # travis produces [] and locally there is a nil :(
189
- (result.phone_numbers || []).must_equal []
190
-
191
- result.address.zipcode.must_be_nil
192
-
193
- result.name.must_equal person.name
194
- result.id.must_equal person.id
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" } ]
195
104
  end
196
105
 
197
106
  it 'should serialize and deserialize with nested include' do
198
- json = serializer.to_json(:include => { 'address' => {}, 'phone_numbers' => { :include => ['area']}})
199
- result = deserializer.from_json(json, :include => { 'address' => {}, 'phone_numbers' => { :include => ['area']}})
200
-
201
- result.object_id.wont_equal person.object_id
202
- result.address.attributes.must_equal person.address.attributes
203
- result.phone_numbers[0].area.attributes.must_equal person.phone_numbers[0].area.attributes
204
- result.phone_numbers[0].prefix.must_equal person.phone_numbers[0].prefix
205
- result.phone_numbers[0].number.must_equal person.phone_numbers[0].number
206
- result.name.must_equal person.name
207
- result.id.must_equal person.id
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
+ } ] ]
208
123
  end
209
124
 
210
125
  it 'should convert elements from arrays wth custom serializer' do
211
- serializer.add_custom_serializers( "Symbol" => Proc.new {|v| v.to_s.capitalize } )
126
+ serializer.add_custom_serializers( "Symbol" =>
127
+ Proc.new {|v| v.to_s.capitalize } )
212
128
  data = serializer.to_hash(:include => [ :children_names ])
213
129
  data[ "children_names"].must_equal( ["Adi", "Aromal", "Shreedev"] )
214
130
  end