representable 2.3.0 → 2.4.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES.md +47 -0
  3. data/Gemfile +5 -0
  4. data/README.md +33 -0
  5. data/lib/representable.rb +60 -73
  6. data/lib/representable/binding.rb +37 -194
  7. data/lib/representable/cached.rb +10 -46
  8. data/lib/representable/coercion.rb +8 -8
  9. data/lib/representable/config.rb +15 -75
  10. data/lib/representable/debug.rb +41 -59
  11. data/lib/representable/declarative.rb +34 -53
  12. data/lib/representable/decorator.rb +11 -40
  13. data/lib/representable/definition.rb +14 -15
  14. data/lib/representable/deprecations.rb +90 -0
  15. data/lib/representable/deserializer.rb +87 -82
  16. data/lib/representable/for_collection.rb +5 -3
  17. data/lib/representable/hash.rb +5 -3
  18. data/lib/representable/hash/binding.rb +6 -15
  19. data/lib/representable/hash/collection.rb +10 -6
  20. data/lib/representable/hash_methods.rb +5 -5
  21. data/lib/representable/insert.rb +31 -0
  22. data/lib/representable/json.rb +7 -3
  23. data/lib/representable/json/hash.rb +1 -1
  24. data/lib/representable/object/binding.rb +5 -5
  25. data/lib/representable/parse_strategies.rb +37 -3
  26. data/lib/representable/pipeline.rb +37 -5
  27. data/lib/representable/pipeline_factories.rb +88 -0
  28. data/lib/representable/serializer.rb +38 -44
  29. data/lib/representable/version.rb +1 -1
  30. data/lib/representable/xml.rb +4 -0
  31. data/lib/representable/xml/binding.rb +25 -31
  32. data/lib/representable/xml/collection.rb +5 -3
  33. data/lib/representable/xml/hash.rb +7 -2
  34. data/lib/representable/yaml.rb +6 -3
  35. data/lib/representable/yaml/binding.rb +4 -4
  36. data/representable.gemspec +3 -3
  37. data/test/---deserialize-pipeline_test.rb +37 -0
  38. data/test/binding_test.rb +7 -7
  39. data/test/cached_test.rb +31 -19
  40. data/test/coercion_test.rb +2 -2
  41. data/test/config/inherit_test.rb +13 -12
  42. data/test/config_test.rb +12 -67
  43. data/test/decorator_test.rb +4 -5
  44. data/test/default_test.rb +34 -0
  45. data/test/defaults_options_test.rb +93 -0
  46. data/test/definition_test.rb +19 -39
  47. data/test/exec_context_test.rb +1 -1
  48. data/test/filter_test.rb +18 -20
  49. data/test/getter_setter_test.rb +1 -8
  50. data/test/hash_bindings_test.rb +13 -13
  51. data/test/heritage_test.rb +62 -0
  52. data/test/if_test.rb +1 -0
  53. data/test/inherit_test.rb +5 -3
  54. data/test/instance_test.rb +3 -4
  55. data/test/json_test.rb +3 -59
  56. data/test/lonely_test.rb +47 -3
  57. data/test/nested_test.rb +8 -2
  58. data/test/pipeline_test.rb +259 -0
  59. data/test/populator_test.rb +76 -0
  60. data/test/realistic_benchmark.rb +39 -7
  61. data/test/render_nil_test.rb +21 -0
  62. data/test/represent_test.rb +2 -2
  63. data/test/representable_test.rb +33 -103
  64. data/test/schema_test.rb +5 -15
  65. data/test/serialize_deserialize_test.rb +2 -2
  66. data/test/skip_test.rb +1 -1
  67. data/test/test_helper.rb +6 -0
  68. data/test/uncategorized_test.rb +67 -0
  69. data/test/xml_bindings_test.rb +6 -6
  70. data/test/xml_test.rb +6 -6
  71. metadata +33 -13
  72. data/lib/representable/apply.rb +0 -13
  73. data/lib/representable/inheritable.rb +0 -71
  74. data/lib/representable/mapper.rb +0 -83
  75. data/lib/representable/populator.rb +0 -56
  76. data/test/inheritable_test.rb +0 -97
