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/Gemfile +2 -2
- data/README.textile +8 -2
- data/Rakefile +1 -1
- data/lib/roar/rails/representer_methods.rb +2 -1
- data/lib/roar/representer/base.rb +65 -0
- data/lib/roar/representer/feature/http_verbs.rb +6 -7
- data/lib/roar/representer/feature/hypermedia.rb +53 -13
- data/lib/roar/representer/feature/model_representing.rb +19 -27
- data/lib/roar/representer/json.rb +44 -14
- data/lib/roar/representer/xml.rb +48 -24
- data/lib/roar/version.rb +1 -1
- data/roar.gemspec +3 -3
- data/test/{http_verbs_test.rb → http_verbs_feature_test.rb} +3 -3
- data/test/hypermedia_feature_test.rb +132 -0
- data/test/integration_test.rb +8 -8
- data/test/json_representer_test.rb +31 -26
- data/test/model_representing_test.rb +21 -23
- data/test/order_representers.rb +5 -2
- data/test/representer_test.rb +35 -5
- data/test/test_helper.rb +28 -7
- data/test/xml_representer_test.rb +60 -90
- metadata +11 -17
- data/lib/roar/model.rb +0 -36
- data/lib/roar/model/representable.rb +0 -31
- data/lib/roar/representer.rb +0 -72
- data/test/hypermedia_test.rb +0 -35
- data/test/model_test.rb +0 -50
- data/test/proxy_test.rb +0 -89
- data/test/representable_test.rb +0 -49
- data/test/ruby_representation_test.rb +0 -144
- data/test/test_helper_test.rb +0 -59
- data/test/xml_hypermedia_test.rb +0 -47
data/test/representer_test.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class RepresenterTest < MiniTest::Spec
|
4
|
-
describe "Representer" do
|
4
|
+
describe "Representer::Base" do
|
5
5
|
before do
|
6
|
-
@c = Class.new
|
6
|
+
@c = Class.new do
|
7
|
+
include Roar::Representer::Base
|
8
|
+
end
|
7
9
|
end
|
8
10
|
|
9
11
|
it "aliases #representable_property to #property" do
|
@@ -16,9 +18,37 @@ class RepresenterTest < MiniTest::Spec
|
|
16
18
|
assert_equal "songs", @c.representable_attrs.first.name
|
17
19
|
end
|
18
20
|
|
19
|
-
|
20
|
-
|
21
|
-
|
21
|
+
|
22
|
+
describe "#from_attributes" do
|
23
|
+
it "accepts a block yielding the created representer instance" do
|
24
|
+
@c.class_eval { attr_accessor :name }
|
25
|
+
|
26
|
+
assert_equal("Conan", @c.from_attributes({}) { |rep| rep.name = "Conan" }.name)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "copies known properties, only, but doesn't complain" do
|
30
|
+
@c.class_eval { property :id }
|
31
|
+
|
32
|
+
assert_equal 1, @c.from_attributes("id" => 1, "unknown" => "don't use me").id
|
33
|
+
end
|
34
|
+
|
35
|
+
it "accepts symbols and strings as property name" do
|
36
|
+
@c.class_eval { property :id }
|
37
|
+
|
38
|
+
assert_equal @c.from_attributes(:id => 1).id, @c.from_attributes("id" => 1).id
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "Inheritance" do
|
44
|
+
it "properly inherits properties" do
|
45
|
+
base = Class.new do
|
46
|
+
include Roar::Representer::JSON
|
47
|
+
self.representation_name= "collection"
|
48
|
+
property :name
|
49
|
+
end
|
50
|
+
|
51
|
+
assert_equal "{\"collection\":{\"name\":\"Paulo\"}}", Class.new(base).from_attributes(:name => "Paulo").to_json
|
22
52
|
end
|
23
53
|
|
24
54
|
end
|
data/test/test_helper.rb
CHANGED
@@ -4,18 +4,39 @@ Bundler.setup
|
|
4
4
|
require 'test/unit'
|
5
5
|
require 'minitest/spec'
|
6
6
|
|
7
|
-
require '
|
8
|
-
|
9
|
-
require 'roar/representer'
|
10
|
-
require 'roar/model'
|
7
|
+
require 'roar/representer/base'
|
8
|
+
require 'roar/representer/feature/hypermedia'
|
11
9
|
require 'roar/representer/feature/http_verbs'
|
12
10
|
|
13
11
|
require 'stringio' # FIXME. remove for 3.0.4.
|
14
12
|
require 'builder'
|
15
13
|
|
14
|
+
module TestModel
|
15
|
+
def self.included(base)
|
16
|
+
base.extend ClassMethods
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
module ClassMethods
|
21
|
+
def accessors(*names)
|
22
|
+
names.each do |name|
|
23
|
+
attr_accessor name
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
attr_accessor :attributes
|
29
|
+
|
30
|
+
def initialize(attributes={})
|
31
|
+
attributes.each do |k,v|
|
32
|
+
send("#{k}=", v)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
16
37
|
|
17
38
|
class Item
|
18
|
-
include
|
39
|
+
include TestModel
|
19
40
|
accessors :value
|
20
41
|
|
21
42
|
def self.model_name
|
@@ -24,7 +45,7 @@ class Item
|
|
24
45
|
end
|
25
46
|
|
26
47
|
class Position
|
27
|
-
include
|
48
|
+
include TestModel
|
28
49
|
accessors :id, :item
|
29
50
|
|
30
51
|
def self.model_name
|
@@ -33,7 +54,7 @@ class Position
|
|
33
54
|
end
|
34
55
|
|
35
56
|
class Order
|
36
|
-
include
|
57
|
+
include TestModel
|
37
58
|
accessors :id, :items
|
38
59
|
|
39
60
|
def self.model_name
|
@@ -1,24 +1,16 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
class
|
4
|
-
include Roar::
|
5
|
-
accessors :id, :item
|
6
|
-
|
7
|
-
def self.model_name
|
8
|
-
:order
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
|
13
|
-
class ItemRepresenter < Roar::Representer::XML
|
3
|
+
class ItemRepresenter
|
4
|
+
include Roar::Representer::XML
|
14
5
|
self.representation_name= :item
|
15
|
-
|
6
|
+
property :value
|
16
7
|
end
|
17
8
|
|
18
|
-
class PositionRepresenter
|
9
|
+
class PositionRepresenter
|
10
|
+
include Roar::Representer::XML
|
19
11
|
self.representation_name= :position
|
20
|
-
|
21
|
-
|
12
|
+
property :id
|
13
|
+
property :item, :as => ItemRepresenter
|
22
14
|
end
|
23
15
|
|
24
16
|
|
@@ -27,7 +19,10 @@ end
|
|
27
19
|
class XMLRepresenterUnitTest < MiniTest::Spec
|
28
20
|
describe "XmlRepresenter" do
|
29
21
|
describe "#link" do
|
30
|
-
class Rapper
|
22
|
+
class Rapper
|
23
|
+
include Roar::Representer::XML
|
24
|
+
include Roar::Representer::Feature::Hypermedia
|
25
|
+
|
31
26
|
link :self
|
32
27
|
link :next
|
33
28
|
end
|
@@ -37,57 +32,13 @@ class XMLRepresenterUnitTest < MiniTest::Spec
|
|
37
32
|
assert_equal [{:rel=>:self, :block=>nil}, {:rel=>:next, :block=>nil}], Rapper.representable_attrs.first.rel2block
|
38
33
|
end
|
39
34
|
end
|
40
|
-
|
41
|
-
describe "#from_attributes" do
|
42
|
-
it "accepts a block" do
|
43
|
-
@c = Class.new(Roar::Representer::XML) do
|
44
|
-
attr_accessor :name
|
45
|
-
end
|
46
|
-
|
47
|
-
assert_equal("Conan", @c.from_attributes({}) { |rep| rep.name = "Conan" }.name)
|
48
|
-
end
|
49
|
-
end
|
50
35
|
end
|
51
36
|
end
|
52
37
|
|
53
|
-
class LinksDefinitionTest < MiniTest::Spec
|
54
|
-
describe "LinksDefinition" do
|
55
|
-
before do
|
56
|
-
@d = Roar::Representer::LinksDefinition.new(:links)
|
57
|
-
end
|
58
|
-
|
59
|
-
it "accepts options in constructor" do
|
60
|
-
assert_equal [], @d.rel2block
|
61
|
-
end
|
62
|
-
|
63
|
-
it "accepts configuration" do
|
64
|
-
@d.rel2block << {:rel => :self}
|
65
|
-
assert_equal [{:rel=>:self}], @d.rel2block
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
class XMLDefinitionTest < MiniTest::Spec
|
71
|
-
class Rapper
|
72
|
-
attr_accessor :name
|
73
|
-
end
|
74
|
-
|
75
|
-
describe "ROXML::Definition" do
|
76
|
-
it "responds to #populate" do
|
77
|
-
@r = Rapper.new
|
78
|
-
Representable::Definition.new(:name).populate(@r, "name" => "Eugen")
|
79
|
-
assert_equal "Eugen", @r.name
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
38
|
|
88
39
|
class XMLRepresenterFunctionalTest < MiniTest::Spec
|
89
40
|
class GreedyOrder
|
90
|
-
include
|
41
|
+
include TestModel
|
91
42
|
accessors :id, :items
|
92
43
|
|
93
44
|
def self.model_name
|
@@ -95,9 +46,10 @@ class XMLRepresenterFunctionalTest < MiniTest::Spec
|
|
95
46
|
end
|
96
47
|
end
|
97
48
|
|
98
|
-
class TestXmlRepresenter
|
49
|
+
class TestXmlRepresenter
|
50
|
+
include Roar::Representer::XML
|
99
51
|
self.representation_name= :order # FIXME: get from represented?
|
100
|
-
|
52
|
+
property :id
|
101
53
|
end
|
102
54
|
|
103
55
|
|
@@ -110,18 +62,6 @@ class XMLRepresenterFunctionalTest < MiniTest::Spec
|
|
110
62
|
@i.value = "Beer"
|
111
63
|
end
|
112
64
|
|
113
|
-
describe "#from_attributes" do
|
114
|
-
it "copies represented attributes, only" do
|
115
|
-
@r = PositionRepresenter.from_attributes("id" => 1, "item" => @i, "unknown" => 1)
|
116
|
-
assert_kind_of PositionRepresenter, @r
|
117
|
-
assert_equal 1, @r.id
|
118
|
-
|
119
|
-
assert_kind_of ItemRepresenter, @r.item
|
120
|
-
assert_equal @r.item.value, "Beer"
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
|
125
65
|
describe "#to_attributes" do
|
126
66
|
it "returns a nested attributes hash" do
|
127
67
|
@r = PositionRepresenter.from_attributes("id" => 1, "item" => @i)
|
@@ -132,28 +72,56 @@ class XMLRepresenterFunctionalTest < MiniTest::Spec
|
|
132
72
|
|
133
73
|
describe "#to_xml" do
|
134
74
|
it "serializes the current model" do
|
135
|
-
assert_xml_equal "<order/>", @r.to_xml
|
75
|
+
assert_xml_equal "<order/>", @r.to_xml
|
136
76
|
|
137
77
|
@r.id = 2
|
138
|
-
assert_xml_equal "<rap><id>2</id></rap>", @r.to_xml(:name => :rap)
|
78
|
+
assert_xml_equal "<rap><id>2</id></rap>", @r.to_xml(:name => :rap)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "is aliased to #serialize" do
|
82
|
+
assert_equal @r.to_xml, @r.serialize
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "#from_xml" do
|
87
|
+
class Order
|
88
|
+
include Roar::Representer::XML
|
89
|
+
property :id
|
90
|
+
property :pending
|
91
|
+
end
|
92
|
+
|
93
|
+
it "is aliased to #deserialize" do
|
94
|
+
assert_equal TestXmlRepresenter.from_xml("<order/>").to_attributes, TestXmlRepresenter.deserialize("<order/>").to_attributes
|
95
|
+
end
|
96
|
+
|
97
|
+
it "accepts :except option" do
|
98
|
+
order = Order.from_xml(%{<order><id>1</id><pending>1</pending></order>}, :except => [:id])
|
99
|
+
assert_equal nil, order.id
|
100
|
+
assert_equal "1", order.pending
|
101
|
+
end
|
102
|
+
|
103
|
+
it "accepts :include option" do
|
104
|
+
order = Order.from_xml(%{<order><id>1</id><pending>1</pending></order>}, :include => [:id])
|
105
|
+
assert_equal "1", order.id
|
106
|
+
assert_equal nil, order.pending
|
139
107
|
end
|
140
108
|
end
|
141
109
|
|
142
110
|
|
143
111
|
describe "without options" do
|
144
|
-
it "#
|
112
|
+
it "#to_xml returns the serialized model" do
|
145
113
|
@r.id = 1
|
146
|
-
assert_xml_equal "<order><id>1</id></order>", @r.
|
114
|
+
assert_xml_equal "<order><id>1</id></order>", @r.to_xml
|
147
115
|
end
|
148
116
|
|
149
117
|
|
150
118
|
it ".from_xml returns the deserialized model" do
|
151
|
-
@m = TestXmlRepresenter.
|
119
|
+
@m = TestXmlRepresenter.from_xml("<order><id>1</id></order>")
|
152
120
|
assert_equal "1", @m.id
|
153
121
|
end
|
154
122
|
|
155
123
|
it ".from_xml still works with nil" do
|
156
|
-
assert TestXmlRepresenter.
|
124
|
+
assert TestXmlRepresenter.from_xml(nil)
|
157
125
|
end
|
158
126
|
|
159
127
|
end
|
@@ -165,16 +133,16 @@ class XMLRepresenterFunctionalTest < MiniTest::Spec
|
|
165
133
|
end
|
166
134
|
|
167
135
|
it "#serialize skips empty :item" do
|
168
|
-
assert_xml_equal "<position><id>1</id></position>", @r.
|
136
|
+
assert_xml_equal "<position><id>1</id></position>", @r.to_xml
|
169
137
|
end
|
170
138
|
|
171
139
|
it "#to_xml delegates to ItemRepresenter#to_xml" do
|
172
140
|
@r.item = @i
|
173
|
-
assert_xml_equal "<position><id>1</id><item><value>Beer</value></item></position>", @r.
|
141
|
+
assert_xml_equal "<position><id>1</id><item><value>Beer</value></item></position>", @r.to_xml
|
174
142
|
end
|
175
143
|
|
176
144
|
it ".from_xml typecasts :item" do
|
177
|
-
@m = PositionRepresenter.
|
145
|
+
@m = PositionRepresenter.from_xml("<position><id>1</id><item><value>beer</value></item>\n</position>")
|
178
146
|
|
179
147
|
assert_equal "1", @m.id
|
180
148
|
assert_equal "beer", @m.item.value
|
@@ -184,28 +152,30 @@ class XMLRepresenterFunctionalTest < MiniTest::Spec
|
|
184
152
|
|
185
153
|
describe "with a typed list" do
|
186
154
|
before do
|
187
|
-
@c = Class.new
|
155
|
+
@c = Class.new do
|
156
|
+
include Roar::Representer::XML
|
157
|
+
|
188
158
|
self.representation_name= :order
|
189
|
-
|
190
|
-
|
159
|
+
property :id
|
160
|
+
collection :items, :as => ItemRepresenter, :from => :item
|
191
161
|
end
|
192
162
|
|
193
163
|
@r = @c.from_attributes("id" => 1)
|
194
164
|
end
|
195
165
|
|
196
166
|
it "#serialize_model skips empty :item" do
|
197
|
-
assert_xml_equal "<order><id>1</id></order>", @r.
|
167
|
+
assert_xml_equal "<order><id>1</id></order>", @r.to_xml
|
198
168
|
end
|
199
169
|
|
200
170
|
it "#serialize delegates to ItemXmlRepresenter#to_xml in list" do
|
201
171
|
@r.items = [ItemRepresenter.from_attributes("value" => "Bier")]
|
202
172
|
|
203
173
|
assert_xml_equal "<order><id>1</id><item><value>Bier</value></item></order>",
|
204
|
-
@r.
|
174
|
+
@r.to_xml
|
205
175
|
end
|
206
176
|
|
207
177
|
it ".from_xml typecasts list" do
|
208
|
-
@m = @c.
|
178
|
+
@m = @c.from_xml("<order><id>1</id><item><value>beer</value></item>\n</order>")
|
209
179
|
|
210
180
|
assert_equal "1", @m.id
|
211
181
|
assert_equal 1, @m.items.size
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 8
|
8
|
-
-
|
9
|
-
version: 0.8.
|
8
|
+
- 1
|
9
|
+
version: 0.8.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Nick Sutterer
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2011-
|
17
|
+
date: 2011-11-25 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -23,11 +23,13 @@ dependencies:
|
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
24
|
none: false
|
25
25
|
requirements:
|
26
|
-
- -
|
26
|
+
- - ~>
|
27
27
|
- !ruby/object:Gem::Version
|
28
28
|
segments:
|
29
29
|
- 0
|
30
|
-
|
30
|
+
- 9
|
31
|
+
- 2
|
32
|
+
version: 0.9.2
|
31
33
|
type: :runtime
|
32
34
|
version_requirements: *id001
|
33
35
|
- !ruby/object:Gem::Dependency
|
@@ -71,7 +73,7 @@ dependencies:
|
|
71
73
|
segments:
|
72
74
|
- 0
|
73
75
|
version: "0"
|
74
|
-
type: :
|
76
|
+
type: :development
|
75
77
|
version_requirements: *id004
|
76
78
|
- !ruby/object:Gem::Dependency
|
77
79
|
name: minitest
|
@@ -136,13 +138,11 @@ files:
|
|
136
138
|
- lib/roar/client/entity_proxy.rb
|
137
139
|
- lib/roar/client/proxy.rb
|
138
140
|
- lib/roar/client/transport.rb
|
139
|
-
- lib/roar/model.rb
|
140
|
-
- lib/roar/model/representable.rb
|
141
141
|
- lib/roar/rails.rb
|
142
142
|
- lib/roar/rails/controller_methods.rb
|
143
143
|
- lib/roar/rails/representer_methods.rb
|
144
144
|
- lib/roar/rails/test_case.rb
|
145
|
-
- lib/roar/representer.rb
|
145
|
+
- lib/roar/representer/base.rb
|
146
146
|
- lib/roar/representer/feature/http_verbs.rb
|
147
147
|
- lib/roar/representer/feature/hypermedia.rb
|
148
148
|
- lib/roar/representer/feature/model_representing.rb
|
@@ -187,23 +187,17 @@ files:
|
|
187
187
|
- test/dummy/tmp/app/cells/blog/post/latest.html.erb
|
188
188
|
- test/dummy/tmp/app/cells/blog/post_cell.rb
|
189
189
|
- test/fake_server.rb
|
190
|
-
- test/
|
191
|
-
- test/
|
190
|
+
- test/http_verbs_feature_test.rb
|
191
|
+
- test/hypermedia_feature_test.rb
|
192
192
|
- test/integration_test.rb
|
193
193
|
- test/json_representer_test.rb
|
194
194
|
- test/model_representing_test.rb
|
195
|
-
- test/model_test.rb
|
196
195
|
- test/order_representers.rb
|
197
|
-
- test/proxy_test.rb
|
198
196
|
- test/rails/controller_methods_test.rb
|
199
197
|
- test/rails/rails_representer_methods_test.rb
|
200
|
-
- test/representable_test.rb
|
201
198
|
- test/representer_test.rb
|
202
|
-
- test/ruby_representation_test.rb
|
203
199
|
- test/test_helper.rb
|
204
|
-
- test/test_helper_test.rb
|
205
200
|
- test/transport_test.rb
|
206
|
-
- test/xml_hypermedia_test.rb
|
207
201
|
- test/xml_representer_test.rb
|
208
202
|
has_rdoc: true
|
209
203
|
homepage: http://rubygems.org/gems/roar
|