roar 1.0.2 → 1.1.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.
Files changed (52) hide show
  1. checksums.yaml +5 -5
  2. data/.github/ISSUE_TEMPLATE.md +20 -0
  3. data/.travis.yml +16 -11
  4. data/CHANGES.markdown +86 -57
  5. data/CONTRIBUTING.md +31 -0
  6. data/Gemfile +7 -4
  7. data/LICENSE +1 -1
  8. data/README.markdown +133 -255
  9. data/Rakefile +3 -1
  10. data/examples/example.rb +0 -0
  11. data/examples/example_server.rb +0 -0
  12. data/lib/roar/client.rb +8 -3
  13. data/lib/roar/decorator.rb +2 -2
  14. data/lib/roar/http_verbs.rb +0 -16
  15. data/lib/roar/hypermedia.rb +30 -56
  16. data/lib/roar/json/collection.rb +10 -2
  17. data/lib/roar/json/hal.rb +74 -83
  18. data/lib/roar/json.rb +5 -5
  19. data/lib/roar/version.rb +1 -1
  20. data/lib/roar/xml.rb +1 -1
  21. data/lib/roar.rb +3 -3
  22. data/roar.gemspec +7 -5
  23. data/test/client_test.rb +1 -1
  24. data/test/coercion_feature_test.rb +7 -2
  25. data/test/decorator_test.rb +17 -7
  26. data/test/hal_json_test.rb +101 -94
  27. data/test/hypermedia_feature_test.rb +13 -31
  28. data/test/hypermedia_test.rb +26 -92
  29. data/test/{decorator_client_test.rb → integration/decorator_client_test.rb} +5 -4
  30. data/test/{faraday_http_transport_test.rb → integration/faraday_http_transport_test.rb} +1 -0
  31. data/test/{http_verbs_test.rb → integration/http_verbs_test.rb} +3 -2
  32. data/test/integration/json_collection_test.rb +35 -0
  33. data/test/{net_http_transport_test.rb → integration/net_http_transport_test.rb} +1 -0
  34. data/test/integration/runner.rb +2 -3
  35. data/test/integration/server.rb +6 -0
  36. data/test/json_representer_test.rb +2 -29
  37. data/test/lonely_test.rb +1 -2
  38. data/test/ssl_client_certs_test.rb +1 -1
  39. data/test/test_helper.rb +21 -3
  40. data/test/xml_representer_test.rb +6 -5
  41. metadata +21 -37
  42. data/gemfiles/Gemfile.representable-1.7 +0 -6
  43. data/gemfiles/Gemfile.representable-1.8 +0 -6
  44. data/gemfiles/Gemfile.representable-2.0 +0 -5
  45. data/gemfiles/Gemfile.representable-2.1 +0 -5
  46. data/gemfiles/Gemfile.representable-head +0 -6
  47. data/lib/roar/json/collection_json.rb +0 -208
  48. data/lib/roar/json/json_api.rb +0 -233
  49. data/test/collection_json_test.rb +0 -132
  50. data/test/hal_links_test.rb +0 -31
  51. data/test/json_api_test.rb +0 -451
  52. data/test/lib/runner.rb +0 -134
@@ -0,0 +1,35 @@
1
+ require 'test_helper'
2
+
3
+ require 'roar/json/collection'
4
+ require 'roar/client'
5
+
6
+ class JsonCollectionTest < MiniTest::Spec
7
+ class Band < OpenStruct; end
8
+
9
+ class BandRepresenter < Roar::Decorator
10
+ include Roar::JSON
11
+
12
+ property :name
13
+ property :label
14
+ end
15
+
16
+ class BandsRepresenter < Roar::Decorator
17
+ include Roar::JSON::Collection
18
+ include Roar::Client
19
+
20
+ items extend: BandRepresenter, class: Band
21
+ end
22
+
23
+ class Bands < Array
24
+ include Roar::JSON::Collection
25
+ end
26
+
27
+ let(:bands) { Bands.new }
28
+
29
+ # "[{\"name\":\"Slayer\",\"label\":\"Canadian Maple\"},{\"name\":\"Nirvana\",\"label\":\"Sub Pop\"}])"
30
+ it 'fetches lonely collection of existing bands' do
31
+ BandsRepresenter.new(bands).get(uri: 'http://localhost:4567/bands', as: 'application/json')
32
+ bands.size.must_equal(2)
33
+ bands[0].name.must_equal('Slayer')
34
+ end
35
+ end
@@ -1,4 +1,5 @@
1
1
  require 'test_helper'
