roar 0.8.2 → 0.8.3

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES.markdown CHANGED
@@ -1,8 +1,11 @@
1
+ h2. 0.8.3
2
+
3
+ * Maintenance release for representable compat.
4
+
1
5
  h2. 0.8.2
2
6
 
3
7
  * Removing `restfulie` dependency - we now use `Net::HTTP`.
4
8
 
5
-
6
9
  h2. 0.8.1
7
10
 
8
11
  * Added the :except and :include options to `#from_*`.
data/README.textile CHANGED
@@ -64,8 +64,12 @@ h2. Representers
64
64
  To render a representational document, the backend service has to define a representer.
65
65
 
66
66
  <pre>
67
+ require 'roar/representer/json'
68
+ require 'roar/representer/feature/hypermedia'
69
+
67
70
  class Article
68
71
  include Roar::Representer::JSON
72
+ include Roar::Representer::Feature::Hypermedia
69
73
 
70
74
  property :title
71
75
  property :id
@@ -121,7 +125,8 @@ Since orders may contain a composition of articles, how would the order service
121
125
  <pre>
122
126
  class Order
123
127
  include Roar::Representer::JSON
124
-
128
+ include Roar::Representer::Feature::Hypermedia
129
+
125
130
  property :id
126
131
  property :client_id
127
132
 
@@ -150,6 +155,7 @@ If we were to implement an endpoint for creating new orders, we'd allow POST to
150
155
  post "/orders" do
151
156
  incoming = Order.deserialize(request.body.string)
152
157
  puts incoming.to_attributes #=> {:client_id => 815}
158
+ end
153
159
  </pre>
154
160
 
155
161
  Look how the @#to_attributes@ method helps extracting data from the incoming document and, again, @#to_json@ returns the freshly created order's representation. Roar's representers are truely working in both directions, rendering and parsing and thus prevent you from redundant knowledge sharing.
data/Rakefile CHANGED
@@ -7,7 +7,7 @@ task :default => [:test, :testrails]
7
7
 
8
8
  Rake::TestTask.new(:test) do |test|
9
9
  test.libs << 'test'
10
- test.test_files = FileList['test/*_test.rb'] - ['test/integration_test.rb']
10
+ test.test_files = FileList['test/*_test.rb'] - ['test/integration_test.rb', 'test/active_record_integration_test.rb']
11
11
  test.verbose = true
12
12
  end
13
13
 
@@ -52,10 +52,9 @@ module Roar
52
52
  # This method is subject to change and might be removed, soon.
53
53
  def deserialize_block_for_options(options)
54
54
  return unless props = options[:except] || options[:include]
55
- props.collect!{ |name| name.to_s }
56
55
 
57
- lambda do |bind|
58
- res = props.include?(bind.definition.name)
56
+ lambda do |name|
57
+ res = props.include?(name)
59
58
  options[:include] ? res : !res
60
59
  end
61
60
  end
@@ -8,15 +8,14 @@ module Roar
8
8
  def self.included(base)
9
9
  base.extend ClassMethods
10
10
  end
11
-
11
+ # TODO: read format and base url defaults from Roar::Config.
12
12
 
13
13
  module ClassMethods
14
14
  include Transport
15
15
 
16
- def get(url, format) # TODO: test me!
17
- #url = resource_base + variable_path.to_s
18
- representation = get_uri(url, format).body
19
- deserialize(representation)
16
+ def get(url, format)
17
+ document = get_uri(url, format).body
18
+ deserialize(document)
20
19
  end
21
20
 
22
21
  def post(url, body, format)
@@ -34,11 +34,14 @@ module Roar
34
34
  protected
35
35
  # Setup hypermedia links by invoking their blocks. Usually called by #serialize.
36
36
  def prepare_links!
37
- links_def = self.class.find_links_definition or return
37
+ links_def = find_links_definition or return
38
+ hyperlink_class = links_def.sought_type
39
+
38
40
  links_def.rel2block.each do |link|
