roar 0.8.0 → 0.8.1

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/lib/roar/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Roar
2
- VERSION = "0.8.0"
2
+ VERSION = "0.8.1"
3
3
  end
data/roar.gemspec CHANGED
@@ -19,11 +19,11 @@ Gem::Specification.new do |s|
19
19
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
20
  s.require_paths = ["lib"]
21
21
 
22
- s.add_runtime_dependency "representable"
22
+ s.add_runtime_dependency "representable", "~> 0.9.2"
23
23
  s.add_runtime_dependency "restfulie", "~> 1.0.0"
24
24
  s.add_runtime_dependency "hooks", "~> 0.1.4"
25
- s.add_runtime_dependency "test_xml"
26
-
25
+
26
+ s.add_development_dependency "test_xml"
27
27
  s.add_development_dependency "minitest", "~> 1.6.0"
28
28
  s.add_development_dependency "sinatra", "~> 1.2.6"
29
29
  s.add_development_dependency "sinatra-reloader", "~> 0.5.0"
@@ -2,8 +2,8 @@ require 'test_helper'
2
2
  require 'roar/representer/feature/http_verbs'
3
3
 
4
4
  class HttpVerbsTest < MiniTest::Spec
5
- class BandRepresenter < Roar::Representer::XML
6
- self.representation_name = :band
5
+ class Band
6
+ include Roar::Representer::XML
7
7
 
8
8
  property :name
9
9
  property :label
@@ -13,7 +13,7 @@ class HttpVerbsTest < MiniTest::Spec
13
13
 
14
14
  describe "HttpVerbs" do
15
15
  before do
16
- @r = BandRepresenter.new
16
+ @r = Band.new
17
17
  end
18
18
 
19
19
  # TODO: assert that Restfulie#post receives the correct document.
@@ -0,0 +1,132 @@
1
+ require 'test_helper'
2
+ require 'roar/representer/feature/hypermedia'
3
+
4
+ class HypermediaTest
5
+ describe "Hypermedia Feature" do
6
+ before do
7
+ @bookmarks = Class.new do
8
+ include Roar::Representer::XML
9
+ include Roar::Representer::Feature::Hypermedia
10
+
11
+ self.representation_name = "bookmarks"
12
+ end
13
+
14
+ @bookmarks_with_links = Class.new(@bookmarks)
15
+ @bookmarks_with_links.class_eval do
16
+ property :id
17
+ link :self do "http://bookmarks" end
18
+ link :all do "http://bookmarks/all" end
19
+ end
20
+ end
21
+
22
+
23
+ describe "#to_xml" do
24
+ it "sets up links and renders <link> correctly in XML" do
25
+ assert_xml_equal '<bookmarks>
26
+ <id>1</id>
27
+ <link rel="self" href="http://bookmarks"/>
28
+ <link rel="all" href="http://bookmarks/all"/>
29
+ </bookmarks>', @bookmarks_with_links.from_attributes(:id => 1).to_xml
30
+ end
31
+
32
+ it "still works even if there are no links defined" do
33
+ assert_xml_equal '<bookmarks/>', @bookmarks.new.to_xml
34
+ end
35
+
36
+ it "doesn't render links with :links => false" do
37
+ assert_xml_equal '<bookmarks>
38
+ <id>1</id>
39
+ </bookmarks>',
40
+ @bookmarks_with_links.from_attributes(:id => 1).to_xml(:links => false)
41
+ end
42
+
43
+ end
44
+
45
+
46
+ describe "#from_xml" do
47
+ it "extracts links from document" do
48
+ doc = @bookmarks_with_links.from_xml(%{
49
+ <bookmarks>
50
+ <link rel="self" href="http://bookmarks">
51
+ </bookmarks>
52
+ })
53
+
54
+ assert_kind_of Roar::Representer::Feature::Hypermedia::LinkCollection, doc.links
55
+ assert_equal 1, doc.links.size
56
+ assert_equal({"rel"=>"self", "href"=>"http://bookmarks"}, doc.links.first.to_attributes)
57
+ end
58
+
59
+ it "sets up an empty link list if no links found in the document" do
60
+ assert_equal [], @bookmarks_with_links.from_xml(%{<bookmarks/>}).links
61
+ end
62
+ end
63
+
64
+
65
+ describe "#links" do
66
+ before do
67
+ @set = @bookmarks.new
68
+ hyper = Roar::Representer::XML::Hyperlink
69
+
70
+ @set.links = [hyper.from_attributes({"rel" => "self", "href" => "http://self"}),
71
+ hyper.from_attributes({"rel" => "next", "href" => "http://next"})]
72
+ end
73
+
74
+ describe "#links=" do
75
+ it "wraps links in a LinkCollection" do
76
+ assert_kind_of Roar::Representer::Feature::Hypermedia::LinkCollection, @set.links
77
+ assert_equal 2, @set.links.size
78
+ end
79
+ end
80
+
81
+ describe "#link[]" do
82
+ it "provides shorthand accessor for rels" do
83
+ assert_equal "http://self", @set.links["self"]
84
+ assert_equal "http://self", @set.links[:self]
85
+ assert_equal "http://next", @set.links[:next]
86
+ assert_equal nil, @set.links[:prev]
87
+ end
88
+ end
89
+
90
+ it "returns an empty list when no links present" do
91
+ assert_equal Roar::Representer::Feature::Hypermedia::LinkCollection.new, @bookmarks.new.links
92
+ end
93
+ end
94
+
95
+
96
+ describe "#find_links_definition" do
97
+ it "returns Definition if links are present" do
98
+ @bookmarks.class_eval do
99
+ property :id
100
+ link :self
101
+ end
102
+
103
+ assert_equal "links", @bookmarks.find_links_definition.name
104
+ end
105
+
106
+ it "returns nil if no links defined" do
107
+ assert_equal nil, @bookmarks.find_links_definition
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+ class LinksDefinitionTest < MiniTest::Spec
114
+ describe "LinksDefinition" do
115
+ before do
116
+ @d = Roar::Representer::Feature::Hypermedia::LinksDefinition.new(:links)
117
+ end
118
+
119
+ it "accepts options in constructor" do
120
+ assert_equal [], @d.rel2block
121
+ end
122
+
123
+ it "accepts configuration" do
124
+ @d.rel2block << {:rel => :self}
125
+ assert_equal [{:rel=>:self}], @d.rel2block
126
+ end
127
+
128
+ it "responds to #each to iterate rel2block" do
129
+ end
130
+
131
+ end
132
+ end
@@ -8,8 +8,8 @@ require 'roar/representer/feature/hypermedia'
8
8
 
