ixtlan-babel 0.3.5 → 0.4.0

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/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