@@ -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 { 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
@@ -1,28 +1,29 @@
1
1
  require 'test_helper'
2
2
 
3
3
  class FilterPipelineTest < MiniTest::Spec
4
- let (:block1) { lambda { |value, *| "1: #{value}" } }
5
- let (:block2) { lambda { |value, *| "2: #{value}" } }
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(Object, "Horowitz").must_equal "2: 1: Horowitz" }
9
+ it { subject.call("Horowitz", {}).must_equal "2: 1: Horowitz" }
10
10
  end
11
11
 
12
12
 
13
13
  class FilterTest < MiniTest::Spec
14
14
  representer! do
15
15
  property :title
16
+
16
17
  property :track,
17
- :parse_filter => lambda { |val, doc, options| "#{val.downcase},#{doc},#{options}" },
18
- :render_filter => lambda { |val, doc, options| "#{val.upcase},#{doc},#{options}" }
18
+ :parse_filter => lambda { |input, options| "#{input.downcase},#{options[:doc]}" },
19
+ :render_filter => lambda { |val, options| "#{val.upcase},#{options[:doc]},#{options[:user_options]}" }
19
20
  end
20
21
 
21
22
  # gets doc and options.
22
23
  it {
23
24
  song = OpenStruct.new.extend(representer).from_hash("title" => "VULCAN EARS", "track" => "Nine")
24
25
  song.title.must_equal "VULCAN EARS"
25
- song.track.must_equal "nine,{\"title\"=>\"VULCAN EARS\", \"track\"=>\"Nine\"},{}"
26
+ song.track.must_equal "nine,{\"title\"=>\"VULCAN EARS\", \"track\"=>\"Nine\"}"
26
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\"},{}"}) }
@@ -32,14 +33,11 @@ class FilterTest < MiniTest::Spec
32
33
  representer! do
33
34
  property :track,
34
35
  :parse_filter => [
35
- lambda { |val, doc, options| "#{val}-1" },
36
- lambda { |val, doc, options| "#{val}-2" }],
36
+ lambda { |input, options| "#{input}-1" },
37
+ lambda { |input, options| "#{input}-2" }],
37
38
  :render_filter => [
38
- lambda { |val, doc, options| "#{val}-1" },
39
- lambda { |val, doc, options| "#{val}-2" }]
40
-
41
- # definition[:parse_filter].instance_variable_get(:@value) << lambda { |val, doc, options| "#{val}-1" }
42
- # property :track, :parse_filter => lambda { |val, doc, options| "#{val}-2" }, :inherit => true
39
+ lambda { |val, options| "#{val}-1" },
40
+ lambda { |val, options| "#{val}-2" }]
43
41
  end
44
42
 
45
43
  # order matters.
@@ -49,11 +47,11 @@ class FilterTest < MiniTest::Spec
49
47
  end
50
48
 
51
49
 
52
- class RenderFilterTest < MiniTest::Spec
53
- representer! do
54
- property :track, :render_filter => [lambda { |val, doc, options| "#{val}-1" } ]
55
- property :track, :render_filter => [lambda { |val, doc, options| "#{val}-2" } ], :inherit => true
56
- end
50
+ # class RenderFilterTest < MiniTest::Spec
51
+ # representer! do
52
+ # property :track, :render_filter => [lambda { |val, options| "#{val}-1" } ]
53
+ # property :track, :render_filter => [lambda { |val, options| "#{val}-2" } ], :inherit => true
54
+ # end
57
55
 
58
- it { OpenStruct.new("track" => "Nine").extend(representer).to_hash.must_equal({"track"=>"Nine-1-2"}) }
59
- end
56
+ # it { OpenStruct.new("track" => "Nine").extend(representer).to_hash.must_equal({"track"=>"Nine-1-2"}) }
57
+ # end
@@ -14,15 +14,8 @@ class GetterSetterTest < BaseTest
14
14
  subject.to_hash(:welcome => "Hi").must_equal({"name" => "Hi Mony Mony"})
15
15
  end
16
16
 
17
- it "does not call original reader when rendering" do
18
- subject.instance_eval { def name; raise; end; self }.to_hash({})
19
- end
20
-
21
17
  it "uses :setter when parsing" do
18
+ subject.instance_eval { def name=(*); raise; end; self }
22
19
  subject.from_hash({"name" => "Eyes Without A Face"}, :welcome => "Hello").song_name.must_equal "Hello Eyes Without A Face"
23
20
  end