9
9
  class RepresenterIntegrationTest < MiniTest::Spec
10
10
  module XML
11
- class BandRepresenter < Roar::Representer::XML
12
- self.representation_name = :band
11
+ class Band
12
+ include Roar::Representer::XML
13
13
 
14
14
  property :name
15
15
  property :label
@@ -29,8 +29,8 @@ class RepresenterIntegrationTest < MiniTest::Spec
29
29
 
30
30
  # TODO: inherit properly.
31
31
  module JSON
32
- class BandRepresenter < Roar::Representer::JSON
33
- self.representation_name = :band
32
+ class Band
33
+ include Roar::Representer::JSON
34
34
 
35
35
  property :name
36
36
  property :label
@@ -55,7 +55,7 @@ class RepresenterIntegrationTest < MiniTest::Spec
55
55
  describe "JSON" do
56
56
  it "allows a POST workflow" do
57
57
  # create representation with initial values:
58
- @r = JSON::BandRepresenter.new(:name => "Bigwig")
58
+ @r = JSON::Band.from_attributes(:name => "Bigwig")
59
59
  assert_equal "Bigwig", @r.name
60
60
 
61
61
  @r = @r.post("http://localhost:9999/band", "application/band+json")
@@ -70,7 +70,7 @@ class RepresenterIntegrationTest < MiniTest::Spec
70
70
  # TODO: implement me.
71
71
  it "allows an ordering workflow" do
72
72
  # create representation with initial values:
73
- @o = ::JSON::Order.new(:client_id => 1)
73
+ @o = ::JSON::Order.from_attributes(:client_id => 1)
74
74
  assert_equal 1, @o.client_id
75
75
 
76
76
  @o.post!("http://localhost:9999/orders", "application/order+json")
@@ -82,7 +82,7 @@ class RepresenterIntegrationTest < MiniTest::Spec
82
82
 
83
83
 
84
84
  # manually POST item:
85
- @i = ::JSON::Item.new(:article_id => "666-S", :amount => 1)
85
+ @i = ::JSON::Item.from_attributes(:article_id => "666-S", :amount => 1)
86
86
  @i.post!(@o.links[:items], "application/item+json")
87
87
  @o.get!(@o.links[:self], "application/order+json")
88
88
 
@@ -104,7 +104,7 @@ class RepresenterIntegrationTest < MiniTest::Spec
104
104
  describe "XML" do
105
105
  it "allows a POST workflow" do
106
106
  # create representation with initial values:
107
- @r = XML::BandRepresenter.new(:name => "Bigwig")
107
+ @r = XML::Band.from_attributes(:name => "Bigwig")
108
108
  assert_equal "Bigwig", @r.name
109
109
 
110
110
  @r = @r.post("http://localhost:9999/band", "application/band+xml")
@@ -3,37 +3,49 @@ require 'test_helper'
3
3
  require "test_xml/mini_test"
4
4
  require "roar/representer/json"