2
+ require 'integration/runner'
2
3
  require 'roar/transport/net_http'
3
4
 
4
5
  class NetHTTPTransportTest < MiniTest::Spec
@@ -1,6 +1,5 @@
1
1
  require "integration/band_representer"
2
- # require 'sinatra/runner' # TODO: merge that into sinatra-contrib.
3
- require 'lib/runner'
2
+ require 'sinatra/runner'
4
3
 
5
4
  class ServerRunner < Sinatra::Runner
6
5
  def app_file
@@ -46,4 +45,4 @@ rescue Exception => e
46
45
  ssl_runner.kill
47
46
 
48
47
  raise e
49
- end
48
+ end
@@ -55,6 +55,12 @@ post "/bands" do
55
55
  status 201
56
56
  end
57
57
 
58
+ get '/bands' do
59
+ [OpenStruct.new(:name => "Slayer", :label => "Canadian Maple"),
60
+ OpenStruct.new(:name => "Nirvana", :label => "Sub Pop")]
61
+ .extend(Integration::BandRepresenter.for_collection).to_json
62
+ end
63
+
58
64
  put "/bands/strungout" do
59
65
  # DISCUSS: as long as we don't agree on what to return in PUT/PATCH, let's return an updated document.
60
66
  body consume_band.to_json
@@ -61,7 +61,7 @@ class JsonRepresenterTest < MiniTest::Spec
61
61
 
62
62
  it "accepts :include and :exclude" do
63
63
  @order.from_json('{"id":1}', :exclude => [:id])
64
- assert_equal nil, @order.id
64
+ assert_nil @order.id
65
65
  end
66
66
  end
67
67
 
@@ -74,32 +74,6 @@ class JsonRepresenterTest < MiniTest::Spec
74
74
  end
75
75
  end
76
76
 
77
- # test the generic roar+json HyperlinkRepresenter
78
- class JsonHyperlinkRepresenterTest
79
- describe "API" do
80
- before do
81
- @link = Roar::Hypermedia::Hyperlink.new.extend(Roar::JSON::HyperlinkRepresenter).from_json(
82
- '{"rel":"self", "href":"http://roar.apotomo.de", "media":"web"}')
83
- end
84
-
85
- it "responds to #rel" do
86
- assert_equal "self", @link.rel
87
- end
88
-
89
- it "responds to #href" do
90
- assert_equal "http://roar.apotomo.de", @link.href
91
- end
92
-
93
- it "responds to #media" do
94
- assert_equal "web", @link.media
95
- end
96
-
97
- it "responds to #to_json" do
98
- assert_equal "{\"rel\":\"self\",\"href\":\"http://roar.apotomo.de\",\"media\":\"web\"}", @link.to_json
99
- end
100
- end
101
- end
102
-
103
77
  class JsonHypermediaTest
104
78
  describe "Hypermedia API" do
105
79
  before do
@@ -119,7 +93,7 @@ class JsonHypermediaTest
119
93
  end
120
94
 
121
95
  it "responds to #links" do
122
- @r.links.must_equal nil
96
+ @r.links.must_equal({})
123
97
  end
124
98
 
125
99
  it "extracts links from JSON" do
@@ -146,4 +120,3 @@ class JsonHypermediaTest
146
120
 
147
121
  end
148
122
  end
149
-
data/test/lonely_test.rb CHANGED
@@ -4,6 +4,5 @@ require "roar/json/collection"
4
4
  require "roar/json/hash"
5
5
 
6
6
  class LonelyCollectionTest < MiniTest::Spec
7
- it { Roar::JSON::Collection.must_equal Representable::JSON::Collection }
8
7
  it { Roar::JSON::Hash.must_equal Representable::JSON::Hash }
9
- end
8
+ end
@@ -57,7 +57,7 @@ class SslClientCertsTest < MiniTest::Spec
57
57
 
58
58
  describe "when a pem file has been provided with the request options" do
59
59
 
60
- let(:pem_file) { File.expand_path("test/fixtures/sample.pem", Roar.root) }
60
+ let(:pem_file) { File.expand_path("test/fixtures/sample.pem", File.expand_path('../..', __FILE__)) }
61
61
 
62
62
  let(:pem) { File.read(pem_file) }