24
-
25
- it "does not call original writer when parsing" do
26
- subject.instance_eval { def name=(*); raise; end; self }.from_hash({"name"=>"Dana D And Talle T"}, {})
27
- end
28
21
  end
@@ -15,17 +15,17 @@ class HashBindingTest < MiniTest::Spec
15
15
  describe "PropertyBinding" do
16
16
  describe "#read" do
17
17
  before do
18
- @property = Representable::Hash::Binding.new(Representable::Definition.new(:song), nil)
18
+ @property = Representable::Hash::Binding.new(Representable::Definition.new(:song))
19
19
  end
20
20
 
21
21
  it "returns fragment if present" do
22
- assert_equal "Stick The Flag Up Your Goddamn Ass, You Sonofabitch", @property.read({"song" => "Stick The Flag Up Your Goddamn Ass, You Sonofabitch"})
23
- assert_equal "", @property.read({"song" => ""})
24
- assert_equal nil, @property.read({"song" => nil})
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
+ assert_equal "", @property.read({"song" => ""}, "song")
24
+ assert_equal nil, @property.read({"song" => nil}, "song")
25
25
  end
26
26
 
27
27
  it "returns FRAGMENT_NOT_FOUND if not in document" do
28
- assert_equal Representable::Binding::FragmentNotFound, @property.read({})
28
+ assert_equal Representable::Binding::FragmentNotFound, @property.read({}, "song")
29
29
  end
30
30
 
31
31
  end
@@ -35,16 +35,16 @@ class HashBindingTest < MiniTest::Spec
35
35
  describe "CollectionBinding" do
36
36
  describe "with plain text items" do
37
37
  before do
38
- @property = Representable::Hash::Binding::Collection.new(Representable::Definition.new(:songs, :collection => true), Album.new)
38
+ @property = Representable::Hash::Binding::Collection.new(Representable::Definition.new(:songs, :collection => true))
39
39
  end
40
40
 
41
41
  it "extracts with #read" do
42
- assert_equal ["The Gargoyle", "Bronx"], @property.read("songs" => ["The Gargoyle", "Bronx"])
42
+ assert_equal ["The Gargoyle", "Bronx"], @property.read({"songs" => ["The Gargoyle", "Bronx"]}, "songs")
43
43
  end
44
44
 
45
45
  it "inserts with #write" do
46
46
  doc = {}
47
- assert_equal(["The Gargoyle", "Bronx"], @property.write(doc, ["The Gargoyle", "Bronx"]))
47
+ assert_equal(["The Gargoyle", "Bronx"], @property.write(doc, ["The Gargoyle", "Bronx"], "songs"))
48
48
  assert_equal({"songs"=>["The Gargoyle", "Bronx"]}, doc)
49
49
  end
50
50
  end
@@ -56,29 +56,29 @@ class HashBindingTest < MiniTest::Spec
56
56
  describe "HashBinding" do
57
57
  describe "with plain text items" do
58
58
  before do
59
- @property = Representable::Hash::Binding::Hash.new(Representable::Definition.new(:songs, :hash => true), nil)
59
+ @property = Representable::Hash::Binding.new(Representable::Definition.new(:songs, :hash => true))
60
60
  end
61
61
 
62
62
  it "extracts with #read" do
63
- assert_equal({"first" => "The Gargoyle", "second" => "Bronx"} , @property.read("songs" => {"first" => "The Gargoyle", "second" => "Bronx"}))
63
+ assert_equal({"first" => "The Gargoyle", "second" => "Bronx"} , @property.read({"songs" => {"first" => "The Gargoyle", "second" => "Bronx"}}, "songs"))
64
64
  end
65
65
 
66
66
  it "inserts with #write" do
67
67
  doc = {}
68
- assert_equal({"first" => "The Gargoyle", "second" => "Bronx"}, @property.write(doc, {"first" => "The Gargoyle", "second" => "Bronx"}))
68
+ assert_equal({"first" => "The Gargoyle", "second" => "Bronx"}, @property.write(doc, {"first" => "The Gargoyle", "second" => "Bronx"}, "songs"))
69
69
  assert_equal({"songs"=>{"first" => "The Gargoyle", "second" => "Bronx"}}, doc)
70
70
  end
71
71
  end
72
72
 
73
73
  describe "with objects" do
74
74
  before do
