roar 0.11.15 → 0.11.16

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/.travis.yml CHANGED
@@ -4,5 +4,4 @@ rvm:
4
4
  notifications:
5
5
  irc: "irc.freenode.org#cells"
6
6
  gemfile:
7
- - gemfiles/Gemfile.representable-1.3
8
7
  - gemfiles/Gemfile.representable-1.4
data/CHANGES.markdown CHANGED
@@ -1,3 +1,7 @@
1
+ # 0.11.16
2
+
3
+ * Added `Roar::Decorator::HypermediaConsumer` which propagates incoming hypermedia links to the represented object (it has to have accessors for `:links`).
4
+
1
5
  # 0.11.15
2
6
 
3
7
  * Fixing [#66](https://github.com/apotonick/roar/issues/66).
data/README.textile CHANGED
@@ -281,6 +281,24 @@ order.post(order.links[:self])
281
281
 
282
282
  This was dead simple since representations can be composed of different documents in Roar.
283
283
 
284
+ h2. Decorators
285
+
286
+ You can use `Roar::Decorator` as a representer. More docs coming soon. Note that if you want your represented object to save incoming hypermedia you need to do two things.
287
+
288
+ <pre>
289
+ class SongClient
290
+ # do whatever here
291
+
292
+ attr_accessor :links
293
+ end
294
+
295
+ class SongRepresenter < Roar::Decorator
296
+ include Roar::Representer::JSON
297
+ include Roar::Decorator::HypermediaConsumer
298
+ end
299
+ </pre>
300
+
301
+
284
302
  h2. More Features
285
303
 
286
304
  Be sure to check out the bundled features.
data/TODO.markdown CHANGED
@@ -1,4 +1,5 @@
1
1
  * Add proxies, so nested models can be lazy-loaded.
2
2
  * move #prepare_links! call to #_links or something so it doesn't need to be called in #serialize.
3
3
  * alias Roar::Representer to Representer
4
- * remove #before_serialize and just overwrite #serialize
4
+ * remove #before_serialize and just overwrite #serialize
5
+ * abstract ::links_definition_options and move them out of the generic representers (JSON, XML). remove lambdas when :representer_exec calls methods in decorator ctx, also
@@ -1,3 +1,10 @@
1
1
  class Roar::Decorator < Representable::Decorator
2
2
  extend Roar::Representer::InheritableArray
3
+
4
+ module HypermediaConsumer
5
+ def links_array=(*args)
6
+ super # TODO: this currently sets #links which is not obvious.
7
+ represented.links = links
8
+ end
9
+ end
3
10
  end
@@ -70,6 +70,12 @@ module Roar
70
70
  include LinkConfigsMethod
71
71
 
72
72
  private
73
+ def links_definition_options
74
+ # TODO: this method is never called.
75
+ [:links_array, {:from => :link, :class => Feature::Hypermedia::Hyperlink, :collection => true,
76
+ :representer_exec => true, :getter => lambda { |*| links_array }, :setter => lambda { |val,*| links_array=(val) } }] # TODO: merge with JSON.
77
+ end
78
+
73
79
  # Setup hypermedia links by invoking their blocks. Usually called by #serialize.
74
80
  def prepare_links!(*args)
75
81
  # TODO: move this method to _links or something so it doesn't need to be called in #serialize.
@@ -45,7 +45,9 @@ module Roar
45
45
 
46
46
  # TODO: move to instance method, or remove?
47
47
  def links_definition_options
48
- [:links_array, {:from => :links, :class => Feature::Hypermedia::Hyperlink, :extend => HyperlinkRepresenter, :collection => true}]
48
+ # FIXME: this doesn't belong into the generic JSON representer.
49
+ [:links_array, {:from => :links, :class => Feature::Hypermedia::Hyperlink, :extend => HyperlinkRepresenter, :collection => true,
50
+ :representer_exec => true, :getter => lambda { |*| links_array }, :setter => lambda { |val,*| self.links_array=(val) } }]
49
51
  end
50
52
  end
51
53
 
@@ -157,9 +157,11 @@ module Roar::Representer
157
157
  def links_definition_options
158
158
  [:links,
159
159
  {
160
- :from => :links,
160
+ :as => :links,
161
161
  :extend => HAL::Links::LinkCollectionRepresenter,
162
- :instance => lambda { |hsh| LinkCollection.new(link_array_rels) } # defined in InstanceMethods as this is executed in represented context.
162
+ :instance => lambda { |hsh| LinkCollection.new(link_array_rels) }, # defined in InstanceMethods as this is executed in represented context.
163
+ :representer_exec => true,
164
+ :getter => lambda { |*| links }
163
165
  }
164
166
  ]
165
167
  end
@@ -38,7 +38,9 @@ module Roar
38
38
  include Representable::XML::ClassMethods
39
39
 
40
40
  def links_definition_options
41
- [:links_array, {:from => :link, :class => Feature::Hypermedia::Hyperlink, :collection => true, :extend => XML::HyperlinkRepresenter}]
41
+ # FIXME: this doesn't belong into the generic XML representer.
42
+ [:links_array, {:from => :link, :class => Feature::Hypermedia::Hyperlink, :collection => true, :extend => XML::HyperlinkRepresenter,
43
+ :representer_exec => true, :getter => lambda { |*| links_array }, :setter => lambda { |val,*| self.links_array=(val) } }] # TODO: merge with JSON.
42
44
  end
43
45
 
44
46
  # Generic entry-point for parsing.
data/lib/roar/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Roar
2
- VERSION = "0.11.15"
2
+ VERSION = "0.11.16"
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", ">= 1.2.8"
22
+ s.add_runtime_dependency "representable", ">= 1.4.2"
23
23
 
24
24
  s.add_development_dependency "rake"
25
25
  s.add_development_dependency "test_xml", ">= 0.1.4"
@@ -1,21 +1,92 @@
1
1
  require 'test_helper'
2
+ require 'roar/decorator'
2
3
 
3
4
  class DecoratorTest < MiniTest::Spec
4
-
5
-
6
5
  describe "Decorator" do
7
6
  it "exposes ::prepare" do
8
- require 'representable/version'
9
- if Representable::VERSION.split(".")[1] == "4"
10
- require 'roar/decorator'
7
+ class SongRepresentation < Roar::Decorator
8
+ include Roar::Representer::JSON
9
+
10
+ property :name
11
+ end
11
12
 
12
- class SongRepresentation < Roar::Decorator
13
- include Roar::Representer::JSON
13
+ SongRepresentation.prepare(OpenStruct.new(:name => "Not The Same")).to_hash.must_equal({"name"=>"Not The Same"})
14
+ end
15
+ end
16
+
17
+ describe "Hypermedia modules" do
18
+ representer_for do
19
+ link(:self) { "http://self" } # TODO: test with Collection::JSON, too.
20
+ end
14
21
 
15
- property :name
22
+ let (:model) { Object.new }
23
+
24
+ describe "JSON" do
25
+ let (:decorator) { rpr_mod = rpr
26
+ Class.new(Roar::Decorator) do
27
+ include rpr_mod
28
+ end }
29
+
30
+ it "rendering links works" do
31
+ decorator.new(model).to_hash.must_equal({"links"=>[{:rel=>:self, :href=>"http://self"}]})
32
+ end
33
+
34
+ it "sets links on decorator" do
35
+ decorator.new(model).from_hash("links"=>[{:rel=>:self, :href=>"http://self"}]).links.must_equal("self"=>link(:rel=>:self, :href=>"http://self"))
36
+ end
37
+
38
+ let (:model_with_links) { model.singleton_class.instance_eval { attr_accessor :links }; model }
39
+ it "does not set links on represented" do
40
+ decorator.new(model_with_links).from_hash("links"=>[{:rel=>:self, :href=>"http://self"}])
41
+ model_with_links.links.must_equal nil
42
+ end
43
+
44
+ describe "Decorator::HypermediaClient" do
45
+ let (:decorator) { rpr_mod = rpr
46
+ Class.new(Roar::Decorator) do
47
+ include rpr_mod
48
+ include Roar::Decorator::HypermediaConsumer
49
+ end }
50
+
51
+ it "propagates links to represented" do
52
+ decorator.new(model_with_links).from_hash("links"=>[{:rel=>:self, :href=>"http://self"}])
53
+ model_with_links.links[:self].must_equal(link(:rel=>:self, :href=>"http://self"))
16
54
  end
55
+ end
56
+ end
57
+
58
+ describe "XML" do
59
+ representer_for([Roar::Representer::XML, Roar::Representer::Feature::Hypermedia]) do
60
+ link(:self) { "http://self" } # TODO: test with HAL, too.
61
+ #self.representation_wrap = :song # FIXME: why isn't this working?
62
+ end
63
+ let (:decorator) { rpr_mod = rpr
64
+ Class.new(Roar::Decorator) do
65
+ include rpr_mod
66
+ self.representation_wrap = :song
67
+ end }
68
+
69
+ it "rendering links works" do
70
+ decorator.new(model).to_xml.must_equal_xml "<song><link rel=\"self\" href=\"http://self\"/></song>"
71
+ end
72
+
73
+ it "sets links on decorator" do
74
+ decorator.new(model).from_xml(%{<song><link rel="self" href="http://self"/></song>}).links.must_equal("self"=>link(:rel=>:self, :href=>"http://self"))
75
+ end
76
+ end
77
+
78
+
79
+ describe "JSON::HAL" do
80
+ representer_for([Roar::Representer::JSON::HAL]) do
81
+ link(:self) { "http://self" }
82
+ end
83
+ let (:decorator) { rpr_mod = rpr
84
+ Class.new(Roar::Decorator) do
85
+ include rpr_mod
86
+ end }
17
87
 
18
- SongRepresentation.prepare(OpenStruct.new(:name => "Not The Same")).to_hash.must_equal({"name"=>"Not The Same"})
88
+ it "rendering links works" do
89
+ decorator.new(model).to_hash.must_equal({"_links"=>{"self"=>{:href=>"http://self"}}})
19
90
  end
20
91
  end
21
92
  end
data/test/test_helper.rb CHANGED
@@ -7,6 +7,7 @@ require 'ostruct'
7
7
 
8
8
  require 'roar/representer'
9
9
  require 'roar/representer/feature/http_verbs'
10
+ require 'roar/representer/json/hal'
10
11
 
11
12
  begin
12
13
  require 'turn'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roar
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.15
4
+ version: 0.11.16
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-30 00:00:00.000000000 Z
12
+ date: 2013-05-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: representable
@@ -18,7 +18,7 @@ dependencies:
18
18
  requirements:
19
19
  - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
- version: 1.2.8
21
+ version: 1.4.2
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ! '>='
28
28
  - !ruby/object:Gem::Version
29
- version: 1.2.8
29
+ version: 1.4.2
30
30
  - !ruby/object:Gem::Dependency
31
31
  name: rake
32
32
  requirement: !ruby/object:Gem::Requirement
@@ -91,7 +91,6 @@ files:
91
91
  - README.textile
92
92
  - Rakefile
93
93
  - TODO.markdown
94
- - gemfiles/Gemfile.representable-1.3
95
94
  - gemfiles/Gemfile.representable-1.4
96
95
  - lib/roar.rb
97
96
  - lib/roar/decorator.rb
@@ -1,13 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- gemspec :path => '../'
4
-
5
- gem 'representable', '~> 1.3.1'
6
- group :test do
7
- gem 'faraday'
8
- gem 'turn'
9
- gem 'virtus'
10
- gem "sinatra", "~> 1.3.2"
11
- gem "sham_rack", "~> 1.3.0"
12
- gem "json"
13
- end