63
63
  let(:cert) { OpenSSL::X509::Certificate.new(pem) }
data/test/test_helper.rb CHANGED
@@ -1,9 +1,15 @@
1
+ # require "pry"
1
2
  require 'minitest/autorun'
2
3
  require 'ostruct'
3
4
 
4
5
  require 'roar/representer'
5
6
  require 'roar/http_verbs'
6
- require 'roar/json/hal'
7
+
8
+ require "roar/json"
9
+ require "roar/json/hal"
10
+
11
+ require "representable/debug"
12
+ require "pp"
7
13
 
8
14
  module AttributesConstructor # TODO: remove me.
9
15
  def initialize(attrs={})
@@ -26,13 +32,22 @@ end
26
32
  require "test_xml/mini_test"
27
33
  require "roar/xml"
28
34
 
29
- require "integration/runner"
30
35
 
31
36
  MiniTest::Spec.class_eval do
32
37
  def link(options)
33
38
  Roar::Hypermedia::Hyperlink.new(options)
34
39
  end
35
40
 
41
+ def self.decorator_for(modules=[Roar::JSON, Roar::Hypermedia], &block)
42
+ let(:decorator_class) do
43
+ Class.new(Roar::Decorator) do
44
+ include *modules.reverse
45
+
46
+ instance_eval(&block)
47
+ end
48
+ end
49
+ end
50
+
36
51
  def self.representer_for(modules=[Roar::JSON, Roar::Hypermedia], &block)
37
52
  let (:rpr) do
38
53
  Module.new do
@@ -42,6 +57,9 @@ MiniTest::Spec.class_eval do
42
57
  end
43
58
  end
44
59
  end
60
+ def representer
61
+ rpr # TODO: unify with representable.
62
+ end
45
63
 
46
64
  def self.representer!(*args, &block)
47
65
  representer_for(*args, &block)
@@ -57,4 +75,4 @@ Roar::Hypermedia::Hyperlink.class_eval do
57
75
  def ==(b)
58
76
  @attrs == b.instance_variable_get(:@attrs)
59
77
  end
60
- end
78
+ end
@@ -1,7 +1,8 @@
1
1
  require 'test_helper'
2
+ require 'roar/decorator'
2
3
 
3
4
  class XMLRepresenterFunctionalTest < MiniTest::Spec
4
- module OrderRepresenter
5
+ class OrderRepresenter < Roar::Decorator
5
6
  include Roar::XML
6
7
 
7
8
  property :id
@@ -11,10 +12,10 @@ class XMLRepresenterFunctionalTest < MiniTest::Spec
11
12
  Order = Struct.new(:id, :items)
12
13
 
13
14
  describe "#to_xml" do
14
- let (:order) { Order.new(1).extend(OrderRepresenter) }
15
+ let (:order) { OrderRepresenter.new(Order.new(1)) }
15
16
 
16
17
  # empty model
17
- it { Order.new.extend(OrderRepresenter).to_xml.must_equal_xml "<order/>" }
18
+ it { OrderRepresenter.new(Order.new).to_xml.must_equal_xml "<order/>" }
18
19
 
19
20
  # populated model
20
21
  it { order.to_xml.must_equal_xml "<order><id>1</id></order>" }
@@ -30,7 +31,7 @@ class XMLRepresenterFunctionalTest < MiniTest::Spec
30
31
  end
31
32
 
32
33
  describe "#from_xml" do
33
- let (:order) { Order.new.extend(OrderRepresenter) }
34
+ let (:order) { OrderRepresenter.new(Order.new) }
34
35
 
35
36
  # parses
36
37
  it { order.from_xml("<order><id>1</id></order>").id.must_equal "1" }
@@ -39,7 +40,7 @@ class XMLRepresenterFunctionalTest < MiniTest::Spec
39
40
  it { order.deserialize("<order><id>1</id></order>").id.must_equal "1" }
40
41
 
41
42
  # accepts options
42
- it { order.from_xml("<order><id>1</id></order>", exclude: [:id]).id.must_equal nil }
43
+ it { order.from_xml("<order><id>1</id></order>", exclude: [:id]).id.must_be_nil }
43
44
  end
44
45
  end
45
46
 
metadata CHANGED
@@ -1,49 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roar
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Sutterer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-24 00:00:00.000000000 Z
11
+ date: 2021-11-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: representable
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: 2.0.1
20
- - - "<="
17
+ - - "~>"
21
18
  - !ruby/object:Gem::Version