75
- @property = Representable::Hash::Binding::Hash.new(Representable::Definition.new(:songs, :hash => true, :class => Song, :extend => SongRepresenter), nil)
75
+ @property = Representable::Hash::Binding.new(Representable::Definition.new(:songs, :hash => true, :class => Song, :extend => SongRepresenter))
76
76
  end
77
77
 
78
78
  it "doesn't change the represented hash in #write" do
79
79
  song = Song.new("Better Than That")
80
80
  hash = {"first" => song}
81
- @property.write({}, hash)
81
+ @property.write({}, hash, "song")
82
82
  assert_equal({"first" => song}, hash)
83
83
  end
84
84
  end
@@ -0,0 +1,62 @@
1
+ require "test_helper"
2
+
3
+ class HeritageTest < Minitest::Spec
4
+ module Hello
5
+ def hello
6
+ puts "Hello!"
7
+ end
8
+ end
9
+ module Ciao
10
+ def ciao
11
+ puts "Ciao!"
12
+ end
13
+ end
14
+
15
+
16
+ class A < Representable::Decorator
17
+ include Representable::Hash
18
+
19
+ feature Hello
20
+
21
+ property :id do
22
+ end
23
+ end
24
+
25
+ class B < A
26
+ feature Ciao # does NOT extend id, of course.
27
+
28
+ property :id, inherit: true do
29
+
30
+ end
31
+ end
32
+
33
+ class C < A
34
+ property :id do end # overwrite old :id.
35
+ end
36
+
37
+ it do
38
+ # puts A.heritage.inspect
39
+ # puts B.heritage.inspect
40
+
41
+ puts B.representable_attrs.get(:id)[:extend].(nil).new(nil).hello
42
+ puts B.representable_attrs.get(:id)[:extend].(nil).new(nil).ciao
43
+
44
+ # feature Hello must be "inherited" from A and included in new C properties, too.
45
+ puts C.representable_attrs.get(:id)[:extend].(nil).new(nil).hello
46
+ end
47
+
48
+ module M
49
+ include Representable
50
+ feature Hello
51
+ end
52
+
53
+ module N
54
+ include Representable
55
+ include M
56
+ feature Ciao
57
+ end
58
+
59
+ it do
60
+ Object.new.extend(N).hello
61
+ end
62
+ end
@@ -55,6 +55,7 @@ class IfTest < MiniTest::Spec
55
55
  it "works with decorator" do
56
56
  rpr = representer
57
57
  Class.new(Representable::Decorator) do
58
+ include Representable::Hash
58
59
  include rpr
59
60
  end.new(subject).to_hash.must_equal({})
60
61
  end
@@ -55,8 +55,8 @@ class InheritTest < MiniTest::Spec
55
55
  representer! do
56
56
  include SongRepresenter
57
57
 
58
- property :name, :inherit => true, :as => :name do # inherit module, only.
59
- # that doesn't make sense.
58
+ property :name, inherit: true, as: :name do # inherit module, only.
59
+ # that doesn't make sense. but it should simply inherit the old nested properties.
60
60
  end
61
61
  end
62
62
 
@@ -91,7 +91,7 @@ class InheritTest < MiniTest::Spec
91
91
  definition = representer.representable_attrs.get(:track) # TODO: find a better way to assert Definition identity.
92
92
  # definition.keys.size.must_equal 2
93
93
  definition[:representable]. must_equal true
94
- definition[:as].evaluate(nil).must_equal "track" # was "no".
94
+ definition.name.must_equal "track" # was "no".
95
95
  end
96
96
  end
97
97
 
@@ -110,7 +110,9 @@ class InheritTest < MiniTest::Spec
110
110
 
