representable 1.2.8 → 1.2.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,7 +2,7 @@ notifications:
2
2
  irc: "irc.freenode.org#cells"
3
3
  matrix:
4
4
  include:
5
- - rvm: 1.8.7
5
+ - rvm: 1.9.3
6
6
  gemfile: gemfiles/Gemfile.mongoid-2.4
7
7
  - rvm: 1.9.3
8
8
  gemfile: Gemfile
@@ -1,3 +1,9 @@
1
+ h2. 1.2.9
2
+
3
+ * When @:class@ returns @nil@ we no longer try to create a new instance but use the processed fragment itself.
4
+ * @:instance@ allows overriding the @ObjectBinding#create_object@ workflow by returning an instance from the lambda. This is particularly helpful when you need to inject additional data into the property object created in #deserialize.
5
+ * @:extend@ and @:class@ now also accept procs which allows having polymorphic properties and collections where representer and class can be chosen at runtime.
6
+
1
7
  h2. 1.2.8
2
8
 
3
9
  * Reverting all the bullshit from 1.2.7 making it even better. @Binding@s now wrap their @Definition@ instance adopting its API. Moved the binding_for_definition mechanics to the respecting @Binding@ subclass.
data/TODO ADDED
@@ -0,0 +1,7 @@
1
+ * Pass key/index as first block arg to :class and :extendv
2
+ class: |key, hsh|
3
+
4
+ * Allow passing options to Binding#serialize.
5
+ serialize(.., options{:exclude => ..})
6
+
7
+ * Allow :writer and :reader / :getter/:setter
@@ -3,5 +3,4 @@ source "http://rubygems.org"
3
3
  # Specify your gem's dependencies in roar-rails.gemspec
4
4
  gemspec :path => '../'
5
5
 
6
- gem 'mongoid', '~> 2.4.0'
7
- gem 'psych'
6
+ gem 'mongoid', '~> 2.4.0'
@@ -119,7 +119,7 @@ private
119
119
  end
120
120
 
121
121
  def representable_bindings_for(format)
122
- representable_attrs.map {|attr| format.build_for(attr) }
122
+ representable_attrs.map {|attr| format.build_for(attr, self) }
123
123
  end
124
124
 
125
125
  # Returns the wrapper for the representation. Mostly used in XML.
@@ -9,6 +9,11 @@ module Representable
9
9
  def definition # TODO: remove in 1.4.
10
10
  raise "Binding#definition is no longer supported as all Definition methods are now delegated automatically."
11
11
  end
12
+
13
+ def initialize(definition, represented)
14
+ super(definition)
15
+ @represented = represented
16
+ end
12
17
 
13
18
  # Main entry point for rendering/parsing a property object.
14
19
  def serialize(value)
@@ -24,7 +29,7 @@ module Representable
24
29
  # at runtime.
25
30
  module Extend
26
31
  # Extends the object with its representer before serialization.
27
- def serialize(object)
32
+ def serialize(*)
28
33
  extend_for(super)
29
34
  end
30
35
 
@@ -33,12 +38,22 @@ module Representable
33
38
  end
34
39
 
35
40
  def extend_for(object)
36
- if mod = representer_module
41
+ if mod = representer_module_for(object) # :extend.
37
42
  object.extend(*mod)
38
43
  end
39
-
44
+
40
45
  object
41
46
  end
47
+
48
+ private
49
+ def representer_module_for(object, *args)
50
+ call_proc_for(representer_module, object) # TODO: how to pass additional data to the computing block?`
51
+ end
52
+
53
+ def call_proc_for(proc, *args)
54
+ return proc unless proc.is_a?(Proc)
55
+ @represented.instance_exec(*args, &proc)
56
+ end
42
57
  end
43
58
 
44
59
  module Object
@@ -47,18 +62,32 @@ module Representable
47
62
  def serialize(object)
48
63
  return object if object.nil?
49
64
 
50
- super(object).send(serialize_method, :wrap => false)
65
+ super.send(serialize_method, :wrap => false) # TODO: pass :binding => self
51
66
  end
52
67
 
53
- def deserialize(data)
68
+ def deserialize(data)
54
69
  # DISCUSS: does it make sense to skip deserialization of nil-values here?
55
- super(create_object).send(deserialize_method, data)
70
+ super(create_object(data)).send(deserialize_method, data)
56
71
  end
