representable 1.5.2 → 1.5.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,9 @@
1
+ h2. 1.5.3
2
+
3
+ * `Representable#update_properties_from` now always returns `represented`, which is `self` in a module representer and the decorated object in a decorator (only the latter changed).
4
+ * Coercion in decorators should work now as expected.
5
+ * Fixed a require bug.
6
+
1
7
  h2. 1.5.2
2
8
 
3
9
  * Rename `:representer_exec` to `:decorator_scope` and make it a documented (!) feature.
data/Gemfile CHANGED
@@ -3,3 +3,4 @@ source 'https://rubygems.org'
3
3
  gemspec
4
4
 
5
5
  #gem "virtus", :path => "../virtus"
6
+ gem 'rake', "10.1.0.beta3"
@@ -45,7 +45,7 @@ module Representable
45
45
  representable_bindings_for(format, options).each do |bin|
46
46
  deserialize_property(bin, doc, options)
47
47
  end
48
- self
48
+ represented
49
49
  end
50
50
 
51
51
  private
@@ -1,13 +1,27 @@
1
+ require 'representable/coercion'
2
+
1
3
  class Representable::Decorator
2
4
  module Coercion
3
5
  def self.included(base)
4
6
  base.class_eval do
7
+ # DISCUSS: this assumes we have a Representer included, yet.
8
+ alias_method :representable_initialize, :initialize
9
+ alias_method :representable_to_hash, :to_hash
10
+
11
+ # FIXME: allow including coercion only from virtus.
5
12
  include Virtus
13
+ undef_method(:initialize)
14
+ undef_method(:to_hash)
15
+
6
16
  extend Representable::Coercion::ClassMethods
7
17
  extend ClassMethods
8
18
 
9
- def initialize(represented) # override Virtus' #initialize.
10
- @represented = represented
19
+ def initialize(*args) # override Virtus' #initialize.
20
+ representable_initialize(*args)
21
+ end
22
+
23
+ def to_hash(*args) # override Virtus' #to_hash.
24
+ representable_to_hash(*args)
11
25
  end
12
26
  end
13
27
  end
@@ -1,3 +1,3 @@
1
1
  module Representable
2
- VERSION = "1.5.2"
2
+ VERSION = "1.5.3"
3
3
  end
@@ -1,8 +1,10 @@
1
1
  require 'test_helper'
2
2
  require 'representable/coercion'
3
+ require 'representable/decorator/coercion'
3
4
 
4
5
  class VirtusCoercionTest < MiniTest::Spec
5
6
  class Song # note that we don't define accessors for the properties here.
7
+ attr_accessor :title
6
8
  end
7
9
 
8
10
  describe "Coercion with Virtus" do
@@ -12,14 +14,22 @@ class VirtusCoercionTest < MiniTest::Spec
12
14
  include Representable::Coercion
13
15
  property :composed_at, :type => DateTime
14
16
  property :track, :type => Integer
17
+ property :title # no coercion.
15
18
  end
16
19
 
17
20
  it "coerces properties in #from_json" do
18
- song = Song.new.extend(SongRepresenter).from_json("{\"composed_at\":\"November 18th, 1983\",\"track\":\"18\"}")
21
+ song = Song.new.extend(SongRepresenter).from_json('{"composed_at":"November 18th, 1983","track":"18","title":"Scarified"}')
19
22
  assert_kind_of DateTime, song.composed_at
20
- assert_equal 18, song.track
21
23
  assert_equal DateTime.parse("Fri, 18 Nov 1983 00:00:00 +0000"), song.composed_at
24
+ assert_equal 18, song.track
25
+ song.title.must_equal "Scarified"
22
26
  end
27
+
28
+ # it "coerces when rendering" do
29
+ # song = Song.new
30
+ # song.title = "Scarified"
31
+ # song.to_json.must_equal ''
32
+ # end
23
33
  end
24
34
 
25
35
 
@@ -45,22 +55,29 @@ class VirtusCoercionTest < MiniTest::Spec
45
55
  end
46
56
  end
47
57
 
48
- require 'representable/decorator/coercion'
49
58
  describe "on decorator" do
50
59
  class SongRepresentation < Representable::Decorator
51
60
  include Representable::JSON
52
61
  include Representable::Decorator::Coercion
53
62
 
54
63
  property :composed_at, :type => DateTime
64
+ property :title
55
65
  end
56
66
 
57
67
  it "coerces when parsing" do
58
- song = SongRepresentation.new(OpenStruct.new).from_json("{\"composed_at\":\"November 18th, 1983\"}")
68
+ song = SongRepresentation.new(OpenStruct.new).from_json("{\"composed_at\":\"November 18th, 1983\", \"title\": \"Scarified\"}")
69
+ song.must_be_kind_of OpenStruct
59
70
  song.composed_at.must_equal DateTime.parse("Fri, 18 Nov 1983")
71
+ song.title.must_equal "Scarified"
60
72
  end
61
73
 
62
74
  it "coerces when rendering" do