39
- links << links_def.sought_type.from_attributes({ # create Hyperlink representer.
40
- "rel" => link[:rel],
41
- "href" => run_link_block(link[:block])})
41
+ links.update_link(hyperlink_class.from_attributes( # create Hyperlink representer.
42
+ :rel => link[:rel],
43
+ :href => run_link_block(link[:block]))
44
+ )
42
45
  end
43
46
  end
44
47
 
@@ -46,16 +49,38 @@ module Roar
46
49
  instance_exec(&block)
47
50
  end
48
51
 
52
+ def find_links_definition
53
+ representable_attrs.find { |d| d.is_a?(LinksDefinition) }
54
+ end
55
+
49
56
 
50
57
  class LinkCollection < Array
51
58
  def [](rel)
52
59
  link = find { |l| l.rel.to_s == rel.to_s } and return link.href
53
60
  end
61
+
62
+ # Checks if the link is already contained by querying for its +rel+.
63
+ # If so, it gets replaced. Otherwise, the new link gets appended.
64
+ def update_link(link)
65
+ if i = find_index { |l| l.rel.to_s == link.rel.to_s }
66
+ return self[i] = link
67
+ end
68
+ self << link
69
+ end
54
70
  end
55
71
 
56
72
 
57
73
  module ClassMethods
58
- # Defines a hypermedia link to be embedded in the document.
74
+ # Declares a hypermedia link in the document.
75
+ #
76
+ # Example:
77
+ #
78
+ # link :self do
79
+ # "http://orders/#{id}"
80
+ # end
81
+ #
82
+ # The block is executed in instance context, so you may call properties or other accessors.
83
+ # Note that you're free to put decider logic into #link blocks, too.
59
84
  def link(rel, &block)
60
85
  unless links = find_links_definition
61
86
  links = LinksDefinition.new(:links, links_definition_options)
@@ -66,7 +91,7 @@ module Roar
66
91
  end
67
92
 
68
93
  def find_links_definition
69
- representable_attrs.find do |d| d.is_a?(LinksDefinition) end
94
+ representable_attrs.find { |d| d.is_a?(LinksDefinition) }
70
95
  end
71
96
  end
72
97
 
@@ -15,7 +15,7 @@ module Roar
15
15
  end
16
16
 
17
17
  module InstanceMethods
18
- def to_json(*args)
18
+ def to_hash(*args)
19
19
  before_serialize(*args)
20
20
  super
21
21
  end
@@ -44,7 +44,7 @@ module Roar
44
44
 
45
45
  # TODO: move to instance method, or remove?
46
46
  def links_definition_options
47
- {:as => [Hyperlink]}
47
+ {:as => Hyperlink , :collection => true}
48
48
  end
49
49
  end
50
50
 
@@ -52,7 +52,6 @@ module Roar
52
52
  # Encapsulates a hypermedia link.
53
53
  class Hyperlink
54
54
  include JSON
55
- self.representation_name = :link
56
55
 
57
56
  property :rel
58
57
  property :href
@@ -27,7 +27,7 @@ module Roar
27
27
 
28
28
  def to_xml(*args)
29
29
  before_serialize(*args)
30
- super.serialize
30
+ super
31
31
  end
32
32
 
33
33
  # Generic entry-point for rendering.
@@ -41,7 +41,7 @@ module Roar
41
41
  include Representable::XML::ClassMethods
42
42
 
43
43
  def links_definition_options
44
- {:from => :link, :as => [Hyperlink]}
44
+ {:from => :link, :as => Hyperlink, :collection => true}
45
45
  end
46
46
 
47
47
  # Generic entry-point for parsing.
@@ -56,7 +56,7 @@ module Roar
56
56
  # TODO: make XML a module to include in Hyperlink < Base.
57
57
  include XML
58
58
 
59
- self.representation_name = :link
59
+ self.representation_wrap = :link
60
60
 
61
61
  property :rel, :from => "@rel"
62
62
  property :href, :from => "@href"
data/lib/roar/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Roar
2
- VERSION = "0.8.2"
2
+ VERSION = "0.8.3"
3
3
  end