57
72
 
58
- def create_object
59
- sought_type.new
73
+ def create_object(fragment)
74
+ instance_for(fragment) or class_for(fragment)
75
+ end
76
+
77
+ private
78
+ def class_for(fragment, *args)
79
+ item_class = class_from(fragment) or return fragment # DISCUSS: is it legal to return the very fragment here?
80
+ item_class.new
81
+ end
82
+
83
+ def class_from(fragment, *args)
84
+ call_proc_for(sought_type, fragment)
85
+ end
86
+
87
+ def instance_for(fragment, *args)
88
+ return unless options[:instance]
89
+ call_proc_for(options[:instance], fragment)
60
90
  end
61
91
  end
62
-
63
92
  end
64
93
  end
@@ -16,10 +16,10 @@ module Representable
16
16
 
17
17
 
18
18
  class PropertyBinding < Representable::Binding
19
- def self.build_for(definition)
20
- return CollectionBinding.new(definition) if definition.array?
21
- return HashBinding.new(definition) if definition.hash?
22
- new(definition)
19
+ def self.build_for(definition, represented)
20
+ return CollectionBinding.new(definition, represented) if definition.array?
21
+ return HashBinding.new(definition, represented) if definition.hash?
22
+ new(definition, represented)
23
23
  end
24
24
 
25
25
  def initialize(*args) # FIXME. make generic.
@@ -50,6 +50,7 @@ module Representable
50
50
 
51
51
  class CollectionBinding < PropertyBinding
52
52
  def serialize_for(value)
53
+ # value.enum_for(:each_with_index).collect { |obj, i| serialize(obj, i) } # DISCUSS: provide ary index/hash key for representer_module_for?
53
54
  value.collect { |obj| serialize(obj) }
54
55
  end
55
56
 
@@ -24,12 +24,12 @@ module Representable
24
24
 
25
25
 
26
26
  class PropertyBinding < Binding
27
- def self.build_for(definition)
28
- return CollectionBinding.new(definition) if definition.array?
29
- return HashBinding.new(definition) if definition.hash? and not definition.options[:use_attributes] # FIXME: hate this.
30
- return AttributeHashBinding.new(definition) if definition.hash? and definition.options[:use_attributes]
31
- return AttributeBinding.new(definition) if definition.attribute
32
- new(definition)
27
+ def self.build_for(definition, represented)
28
+ return CollectionBinding.new(definition, represented) if definition.array?
29
+ return HashBinding.new(definition, represented) if definition.hash? and not definition.options[:use_attributes] # FIXME: hate this.
30
+ return AttributeHashBinding.new(definition, represented) if definition.hash? and definition.options[:use_attributes]
31
+ return AttributeBinding.new(definition, represented) if definition.attribute
32
+ new(definition, represented)
33
33
  end
34
34
 
35
35
  def initialize(*args)
@@ -19,12 +19,12 @@ module Representable
19
19
  end
20
20
 
21
21
  class PropertyBinding < Representable::Hash::PropertyBinding
22
- def self.build_for(definition)
23
- return CollectionBinding.new(definition) if definition.array?
22
+ def self.build_for(definition, represented)
23
+ return CollectionBinding.new(definition, represented) if definition.array?
24
24
  #return HashBinding.new(definition) if definition.hash? and not definition.options[:use_attributes] # FIXME: hate this.
25
25
  #return AttributeHashBinding.new(definition) if definition.hash? and definition.options[:use_attributes]
26
26
  #return AttributeBinding.new(definition) if definition.attribute
27
- new(definition)
27
+ new(definition, represented)
28
28
  end
29
29
 
30
30
  def initialize(*args) # FIXME. make generic.
@@ -20,7 +20,7 @@ module Representable
20
20
  end
21
21
 
22
22
  def typed?
23
- sought_type.is_a?(Class) or representer_module # also true if only :extend is set, for people who want solely rendering.
23
+ sought_type.is_a?(Class) or representer_module or options[:instance] # also true if only :extend is set, for people who want solely rendering.
24
24
  end
25
25
 
26
26
  def array?
@@ -1,9 +1,10 @@
1
+ require 'representable/json'
1
2
  require 'representable/hash_methods'
2
3
 
3
4
  module Representable::JSON
4
5
  module Hash
5
6
  include Representable::JSON