111
111
  let (:inheriting) {
112
112
  class InheritingDecorator < representer
113
+ include Representable::Debug
113
114
  property :hit, :inherit => true do
115
+ include Representable::Debug
114
116
  property :length
115
117
  end
116
118
  self
@@ -36,7 +36,7 @@ class InstanceTest < BaseTest
36
36
  :extend => song_representer
37
37
  end
38
38
 
39
- it { OpenStruct.new(:song => Song.new(1, "The Answer Is Still No")).extend(representer).
39
+ it( "xxx") { OpenStruct.new(:song => Song.new(1, "The Answer Is Still No")).extend(representer).
40
40
  from_hash("song" => {"id" => 1}).song.must_equal Song.new(1, "The Answer Is Still No") }
41
41
 
42
42
  it { OpenStruct.new(:song => Song.new(1, "The Answer Is Still No")).extend(representer).
@@ -48,7 +48,6 @@ class InstanceTest < BaseTest
48
48
  representer!(:inject => :song_representer) do
49
49
  collection :songs,
50
50
  :instance => lambda { |fragment, i, *args|
51
-
52
51
  fragment["id"] == songs[i].id ? songs[i] : Song.find(fragment["id"])
53
52
  }, # let's not allow returning nil anymore. make sure we can still do everything as with nil. also, let's remove parse_strategy: sync.
54
53
 
@@ -142,7 +141,7 @@ class InstanceTest < BaseTest
142
141
  :setter => lambda { |*| }
143
142
  end
144
143
 
145
- it {
144
+ it("hooray") {
146
145
  album= Struct.new(:songs).new(songs = [
147
146
  Song.new(1, "The Answer Is Still No"),
148
147
  Song.new(2, "Invncble")])
@@ -250,7 +249,7 @@ class InstanceTest < BaseTest
250
249
  describe "new syntax for instance: true" do
251
250
  representer!(:inject => :song_representer) do
252
251
  property :song, :pass_options => true,
253
- :extend => song_representer, :instance => lambda { |fragment, args| args.binding.get }
252
+ :extend => song_representer, :instance => lambda { |fragment, args| args.binding.get(represented: args.represented) }
254
253
  end
255
254
 
256
255
  it "uses Binding#get instead of creating an instance, but deprecates" do
@@ -88,25 +88,13 @@ module JsonTest
88
88
 
89
89
  describe "#build_for" do
90
90
  it "returns TextBinding" do
91
- assert_kind_of Representable::Hash::Binding, Representable::Hash::Binding.build_for(Def.new(:band), nil)
92
- end
93
-
94
- it "returns HashBinding" do
95
- assert_kind_of Representable::Hash::Binding::Hash, Representable::Hash::Binding.build_for(Def.new(:band, :hash => true), nil)
91
+ assert_kind_of Representable::Hash::Binding, Representable::Hash::Binding.build_for(Def.new(:band))
96
92
  end
97
93
 
98
94
  it "returns CollectionBinding" do
99
- assert_kind_of Representable::Hash::Binding::Collection, Representable::Hash::Binding.build_for(Def.new(:band, :collection => true), nil)
95
+ assert_kind_of Representable::Hash::Binding::Collection, Representable::Hash::Binding.build_for(Def.new(:band, :collection => true))
100
96
  end
101
97
  end
102
-
103
- # describe "#representable_bindings_for" do
104
- # it "returns bindings for each property" do
105
- # bins = @band.send(:representable_bindings_for, Representable::JSON::Binding, {})
106
- # assert_equal 2, bins.size
107
- # assert_equal "name", bins.first.name
108
- # end
109
- # end
110
98
  end
111
99
 
112
100
 
@@ -242,50 +230,6 @@ module JsonTest
242
230
  end
243
231
  end
244
232
 
245
- describe ":default => :value" do
246
- before do
247
- @Album = Class.new do
248
- include Representable::JSON
249
- property :name, :default => "30 Years Live"
250
- attr_accessor :name
251
- end
252
- end
253
-
254
- describe "#from_json" do
255
- it "uses default when property nil in doc" do
256
- album = @Album.new.from_json({}.to_json)
257
- assert_equal "30 Years Live", album.name
258
- end
259
-
260
- it "uses value from doc when present" do
261
- album = @Album.new.from_json({:name => "Live At The Wireless"}.to_json)
262
- assert_equal "Live At The Wireless", album.name
263
- end
264
-
265
- it "uses value from doc when empty string" do
266
- album = @Album.new.from_json({:name => ""}.to_json)
267
- assert_equal "", album.name
268
- end
269
- end
270
-
271
- describe "#to_json" do
272
- it "uses default when not available in object" do
273
- assert_json "{\"name\":\"30 Years Live\"}", @Album.new.to_json
274
- end
275
-
276
- it "uses value from represented object when present" do
277
- album = @Album.new
278
- album.name = "Live At The Wireless"
279
- assert_json "{\"name\":\"Live At The Wireless\"}", album.to_json
280
- end
281
-
282
- it "uses value from represented object when emtpy string" do
283
- album = @Album.new
284
- album.name = ""
285
- assert_json "{\"name\":\"\"}", album.to_json
286
- end
287
- end
288
- end
289
233
  end
290
234
 
291
235
 
@@ -302,7 +246,7 @@ end
302
246
  assert_equal ["Out in the cold", "Microphone"], cd.songs
303
247
  end
304
248
 
305
- it "#to_json serializes correctly" do
249
+ it "zzz#to_json serializes correctly" do
306
250
  cd = CD.new
307
251
  cd.songs = ["Out in the cold", "Microphone"]
308
252
 
@@ -36,7 +36,7 @@ class LonelyRepresenterTest < MiniTest::Spec
36
36
  property :name
37
37
  end
38
38
 
39
- let (:decorator) { rpr = representer; Class.new(Representable::Decorator) { include rpr } }
39
+ let (:decorator) { rpr = representer; Class.new(Representable::Decorator) { include Representable::Hash; include rpr } }
40
40
 
41
41
  describe "JSON::Collection" do
42
42
  let (:songs) { [Song.new("Days Go By"), Song.new("Can't Take Them All")] }
@@ -55,7 +55,7 @@ class LonelyRepresenterTest < MiniTest::Spec
55
55
  assert_json json, songs.extend(representer).to_json
56
56
  end
57
57
 
58
- it "renders array with decorator xxx" do
58
+ it "renders array with decorator" do
59
59
  assert_json json, decorator.new(songs).to_json
60
60
  end
61
61
 
@@ -98,6 +98,23 @@ class LonelyRepresenterTest < MiniTest::Spec
98
98
  end
99
99
  end
100
100
 
101
+ describe "Hash::Collection with dynamic options" do
102
+ class One < Representable::Decorator
103
+ def to_hash(*); "One: #{represented}"; end
104
+ end
105
+
106
+ class Two < Representable::Decorator
107
+ def to_hash(*); "Two: #{represented}"; end
108
+ end
109
+
110
+ representer!(module: Representable::Hash::Collection) do
111
+ items extend: ->(options) { options[:input] == 1 ? options[:user_options][:one] : options[:user_options][:two] }
112
+ end
113
+
114
+
115
+ it { [1,2].extend(representer).to_hash(one: One, two: Two).must_equal(["One: 1", "Two: 2"]) }
116
+ end
117
+
101
118
 
102
119
  describe "JSON::Hash" do # TODO: move to HashTest.
103
120
  describe "with contained objects" do
@@ -141,7 +158,7 @@ class LonelyRepresenterTest < MiniTest::Spec
141
158
  assert_equal({"two" => Song.new("Can't Take Them All")}, {}.extend(representer).from_json(json, :exclude => [:one]))
142
159
  end
143
160
 
144
- it "respects :include" do
161
+ it "xxxrespects :include" do
145
162
  assert_equal({"one" => Song.new("Days Go By")}, {}.extend(representer).from_json(json, :include => [:one]))
146
163
  end
147
164
  end
@@ -160,6 +177,33 @@ class LonelyRepresenterTest < MiniTest::Spec
160
177
  end
161
178
 
162
179
 
180
+ describe "with scalar" do
181
+ let (:representer) {
182
+ Module.new do
183
+ include Representable::JSON::Hash
184
+ end
185
+ }
186
+ let (:json) { %{{"one":1,"two":2}} }
187
+ let (:data) { {one: 2, two: 3} }
188
+
189
+ describe "#to_json" do
190
+ it { data.extend(representer).to_json.must_equal %{{"one":2,"two":3}} }
191
+
192
+ # it "respects :exclude" do
193
+ # assert_json "{\"two\":{\"name\":\"Can't Take Them All\"}}", {:one => Song.new("Days Go By"), :two => Song.new("Can't Take Them All")}.extend(representer).to_json(:exclude => [:one])
194
+ # end
195
+
196
+ # it "respects :include" do
197
+ # assert_json "{\"two\":{\"name\":\"Can't Take Them All\"}}", {:one => Song.new("Days Go By"), :two => Song.new("Can't Take Them All")}.extend(representer).to_json(:include => [:two])
198
+ # end
199
+ end
200
+
201
+ describe "#from_json" do # FIXME: what's the point of this?
202
+ it { data.extend(representer).from_hash(data).must_equal data }
203
+ end
204
+ end
205
+
206
+
163
207
  describe "with contained text" do
164
208
  before do
165
209
  @songs_representer = Module.new do