data/roar.gemspec CHANGED
@@ -19,7 +19,7 @@ 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", "~> 0.9.2"
22
+ s.add_runtime_dependency "representable", "~> 0.10.3"
23
23
  s.add_runtime_dependency "hooks", "~> 0.1.4"
24
24
 
25
25
  s.add_development_dependency "test_xml"
data/test/Gemfile CHANGED
@@ -4,3 +4,4 @@ gem "sinatra"
4
4
  gem "sinatra-contrib", :path => "./sinatra-contrib"
5
5
  gem "sinatra-activerecord"
6
6
  gem "roar", :path => ".."
7
+ gem "representable", :path => "../../representable"
data/test/fake_server.rb CHANGED
@@ -1,9 +1,30 @@
1
1
  require "bundler/setup"
2
2
  require 'sinatra/base'
3
3
  require 'sinatra/reloader'
4
+ require 'roar/representer/xml'
5
+
6
+ # Usually shared in a gem between service and clients.
7
+ module BandRepresenter
8
+ include Roar::Representer::XML
9
+ property :name
10
+ property :label
11
+ end
12
+
13
+ Band = Struct.new(:name, :label)
14
+ Band.class_eval do
15
+ include Roar::Representer::XML
16
+ include BandRepresenter
17
+ end
4
18
 
5
19
 
6
- class FakeServer < Sinatra::Base
20
+ class FakeServer < Sinatra::Base
21
+ BANDS = {"belvedere" => Band.new("Belvedere", "canadian maple")}
22
+
23
+ get "/bands/:id" do
24
+ BANDS[params[:id]].to_xml
25
+ end
26
+
27
+
7
28
  get "/method" do
8
29
  "<method>get</method>"
9
30
  end
@@ -13,34 +13,55 @@ class HttpVerbsTest < MiniTest::Spec
13
13
 
14
14
  describe "HttpVerbs" do
15
15
  before do
16
- @r = Band.new
16
+ @r = @band = Band.new
17
17
  end
18
18
 
19
19
  # TODO: assert that Restfulie#post receives the correct document.
20
20
 
21
- it "#post deserializes the incoming representation and returns it" do
22
- @r.name = "Strung Out"
23
- rep = @r.post("http://localhost:9999/band", "application/xml")
24
- assert_equal "Strung Out", rep.name
25
- assert_equal "n/a", rep.label
21
+ describe "#post" do
22
+ it "#deserializes the incoming representation and returns it" do
23
+ @r.name = "Strung Out"
24
+ rep = @r.post("http://localhost:9999/band", "application/xml")
25
+ assert_equal "Strung Out", rep.name
26
+ assert_equal "n/a", rep.label
27
+ end
26
28
  end
27
29
 
28
- it "#post! deserializes the incoming representation and replaces attributes" do
29
- @r.name = "Strung Out"
30
- assert_equal nil, @r.label
31
- @r.post!("http://localhost:9999/band", "application/xml")
32
- assert_equal "Strung Out", @r.name
33
- assert_equal "n/a", @r.label
30
+ describe "#post!" do
31
+ it "#post! deserializes the incoming representation and replaces attributes" do
32
+ @r.name = "Strung Out"
33
+ assert_equal nil, @r.label
34
+ @r.post!("http://localhost:9999/band", "application/xml")
35
+ assert_equal "Strung Out", @r.name
36
+ assert_equal "n/a", @r.label
37
+ end
34
38
  end
35
39
 
40
+ describe "#put!" do
41
+ it "deserializes the incoming representation and returns it" do
42
+ @r.name = "Strung Out"
43
+ @r.label = "Fat Wreck"
44
+ rep = @r.put("http://localhost:9999/band/strungout", "application/xml")
45
+ assert_equal "Strung Out", rep.name
46
+ assert_equal "Fat Wreck", rep.label
47
+ end
48
+ end
36
49
 
50
+ describe ".get" do
51
+ it "returns the deserialized retrieved doc" do
52
+ band = Band.get("http://localhost:9999/bands/belvedere", "application/xml")
53
+ assert_equal "Belvedere", band.name
54
+ assert_equal "canadian maple", band.label
55
+ end
56
+ end
37
57
 