6
- include HashMethods
7
+ include Representable::HashMethods
7
8
 
8
9
  def self.included(base)
9
10
  base.class_eval do
@@ -0,0 +1,29 @@
1
+ module Representable
2
+ module Feature
3
+ module ReadableWriteable
4
+ def deserialize_property(binding, doc, options)
5
+ return unless binding.writeable?
6
+ super
7
+ end
8
+
9
+ def serialize_property(binding, doc, options)
10
+ return unless binding.readable?
11
+ super
12
+ end
13
+ end
14
+ end
15
+
16
+ # TODO: i hate monkey-patching Definition here since it globally adds this options. However, for now this should be ok :-)
17
+ class Definition
18
+ # TODO: make this generic like `option :writeable, :default => true`
19
+ def writeable?
20
+ return options[:writeable] if options.has_key?(:writeable)
21
+ true
22
+ end
23
+
24
+ def readable?
25
+ return options[:readable] if options.has_key?(:readable)
26
+ true
27
+ end
28
+ end
29
+ end
@@ -1,3 +1,3 @@
1
1
  module Representable
2
- VERSION = "1.2.8"
2
+ VERSION = "1.2.9"
3
3
  end
@@ -1,3 +1,4 @@
1
+ require 'representable/xml'
1
2
  require 'representable/hash_methods'
2
3
 
3
4
  module Representable::XML
@@ -35,6 +35,8 @@ class VirtusCoercionTest < MiniTest::Spec
35
35
  end
36
36
 
37
37
  it "coerces into the provided type" do
38
+ skip "Virtus is still not correctly treating coercion on class level?"
39
+
38
40
  song = ImmigrantSong.new.from_json("{\"composed_at\":\"November 18th, 1983\",\"track\":\"18\"}")
39
41
  assert_equal DateTime.parse("Fri, 18 Nov 1983 00:00:00 +0000"), song.composed_at
40
42
  assert_equal 18, song.track
@@ -25,6 +25,10 @@ class DefinitionTest < MiniTest::Spec
25
25
  it "is true when :extend is present, only" do
26
26
  assert Representable::Definition.new(:songs, :extend => Hash).typed?
27
27
  end
28
+
29
+ it "is true when :instance is present, only" do
30
+ assert Representable::Definition.new(:songs, :instance => Object.new).typed?
31
+ end
28
32
  end
29
33
 
30
34
  it "responds to #getter and returns string" do
@@ -59,6 +59,11 @@ puts song.extend(SongRepresenter).to_json
59
59
  ######### nesting types
60
60
 
61
61
  class Album < OpenStruct
62
+ def name
63
+ puts @table.inspect
64
+ #@attributes
65
+ @table[:name]
66
+ end
62
67
  end
63
68
 
64
69
  module AlbumRepresenter
@@ -88,6 +93,20 @@ SongRepresenter.module_eval do
88
93
  end
89
94
 
90
95
 
96
+ ######### using helpers (customizing the rendering/parsing)
97
+ module AlbumRepresenter
98
+ def name
99
+ super.upper
100
+ end
101
+ end
102
+ album = Album.new(:name => "The Police", :songs => [song, Song.new(:title => "Synchronicity")])
103
+ puts album.extend(AlbumRepresenter).to_json
104
+
105
+ SongRepresenter.module_eval do
106
+ @representable_attrs = nil
107
+ end
108
+
109
+
91
110
  ######### inheritance
92
111
  module SongRepresenter
93
112
  include Representable::JSON
@@ -156,4 +175,5 @@ puts song.extend(SongRepresenter).to_yaml
156
175
 
157
176
  ######### custom methods in representer (using helpers)
158
177
  ######### r/w, conditions
159
- #########
178
+ #########
179
+ ######### polymorphic :extend and :class, instance context!, :instance
@@ -15,7 +15,7 @@ class HashBindingTest < MiniTest::Spec
15
15
  describe "PropertyBinding" do
16
16
  describe "#read" do
17
17
  before do
18
- @property = Representable::Hash::PropertyBinding.new(Representable::Definition.new(:song))
18
+ @property = Representable::Hash::PropertyBinding.new(Representable::Definition.new(:song), nil)
19
19
  end
20
20
 
21
21
  it "returns fragment if present" do
@@ -32,7 +32,7 @@ class HashBindingTest < MiniTest::Spec
32
32
 
