representable 3.0.0 → 3.1.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.
Files changed (105) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ci.yml +17 -0
  3. data/CHANGES.md +25 -0
  4. data/Gemfile +4 -12
  5. data/LICENSE +1 -1
  6. data/README.md +6 -6
  7. data/Rakefile +1 -6
  8. data/TODO +1 -3
  9. data/TODO-4.0.md +72 -0
  10. data/lib/representable.rb +19 -25
  11. data/lib/representable/binding.rb +32 -12
  12. data/lib/representable/cached.rb +1 -1
  13. data/lib/representable/coercion.rb +8 -6
  14. data/lib/representable/config.rb +13 -3
  15. data/lib/representable/debug.rb +23 -15
  16. data/lib/representable/declarative.rb +12 -7
  17. data/lib/representable/decorator.rb +1 -1
  18. data/lib/representable/definition.rb +7 -3
  19. data/lib/representable/deserializer.rb +5 -4
  20. data/lib/representable/for_collection.rb +1 -1
  21. data/lib/representable/hash.rb +9 -2
  22. data/lib/representable/hash/allow_symbols.rb +9 -11
  23. data/lib/representable/hash/binding.rb +1 -0
  24. data/lib/representable/hash/collection.rb +4 -2
  25. data/lib/representable/hash_methods.rb +3 -2
  26. data/lib/representable/insert.rb +1 -1
  27. data/lib/representable/json.rb +8 -7
  28. data/lib/representable/json/collection.rb +3 -0
  29. data/lib/representable/object.rb +1 -1
  30. data/lib/representable/object/binding.rb +5 -1
  31. data/lib/representable/option.rb +19 -0
  32. data/lib/representable/pipeline.rb +3 -2
  33. data/lib/representable/pipeline_factories.rb +4 -2
  34. data/lib/representable/populator.rb +1 -1
  35. data/lib/representable/represent.rb +1 -0
  36. data/lib/representable/serializer.rb +3 -2
  37. data/lib/representable/version.rb +1 -1
  38. data/lib/representable/virtus_coercion.rb +38 -0
  39. data/lib/representable/xml.rb +12 -10
  40. data/lib/representable/xml/binding.rb +19 -13
  41. data/lib/representable/xml/namespace.rb +122 -0
  42. data/lib/representable/yaml.rb +6 -2
  43. data/lib/representable/yaml/binding.rb +1 -0
  44. data/representable.gemspec +8 -9
  45. data/test/as_test.rb +7 -7
  46. data/test/binding_test.rb +14 -14
  47. data/test/cached_test.rb +59 -49
  48. data/test/class_test.rb +9 -9
  49. data/test/coercion_test.rb +33 -22
  50. data/test/config/inherit_test.rb +14 -14
  51. data/test/config_test.rb +20 -20
  52. data/test/decorator_scope_test.rb +4 -4
  53. data/test/decorator_test.rb +33 -20
  54. data/test/default_test.rb +8 -8
  55. data/test/defaults_options_test.rb +3 -3
  56. data/test/definition_test.rb +38 -40
  57. data/test/{example.rb → examples/example.rb} +0 -1
  58. data/test/examples/object.rb +1 -5
  59. data/test/exec_context_test.rb +8 -8
  60. data/test/features_test.rb +6 -6
  61. data/test/filter_test.rb +8 -8
  62. data/test/for_collection_test.rb +10 -10
  63. data/test/generic_test.rb +13 -13
  64. data/test/getter_setter_test.rb +5 -5
  65. data/test/hash_bindings_test.rb +1 -1
  66. data/test/hash_test.rb +45 -23
  67. data/test/heritage_test.rb +16 -13
  68. data/test/if_test.rb +9 -9
  69. data/test/include_exclude_test.rb +14 -14
  70. data/test/inherit_test.rb +18 -18
  71. data/test/inline_test.rb +24 -24
  72. data/test/instance_test.rb +31 -31
  73. data/test/is_representable_test.rb +10 -10
  74. data/test/json_test.rb +29 -7
  75. data/test/lonely_test.rb +31 -31
  76. data/test/nested_test.rb +13 -13
  77. data/test/object_test.rb +9 -9
  78. data/test/option_test.rb +36 -0
  79. data/test/parse_pipeline_test.rb +3 -5
  80. data/test/pipeline_test.rb +50 -50
  81. data/test/populator_test.rb +18 -18
  82. data/test/prepare_test.rb +4 -4
  83. data/test/private_options_test.rb +2 -2
  84. data/test/reader_writer_test.rb +2 -2
  85. data/test/render_nil_test.rb +2 -2
  86. data/test/represent_test.rb +14 -14
  87. data/test/representable_test.rb +34 -36
  88. data/test/schema_test.rb +8 -11
  89. data/test/serialize_deserialize_test.rb +2 -2
  90. data/test/skip_test.rb +14 -14
  91. data/test/stringify_hash_test.rb +3 -3
  92. data/test/test_helper.rb +26 -14
  93. data/test/uncategorized_test.rb +10 -10
  94. data/test/user_options_test.rb +4 -4
  95. data/test/virtus_coercion_test.rb +52 -0
  96. data/test/wrap_test.rb +19 -19
  97. data/test/xml_bindings_test.rb +0 -4
  98. data/test/xml_namespace_test.rb +186 -0
  99. data/test/xml_test.rb +103 -43
  100. data/test/yaml_test.rb +51 -26
  101. metadata +101 -39
  102. data/.travis.yml +0 -7
  103. data/lib/representable/TODO.getting_serious +0 -11
  104. data/lib/representable/autoload.rb +0 -10
  105. data/test/mongoid_test.rb +0 -31
