Skip to content

Commit fa68b5e

Browse files
authored
Refactor rendering + improve inference. (#2)
* Refactor rendering + improve inference. * Rename rendering.rb => renderer.rb. * Factor-out Renderer class into JSONAPI::Serializable::Renderer.
1 parent 2a37286 commit fa68b5e

File tree

6 files changed

+48
-72
lines changed

6 files changed

+48
-72
lines changed

jsonapi-rails.gemspec

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,24 @@ version = File.read(File.expand_path('../VERSION', __FILE__)).strip
33
Gem::Specification.new do |spec|
44
spec.name = 'jsonapi-rails'
55
spec.version = version
6-
spec.author = ['L. Preston Sego III', 'Lucas Hosseini']
7-
8-
spec.summary = 'Rails plugin for (de)serialization of JSONAPI resources'
9-
spec.description = 'Efficiently build and consume JSONAPI documents.'
6+
spec.author = ['Lucas Hosseini']
7+
spec.email = ['[email protected]']
8+
spec.summary = 'jsonapi-rb integrations for Rails.'
9+
spec.description = 'Efficient, convenient, non-intrusive JSONAPI ' \
10+
'framework for Rails.'
1011
spec.homepage = 'https://github.com/jsonapi-rb/rails'
1112
spec.license = 'MIT'
1213

1314
spec.files = Dir['README.md', 'lib/**/*']
1415
spec.require_path = 'lib'
1516

16-
spec.add_dependency 'jsonapi-renderer', '0.1.1.beta2'
17-
spec.add_dependency 'jsonapi-parser', '0.1.1.beta3'
18-
spec.add_dependency 'jsonapi-serializable', '0.1.1.beta2'
17+
spec.add_dependency 'jsonapi-renderer', '0.1.1.beta3'
18+
spec.add_dependency 'jsonapi-parser', '0.1.1.beta3'
19+
spec.add_dependency 'jsonapi-serializable', '0.1.1.beta3'
1920
spec.add_dependency 'jsonapi-deserializable', '0.1.1.beta3'
2021

2122
spec.add_development_dependency 'activerecord', '>=5'
22-
spec.add_development_dependency 'sqlite3', '>= 1.3.12'
23-
spec.add_development_dependency 'rake', '>=0.9'
24-
spec.add_development_dependency 'rspec', '~>3.4'
23+
spec.add_development_dependency 'sqlite3', '>= 1.3.12'
24+
spec.add_development_dependency 'rake', '>=0.9'
25+
spec.add_development_dependency 'rspec', '~>3.5'
2526
end

lib/jsonapi/rails.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
require 'jsonapi/deserializable'
55
require 'jsonapi/serializable'
66

7-
require 'jsonapi/rails/serializable/model_extensions'
87
require 'jsonapi/rails/deserializable/resource_extensions'
98

109
require 'jsonapi/rails/railtie'

lib/jsonapi/rails/railtie.rb

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,12 @@
44
require 'active_support'
55

66
require 'jsonapi/rails/parser'
7-
require 'jsonapi/rails/render'
7+
require 'jsonapi/rails/renderer'
88

99
module JSONAPI
1010
module Rails
1111
class Railtie < ::Rails::Railtie
1212
MEDIA_TYPE = 'application/vnd.api+json'.freeze
13-
HEADERS = {
14-
response: { 'CONTENT_TYPE'.freeze => MEDIA_TYPE },
15-
request: { 'ACCEPT'.freeze => MEDIA_TYPE }
16-
}.freeze
1713
PARSER = JSONAPI::Rails.parser
1814

1915
initializer 'JSONAPI::Rails.initialize' do
@@ -23,16 +19,22 @@ class Railtie < ::Rails::Railtie
2319
else
2420
ActionDispatch::ParamsParser::DEFAULT_PARSERS[Mime[:jsonapi]] = PARSER
2521
end
22+
2623
ActionController::Renderers.add :jsonapi do |json, options|
2724
unless json.is_a?(String)
28-
json = JSONAPI::Rails.render(json, options)
29-
.to_json(options)
25+
json = JSONAPI::Rails::Renderer.render(json, options)
3026
end
3127
self.content_type ||= Mime[:jsonapi]
3228
self.response_body = json
3329
end
3430

35-
# TODO(beauby): Add renderer for `jsonapi_errors`.
31+
ActionController::Renderers.add :jsonapi_errors do |json, options|
32+
unless json.is_a?(String)
33+
json = JSONAPI::Rails::ErrorRender.render_errors(json, options)
34+
end
35+
self.content_type ||= Mime[:jsonapi]
36+
self.response_body = json
37+
end
3638
end
3739
end
3840
end

lib/jsonapi/rails/render.rb

Lines changed: 0 additions & 33 deletions
This file was deleted.

lib/jsonapi/rails/renderer.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
require 'jsonapi/serializable/renderer'
2+
require 'jsonapi/serializable/resource_builder'
3+
4+
module JSONAPI
5+
module Rails
6+
class Renderer
7+
def self.render(resources, options)
8+
# TODO(beauby): handle status option.
9+
opts = options.dup
10+
# TODO(beauby): Move this to a global configuration.
11+
default_exposures = {
12+
url_helpers: ::Rails.application.routes.url_helpers
13+
}
14+
opts[:expose] = default_exposures.merge!(opts[:expose] || {})
15+
16+
JSONAPI::Serializable::Renderer.render(resources, opts)
17+
end
18+
end
19+
20+
class ErrorRenderer
21+
def self.render(errors, options)
22+
# TODO(beauby): SerializableError inference on AR validation errors.
23+
JSONAPI::Serializable::ErrorRenderer.render(errors, options)
24+
end
25+
end
26+
end
27+
end

lib/jsonapi/rails/serializable/model_extensions.rb

Lines changed: 0 additions & 20 deletions
This file was deleted.

0 commit comments

Comments
 (0)