5
5
 
6
- class JsonRepresenterFunctionalTest < MiniTest::Spec
7
- class OrderRepresenter < Roar::Representer::JSON
8
- self.representation_name= :order
9
- representable_property :id
6
+ class JsonRepresenterTest < MiniTest::Spec
7
+ class Order
8
+ include Roar::Representer::JSON
9
+ property :id
10
+ property :pending
10
11
  end
11
12
 
12
13
 
13
14
  describe "JsonRepresenter" do
14
15
  before do
15
- @r = OrderRepresenter.new
16
+ @r = Order.new
16
17
  end
17
18
 
18
19
  describe "#to_json" do
19
20
  it "#serialize returns the serialized model" do
20
21
  @r.id = 1
21
- assert_equal '{"order":{"id":1}}', @r.serialize
22
+ assert_equal '{"order":{"id":1}}', @r.to_json
22
23
  end
23
-
24
-
25
- it ".from_xml returns the deserialized model" do
26
- @m = OrderRepresenter.deserialize('{"order": {"id":1}}')
24
+ end
25
+
26
+ describe ".from_json" do
27
+ it "returns the deserialized model" do
28
+ @m = Order.from_json('{"order": {"id":1}}')
27
29
  assert_equal 1, @m.id
28
30
  end
29
31
 
30
- it ".from_xml still works with nil" do
31
- assert OrderRepresenter.deserialize(nil)
32
+ it "accepts :except option" do
33
+ order = Order.from_json({order: {id: 1, pending: 1}}.to_json, :except => [:id])
34
+ assert_equal nil, order.id
35
+ assert_equal 1, order.pending
36
+ end
37
+
38
+ it "accepts :include option" do
39
+ order = Order.from_json({order: {id: 1, pending: 1}}.to_json, :include => [:id])
40
+ assert_equal 1, order.id
41
+ assert_equal nil, order.pending
32
42
  end
33
43
 
44
+ it "works with a nil document" do
45
+ assert Order.from_json(nil)
46
+ end
34
47
  end
35
48
  end
36
-
37
49
  end
38
50
 
39
51
  class JsonHyperlinkRepresenterTest
@@ -60,12 +72,13 @@ end
60
72
  class JsonHypermediaTest
61
73
  describe "Hypermedia API" do
62
74
  before do
63
- @c = Class.new(Roar::Representer::JSON) do
75
+ @c = Class.new do
76
+ include Roar::Representer::JSON
64
77
  include Roar::Representer::Feature::Hypermedia
65
78
 
66
79
  self.representation_name= :order
67
80
 
68
- representable_property :id
81
+ property :id
69
82
 
70
83
  link :self do "http://self" end
71
84
  link :next do "http://next/#{id}" end
@@ -75,27 +88,19 @@ class JsonHypermediaTest
75
88
  end
76
89
 
77
90
  it "responds to #links" do
78
- assert_equal nil, @r.links
79
- end
80
-
81
- it "computes links in #from_attributes" do
82
- @r = @c.from_attributes({"id" => 1})
83
- assert_equal 2, @r.links.size
84
- assert_equal({"rel"=>:self, "href"=>"http://self"}, @r.links.first.to_attributes)
85
- assert_equal({"rel"=>:next, "href"=>"http://next/1"}, @r.links.last.to_attributes)
91
+ assert_equal [], @r.links
86
92
  end
87
93
 
88
94
  it "extracts links from JSON" do
89
- @r = @c.deserialize({:order => {:links => [{:rel => "self", :href => "http://self"}]}}.to_json)
95
+ @r = @c.from_json({:order => {:links => [{:rel => "self", :href => "http://self"}]}}.to_json)
90
96
 
91
97
  assert_equal 1, @r.links.size
92
98
  assert_equal({"rel"=>"self", "href"=>"http://self"}, @r.links.first.to_attributes)
93
99
  end
94
100
 
95
101
  it "renders link: correctly in JSON" do
96
- assert_equal "{\"order\":{\"id\":1,\"links\":[{\"rel\":\"self\",\"href\":\"http://self\"},{\"rel\":\"next\",\"href\":\"http://next/1\"}]}}", @c.from_attributes({"id" => 1}).serialize
102
+ assert_equal "{\"order\":{\"id\":1,\"links\":[{\"rel\":\"self\",\"href\":\"http://self\"},{\"rel\":\"next\",\"href\":\"http://next/1\"}]}}", @c.from_attributes(:id => 1).to_json
97
103
  end
98
-
99
104
  end
100
105
  end
101
106
 
@@ -3,24 +3,27 @@ require 'roar/representer/feature/model_representing'
3
3
 
4
4
  class ModelRepresentingTest < MiniTest::Spec
5
5
  describe "ModelRepresenting" do