33
33
  describe "with plain text" do
34
34
  before do
35
- @property = Representable::Hash::PropertyBinding.new(Representable::Definition.new(:song))
35
+ @property = Representable::Hash::PropertyBinding.new(Representable::Definition.new(:song), nil)
36
36
  end
37
37
 
38
38
  it "extracts with #read" do
@@ -48,7 +48,7 @@ class HashBindingTest < MiniTest::Spec
48
48
 
49
49
  describe "with an object" do
50
50
  before do
51
- @property = Representable::Hash::PropertyBinding.new(Representable::Definition.new(:song, :class => SongWithRepresenter))
51
+ @property = Representable::Hash::PropertyBinding.new(Representable::Definition.new(:song, :class => SongWithRepresenter), nil)
52
52
  @doc = {}
53
53
  end
54
54
 
@@ -64,7 +64,7 @@ class HashBindingTest < MiniTest::Spec
64
64
 
65
65
  describe "with an object and :extend" do
66
66
  before do
67
- @property = Representable::Hash::PropertyBinding.new(Representable::Definition.new(:song, :class => Song, :extend => SongRepresenter))
67
+ @property = Representable::Hash::PropertyBinding.new(Representable::Definition.new(:song, :class => Song, :extend => SongRepresenter), nil)
68
68
  @doc = {}
69
69
  end
70
70
 
@@ -83,7 +83,7 @@ class HashBindingTest < MiniTest::Spec
83
83
  describe "CollectionBinding" do
84
84
  describe "with plain text items" do
85
85
  before do
86
- @property = Representable::Hash::CollectionBinding.new(Representable::Definition.new(:songs, :collection => true))
86
+ @property = Representable::Hash::CollectionBinding.new(Representable::Definition.new(:songs, :collection => true), nil)
87
87
  end
88
88
 
89
89
  it "extracts with #read" do
@@ -104,7 +104,7 @@ class HashBindingTest < MiniTest::Spec
104
104
  describe "HashBinding" do
105
105
  describe "with plain text items" do
106
106
  before do
107
- @property = Representable::Hash::HashBinding.new(Representable::Definition.new(:songs, :hash => true))
107
+ @property = Representable::Hash::HashBinding.new(Representable::Definition.new(:songs, :hash => true), nil)
108
108
  end
109
109
 
110
110
  it "extracts with #read" do
@@ -120,7 +120,7 @@ class HashBindingTest < MiniTest::Spec
120
120
 
121
121
  describe "with objects" do
122
122
  before do
123
- @property = Representable::Hash::HashBinding.new(Representable::Definition.new(:songs, :hash => true, :class => Song, :extend => SongRepresenter))
123
+ @property = Representable::Hash::HashBinding.new(Representable::Definition.new(:songs, :hash => true, :class => Song, :extend => SongRepresenter), nil)
124
124
  end
125
125
 
126
126
  it "doesn't change the represented hash in #write" do
@@ -128,19 +128,19 @@ module JsonTest
128
128
 
129
129
  describe "#build_for" do
130
130
  it "returns ObjectBinding" do
131
- assert_kind_of Representable::Hash::ObjectBinding, Representable::Hash::PropertyBinding.build_for(Def.new(:band, :class => Hash))
131
+ assert_kind_of Representable::Hash::ObjectBinding, Representable::Hash::PropertyBinding.build_for(Def.new(:band, :class => Hash), nil)
132
132
  end
133
133
 
134
134
  it "returns TextBinding" do
135
- assert_kind_of Representable::Hash::PropertyBinding, Representable::Hash::PropertyBinding.build_for(Def.new(:band))
135
+ assert_kind_of Representable::Hash::PropertyBinding, Representable::Hash::PropertyBinding.build_for(Def.new(:band), nil)
136
136
  end
137
137
 
138
138
  it "returns HashBinding" do
139
- assert_kind_of Representable::Hash::HashBinding, Representable::Hash::PropertyBinding.build_for(Def.new(:band, :hash => true))
139
+ assert_kind_of Representable::Hash::HashBinding, Representable::Hash::PropertyBinding.build_for(Def.new(:band, :hash => true), nil)
140
140
  end
141
141
 
142
142
  it "returns CollectionBinding" do
