roar-rails 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/CHANGES.markdown +6 -0
- data/README.markdown +12 -3
- data/gemfiles/Gemfile.rails4-2 +12 -0
- data/lib/generators/rails/USAGE +4 -4
- data/lib/generators/rails/templates/representer.rb +1 -1
- data/lib/roar-rails.rb +4 -0
- data/lib/roar/rails/controller_additions.rb +3 -1
- data/lib/roar/rails/json_api.rb +7 -0
- data/lib/roar/rails/rails4_2_strategy.rb +13 -0
- data/lib/roar/rails/responder.rb +1 -1
- data/lib/roar/rails/version.rb +1 -1
- data/roar-rails.gemspec +1 -0
- data/test/consume_test.rb +46 -0
- data/test/dummy/config/environments/test.rb +6 -0
- data/test/json_api_renderer_test.rb +35 -0
- data/test/render_test.rb +3 -2
- data/test/test_helper.rb +10 -1
- metadata +21 -3
- data/lib/roar/rails/rails4_1_strategy.rb +0 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a55ffa3152e3f698afddef93555e37f5b61d232c
|
4
|
+
data.tar.gz: b3a48ed2ee0c550d255e1a5b031609c53f050a8e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a6701490dd9bfbe6730bf702ac41d536e3158982ab469b7a8f217d6469051220b85cfe6019636a261196a5d91bedd579df740482dd6dbb909fedc342a221593c
|
7
|
+
data.tar.gz: 08128efd725c3cae0bf5c5a7bf78ed84e1f71c9c3f48b7569a8676dfe7470bbd21f26894f3f3c2bbfd9ad82ff33bfb450d70bf785bca53a83058a2ea8dc0bff1
|
data/.travis.yml
CHANGED
data/CHANGES.markdown
CHANGED
data/README.markdown
CHANGED
@@ -270,21 +270,30 @@ end
|
|
270
270
|
|
271
271
|
Put your representers in `app/representers` and they will be autoloaded by Rails. Also, frequently used modules as media representers and features don't need to be required manually.
|
272
272
|
|
273
|
-
## Rails 4.1
|
273
|
+
## Rails 4.1+ and HAL/JSON-API
|
274
274
|
|
275
275
|
**Note**: this is a temporary work-around, we're trying to fix that in Rails/roar-rails itself [May 2014].
|
276
276
|
|
277
|
-
Rails 4.1 expects you to manually register a global HAL renderer, or `respond_with` will throw
|
277
|
+
Rails 4.1 and up expects you to manually register a global HAL or JSON-API renderer, or `respond_with` will throw an `ActionController::MissingRenderer` exception.
|
278
278
|
|
279
279
|
One fix is to add this to `config/initializers/mime_types.rb` right below `Mime::Type.register 'application/hal+json', :hal`:
|
280
280
|
|
281
281
|
```ruby
|
282
282
|
ActionController::Renderers.add :hal do |obj, options|
|
283
283
|
self.content_type ||= Mime[:hal]
|
284
|
-
obj
|
284
|
+
obj
|
285
285
|
end
|
286
286
|
```
|
287
287
|
|
288
|
+
Similarly, for JSON-API, below `Mime::Type.register 'application/vnd.api+json', :json_api` add:
|
289
|
+
|
290
|
+
|
291
|
+
```ruby
|
292
|
+
ActionController::Renderers.add :json_api do |obj, options|
|
293
|
+
self.content_type ||= Mime[:json_api]
|
294
|
+
obj
|
295
|
+
end
|
296
|
+
```
|
288
297
|
## Contributors
|
289
298
|
|
290
299
|
* [Railslove](http://www.railslove.de) and especially Michael Bumann [bumi] have heavily supported development of roar-rails ("resource :singers").
|
@@ -0,0 +1,12 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
|
3
|
+
# Specify your gem's dependencies in roar-rails.gemspec
|
4
|
+
gemspec :path => '../'
|
5
|
+
|
6
|
+
gem 'railties', '~> 4.2.0'
|
7
|
+
gem 'actionpack', '~> 4.2.0'
|
8
|
+
|
9
|
+
gem 'activemodel', '~> 4.2.0'
|
10
|
+
gem 'activerecord', '~> 4.2.0'
|
11
|
+
|
12
|
+
gem 'minitest', '~> 5.5.0'
|
data/lib/generators/rails/USAGE
CHANGED
@@ -10,7 +10,7 @@ Examples:
|
|
10
10
|
This will create a representer as follows:
|
11
11
|
|
12
12
|
module BandRepresenter
|
13
|
-
include Roar::
|
13
|
+
include Roar::JSON
|
14
14
|
|
15
15
|
property :id
|
16
16
|
property :name
|
@@ -18,12 +18,12 @@ Examples:
|
|
18
18
|
|
19
19
|
You can pass :class and :extend property options:
|
20
20
|
|
21
|
-
rails g singer id instrument:
|
21
|
+
rails g singer id instrument:equipment:instrument_representer
|
22
22
|
|
23
23
|
This will add property options:
|
24
24
|
|
25
25
|
module SingerRepresenter
|
26
|
-
include Roar::
|
26
|
+
include Roar::JSON
|
27
27
|
|
28
28
|
property :id
|
29
29
|
property :instrument, :class => Equipment, :extend => InstrumentRepresenter
|
@@ -34,7 +34,7 @@ Examples:
|
|
34
34
|
rails g representer Band id name --format=xml
|
35
35
|
|
36
36
|
module BandRepresenter
|
37
|
-
include Roar::
|
37
|
+
include Roar::XML
|
38
38
|
|
39
39
|
property :id
|
40
40
|
property :name
|
data/lib/roar-rails.rb
CHANGED
@@ -9,6 +9,7 @@ module Roar
|
|
9
9
|
|
10
10
|
module JSON
|
11
11
|
autoload("HAL", "roar/rails/hal")
|
12
|
+
autoload("JSONAPI", "roar/rails/json_api")
|
12
13
|
end
|
13
14
|
|
14
15
|
autoload("Hypermedia", "roar/hypermedia")
|
@@ -28,7 +29,10 @@ module Roar
|
|
28
29
|
require 'roar/rails/rails3_1_strategy'
|
29
30
|
elsif rails_version.~ 3.2
|
30
31
|
require 'roar/rails/rails3_2_strategy'
|
32
|
+
elsif rails_version.~ 4.2
|
33
|
+
require 'roar/rails/rails4_2_strategy'
|
31
34
|
else
|
35
|
+
# fallback to 4.0 strategy
|
32
36
|
require 'roar/rails/rails4_0_strategy'
|
33
37
|
end
|
34
38
|
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'responders'
|
1
2
|
require 'uber/inheritable_attr'
|
2
3
|
require 'roar/rails/responder'
|
3
4
|
require 'roar/rails/formats'
|
@@ -79,7 +80,8 @@ module Roar::Rails
|
|
79
80
|
module Render
|
80
81
|
def render(options)
|
81
82
|
format = options.keys.first
|
82
|
-
|
83
|
+
status = options[:status] || :ok
|
84
|
+
super format => prepare_model_for(format, options.values.first, options), :status => status
|
83
85
|
end
|
84
86
|
end
|
85
87
|
end
|
data/lib/roar/rails/responder.rb
CHANGED
@@ -33,7 +33,7 @@ module Roar
|
|
33
33
|
def create_response(model)
|
34
34
|
render_method = "to_#{format}"
|
35
35
|
media_format = Mime[format]
|
36
|
-
Response.new(model.send(render_method, options), media_format)
|
36
|
+
Response.new(model.send(render_method, options), media_format).body
|
37
37
|
end
|
38
38
|
|
39
39
|
def handle_lonely_collection!(collection)
|
data/lib/roar/rails/version.rb
CHANGED
data/roar-rails.gemspec
CHANGED
@@ -23,6 +23,7 @@ Gem::Specification.new do |s|
|
|
23
23
|
s.add_runtime_dependency "actionpack"
|
24
24
|
s.add_runtime_dependency "railties", ">= 3.0.0"
|
25
25
|
s.add_runtime_dependency "uber", ">= 0.0.5"
|
26
|
+
s.add_runtime_dependency "responders"
|
26
27
|
|
27
28
|
s.add_development_dependency "minitest"
|
28
29
|
s.add_development_dependency "activemodel"
|
data/test/consume_test.rb
CHANGED
@@ -38,6 +38,22 @@ class ConsumeHalWithNoHalRespondTest < ActionController::TestCase
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
+
class ConsumeJsonApiWithNoJsonApiRespondTest < ActionController::TestCase
|
42
|
+
include Roar::Rails::TestCase
|
43
|
+
|
44
|
+
tests UnnamespaceSingersController
|
45
|
+
|
46
|
+
# Content-type is set properly, it's a registered mime but responder doesn't do #from_json_api.
|
47
|
+
# FIXME: why does that still find a representer?
|
48
|
+
test "#consume parses hal document and updates the model" do
|
49
|
+
@request.env['CONTENT_TYPE'] = 'application/vnd.api+json'
|
50
|
+
# assert_raises Roar::Rails::UnsupportedMediaType do
|
51
|
+
assert_raises NoMethodError do # currently, we don't know if a format is supported in general, or not.
|
52
|
+
post :consume_json, "{\"name\": \"Bumi\"}"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
41
57
|
class ConsumeWithConfigurationTest < ActionController::TestCase
|
42
58
|
include Roar::Rails::TestCase
|
43
59
|
|
@@ -109,6 +125,36 @@ class ConsumeHalTest < ActionController::TestCase
|
|
109
125
|
end
|
110
126
|
end
|
111
127
|
|
128
|
+
class ConsumeJsonApiTest < ActionController::TestCase
|
129
|
+
include Roar::Rails::TestCase
|
130
|
+
|
131
|
+
module MusicianRepresenter
|
132
|
+
include Roar::JSON::JSONAPI
|
133
|
+
type :singer
|
134
|
+
property :name
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
class SingersController < ActionController::Base
|
139
|
+
include Roar::Rails::ControllerAdditions
|
140
|
+
represents :json_api, :entity => MusicianRepresenter
|
141
|
+
|
142
|
+
def consume_json_api
|
143
|
+
singer = consume!(Singer.new)
|
144
|
+
render :text => singer.inspect
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
tests SingersController
|
149
|
+
|
150
|
+
test "#consume parses JSON-API document and updates the model" do
|
151
|
+
@request.env['CONTENT_TYPE'] = 'application/vnd.api+json'
|
152
|
+
post :consume_json_api, "{\"singer\": {\"name\": \"Bumi\"}}"
|
153
|
+
|
154
|
+
assert_equal %{#<struct Singer name="Bumi">}, @response.body
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
112
158
|
class ConsumeWithOptionsOverridingConfigurationTest < ActionController::TestCase
|
113
159
|
include Roar::Rails::TestCase
|
114
160
|
|
@@ -31,4 +31,10 @@ Dummy::Application.configure do
|
|
31
31
|
# config.active_record.schema_format = :sql
|
32
32
|
|
33
33
|
config.representer.default_url_options = {:host => "roar.apotomo.de"}
|
34
|
+
|
35
|
+
if Roar::Rails.rails_version.~ 4.2
|
36
|
+
config.eager_load = false
|
37
|
+
config.active_support.test_order = :random
|
38
|
+
end
|
39
|
+
|
34
40
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class HalRendererTest < ActionController::TestCase
|
4
|
+
include Roar::Rails::TestCase
|
5
|
+
|
6
|
+
class SingersController < ActionController::Base
|
7
|
+
module JsonApiSingerRepresenter
|
8
|
+
include Roar::JSON::JSONAPI
|
9
|
+
|
10
|
+
type :singer
|
11
|
+
property :name
|
12
|
+
end
|
13
|
+
|
14
|
+
include Roar::Rails::ControllerAdditions
|
15
|
+
represents :json_api, :entity => JsonApiSingerRepresenter
|
16
|
+
|
17
|
+
def show
|
18
|
+
singer = Musician.new("Bumi")
|
19
|
+
respond_with singer
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
tests SingersController
|
24
|
+
|
25
|
+
test "should render correctly in response to a application/vnd.api+json" do
|
26
|
+
get :show, :id => "bumi", :format => :json_api
|
27
|
+
assert_body '{"singer":{"name":"Bumi"}}'
|
28
|
+
end
|
29
|
+
|
30
|
+
test "should have a content_type of application/vnd.api+json" do
|
31
|
+
get :show, :id => "bumi", :format => :json_api
|
32
|
+
assert_equal response.content_type, 'application/vnd.api+json'
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
data/test/render_test.rb
CHANGED
@@ -17,7 +17,7 @@ class RenderTest < ActionController::TestCase
|
|
17
17
|
|
18
18
|
def show
|
19
19
|
singer = Musician.new("Bumi")
|
20
|
-
render :json => singer
|
20
|
+
render :json => singer, status: 201
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
@@ -26,5 +26,6 @@ class RenderTest < ActionController::TestCase
|
|
26
26
|
test "should use Representer for #render" do
|
27
27
|
get :show, :id => "bumi", :format => :json
|
28
28
|
assert_body '{"title":"Bumi"}'
|
29
|
+
assert_equal 201, response.status
|
29
30
|
end
|
30
|
-
end
|
31
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -11,8 +11,17 @@ Singer = Struct.new(:name)
|
|
11
11
|
# Rails.backtrace_cleaner.remove_silencers!
|
12
12
|
|
13
13
|
Mime::Type.register 'application/hal+json', :hal
|
14
|
+
Mime::Type.register 'application/vnd.api+json', :json_api
|
14
15
|
|
15
|
-
|
16
|
+
|
17
|
+
|
18
|
+
# see also https://github.com/jingweno/msgpack_rails/issues/3
|
19
|
+
::ActionController::Renderers.add :hal do |js, options|
|
16
20
|
self.content_type ||= Mime::HAL
|
17
21
|
js.is_a?(String) ? js : js.to_json
|
18
22
|
end
|
23
|
+
|
24
|
+
::ActionController::Renderers.add :json_api do |js, options|
|
25
|
+
self.content_type ||= Mime::JSONAPI
|
26
|
+
js.is_a?(String) ? js : js.to_json
|
27
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: roar-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.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: 2015-01-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: roar
|
@@ -86,6 +86,20 @@ dependencies:
|
|
86
86
|
- - ">="
|
87
87
|
- !ruby/object:Gem::Version
|
88
88
|
version: 0.0.5
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: responders
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
type: :runtime
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - ">="
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: '0'
|
89
103
|
- !ruby/object:Gem::Dependency
|
90
104
|
name: minitest
|
91
105
|
requirement: !ruby/object:Gem::Requirement
|
@@ -175,6 +189,7 @@ files:
|
|
175
189
|
- gemfiles/Gemfile.rails3-2
|
176
190
|
- gemfiles/Gemfile.rails4-0
|
177
191
|
- gemfiles/Gemfile.rails4-1
|
192
|
+
- gemfiles/Gemfile.rails4-2
|
178
193
|
- lib/generators/rails/USAGE
|
179
194
|
- lib/generators/rails/representer_generator.rb
|
180
195
|
- lib/generators/rails/templates/representer.rb
|
@@ -182,11 +197,12 @@ files:
|
|
182
197
|
- lib/roar/rails/controller_additions.rb
|
183
198
|
- lib/roar/rails/formats.rb
|
184
199
|
- lib/roar/rails/hal.rb
|
200
|
+
- lib/roar/rails/json_api.rb
|
185
201
|
- lib/roar/rails/rails3_0_strategy.rb
|
186
202
|
- lib/roar/rails/rails3_1_strategy.rb
|
187
203
|
- lib/roar/rails/rails3_2_strategy.rb
|
188
204
|
- lib/roar/rails/rails4_0_strategy.rb
|
189
|
-
- lib/roar/rails/
|
205
|
+
- lib/roar/rails/rails4_2_strategy.rb
|
190
206
|
- lib/roar/rails/railtie.rb
|
191
207
|
- lib/roar/rails/responder.rb
|
192
208
|
- lib/roar/rails/test_case.rb
|
@@ -213,6 +229,7 @@ files:
|
|
213
229
|
- test/dummy/config/routes.rb
|
214
230
|
- test/dummy/db/test.sqlite3
|
215
231
|
- test/formats_test.rb
|
232
|
+
- test/json_api_renderer_test.rb
|
216
233
|
- test/json_hal_renderer_test.rb
|
217
234
|
- test/render_test.rb
|
218
235
|
- test/representer_generator_test.rb
|
@@ -264,6 +281,7 @@ test_files:
|
|
264
281
|
- test/dummy/config/routes.rb
|
265
282
|
- test/dummy/db/test.sqlite3
|
266
283
|
- test/formats_test.rb
|
284
|
+
- test/json_api_renderer_test.rb
|
267
285
|
- test/json_hal_renderer_test.rb
|
268
286
|
- test/render_test.rb
|
269
287
|
- test/representer_generator_test.rb
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module Roar::Rails
|
2
|
-
class Responder < ActionController::Responder
|
3
|
-
module VersionStrategy
|
4
|
-
extend ActiveSupport::Concern
|
5
|
-
included do
|
6
|
-
# FIXME: this totally SUCKS, why am i supposed to add a global "renderer" (whatever that is) to handle hal requests. this should be a generic behaviour in Rails core.
|
7
|
-
# TODO: replace renderer/responder layer in Rails with a simpler implementation.
|
8
|
-
# ActionController.add_renderer :hal do |js, options|
|
9
|
-
# self.content_type ||= Mime::HAL
|
10
|
-
# js.to_json
|
11
|
-
# end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
module TestCase
|
17
|
-
module VersionStrategy
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|