@@ -17,7 +17,6 @@ end
17
17
 
18
18
  song = Song.new(:title => "Fallout", :track => 1)
19
19
 
20
- require 'representable/json'
21
20
  module SongRepresenter
22
21
  include Representable::JSON
23
22
 
@@ -7,8 +7,6 @@ require "pp"
7
7
  source = OpenStruct.new(name: "30 Years Live", songs: [
8
8
  OpenStruct.new(id: 1, title: "Dear Beloved"), OpenStruct.new(id: 2, title: "Fuck Armageddon")])
9
9
 
10
- pp source
11
-
12
10
  require "representable/object"
13
11
 
14
12
  class AlbumRepresenter < Representable::Decorator
@@ -26,6 +24,4 @@ Song = Struct.new(:title)
26
24
 
27
25
  target = Album.new
28
26
 
29
- AlbumRepresenter.new(target).from_object(source)
30
-
31
- pp target
27
+ AlbumRepresenter.new(target).from_object(source)
@@ -7,8 +7,8 @@ class ExecContextTest < MiniTest::Spec
7
7
  # :yaml => [Representable::YAML, "---\nsong:\n name: Alive\n", "---\nsong:\n name: You've Taken Everything\n"],
8
8
  ) do |format, mod, input, output|
9
9
 
10
- let (:song) { representer.prepare(Song.new("Timing")) }
11
- let (:format) { format }
10
+ let(:song) { representer.prepare(Song.new("Timing")) }
11
+ let(:format) { format }
12
12
 
13
13
 
14
14
  describe "exec_context: nil" do
@@ -17,7 +17,7 @@ class ExecContextTest < MiniTest::Spec
17
17
  end
18
18
 
19
19
  it { render(song).must_equal_document output }
20
- it { parse(song, input).name.must_equal "Rebel Fate" }
20
+ it { _(parse(song, input).name).must_equal "Rebel Fate" }
21
21
  end
22
22
 
23
23
 
@@ -27,7 +27,7 @@ class ExecContextTest < MiniTest::Spec
27
27
  end
28
28
 
29
29
  it { render(song).must_equal_document output }
30
- it { parse(song, input).name.must_equal "Rebel Fate" }
30
+ it { _(parse(song, input).name).must_equal "Rebel Fate" }
31
31
  end
32
32
 
33
33
 
@@ -41,7 +41,7 @@ class ExecContextTest < MiniTest::Spec
41
41
  end
42
42
 
43
43
  it { render(song).must_equal_document({Representable::Hash::Binding => "name"}) }
44
- it { parse(song, {Representable::Hash::Binding => "Rebel Fate"}).name.must_equal "Rebel Fate" }
44
+ it { _(parse(song, {Representable::Hash::Binding => "Rebel Fate"}).name).must_equal "Rebel Fate" }
45
45
  end
