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.
- checksums.yaml +5 -5
- data/.github/ISSUE_TEMPLATE.md +20 -0
- data/.travis.yml +16 -11
- data/CHANGES.markdown +86 -57
- data/CONTRIBUTING.md +31 -0
- data/Gemfile +7 -4
- data/LICENSE +1 -1
- data/README.markdown +133 -255
- data/Rakefile +3 -1
- data/examples/example.rb +0 -0
- data/examples/example_server.rb +0 -0
- data/lib/roar/client.rb +8 -3
- data/lib/roar/decorator.rb +2 -2
- data/lib/roar/http_verbs.rb +0 -16
- data/lib/roar/hypermedia.rb +30 -56
- data/lib/roar/json/collection.rb +10 -2
- data/lib/roar/json/hal.rb +74 -83
- data/lib/roar/json.rb +5 -5
- data/lib/roar/version.rb +1 -1
- data/lib/roar/xml.rb +1 -1
- data/lib/roar.rb +3 -3
- data/roar.gemspec +7 -5
- data/test/client_test.rb +1 -1
- data/test/coercion_feature_test.rb +7 -2
- data/test/decorator_test.rb +17 -7
- data/test/hal_json_test.rb +101 -94
- data/test/hypermedia_feature_test.rb +13 -31
- data/test/hypermedia_test.rb +26 -92
- data/test/{decorator_client_test.rb → integration/decorator_client_test.rb} +5 -4
- data/test/{faraday_http_transport_test.rb → integration/faraday_http_transport_test.rb} +1 -0
- data/test/{http_verbs_test.rb → integration/http_verbs_test.rb} +3 -2
- data/test/integration/json_collection_test.rb +35 -0
- data/test/{net_http_transport_test.rb → integration/net_http_transport_test.rb} +1 -0
- data/test/integration/runner.rb +2 -3
- data/test/integration/server.rb +6 -0
- data/test/json_representer_test.rb +2 -29
- data/test/lonely_test.rb +1 -2
- data/test/ssl_client_certs_test.rb +1 -1
- data/test/test_helper.rb +21 -3
- data/test/xml_representer_test.rb +6 -5
- metadata +21 -37
- data/gemfiles/Gemfile.representable-1.7 +0 -6
- data/gemfiles/Gemfile.representable-1.8 +0 -6
- data/gemfiles/Gemfile.representable-2.0 +0 -5
- data/gemfiles/Gemfile.representable-2.1 +0 -5
- data/gemfiles/Gemfile.representable-head +0 -6
- data/lib/roar/json/collection_json.rb +0 -208
- data/lib/roar/json/json_api.rb +0 -233
- data/test/collection_json_test.rb +0 -132
- data/test/hal_links_test.rb +0 -31
- data/test/json_api_test.rb +0 -451
- 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
|
data/test/integration/runner.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require "integration/band_representer"
|
2
|
-
|
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
|
data/test/integration/server.rb
CHANGED
@@ -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
|
-
|
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
|
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
@@ -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",
|
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
|
-
|
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
|
-
|
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)
|
15
|
+
let (:order) { OrderRepresenter.new(Order.new(1)) }
|
15
16
|
|
16
17
|
# empty model
|
17
|
-
it { Order.new
|
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
|
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.
|
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.
|
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:
|
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
|
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
|
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
|
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
|
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.
|
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.
|
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:
|
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://
|
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:
|
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
|
-
|
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,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
|