63
- SongRepresentation.new(OpenStruct.new(:composed_at => "November 18th, 1983")).to_json.must_equal "{\"composed_at\":\"1983-11-18T00:00:00+00:00\"}"
75
+ SongRepresentation.new(
76
+ OpenStruct.new(
77
+ :composed_at => "November 18th, 1983",
78
+ :title => "Scarified"
79
+ )
80
+ ).to_hash.must_equal({"composed_at"=>DateTime.parse("Fri, 18 Nov 1983"), "title"=>"Scarified"})
64
81
  end
65
82
  end
66
83
  end
@@ -0,0 +1,45 @@
1
+ require 'test_helper'
2
+
3
+ class DecoratorTest < MiniTest::Spec
4
+ # TODO: Move to global place since it's used twice.
5
+ class SongRepresentation < Representable::Decorator
6
+ include Representable::JSON
7
+ property :name
8
+ end
9
+
10
+ class AlbumRepresentation < Representable::Decorator
11
+ include Representable::JSON
12
+
13
+ collection :songs, :class => Song, :extend => SongRepresentation
14
+ end
15
+
16
+ let (:song) { Song.new("Mama, I'm Coming Home") }
17
+ let (:album) { Album.new([song]) }
18
+ let (:decorator) { AlbumRepresentation.new(album) }
19
+
20
+ it "renders" do
21
+ decorator.to_hash.must_equal({"songs"=>[{"name"=>"Mama, I'm Coming Home"}]})
22
+ album.wont_respond_to :to_hash
23
+ song.wont_respond_to :to_hash # DISCUSS: weak test, how to assert blank slate?
24
+ end
25
+
26
+ describe "#from_hash" do
27
+ it "returns represented" do
28
+ decorator.from_hash({"songs"=>[{"name"=>"Mama, I'm Coming Home"}]}).must_equal album
29
+ end
30
+
31
+ it "parses" do
32
+ decorator.from_hash({"songs"=>[{"name"=>"Atomic Garden"}]})
33
+ album.songs.first.must_be_kind_of Song
34
+ album.songs.must_equal [Song.new("Atomic Garden")]
35
+ album.wont_respond_to :to_hash
36
+ song.wont_respond_to :to_hash # DISCUSS: weak test, how to assert blank slate?
37
+ end
38
+ end
39
+
40
+ describe "#decorated" do
41
+ it "is aliased to #represented" do
42
+ AlbumRepresentation.prepare(album).decorated.must_equal album
43
+ end
44
+ end
45
+ end
@@ -266,7 +266,7 @@ class RepresentableTest < MiniTest::Spec
266
266
  assert_equal nil, @band.founders
267
267
  end
268
268
 
269
- it "always returns self" do
269
+ it "always returns the represented" do
270
270
  assert_equal @band, @band.update_properties_from({"name"=>"Nofx"}, {}, Representable::Hash::PropertyBinding)
271
271
  end
272
272
 
@@ -740,42 +740,15 @@ class RepresentableTest < MiniTest::Spec
740
740
  end
741
741
  end
742
742
 
743
- describe "decorator" do
744
- # TODO: Move to global place since it's used twice.
745
- class SongRepresentation < Representable::Decorator
746
- include Representable::JSON
747
- property :name
748
- end
749
-
750
- class AlbumRepresentation < Representable::Decorator
751
- include Representable::JSON
752
-
753
- collection :songs, :class => Song, :extend => SongRepresentation
754
- end
755
-
756
- let (:song) { Song.new("Mama, I'm Coming Home") }
757
- let (:album) { Album.new([song]) }
758
- let (:decorator) { AlbumRepresentation.new(album) }
759
-
760
- it "renders" do
761
- decorator.to_hash.must_equal({"songs"=>[{"name"=>"Mama, I'm Coming Home"}]})
762
- album.wont_respond_to :to_hash
763
- song.wont_respond_to :to_hash # DISCUSS: weak test, how to assert blank slate?
764
- end
765
-
766
- it "parses" do
767
- decorator.from_hash({"songs"=>[{"name"=>"Atomic Garden"}]})
768
- album.songs.first.must_be_kind_of Song
769
- album.songs.must_equal [Song.new("Atomic Garden")]
770
- album.wont_respond_to :to_hash
771
- song.wont_respond_to :to_hash # DISCUSS: weak test, how to assert blank slate?
772
- end
743
+ # TODO: Move to global place since it's used twice.
744
+ class SongRepresentation < Representable::Decorator
745
+ include Representable::JSON
746
+ property :name
747
+ end
748
+ class AlbumRepresentation < Representable::Decorator
749
+ include Representable::JSON
773
750
 
774
- describe "#decorated" do
775
- it "is aliased to #represented" do
776
- AlbumRepresentation.prepare(album).decorated.must_equal album
777
- end
778
- end
751
+ collection :songs, :class => Song, :extend => SongRepresentation
779
752
  end
780
753
 
781
754
  describe "::prepare" do
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.5.2
4
+ version: 1.5.3
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: 2013-05-27 00:00:00.000000000 Z
12
+ date: 2013-05-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: nokogiri
@@ -210,6 +210,7 @@ files:
210
210
  - lib/representable/yaml.rb
211
211
  - representable.gemspec
212
212
  - test/coercion_test.rb
213
+ - test/decorator_test.rb
213
214
  - test/definition_test.rb
214
215
  - test/example.rb
215
216
  - test/hash_bindings_test.rb