38
- it "#put deserializes the incoming representation and returns it" do
39
- @r.name = "Strung Out"
40
- @r.label = "Fat Wreck"
41
- rep = @r.put("http://localhost:9999/band/strungout", "application/xml")
42
- assert_equal "Strung Out", rep.name
43
- assert_equal "Fat Wreck", rep.label
58
+ describe "#get!" do
59
+ it "retrieves, deserializes and updates properties" do
60
+ band = @band.get!("http://localhost:9999/bands/belvedere", "application/xml")
61
+ assert_equal "Belvedere", band.name
62
+ assert_equal "canadian maple", band.label
63
+ end
44
64
  end
65
+
45
66
  end
46
67
  end
@@ -1,5 +1,6 @@
1
1
  require 'test_helper'
2
2
  require 'roar/representer/feature/hypermedia'
3
+ require 'roar/representer/json'
3
4
 
4
5
  class HypermediaTest
5
6
  describe "Hypermedia Feature" do
@@ -8,11 +9,13 @@ class HypermediaTest
8
9
  include Roar::Representer::XML
9
10
  include Roar::Representer::Feature::Hypermedia
10
11
 
11
- self.representation_name = "bookmarks"
12
+ self.representation_wrap = "bookmarks"
12
13
  end
13
14
 
14
15
  @bookmarks_with_links = Class.new(@bookmarks)
15
16
  @bookmarks_with_links.class_eval do
17
+ self.representation_wrap = "bookmarks"
18
+
16
19
  property :id
17
20
  link :self do "http://bookmarks" end
18
21
  link :all do "http://bookmarks/all" end
@@ -39,10 +42,32 @@ class HypermediaTest
39
42
  </bookmarks>',
40
43
  @bookmarks_with_links.from_attributes(:id => 1).to_xml(:links => false)
41
44
  end
45
+ end
46
+
47
+ describe "#to_json" do
48
+ class Note
49
+ include Roar::Representer::JSON
50
+ include Roar::Representer::Feature::Hypermedia
51
+ link(:self) { "http://me" }
52
+ end
53
+
54
+ it "works twice" do
55
+ note = Note.new
56
+ assert_equal note.to_json, note.to_json
57
+ end
42
58
 
59
+ it "sets up links even when nested" do
60
+ class Page
61
+ include Roar::Representer::JSON
62
+ property :note, :as => Note
63
+ end
64
+
65
+ assert_equal "{\"note\":{\"links\":[{\"rel\":\"self\",\"href\":\"http://me\"}]}}", Page.from_attributes(note: Note.new).to_json
66
+ end
43
67
  end
44
68
 
45
69
 
70
+
46
71
  describe "#from_xml" do
47
72
  it "extracts links from document" do