22
- version: 3.0.0
19
+ version: '3.0'
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- version: 2.0.1
30
- - - "<="
24
+ - - "~>"
31
25
  - !ruby/object:Gem::Version
32
- version: 3.0.0
26
+ version: '3.0'
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: rake
35
29
  requirement: !ruby/object:Gem::Requirement
36
30
  requirements:
37
31
  - - ">="
38
32
  - !ruby/object:Gem::Version
39
- version: 0.10.1
33
+ version: '0'
40
34
  type: :development
41
35
  prerelease: false
42
36
  version_requirements: !ruby/object:Gem::Requirement
43
37
  requirements:
44
38
  - - ">="
45
39
  - !ruby/object:Gem::Version
46
- version: 0.10.1
40
+ version: '0'
47
41
  - !ruby/object:Gem::Dependency
48
42
  name: test_xml
49
43
  requirement: !ruby/object:Gem::Requirement
@@ -64,14 +58,14 @@ dependencies:
64
58
  requirements:
65
59
  - - ">="
66
60
  - !ruby/object:Gem::Version
67
- version: 5.4.2
61
+ version: '5.10'
68
62
  type: :development
69
63
  prerelease: false
70
64
  version_requirements: !ruby/object:Gem::Requirement
71
65
  requirements:
72
66
  - - ">="
73
67
  - !ruby/object:Gem::Version
74
- version: 5.4.2
68
+ version: '5.10'
75
69
  - !ruby/object:Gem::Dependency
76
70
  name: sinatra
77
71
  requirement: !ruby/object:Gem::Requirement
@@ -129,7 +123,7 @@ dependencies:
129
123
  - !ruby/object:Gem::Version
130
124
  version: '0'
131
125
  - !ruby/object:Gem::Dependency
132
- name: json
126
+ name: multi_json
133
127
  requirement: !ruby/object:Gem::Requirement
134
128
  requirements:
135
129
  - - ">="
@@ -150,9 +144,11 @@ executables: []
150
144
  extensions: []
151
145
  extra_rdoc_files: []
152
146
  files:
147
+ - ".github/ISSUE_TEMPLATE.md"
153
148
  - ".gitignore"
154
149
  - ".travis.yml"
155
150
  - CHANGES.markdown
151
+ - CONTRIBUTING.md
156
152
  - Gemfile
157
153
  - LICENSE
158
154
  - README.markdown
@@ -160,11 +156,6 @@ files:
160
156
  - TODO.markdown
161
157
  - examples/example.rb
162
158
  - examples/example_server.rb
163
- - gemfiles/Gemfile.representable-1.7
164
- - gemfiles/Gemfile.representable-1.8
165
- - gemfiles/Gemfile.representable-2.0
166
- - gemfiles/Gemfile.representable-2.1
167
- - gemfiles/Gemfile.representable-head
168
159
  - lib/roar.rb
169
160
  - lib/roar/client.rb
170
161
  - lib/roar/coercion.rb
@@ -173,10 +164,8 @@ files:
173
164
  - lib/roar/hypermedia.rb
174
165
  - lib/roar/json.rb
175
166
  - lib/roar/json/collection.rb
176
- - lib/roar/json/collection_json.rb
177
167
  - lib/roar/json/hal.rb
178
168
  - lib/roar/json/hash.rb
179
- - lib/roar/json/json_api.rb
180
169
  - lib/roar/representer.rb
181
170
  - lib/roar/transport/faraday.rb
182
171
  - lib/roar/transport/net_http.rb
@@ -186,31 +175,28 @@ files:
186
175
  - roar.gemspec
187
176
  - test/client_test.rb
188
177
  - test/coercion_feature_test.rb
189
- - test/collection_json_test.rb
190
- - test/decorator_client_test.rb
191
178
  - test/decorator_test.rb
192
- - test/faraday_http_transport_test.rb
193
179
  - test/fixtures/sample.pem
194
180
  - test/hal_json_test.rb
195
- - test/hal_links_test.rb
196
- - test/http_verbs_test.rb
197
181
  - test/hypermedia_feature_test.rb
198
182
  - test/hypermedia_test.rb
199
183
  - test/integration/Gemfile
200
184
  - test/integration/band_representer.rb