46
46
 
47
47
 
@@ -53,7 +53,7 @@ class ExecContextTest < MiniTest::Spec
53
53
  end
54
54
 
55
55
  it { render(song).must_equal_document output }
56
- it { parse(song, input).name.must_equal "Rebel Fate" }
56
+ it { _(parse(song, input).name).must_equal "Rebel Fate" }
57
57
  end
58
58
 
59
59
 
@@ -71,7 +71,7 @@ class ExecContextTest < MiniTest::Spec
71
71
  end
72
72
 
73
73
  it { render(song).must_equal_document({Representable::Decorator=>"Timebomb"}) }
74
- it { parse(song, {Representable::Decorator=>"Listless"}).name.must_equal "Listless" }
74
+ it { _(parse(song, {Representable::Decorator=>"Listless"}).name).must_equal "Listless" }
75
75
  end
76
76
 
77
77
 
@@ -86,7 +86,7 @@ class ExecContextTest < MiniTest::Spec
86
86
  end
87
87
 
88
88
  it { render(song).must_equal_document({Representable::Hash::Binding => "name"}) }
89
- it("xxx") { parse(song, {Representable::Hash::Binding => "Rebel Fate"}).name.must_equal "Rebel Fate" }
89
+ it("xxx") { _(parse(song, {Representable::Hash::Binding => "Rebel Fate"}).name).must_equal "Rebel Fate" }
90
90
  end
91
91
  end
92
92
  end
@@ -20,23 +20,23 @@ class FeaturesTest < MiniTest::Spec
20
20
  end
21
21
  }
22
22
 
23
- let (:song) { OpenStruct.new(:details => Object.new) }
23
+ let(:song) { OpenStruct.new(:details => Object.new) }
24
24
 
25
25
  describe "Module" do
26
26
  representer! do
27
- instance_exec &definition
27
+ instance_exec(&definition)
28
28
  end
29
29
 
30
- it { song.extend(representer).to_hash.must_equal({"title"=>"Is It A Lie", "length"=>"2:31", "details"=>{"title"=>"Is It A Lie"}}) }
30
+ it { _(song.extend(representer).to_hash).must_equal({"title"=>"Is It A Lie", "length"=>"2:31", "details"=>{"title"=>"Is It A Lie"}}) }
31
31
  end
32
32
 
33
33
 
34
34
  describe "Decorator" do
35
35
  representer!(:decorator => true) do
36
- instance_exec &definition
36
+ instance_exec(&definition)
37
37
  end
38
38
 
39
- it { representer.new(song).to_hash.must_equal({"title"=>"Is It A Lie", "length"=>"2:31", "details"=>{"title"=>"Is It A Lie"}}) }
39
+ it { _(representer.new(song).to_hash).must_equal({"title"=>"Is It A Lie", "length"=>"2:31", "details"=>{"title"=>"Is It A Lie"}}) }
40
40
  end
41
41
  end
42
42
 
@@ -65,6 +65,6 @@ class FeatureInclusionOrderTest < MiniTest::Spec
65
65
  end
66
66
 
67
67
  it do
68
- representer.new(OpenStruct.new(song: Object)).to_hash.must_equal({"title"=>"I am number two, I was first!", "song"=>{"title"=>"I am number two, I was first!"}})
68
+ _(representer.new(OpenStruct.new(song: Object)).to_hash).must_equal({"title"=>"I am number two, I was first!", "song"=>{"title"=>"I am number two, I was first!"}})
69
69
  end
70
70
  end
data/test/filter_test.rb CHANGED
@@ -1,12 +1,12 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class FilterPipelineTest < MiniTest::Spec
4
- let (:block1) { lambda { |input, options| "1: #{input}" } }
5
- let (:block2) { lambda { |input, options| "2: #{input}" } }
4
+ let(:block1) { lambda { |input, options| "1: #{input}" } }
5
+ let(:block2) { lambda { |input, options| "2: #{input}" } }
6
6
 
7
7
  subject { Representable::Pipeline[block1, block2] }
8
8
 