6
- class ItemRepresenter < Roar::Representer::XML
7
- include Roar::Representer::Feature::ModelRepresenting # TODO: move to abstract!
6
+ class ItemRepresenter
7
+ include Roar::Representer::XML
8
+ include Roar::Representer::Feature::ModelRepresenting
8
9
  self.representation_name= :item
9
- representable_property :value
10
+ property :value
10
11
  end
11
12
 
12
- class PositionRepresenter < Roar::Representer::XML
13
- include Roar::Representer::Feature::ModelRepresenting # TODO: move to abstract!
13
+ class PositionRepresenter
14
+ include Roar::Representer::XML
15
+ include Roar::Representer::Feature::ModelRepresenting
14
16
  self.representation_name= :position
15
- representable_property :id
16
- representable_property :item, :as => ItemRepresenter
17
+ property :id
18
+ property :item, :as => ItemRepresenter
17
19
  end
18
20
 
19
- class OrderRepresenter < Roar::Representer::XML
20
- include Roar::Representer::Feature::ModelRepresenting # TODO: move to abstract!
21
+ class OrderRepresenter
22
+ include Roar::Representer::XML
23
+ include Roar::Representer::Feature::ModelRepresenting
21
24
  self.representation_name= :order
22
- representable_property :id
23
- representable_property :items, :as => [ItemRepresenter]
25
+ property :id
26
+ collection :items, :as => ItemRepresenter
24
27
  end
25
28
 
26
29
  describe "#definition_class" do
@@ -33,7 +36,6 @@ class ModelRepresentingTest < MiniTest::Spec
33
36
  describe "#for_model" do
34
37
  it "copies represented model attributes, nothing more" do
35
38
  @o = Position.new("id" => 1, "item" => Item.new("value" => "Beer"))
36
-
37
39
  @r = PositionRepresenter.for_model(@o)
38
40
  assert_kind_of PositionRepresenter, @r
39
41
  assert_equal 1, @r.id
@@ -43,23 +45,13 @@ class ModelRepresentingTest < MiniTest::Spec
43
45
  assert_equal "Beer", @i.value
44
46
  end
45
47
 
46
- it "copies the model to @represented" do
48
+ it "references the model in @represented" do
47
49
  @o = Position.new("id" => 1, "item" => @i = Item.new("value" => "Beer"))
48
50
 
49
51
  @r = PositionRepresenter.for_model(@o)
50
52
  assert_equal @o, @r.represented
51
53
  assert_equal @i, @r.item.represented
52
54
  end
53
-
54
-
55
- it "works with Hyperlink attributes" do
56
- @c = Class.new(ItemRepresenter) do
57
- link :self do "http://self" end
58
- end
59
-
60
- assert_equal({"value"=>"Beer", "links"=>[{"rel"=>:self, "href"=>"http://self"}]}, @c.for_model(Item.new("value" => "Beer")).to_attributes)
61
- end
62
-
63
55
  end
64
56
 
65
57
  describe "#serialize_model" do
@@ -93,6 +85,9 @@ class ModelRepresentingTest < MiniTest::Spec
93
85
  OrderRepresenter.class_eval do
94
86
  include Roar::Representer::Feature::ActiveRecordMethods
95
87
  end
88
+ ItemRepresenter.class_eval do
89
+ include Roar::Representer::Feature::ActiveRecordMethods
90
+ end
96
91
  assert_equal({"id" => 1, "items_attributes" => [{"value" => "Beer"}]}, @r.to_nested_attributes) # DISCUSS: overwrite #to_attributes.
97
92
  end
98
93
 
@@ -103,11 +98,14 @@ class ModelRepresentingTest < MiniTest::Spec
103
98
 
104
99
  OrderRepresenter.class_eval do
105
100
  include Roar::Representer::Feature::ActiveRecordMethods
101
+ include Roar::Representer::Feature::Hypermedia
106
102
  link :self do
107
103
  # "bla"
108
104
  end
109
105
  end
110
106
  ItemRepresenter.class_eval do
107
+ include Roar::Representer::Feature::ActiveRecordMethods
108
+ include Roar::Representer::Feature::Hypermedia
111
109
  link :self do
112
110
 
113
111
  end
@@ -4,7 +4,9 @@ require 'roar/representer/feature/hypermedia'
4
4
 
5
5
  module JSON
6
6
 
7
- class Item < Roar::Representer::JSON
7
+ class Item
8
+ include Roar::Representer::JSON
9
+
8
10
  property :article_id
9
11
  property :amount
10
12
 
@@ -13,7 +15,8 @@ module JSON
13
15
  end
14
16
 
15
17
 
16
- class Order < Roar::Representer::JSON
18
+ class Order
19
+ include Roar::Representer::JSON
17
20
  property :client_id
18
21
  collection :items, :as => Item
19
22