48
73
  doc = @bookmarks_with_links.from_xml(%{
@@ -130,3 +155,19 @@ class LinksDefinitionTest < MiniTest::Spec
130
155
 
131
156
  end
132
157
  end
158
+
159
+ class LinkCollectionTest < MiniTest::Spec
160
+ describe "LinkCollection" do
161
+ it "provides #update_link" do
162
+ collection = Roar::Representer::Feature::Hypermedia::LinkCollection.new
163
+ link = Roar::Representer::XML::Hyperlink.from_attributes(rel: "self", href: "http://self")
164
+
165
+ collection.update_link(link)
166
+ assert_equal 1, collection.size
167
+
168
+ collection.update_link(link)
169
+ assert_equal 1, collection.size
170
+ end
171
+ end
172
+ end
173
+
@@ -1,122 +1,85 @@
1
1
  require 'test_helper'
2
-
3
- require 'roar/representer/xml'
4
2
  require 'roar/representer/json'
5
-
6
- require 'roar/representer/feature/http_verbs'
7
3
  require 'roar/representer/feature/hypermedia'
8
4
 
9
- class RepresenterIntegrationTest < MiniTest::Spec
10
- module XML
11
- class Band
12
- include Roar::Representer::XML
13
-
14
- property :name
15
- property :label
16
-
17
- include Roar::Representer::Feature::HttpVerbs
18
-
19
-
20
- link :search do
21
- search_url
22
- end
23
-
24
- link :self do
25
- order_url(represented)
26
- end
5
+ class IntegrationTest < MiniTest::Spec
6
+ class Beer
7
+ include Roar::Representer::JSON
8
+ include Roar::Representer::Feature::Hypermedia
9
+
10
+ property :name
11
+
12
+ link :self do
13
+ "http://beers/#{name.downcase}"
27
14
  end
28
15
  end
29
16
 
30
- # TODO: inherit properly.
31
- module JSON
32
- class Band
33
- include Roar::Representer::JSON
34
-
35
- property :name
36
- property :label
37
-
38
- include Roar::Representer::Feature::HttpVerbs
39
- include Roar::Representer::Feature::Hypermedia
40
-
41
-
42
- link :search do
43
- search_url
44
- end
45
-
46
- link :self do
47
- order_url(represented)
48
- end
49
- end
17
+ class Beers
18
+ include Roar::Representer::JSON
19
+ include Roar::Representer::Feature::Hypermedia
20
+
21
+ collection :items, :as => Beer
50
22
  end
51
23
 
52
-
53
- require 'order_representers'
54
- describe "Representer as client" do
55
- describe "JSON" do
56
- it "allows a POST workflow" do
57
- # create representation with initial values:
58
- @r = JSON::Band.from_attributes(:name => "Bigwig")
59
- assert_equal "Bigwig", @r.name
60
-
61
- @r = @r.post("http://localhost:9999/band", "application/band+json")
62
- assert_equal "n/a", @r.label
63
-
64
- # check HATEOAS:
65
- #@r.extend Roar::Representer::Feature::Hypermedia
66
- assert_equal "http://search", @r.links[:search]
67
- assert_equal "http://band/strungout", @r.links[:self]
24
+ describe "Beer service" do
25
+ it "provides a document for a particular beer" do
26
+ assert_equal "{\"beer\":{\"name\":\"Eisenbahn\",\"links\":[{\"rel\":\"self\",\"href\":\"http://beers/eisenbahn\"}]}}", Beer.from_attributes(name: "Eisenbahn").to_json
27
+ end
28
+
29
+ it "provides a detailed beers list" do
30
+ beers = ["Jever", "Becks", "Eisenbahn", "Colorado"].collect do |name|
31
+ Beer.from_attributes(name: name)
68
32
  end
69
33
 
70
- # TODO: implement me.
71
- it "allows an ordering workflow" do
72
- # create representation with initial values:
73
- @o = ::JSON::Order.from_attributes(:client_id => 1)
74
- assert_equal 1, @o.client_id
75
-
76
- @o.post!("http://localhost:9999/orders", "application/order+json")
77
- # check HATEOAS:
78
- #@r.extend Roar::Representer::Feature::Hypermedia
79
-
80
- assert_equal "http://localhost:9999/orders/1/items", @o.links[:items]
81
- assert_equal "http://localhost:9999/orders/1", @o.links[:self]
82
-
83
-
84
- # manually POST item:
85
- @i = ::JSON::Item.from_attributes(:article_id => "666-S", :amount => 1)
86
- @i.post!(@o.links[:items], "application/item+json")
87
- @o.get!(@o.links[:self], "application/order+json")
34
+
35
+ list = Beers.new
36
+ list.items = beers
37
+
38
+ assert_equal "{\"beers\":{\"items\":[{\"name\":\"Jever\",\"links\":[{\"rel\":\"self\",\"href\":\"http://beers/jever\"}]},{\"name\":\"Becks\",\"links\":[{\"rel\":\"self\",\"href\":\"http://beers/becks\"}]},{\"name\":\"Eisenbahn\",\"links\":[{\"rel\":\"self\",\"href\":\"http://beers/eisenbahn\"}]},{\"name\":\"Colorado\",\"links\":[{\"rel\":\"self\",\"href\":\"http://beers/colorado\"}]}]}}", list.to_json
39
+ end
40
+
41
+ it "provides a pageable beers list without details" do
42
+ class BeerCollection
43
+ include Roar::Representer::JSON
44
+ include Roar::Representer::Feature::Hypermedia
88
45
 
89
- # check if item is included in order:
90
- assert_equal 1, @o.items.size
91
- assert_equal @i.to_attributes, @o.items.first.to_attributes
46
+ attr_accessor :per_page, :current_page, :all_items
92
47
 
48
+ collection :beers, :as => Beer
49
+ property :total
93
50
 
94
- ###@@o.delete!(@o.links[:self])
51
+ def total
52
+ all_items.size
53
+ end
95
54
 
96
- # use the DSL to add items:
97
- #@o.links[:items].post(:article_id => "666-S", :amount => 1)
55
+ def beers
56
+ all_items[(current_page-1)*per_page..current_page*per_page-1]
57
+ end
98
58
 
99
- #@o.items.post(:article_id => "666-S", :amount => 1)
59
+ link :next do
60
+ "http://beers/all?page=#{current_page+1}" if current_page < total / per_page
61
+ end
100
62
 
63
+ link :prev do
64
+ "http://beers/all?page=#{current_page-1}" if current_page > 1
65
+ end
101
66
  end
102
- end
103
-
104
- describe "XML" do
105
- it "allows a POST workflow" do
106
- # create representation with initial values:
107
- @r = XML::Band.from_attributes(:name => "Bigwig")
108
- assert_equal "Bigwig", @r.name
109
-
110
- @r = @r.post("http://localhost:9999/band", "application/band+xml")
111
- assert_equal "n/a", @r.label
112
-
113
- # check HATEOAS:
114
- #@r.extend Roar::Representer::Feature::Hypermedia
115
- assert_equal "http://search", @r.links[:search]
116
- assert_equal "http://band/strungout", @r.links[:self]
67
+
68
+ beers = ["Jever", "Becks", "Eisenbahn", "Colorado"].collect do |name|
69
+ Beer.from_attributes(name: name)
117
70
  end
71
+
72
+
73
+ list = BeerCollection.new
74
+ list.all_items = beers # this would be a AR collection from a #find.
75
+ list.current_page = 1
76
+ list.per_page = 2
77
+
78
+ assert_equal "{\"beer_collection\":{\"beers\":[{\"name\":\"Jever\",\"links\":[{\"rel\":\"self\",\"href\":\"http://beers/jever\"}]},{\"name\":\"Becks\",\"links\":[{\"rel\":\"self\",\"href\":\"http://beers/becks\"}]}],\"total\":4,\"links\":[{\"rel\":\"next\",\"href\":\"http://beers/all?page=2\"},{\"rel\":\"prev\"}]}}", list.to_json
79
+
80
+
81
+ list.current_page = 2
82
+ assert_equal "{\"beers\":[{\"name\":\"Eisenbahn\",\"links\":[{\"rel\":\"self\",\"href\":\"http://beers/eisenbahn\"}]},{\"name\":\"Colorado\",\"links\":[{\"rel\":\"self\",\"href\":\"http://beers/colorado\"}]}],\"total\":4,\"links\":[{\"rel\":\"next\"},{\"rel\":\"prev\",\"href\":\"http://beers/all?page=1\"}]}", list.to_json(wrap: false)
118
83
  end
119
-
120
-
121
84
  end
122
85
  end
@@ -19,24 +19,24 @@ class JsonRepresenterTest < MiniTest::Spec
19
19
  describe "#to_json" do
20
20
  it "#serialize returns the serialized model" do
21
21
  @r.id = 1
22
- assert_equal '{"order":{"id":1}}', @r.to_json
22
+ assert_equal '{"id":1}', @r.to_json
23
23
  end
24
24
  end
25
25
 
26
26
  describe ".from_json" do
27
27
  it "returns the deserialized model" do
28
- @m = Order.from_json('{"order": {"id":1}}')
28
+ @m = Order.from_json('{"id":1}')
29
29
  assert_equal 1, @m.id
30
30
  end
31
31
 
32
32
  it "accepts :except option" do
33
- order = Order.from_json({order: {id: 1, pending: 1}}.to_json, :except => [:id])
33
+ order = Order.from_json({id: 1, pending: 1}.to_json, :except => [:id])
34
34
  assert_equal nil, order.id
35
35
  assert_equal 1, order.pending
36
36
  end
37
37
 
38
38
  it "accepts :include option" do
39
- order = Order.from_json({order: {id: 1, pending: 1}}.to_json, :include => [:id])
39
+ order = Order.from_json({id: 1, pending: 1}.to_json, :include => [:id])
40
40
  assert_equal 1, order.id
41
41
  assert_equal nil, order.pending
42
42
  end
@@ -51,14 +51,9 @@ end
51
51
  class JsonHyperlinkRepresenterTest
52
52
  describe "API" do
53
53
  before do
54
- @l = Roar::Representer::JSON::Hyperlink.from_json({:link => {:rel => :self, :href => "http://roar.apotomo.de"}}.to_json)
54
+ @l = Roar::Representer::JSON::Hyperlink.from_json({:rel => :self, :href => "http://roar.apotomo.de"}.to_json)
55
55
  end
56
56
 
57
- it "responds to #representation_name" do
58
- assert_equal :link, @l.class.representation_name
59
- end
60
-
61
-
62
57
  it "responds to #rel" do
63
58
  assert_equal "self", @l.rel
64
59
  end
@@ -76,8 +71,6 @@ class JsonHypermediaTest
76
71
  include Roar::Representer::JSON
77
72
  include Roar::Representer::Feature::Hypermedia
78
73
 
79
- self.representation_name= :order
80
-
81
74
  property :id
82
75
 
83
76
  link :self do "http://self" end
@@ -92,14 +85,14 @@ class JsonHypermediaTest
92
85
  end
93
86
 
94
87
  it "extracts links from JSON" do
95
- @r = @c.from_json({:order => {:links => [{:rel => "self", :href => "http://self"}]}}.to_json)
88
+ @r = @c.from_json({:links => [{:rel => "self", :href => "http://self"}]}.to_json)
96
89
 
97
90
  assert_equal 1, @r.links.size
98
91
  assert_equal({"rel"=>"self", "href"=>"http://self"}, @r.links.first.to_attributes)
99
92
  end
100
93
 
101
94
  it "renders link: correctly in JSON" do
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
95
+ assert_equal "{\"id\":1,\"links\":[{\"rel\":\"self\",\"href\":\"http://self\"},{\"rel\":\"next\",\"href\":\"http://next/1\"}]}", @c.from_attributes(:id => 1).to_json
103
96
  end
104
97
  end
105
98
  end
@@ -6,14 +6,14 @@ class ModelRepresentingTest < MiniTest::Spec
6
6
  class ItemRepresenter
7
7
  include Roar::Representer::XML
8
8
  include Roar::Representer::Feature::ModelRepresenting
9
- self.representation_name= :item
9
+ self.representation_wrap= :item
10
10
  property :value
11
11
  end
12
12
 
13
13
  class PositionRepresenter
14
14
  include Roar::Representer::XML
15
15
  include Roar::Representer::Feature::ModelRepresenting
16
- self.representation_name= :position
16
+ self.representation_wrap= :position
17
17
  property :id
18
18
  property :item, :as => ItemRepresenter
19
19
  end
@@ -21,7 +21,7 @@ class ModelRepresentingTest < MiniTest::Spec
21
21
  class OrderRepresenter
22
22
  include Roar::Representer::XML
23
23
  include Roar::Representer::Feature::ModelRepresenting
24
- self.representation_name= :order
24
+ self.representation_wrap= :order
25
25
  property :id
26
26
  collection :items, :as => ItemRepresenter
27
27
  end
@@ -41,14 +41,18 @@ class RepresenterTest < MiniTest::Spec
41
41
  end
42
42
 
43
43
  describe "Inheritance" do
44
- it "properly inherits properties" do
45
- base = Class.new do
44
+ it "properly inherits properties from modules" do
45
+ module PersonRepresentation
46
46
  include Roar::Representer::JSON
47
- self.representation_name= "collection"
48
47
  property :name
49
48
  end
50
49
 
51
- assert_equal "{\"collection\":{\"name\":\"Paulo\"}}", Class.new(base).from_attributes(:name => "Paulo").to_json
50
+ class Person
51
+ include Roar::Representer::JSON
52
+ include PersonRepresentation
53
+ end
54
+
55
+ assert_equal "{\"name\":\"Paulo\"}", Person.from_attributes(:name => "Paulo").to_json
52
56
  end
53
57
 
54
58
  end
data/test/test_helper.rb CHANGED
@@ -8,9 +8,6 @@ require 'roar/representer/base'
8
8
  require 'roar/representer/feature/hypermedia'
9
9
  require 'roar/representer/feature/http_verbs'
10
10
 
11
- require 'stringio' # FIXME. remove for 3.0.4.
12
- require 'builder'
13
-
14
11
  module TestModel
15
12
  def self.included(base)
16
13
  base.extend ClassMethods
@@ -2,13 +2,13 @@ require 'test_helper'
2
2
 
3
3
  class ItemRepresenter
4
4
  include Roar::Representer::XML
5
- self.representation_name= :item
5
+ self.representation_wrap= :item
6
6
  property :value
7
7
  end
8
8
 
9
9
  class PositionRepresenter
10
10
  include Roar::Representer::XML
11
- self.representation_name= :position
11
+ self.representation_wrap= :position
12
12
  property :id
13
13
  property :item, :as => ItemRepresenter
14
14
  end
@@ -48,7 +48,7 @@ class XMLRepresenterFunctionalTest < MiniTest::Spec
48
48
 
49
49
  class TestXmlRepresenter
50
50
  include Roar::Representer::XML
51
- self.representation_name= :order # FIXME: get from represented?
51
+ self.representation_wrap= :order # FIXME: get from represented?
52
52
  property :id
53
53
  end
54
54
 
@@ -120,9 +120,9 @@ class XMLRepresenterFunctionalTest < MiniTest::Spec
120
120
  assert_equal "1", @m.id
121
121
  end
122
122
 
123
- it ".from_xml still works with nil" do
124
- assert TestXmlRepresenter.from_xml(nil)
125
- end
123
+ #it ".from_xml still works with nil" do
124
+ # assert TestXmlRepresenter.from_xml(nil)
125
+ #end
126
126
 
127
127
  end
128
128
 
@@ -155,7 +155,7 @@ class XMLRepresenterFunctionalTest < MiniTest::Spec
155
155
  @c = Class.new do
156
156
  include Roar::Representer::XML
157
157
 
158
- self.representation_name= :order
158
+ self.representation_wrap= :order
159
159
  property :id
160
160
  collection :items, :as => ItemRepresenter, :from => :item
161
161
  end
@@ -193,7 +193,7 @@ class XmlHyperlinkRepresenterTest < MiniTest::Spec
193
193
  end
194
194
 
195
195
  it "responds to #representation_name" do
196
- assert_equal :link, @l.class.representation_name
196
+ assert_equal :link, @l.class.representation_wrap
197
197
  end
198
198
 
199
199
 
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 8
8
- - 2
9
- version: 0.8.2
8
+ - 3
9
+ version: 0.8.3
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-11-27 00:00:00 +01:00
17
+ date: 2011-12-08 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -27,9 +27,9 @@ dependencies:
27
27
  - !ruby/object:Gem::Version
28
28
  segments:
29
29
  - 0
30
- - 9
31
- - 2
32
- version: 0.9.2
30
+ - 10
31
+ - 3
32
+ version: 0.10.3
33
33
  type: :runtime
34
34
  version_requirements: *id001
35
35
  - !ruby/object:Gem::Dependency