9
- it { subject.call("Horowitz", {}).must_equal "2: 1: Horowitz" }
9
+ it { _(subject.call("Horowitz", {})).must_equal "2: 1: Horowitz" }
10
10
  end
11
11
 
12
12
 
@@ -22,11 +22,11 @@ class FilterTest < MiniTest::Spec
22
22
  # gets doc and options.
23
23
  it {
24
24
  song = OpenStruct.new.extend(representer).from_hash("title" => "VULCAN EARS", "track" => "Nine")
25
- song.title.must_equal "VULCAN EARS"
26
- song.track.must_equal "nine,{\"title\"=>\"VULCAN EARS\", \"track\"=>\"Nine\"}"
25
+ _(song.title).must_equal "VULCAN EARS"
26
+ _(song.track).must_equal "nine,{\"title\"=>\"VULCAN EARS\", \"track\"=>\"Nine\"}"
27
27
  }
28
28
 
29
- it { OpenStruct.new("title" => "vulcan ears", "track" => "Nine").extend(representer).to_hash.must_equal( {"title"=>"vulcan ears", "track"=>"NINE,{\"title\"=>\"vulcan ears\"},{}"}) }
29
+ it { _(OpenStruct.new("title" => "vulcan ears", "track" => "Nine").extend(representer).to_hash).must_equal( {"title"=>"vulcan ears", "track"=>"NINE,{\"title\"=>\"vulcan ears\"},{}"}) }
30
30
 
31
31
 
32
32
  describe "#parse_filter" do
@@ -41,8 +41,8 @@ class FilterTest < MiniTest::Spec
41
41
  end
42
42
 
43
43
  # order matters.
44
- it { OpenStruct.new.extend(representer).from_hash("track" => "Nine").track.must_equal "Nine-1-2" }
45
- it { OpenStruct.new("track" => "Nine").extend(representer).to_hash.must_equal({"track"=>"Nine-1-2"}) }
44
+ it { _(OpenStruct.new.extend(representer).from_hash("track" => "Nine").track).must_equal "Nine-1-2" }
45
+ it { _(OpenStruct.new("track" => "Nine").extend(representer).to_hash).must_equal({"track"=>"Nine-1-2"}) }
46
46
  end
47
47
  end
48
48
 
@@ -7,8 +7,8 @@ class ForCollectionTest < MiniTest::Spec
7
7
  property :name
8
8
  end
9
9
 
10
- let (:songs) { [Song.new("Days Go By"), Song.new("Can't Take Them All")] }
11
- let (:json) { "[{\"name\":\"Days Go By\"},{\"name\":\"Can't Take Them All\"}]" }
10
+ let(:songs) { [Song.new("Days Go By"), Song.new("Can't Take Them All")] }
11
+ let(:json) { "[{\"name\":\"Days Go By\"},{\"name\":\"Can't Take Them All\"}]" }
12
12
 
13
13
 
14
14
  # Module.for_collection
@@ -20,9 +20,9 @@ class ForCollectionTest < MiniTest::Spec
20
20
  ) do |format, mod, output, input|
21
21
 
22
22
  describe "Module::for_collection [#{format}]" do
23
- let (:format) { format }
23
+ let(:format) { format }
24
24
 