143
- assert_kind_of Representable::Hash::CollectionBinding, Representable::Hash::PropertyBinding.build_for(Def.new(:band, :collection => true))
143
+ assert_kind_of Representable::Hash::CollectionBinding, Representable::Hash::PropertyBinding.build_for(Def.new(:band, :collection => true), nil)
144
144
  end
145
145
  end
146
146
 
@@ -1,6 +1,15 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class RepresentableTest < MiniTest::Spec
4
+ def self.representer!(name=:representer, &block)
5
+ let(name) do
6
+ Module.new do
7
+ include Representable::Hash
8
+ instance_exec(&block)
9
+ end
10
+ end
11
+ end
12
+
4
13
  class Band
5
14
  include Representable
6
15
  property :name
@@ -403,6 +412,122 @@ class RepresentableTest < MiniTest::Spec
403
412
  assert_equal "oh yes", band.fame
404
413
  end
405
414
  end
415
+
416
+ describe ":extend and :class" do
417
+ module UpcaseRepresenter
418
+ def to_hash(*); upcase; end
419
+ def from_hash(hsh); self.class.new hsh.upcase; end # DISCUSS: from_hash must return self.
420
+ end
421
+ module DowncaseRepresenter
422
+ def to_hash(*); downcase; end
423
+ def from_hash(hsh); hsh.downcase; end
424
+ end
425
+ class UpcaseString < String; end
426
+
427
+
428
+ describe "lambda blocks" do
429
+ representer! do
430
+ property :name, :extend => lambda { |name| compute_representer(name) }
431
+ end
432
+
433
+ it "executes lambda in represented instance context" do
434
+ Song.new("Carnage").instance_eval do
435
+ def compute_representer(name)
436
+ UpcaseRepresenter
437
+ end
438
+ self
439
+ end.extend(representer).to_hash.must_equal({"name" => "CARNAGE"})
440
+ end
441
+ end
442
+
443
+ describe ":instance" do
444
+ obj = String.new("Fate")
445
+ mod = Module.new { def from_hash(*); self; end }
446
+ representer! do
447
+ property :name, :extend => mod, :instance => lambda { |name| obj }
448
+ end
449
+
450
+ it "uses object from :instance but still extends it" do
451
+ song = Song.new.extend(representer).from_hash("name" => "Eric's Had A Bad Day")
452
+ song.name.must_equal obj
453
+ song.name.must_be_kind_of mod
454
+ end
455
+ end
456
+
457
+ describe "property with :extend" do
458
+ representer! do
459
+ property :name, :extend => lambda { |name| name.is_a?(UpcaseString) ? UpcaseRepresenter : DowncaseRepresenter }, :class => String
460
+ end
461
+
462
+ it "uses lambda when rendering" do
463
+ assert_equal({"name" => "you make me thick"}, Song.new("You Make Me Thick").extend(representer).to_hash )
464
+ assert_equal({"name" => "STEPSTRANGER"}, Song.new(UpcaseString.new "Stepstranger").extend(representer).to_hash )
465
+ end
466
+
467
+ it "uses lambda when parsing" do
468
+ Song.new.extend(representer).from_hash({"name" => "You Make Me Thick"}).name.must_equal "you make me thick"
469
+ Song.new.extend(representer).from_hash({"name" => "Stepstranger"}).name.must_equal "stepstranger" # DISCUSS: we compare "".is_a?(UpcaseString)
470
+ end
471
+
472
+ describe "with :class lambda" do
473
+ representer! do
474
+ property :name, :extend => lambda { |name| name.is_a?(UpcaseString) ? UpcaseRepresenter : DowncaseRepresenter },
475
+ :class => lambda { |fragment| fragment == "Still Failing?" ? String : UpcaseString }
476
+ end
477
+
478
+ it "creates instance from :class lambda when parsing" do
479
+ song = Song.new.extend(representer).from_hash({"name" => "Quitters Never Win"})
480
+ song.name.must_be_kind_of UpcaseString
481
+ song.name.must_equal "QUITTERS NEVER WIN"
482
+
483
+ song = Song.new.extend(representer).from_hash({"name" => "Still Failing?"})
484
+ song.name.must_be_kind_of String
485
+ song.name.must_equal "still failing?"
486
+ end
487
+
488
+ describe "when :class lambda returns nil" do
489
+ representer! do
490
+ property :name, :extend => lambda { |name| Module.new { def from_hash(data); data; end } },
491
+ :class => nil
492
+ end
493
+
494
+ it "skips creating new instance" do
495
+ song = Song.new.extend(representer).from_hash({"name" => string = "Satellite"})
496
+ song.name.object_id.must_equal string.object_id
497
+ end
498
+ end
499
+ end
500
+ end
501
+
502
+
503
+ describe "collection with :extend" do
504
+ representer! do
505
+ collection :songs, :extend => lambda { |name| name.is_a?(UpcaseString) ? UpcaseRepresenter : DowncaseRepresenter }, :class => String
506
+ end
507
+
508
+ it "uses lambda for each item when rendering" do
509
+ Album.new([UpcaseString.new("Dean Martin"), "Charlie Still Smirks"]).extend(representer).to_hash.must_equal("songs"=>["DEAN MARTIN", "charlie still smirks"])
510
+ end
511
+
512
+ it "uses lambda for each item when parsing" do
513
+ album = Album.new.extend(representer).from_hash("songs"=>["DEAN MARTIN", "charlie still smirks"])
514
+ album.songs.must_equal ["dean martin", "charlie still smirks"] # DISCUSS: we compare "".is_a?(UpcaseString)
515
+ end
516
+
517
+ describe "with :class lambda" do
518
+ representer! do
519
+ collection :songs, :extend => lambda { |name| name.is_a?(UpcaseString) ? UpcaseRepresenter : DowncaseRepresenter },
520
+ :class => lambda { |fragment| fragment == "Still Failing?" ? String : UpcaseString }
521
+ end
522
+
523
+ it "creates instance from :class lambda for each item when parsing" do
524
+ album = Album.new.extend(representer).from_hash("songs"=>["Still Failing?", "charlie still smirks"])
525
+ album.songs.must_equal ["still failing?", "CHARLIE STILL SMIRKS"]
526
+ end
527
+ end
528
+ end
529
+
530
+ end
406
531
 