185
+ - test/integration/decorator_client_test.rb
186
+ - test/integration/faraday_http_transport_test.rb
187
+ - test/integration/http_verbs_test.rb
188
+ - test/integration/json_collection_test.rb
189
+ - test/integration/net_http_transport_test.rb
201
190
  - test/integration/runner.rb
202
191
  - test/integration/server.rb
203
192
  - test/integration/ssl_server.rb
204
- - test/json_api_test.rb
205
193
  - test/json_representer_test.rb
206
- - test/lib/runner.rb
207
194
  - test/lonely_test.rb
208
- - test/net_http_transport_test.rb
209
195
  - test/representer_test.rb
210
196
  - test/ssl_client_certs_test.rb
211
197
  - test/test_helper.rb
212
198
  - test/xml_representer_test.rb
213
- homepage: http://rubygems.org/gems/roar
199
+ homepage: http://trailblazer.to/gems/roar
214
200
  licenses:
215
201
  - MIT
216
202
  metadata: {}
@@ -222,17 +208,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
222
208
  requirements:
223
209
  - - ">="
224
210
  - !ruby/object:Gem::Version
225
- version: '0'
211
+ version: 1.9.3
226
212
  required_rubygems_version: !ruby/object:Gem::Requirement
227
213
  requirements:
228
214
  - - ">="
229
215
  - !ruby/object:Gem::Version
230
216
  version: '0'
231
217
  requirements: []
232
- rubyforge_project:
233
- rubygems_version: 2.4.8
218
+ rubygems_version: 3.2.3
234
219
  signing_key:
235
220
  specification_version: 4
236
221
  summary: Parse and render REST API documents using representers.
237
222
  test_files: []