25
- let (:representer) {
25
+ let(:representer) {
26
26
  Module.new do
27
27
  include mod
28
28
  property :name#, :as => :title
@@ -36,13 +36,13 @@ class ForCollectionTest < MiniTest::Spec
36
36
  it { render(songs.extend(representer.for_collection)).must_equal_document output }
37
37
  it { render(representer.for_collection.prepare(songs)).must_equal_document output }
38
38
  # parsing needs the class set, at least
39
- it { parse([].extend(representer.for_collection), input).must_equal songs }
39
+ it { _(parse([].extend(representer.for_collection), input)).must_equal songs }
40
40
  end
41
41
 
42
42
  describe "Module::for_collection without configuration [#{format}]" do
43
- let (:format) { format }
43
+ let(:format) { format }
44
44
 
45
- let (:representer) {
45
+ let(:representer) {
46
46
  Module.new do
47
47
  include mod
48
48
  property :name
@@ -55,8 +55,8 @@ class ForCollectionTest < MiniTest::Spec
55
55
 
56
56
 
57
57
  describe "Decorator::for_collection [#{format}]" do
58
- let (:format) { format }
59
- let (:representer) {
58
+ let(:format) { format }
59
+ let(:representer) {
60
60
  Class.new(Representable::Decorator) do
61
61
  include mod
62
62
  property :name
@@ -66,7 +66,7 @@ class ForCollectionTest < MiniTest::Spec
66
66
  }
67
67
 
68
68
  it { render(representer.for_collection.new(songs)).must_equal_document output }
69
- it { parse(representer.for_collection.new([]), input).must_equal songs }
69
+ it { _(parse(representer.for_collection.new([]), input)).must_equal songs }
70
70
  end
71
71
  end
72
72
 
data/test/generic_test.rb CHANGED
@@ -1,10 +1,10 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class GenericTest < MiniTest::Spec # TODO: rename/restructure to CollectionTest.
4
- let (:new_album) { OpenStruct.new.extend(representer) }
5
- let (:album) { OpenStruct.new(:songs => ["Fuck Armageddon"]).extend(representer) }
6
- let (:song) { OpenStruct.new(:title => "Resist Stance") }
7
- let (:song_representer) { Module.new do include Representable::Hash; property :title end }
4
+ let(:new_album) { OpenStruct.new.extend(representer) }
5
+ let(:album) { OpenStruct.new(:songs => ["Fuck Armageddon"]).extend(representer) }
6
+ let(:song) { OpenStruct.new(:title => "Resist Stance") }
7
+ let(:song_representer) { Module.new do include Representable::Hash; property :title end }
8
8
 
9
9
 
10
10
  describe "::collection" do
@@ -14,13 +14,13 @@ class GenericTest < MiniTest::Spec # TODO: rename/restructure to CollectionTest.
14
14
 
15
15
  it "doesn't initialize property" do
16
16
  new_album.from_hash({})
17
- new_album.songs.must_equal nil
17
+ _(new_album.songs).must_be_nil
18
18
  end
19
19
 
20
20
  it "leaves properties untouched" do
21
21
  album.from_hash({})
22
22
  # TODO: test property.
23
- album.songs.must_equal ["Fuck Armageddon"] # when the collection is not present in the incoming hash, this propery stays untouched.
23
+ _(album.songs).must_equal ["Fuck Armageddon"] # when the collection is not present in the incoming hash, this propery stays untouched.
24
24
  end
25
25
 
26
26
 
@@ -32,14 +32,14 @@ class GenericTest < MiniTest::Spec # TODO: rename/restructure to CollectionTest.
32
32
  ) do |format, mod, output, input|
33
33
 
34
34
  describe "nil collections" do
35
- let (:format) { format }
35
+ let(:format) { format }
36
36
 
37
37
  representer!(:module => mod) do
38
38
  collection :songs
39
39
  self.representation_wrap = :album if format == :xml
40
40
  end
41
41
 
42
- let (:album) { Album.new.extend(representer) }
42
+ let(:album) { Album.new.extend(representer) }
43
43
 
44
44
  it "doesn't render collection in #{format}" do
45
45
  render(album).must_equal_document output
@@ -55,14 +55,14 @@ class GenericTest < MiniTest::Spec # TODO: rename/restructure to CollectionTest.
55
55
  ) do |format, mod, output, input|
56
56
 
57
57
  describe "empty collections" do
58
- let (:format) { format }
58
+ let(:format) { format }
59
59
 
60
60
  representer!(:module => mod) do
61
61
  collection :songs
62
62
  self.representation_wrap = :album if format == :xml
63
63
  end
64
64
 
65
- let (:album) { OpenStruct.new(:songs => []).extend(representer) }
65
+ let(:album) { OpenStruct.new(:songs => []).extend(representer) }
66
66
 
67
67
  it "renders empty collection in #{format}" do
68
68
  render(album).must_equal_document output
@@ -79,14 +79,14 @@ class GenericTest < MiniTest::Spec # TODO: rename/restructure to CollectionTest.
79
79
  ) do |format, mod, output, input|
80
80
 
81
81
  describe "render_empty [#{format}]" do
82
- let (:format) { format }
82
+ let(:format) { format }
83
83
 
84
84
  representer!(:module => mod) do
85
85
  collection :songs, :render_empty => false
86
86
  self.representation_wrap = :album if format == :xml
87
87
  end
88
88
 
89
- let (:album) { OpenStruct.new(:songs => []).extend(representer) }
89
+ let(:album) { OpenStruct.new(:songs => []).extend(representer) }
90
90
 
91
91
  it { render(album).must_equal_document output }
92
92
  end
@@ -109,7 +109,7 @@ class GenericTest < MiniTest::Spec # TODO: rename/restructure to CollectionTest.
109
109
  end
110
110
 
111
111
  it "doesn't change represented object" do
112
- song.extend(representer).send("from_#{format}", input).title.must_equal "Resist Stance"
112
+ _(song.extend(representer).send("from_#{format}", input).title).must_equal "Resist Stance"
113
113
  end
114
114
  end
115
115
  end
@@ -3,19 +3,19 @@ require 'test_helper'
3
3
  class GetterSetterTest < BaseTest
4
4
  representer! do
5
5
  property :name, # key under :name.
6
- :getter => lambda { |options| "#{options[:user_options][:welcome]} #{song_name}" },
7
- :setter => lambda { |options| self.song_name = "#{options[:user_options][:welcome]} #{options[:input]}" }
6
+ :getter => lambda { |user_options:, **| "#{user_options[:welcome]} #{song_name}" },
7
+ :setter => lambda { |user_options:, input:, **| self.song_name = "#{user_options[:welcome]} #{input}" }
8
8
  end
9
9
 
10
10
  subject { Struct.new(:song_name).new("Mony Mony").extend(representer) }
11
11
 
12
12
  it "uses :getter when rendering" do
13
13
  subject.instance_eval { def name; raise; end }
14
- subject.to_hash(user_options: {welcome: "Hi"}).must_equal({"name" => "Hi Mony Mony"})
14
+ _(subject.to_hash(user_options: {welcome: "Hi"})).must_equal({"name" => "Hi Mony Mony"})
15
15
  end
16
16
 
17
17
  it "uses :setter when parsing" do
18
18
  subject.instance_eval { def name=(*); raise; end; self }
19
- subject.from_hash({"name" => "Eyes Without A Face"}, user_options: {welcome: "Hello"}).song_name.must_equal "Hello Eyes Without A Face"
19
+ _(subject.from_hash({"name" => "Eyes Without A Face"}, user_options: {welcome: "Hello"}).song_name).must_equal "Hello Eyes Without A Face"
20
20
  end
21
- end
21
+ end
@@ -21,7 +21,7 @@ class HashBindingTest < MiniTest::Spec
21
21
  it "returns fragment if present" do
22
22
  assert_equal "Stick The Flag Up Your Goddamn Ass, You Sonofabitch", @property.read({"song" => "Stick The Flag Up Your Goddamn Ass, You Sonofabitch"}, "song")
23
23
  assert_equal "", @property.read({"song" => ""}, "song")
24
- assert_equal nil, @property.read({"song" => nil}, "song")
24
+ assert_nil @property.read({"song" => nil}, "song")
25
25
  end
26
26
 
27
27
  it "returns FRAGMENT_NOT_FOUND if not in document" do
data/test/hash_test.rb CHANGED
@@ -1,5 +1,27 @@
1
1
  require 'test_helper'
2
2
 
3
+ class HashPublicMethodsTest < Minitest::Spec
4
+ #---
5
+ # from_hash
6
+ class BandRepresenter < Representable::Decorator
7
+ include Representable::Hash
8
+ property :id
9
+ property :name
10
+ end
11
+
12
+ let(:data) { {"id"=>1,"name"=>"Rancid"} }
13
+
14
+ it { _(BandRepresenter.new(Band.new).from_hash(data)[:id, :name]).must_equal [1, "Rancid"] }
15
+ it { _(BandRepresenter.new(Band.new).parse(data)[:id, :name]).must_equal [1, "Rancid"] }
16
+
17
+ #---
18
+ # to_hash
19
+ let(:band) { Band.new(1, "Rancid") }
20
+
21
+ it { _(BandRepresenter.new(band).to_hash).must_equal data }
22
+ it { _(BandRepresenter.new(band).render).must_equal data }
23
+ end
24
+
3
25
  class HashWithScalarPropertyTest < MiniTest::Spec
4
26
  Album = Struct.new(:title)
5
27
 
@@ -7,24 +29,24 @@ class HashWithScalarPropertyTest < MiniTest::Spec
7
29
  property :title
8
30
  end
9
31
 
10
- let (:album) { Album.new("Liar") }
32
+ let(:album) { Album.new("Liar") }
11
33
 
12
34
  describe "#to_hash" do
13
35
  it "renders plain property" do
14
- album.extend(representer).to_hash.must_equal("title" => "Liar")
36
+ _(album.extend(representer).to_hash).must_equal("title" => "Liar")
15
37
  end
16
38
  end
17
39
 
18
40
 
19
41
  describe "#from_hash" do
20
42
  it "parses plain property" do
21
- album.extend(representer).from_hash("title" => "This Song Is Recycled").title.must_equal "This Song Is Recycled"
43
+ _(album.extend(representer).from_hash("title" => "This Song Is Recycled").title).must_equal "This Song Is Recycled"
22
44
  end
23
45
 
24
46
  # Fixes issue #115
25
47
  it "allows nil value in the incoming document and corresponding nil value for the represented" do
26
48
  album = Album.new
27
- album.title.must_equal nil
49
+ _(album.title).must_be_nil
28
50
  album.extend(representer).from_hash("title" => nil)
29
51
  end
30
52
  end
@@ -40,39 +62,39 @@ class HashWithTypedPropertyTest < MiniTest::Spec
40
62
  end
41
63
  end
42
64
 
43
- let (:album) { Album.new(Song.new("Liar")) }
65
+ let(:album) { Album.new(Song.new("Liar")) }
44
66
 
45
67
  describe "#to_hash" do
46
68
  it "renders embedded typed property" do
47
- album.extend(representer).to_hash.must_equal("best_song" => {"name" => "Liar"})
69
+ _(album.extend(representer).to_hash).must_equal("best_song" => {"name" => "Liar"})
48
70
  end
49
71
  end
50
72
 
51
73
  describe "#from_hash" do
52
74
  it "parses embedded typed property" do
53
75
  album.extend(representer).from_hash("best_song" => {"name" => "Go With Me"})
54
- album.best_song.name.must_equal "Go With Me"
76
+ _(album.best_song.name).must_equal "Go With Me"
55
77
  end
56
78
 
57
79
  # nested nil removes nested object.
58
80
  it do
59
81
  album = Album.new(Song.new("Pre-medicated Murder"))
60
82
  album.extend(representer).from_hash("best_song" => nil)
61
- album.best_song.must_equal nil
83
+ _(album.best_song).must_be_nil
62
84
  end
63
85
 
64
86
  # nested blank hash creates blank object when not populated.
65
87
  it do
66
88
  album = Album.new#(Song.new("Pre-medicated Murder"))
67
89
  album.extend(representer).from_hash("best_song" => {})
68
- album.best_song.name.must_equal nil
90
+ _(album.best_song.name).must_be_nil
69
91
  end
70
92
 
71
93
  # Fixes issue #115
72
94
  it "allows nil value in the incoming document and corresponding nil value for the represented" do
73
95
  album = Album.new
74
96
  album.extend(representer).from_hash("best_song" => nil)
75
- album.best_song.must_equal nil
97
+ _(album.best_song).must_be_nil
76
98
  end
77
99
  end
78
100
  end
@@ -85,10 +107,10 @@ class HashWithTypedPropertyAndAs < MiniTest::Spec
85
107
  end
86
108
  end
87
109
 
88
- let (:album) { OpenStruct.new(:song => Song.new("Liar")).extend(representer) }
110
+ let(:album) { OpenStruct.new(:song => Song.new("Liar")).extend(representer) }
89
111
 
90
- it { album.to_hash.must_equal("hit" => {"name" => "Liar"}) }
91
- it { album.from_hash("hit" => {"name" => "Go With Me"}).must_equal OpenStruct.new(:song => Song.new("Go With Me")) }
112
+ it { _(album.to_hash).must_equal("hit" => {"name" => "Liar"}) }
113
+ it { _(album.from_hash("hit" => {"name" => "Go With Me"})).must_equal OpenStruct.new(:song => Song.new("Go With Me")) }
92
114
  end
93
115
  # # describe "FIXME COMBINE WITH ABOVE with :extend and :as" do
94
116
  # # hash_song = Module.new do
@@ -97,13 +119,13 @@ end
97
119
  # # property :name
98
120
  # # end
99
121
 
100
- # # let (:hash_album) { Module.new do
122
+ # # let(:hash_album) { Module.new do
101
123
  # # include Representable::XML
102
124
  # # self.representation_wrap = :album
103
125
  # # property :song, :extend => hash_song, :class => Song, :as => :hit
104
126
  # # end }
105
127
 
106
- # # let (:album) { OpenStruct.new(:song => Song.new("Liar")).extend(hash_album) }
128
+ # # let(:album) { OpenStruct.new(:song => Song.new("Liar")).extend(hash_album) }
107
129
 
108
130
  # # it { album.to_xml.must_equal_xml("<album><hit><name>Liar</name></hit></album>") }
109
131
  # # #it { album.from_hash("hit" => {"name" => "Go With Me"}).must_equal OpenStruct.new(:song => Song.new("Go With Me")) }
@@ -122,18 +144,18 @@ class HashWithTypedCollectionTest < MiniTest::Spec
122
144
  end
123
145
  end
124
146
 
125
- let (:album) { Album.new([Song.new("Liar", 1), Song.new("What I Know", 2)]) }
147
+ let(:album) { Album.new([Song.new("Liar", 1), Song.new("What I Know", 2)]) }
126
148
 
127
149
  describe "#to_hash" do
128
150
  it "renders collection of typed property" do
129
- album.extend(representer).to_hash.must_equal("songs" => [{"name" => "Liar", "track" => 1}, {"name" => "What I Know", "track" => 2}])
151
+ _(album.extend(representer).to_hash).must_equal("songs" => [{"name" => "Liar", "track" => 1}, {"name" => "What I Know", "track" => 2}])
130
152
  end
131
153
  end
132
154
 
133
155
  describe "#from_hash" do
134
156
  it "parses collection of typed property" do
135
- album.extend(representer).from_hash("songs" => [{"name" => "One Shot Deal", "track" => 4},
136
- {"name" => "Three Way Dance", "track" => 5}]).must_equal Album.new([Song.new("One Shot Deal", 4), Song.new("Three Way Dance", 5)])
157
+ _(album.extend(representer).from_hash("songs" => [{"name" => "One Shot Deal", "track" => 4},
158
+ {"name" => "Three Way Dance", "track" => 5}])).must_equal Album.new([Song.new("One Shot Deal", 4), Song.new("Three Way Dance", 5)])
137
159
  end
138
160
  end
139
161
  end
@@ -142,19 +164,19 @@ class HashWithScalarCollectionTest < MiniTest::Spec
142
164
  Album = Struct.new(:songs)
143
165
  representer! { collection :songs }
144
166
 
145
- let (:album) { Album.new(["Jackhammer", "Terrible Man"]) }
167
+ let(:album) { Album.new(["Jackhammer", "Terrible Man"]) }
146
168
 
147
169
 
148
170
  describe "#to_hash" do
149
171
  it "renders a block style list per default" do
150
- album.extend(representer).to_hash.must_equal("songs" => ["Jackhammer", "Terrible Man"])
172
+ _(album.extend(representer).to_hash).must_equal("songs" => ["Jackhammer", "Terrible Man"])
151
173
  end
152
174
  end
153
175
 
154
176
 
155
177
  describe "#from_hash" do
156
178
  it "parses a block style list" do
157
- album.extend(representer).from_hash("songs" => ["Off Key Melody", "Sinking"]).must_equal Album.new(["Off Key Melody", "Sinking"])
179
+ _(album.extend(representer).from_hash("songs" => ["Off Key Melody", "Sinking"])).must_equal Album.new(["Off Key Melody", "Sinking"])
158
180
  end
159
181
  end
160
- end
182
+ end