407
532
  describe "Config" do
408
533
  before do
@@ -26,7 +26,7 @@ class XMLBindingTest < MiniTest::Spec
26
26
  describe "PropertyBinding" do
27
27
  describe "with plain text" do
28
28
  before do
29
- @property = Representable::XML::PropertyBinding.new(Representable::Definition.new(:song))
29
+ @property = Representable::XML::PropertyBinding.new(Representable::Definition.new(:song), nil)
30
30
  end
31
31
 
32
32
  it "extracts with #read" do
@@ -41,7 +41,7 @@ class XMLBindingTest < MiniTest::Spec
41
41
 
42
42
  describe "with an object" do
43
43
  before do
44
- @property = Representable::XML::PropertyBinding.new(Representable::Definition.new(:song, :class => SongWithRepresenter))
44
+ @property = Representable::XML::PropertyBinding.new(Representable::Definition.new(:song, :class => SongWithRepresenter), nil)
45
45
  end
46
46
 
47
47
  it "extracts with #read" do
@@ -56,7 +56,7 @@ class XMLBindingTest < MiniTest::Spec
56
56
 
57
57
  describe "with an object and :extend" do
58
58
  before do
59
- @property = Representable::XML::PropertyBinding.new(Representable::Definition.new(:song, :class => Song, :extend => SongRepresenter))
59
+ @property = Representable::XML::PropertyBinding.new(Representable::Definition.new(:song, :class => Song, :extend => SongRepresenter), nil)
60
60
  end
61
61
 
62
62
  it "extracts with #read" do
@@ -74,7 +74,7 @@ class XMLBindingTest < MiniTest::Spec
74
74
  describe "CollectionBinding" do
75
75
  describe "with plain text items" do
76
76
  before do
77
- @property = Representable::XML::CollectionBinding.new(Representable::Definition.new(:song, :collection => true))
77
+ @property = Representable::XML::CollectionBinding.new(Representable::Definition.new(:song, :collection => true), nil)
78
78
  end
79
79
 
80
80
  it "extracts with #read" do
@@ -90,7 +90,7 @@ class XMLBindingTest < MiniTest::Spec
90
90
 
91
91
  describe "with objects" do
92
92
  before do
93
- @property = Representable::XML::PropertyBinding.new(Representable::Definition.new(:song, :collection => true, :class => SongWithRepresenter))
93
+ @property = Representable::XML::PropertyBinding.new(Representable::Definition.new(:song, :collection => true, :class => SongWithRepresenter), nil)
94
94
  end