238
- has_rdoc:
@@ -1,6 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- gemspec path: '../'
4
-
5
- gem 'representable', '~> 1.7.0'
6
- gem 'sinatra-contrib', github: 'apotonick/sinatra-contrib', branch: 'runner'
@@ -1,6 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- gemspec path: '../'
4
-
5
- gem 'representable', '~> 1.8.0'
6
- gem 'sinatra-contrib', github: 'apotonick/sinatra-contrib', branch: 'runner'
@@ -1,5 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- gemspec path: '../'
4
-
5
- gem 'representable', '~> 2.0.0'
@@ -1,5 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- gemspec path: '../'
4
-
5
- gem 'representable', '~> 2.1.5'
@@ -1,6 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- gemspec path: '../'
4
-
5
- gem 'representable', github: 'apotonick/representable'
6
- gem 'sinatra-contrib', github: 'apotonick/sinatra-contrib', branch: 'runner'
@@ -1,208 +0,0 @@
1
- module Roar::JSON
2
- # Implementation of the Collection+JSON media format, http://amundsen.com/media-types/collection/format/
3
- #
4
- # When clients want to add or update an item the collection's filled out template is POSTed or PUT. You can parse that using the
5
- # +SongCollectionRepresenter::template_representer+ module.
6
- #
7
- # Song.new.extend(SongCollectionRepresenter.template_representer).from_json("{template: ...")
8
- module CollectionJSON
9
- def self.included(base)
10
- base.class_eval do
11
- include Roar::Representer
12
- include Roar::JSON
13
- include Roar::Hypermedia
14
-
15
- extend ClassMethods
16
-
17
- self.representation_wrap= :collection # FIXME: move outside of this block for inheritance!
18
-
19
- property :__template, :as => :template, :extend => lambda {|*| representable_attrs.collection_representers[:template] }, :class => Array
20
- def __template
21
- OpenStruct.new # TODO: handle preset values.
22
- end
23
-
24
- collection :queries, :extend => Roar::JSON::HyperlinkRepresenter, :class => lambda { |fragment,*| ::Hash }
25
- def queries
26
- compile_links_for(representable_attrs.collection_representers[:queries].link_configs)
27
- end
28
- def queries=(v)
29
- end
30
-
31
-
32
- def items
33
- self
34
- end
35
- def items=(v)
36
- replace(v)
37
- end
38
-
39
- property :__version, :as => :version
40
- def __version
41
- representable_attrs.collection_representers[:version]
42
- end
43
-
44
- property :__href, :as => :href
45
- def __href
46
- compile_links_for(representable_attrs.collection_representers[:href].link_configs).first.href
47
- end
48
-
49
-
50
-
51
- include ClientMethods
52
- end
53
- end
54
-
55
- module ClassMethods
56
- module PropertyWithRenderNil
57
- def property(name, options={})
58
- super(name, options.merge!(:render_nil => true))
59
- end
60
- end
61
-
62
- # TODO: provide automatic copying from the ItemRepresenter here.
63
- def template(&block)
64
- mod = representable_attrs.collection_representers[:object_template] = Module.new do
65
- include Roar::JSON
66
- include Roar::JSON::CollectionJSON::DataMethods
67
-
68
- extend PropertyWithRenderNil
69
-
70
- module_exec(&block)
71
-
72
- #self.representation_wrap = :template
73
- def from_hash(hash, *args) # overridden in :template representer.
74
- super(hash["template"])
75
- end
76
- end
77
-
78
- representable_attrs.collection_representers[:template] = Module.new do
79
- include Roar::JSON
80
- include mod
81
-
82
- #self.representation_wrap = false
83
-
84
- # DISCUSS: currently we skip real deserialization here and just store the :data hash.
85
- def from_hash(hash, *args)
86
- replace(hash["data"])
87
- end
88
- end
89
- end
90
- def template_representer
91
- representable_attrs.collection_representers[:object_template]
92
- end
93
-
94
- def queries(&block)
95
- mod = representable_attrs.collection_representers[:queries] = Module.new do
96
- include Roar::JSON
97
- include Roar::Hypermedia
98
-
99
- module_exec(&block)
100
-
101
- def to_hash(*)
102
- hash = super
103
- hash["links"] # TODO: make it easier to render collection of links.
104
- end
105
- end
106
- end
107
-
108
- def items(options={}, &block)
109
- collection :items, { :extend => lambda {|*| representable_attrs.collection_representers[:items] } }.merge!(options)
110
-
111
- mod = representable_attrs.collection_representers[:items] = Module.new do
112
- include Roar::JSON
113
- include Roar::Hypermedia
114
- include Roar::JSON::CollectionJSON::DataMethods
115
- extend SharedClassMethodsBullshit
116
-
117
- module_exec(&block)
118
-
119
- # TODO: share with main module!
120
- property :__href, :as => :href
121
- def __href
122
- compile_links_for(representable_attrs.collection_representers[:href].link_configs).first.href
123
- end
124
- def __href=(v)
125
- @__href = Roar::Hypermedia::Hyperlink.new(:href => v)
126
- end
127
- def href
128
- @__href
129
- end
130
- end
131
- end
132
-
133
- def version(v)
134
- representable_attrs.collection_representers[:version] = v
135
- end
136
-
137
- module SharedClassMethodsBullshit
138
- def href(&block)
139
- mod = representable_attrs.collection_representers[:href] = Module.new do
140
- include Roar::JSON
141
- include Roar::Hypermedia
142
-
143
-
144
- link(:href, &block)
145
- end
146
- end
147
-
148
- def representable_attrs
149
- super.tap do |attrs|
150
- attrs.instance_eval do # FIXME: of course, this is WIP.
151
- def collection_representers
152
- @collection_representers ||= {}
153
- end
154
- end
155
- end
156
- end
157
- end
158
- include SharedClassMethodsBullshit
159
- end
160
-
161
- module DataMethods
162
- def to_hash(*)
163
- hash = super.tap do |hsh|
164
- data = []
165
- hsh.keys.each do |n|
166
- next if ["href", "links"].include?(n)
167
-
168
- v = hsh.delete(n.to_s)
169
- data << {:name => n, :value => v} # TODO: get :prompt from Definition.
170
- end
171
- hsh[:data] = data
172
- end
173
- end
174
-
175
- def from_hash(hash, *args)
176
- data = {}
177
- hash.delete("data").collect do |item|
178
- data[item["name"]] = item["value"]
179
- end
180
- super(hash.merge!(data))
181
- end
182
- end
183
-
184
- module ClientMethods
185
- def __version=(v)
186
- @__version = v
187
- end
188
- def version
189
- @__version
190
- end
191
-
192
- def __href=(v)
193
- @__href = Roar::Hypermedia::Hyperlink.new(:href => v)
194
- end
195
- def href
196
- @__href
197
- end
198
-
199
- def __template=(v)
200
- @__template = v
201
- end
202
- # DISCUSS: this might return a Template instance, soon.
203
- def template
204
- @__template
205
- end
206
- end
207
- end
208
- end