95
95
 
96
96
  it "extracts with #read" do
@@ -111,7 +111,7 @@ class XMLBindingTest < MiniTest::Spec
111
111
  describe "HashBinding" do
112
112
  describe "with plain text items" do
113
113
  before do
114
- @property = Representable::XML::HashBinding.new(Representable::Definition.new(:songs, :hash => true))
114
+ @property = Representable::XML::HashBinding.new(Representable::Definition.new(:songs, :hash => true), nil)
115
115
  end
116
116
 
117
117
  it "extracts with #read" do
@@ -127,7 +127,7 @@ class XMLBindingTest < MiniTest::Spec
127
127
 
128
128
  describe "with objects" do
129
129
  before do
130
- @property = Representable::XML::HashBinding.new(Representable::Definition.new(:songs, :hash => true, :class => Song, :extend => SongRepresenter))
130
+ @property = Representable::XML::HashBinding.new(Representable::Definition.new(:songs, :hash => true, :class => Song, :extend => SongRepresenter), nil)
131
131
  end
132
132
  end
133
133
  end
@@ -136,7 +136,7 @@ class XMLBindingTest < MiniTest::Spec
136
136
  describe "AttributeBinding" do
137
137
  describe "with plain text items" do
138
138
  before do
139
- @property = Representable::XML::AttributeBinding.new(Representable::Definition.new(:name, :attribute => true))
139
+ @property = Representable::XML::AttributeBinding.new(Representable::Definition.new(:name, :attribute => true), nil)
140
140
  end
141
141
 
142
142
  it "extracts with #read" do
@@ -126,20 +126,20 @@ class XmlTest < MiniTest::Spec
126
126
 
127
127
  describe "XML::Binding#build_for" do
128
128
  it "returns AttributeBinding" do
129
- assert_kind_of XML::AttributeBinding, XML::PropertyBinding.build_for(Def.new(:band, :from => "band", :attribute => true))
129
+ assert_kind_of XML::AttributeBinding, XML::PropertyBinding.build_for(Def.new(:band, :from => "band", :attribute => true), nil)
130
130
  end
131
131
 
132
132
  it "returns PropertyBinding" do
133
- assert_kind_of XML::PropertyBinding, XML::PropertyBinding.build_for(Def.new(:band, :class => Hash))
134
- assert_kind_of XML::PropertyBinding, XML::PropertyBinding.build_for(Def.new(:band, :from => :content))
133
+ assert_kind_of XML::PropertyBinding, XML::PropertyBinding.build_for(Def.new(:band, :class => Hash), nil)
134
+ assert_kind_of XML::PropertyBinding, XML::PropertyBinding.build_for(Def.new(:band, :from => :content), nil)
135
135
  end
136
136
 
137
137
  it "returns CollectionBinding" do
138
- assert_kind_of XML::CollectionBinding, XML::PropertyBinding.build_for(Def.new(:band, :collection => :true))
138
+ assert_kind_of XML::CollectionBinding, XML::PropertyBinding.build_for(Def.new(:band, :collection => :true), nil)
139
139
  end
140
140
 
141
141
  it "returns HashBinding" do
142
- assert_kind_of XML::HashBinding, XML::PropertyBinding.build_for(Def.new(:band, :hash => :true))
142
+ assert_kind_of XML::HashBinding, XML::PropertyBinding.build_for(Def.new(:band, :hash => :true), nil)
143
143
  end
144
144
  end
145
145
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: representable
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.8
4
+ version: 1.2.9
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-01 00:00:00.000000000 Z
12
+ date: 2013-01-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -155,6 +155,7 @@ files:
155
155
  - LICENSE
156
156
  - README.rdoc
157
157
  - Rakefile
158
+ - TODO
158
159
  - gemfiles/Gemfile.mongoid-2.4
159
160
  - lib/representable.rb
160
161
  - lib/representable/binding.rb
@@ -170,6 +171,7 @@ files:
170
171
  - lib/representable/json.rb
171
172
  - lib/representable/json/collection.rb
172
173
  - lib/representable/json/hash.rb
174
+ - lib/representable/readable_writeable.rb
173
175
  - lib/representable/version.rb
174
176
  - lib/representable/xml.rb
175
177
  - lib/representable/xml/collection.rb