Skip to content

Commit 4fb2b99

Browse files
committed
Small refactor + update dependencies.
1 parent 66dd295 commit 4fb2b99

7 files changed

Lines changed: 58 additions & 75 deletions

File tree

jsonapi-rails.gemspec

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,11 @@ Gem::Specification.new do |spec|
1414
spec.files = Dir['README.md', 'lib/**/*']
1515
spec.require_path = 'lib'
1616

17-
spec.add_dependency 'rails', '~> 5.0.0', '>= 5.0.0.1'
18-
spec.add_dependency 'jsonapi-deserializable', '0.1.1.beta3'
19-
spec.add_dependency 'jsonapi-parser', '0.1.1.beta3'
20-
spec.add_dependency 'jsonapi-serializable', '0.1.1.beta4'
17+
spec.add_dependency 'jsonapi-deserializable', '0.1.1'
18+
spec.add_dependency 'jsonapi-serializable', '0.1.1'
2119

20+
spec.add_development_dependency 'rails', '~> 5.0.0'
2221
spec.add_development_dependency 'sqlite3'
23-
spec.add_development_dependency 'rake', '>=0.9'
24-
spec.add_development_dependency 'rspec-rails', '~>3.5'
22+
spec.add_development_dependency 'rake', '~> 11.3'
23+
spec.add_development_dependency 'rspec-rails', '~> 3.5'
2524
end

lib/jsonapi/rails/action_controller.rb

Lines changed: 14 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -11,26 +11,25 @@ def self.included(base)
1111
end
1212

1313
module ClassMethods
14-
def deserializable_resource(key, *args, &block)
15-
klass = args.shift unless args.first.is_a?(Hash)
16-
options = args.first || {}
17-
if klass.nil?
18-
klass = Class.new(JSONAPI::Deserializable::Resource, &block)
19-
end
20-
use DeserializeResource, key, klass, options
14+
def deserializable_resource(key, options = {}, &block)
15+
_deserializable(key, options,
16+
JSONAPI::Deserializable::Resource, &block)
2117
end
2218

23-
def deserializable_relationship(key, *args, &block)
24-
klass = args.shift unless args.first.is_a?(Hash)
25-
options = args.first || {}
26-
if klass.nil?
27-
klass = Class.new(JSONAPI::Deserializable::Relationship, &block)
28-
end
29-
use DeserializeResource, key, klass, options
19+
def deserializable_relationship(key, options = {}, &block)
20+
_deserializable(key, options,
21+
JSONAPI::Deserializable::Relationship, &block)
22+
end
23+
24+
# @api private
25+
def _deserializable(key, options, fallback, &block)
26+
options = options.dup
27+
klass = options.delete(:class) || Class.new(fallback, &block)
28+
use Deserialization, key, klass, options
3029
end
3130
end
3231

33-
class DeserializationMiddleware
32+
class Deserialization
3433
REQUEST_PARAMETERS_KEY =
3534
'action_dispatch.request.request_parameters'.freeze
3635
def initialize(app, key, klass)
@@ -42,7 +41,6 @@ def initialize(app, key, klass)
4241
def call(env)
4342
request = Rack::Request.new(env)
4443
body = JSON.parse(request.body.read)
45-
parser.parse!(body)
4644
deserialized_hash = @deserializable_class.call(body)
4745
(env[REQUEST_PARAMETERS_KEY] ||= {}).tap do |request_parameters|
4846
request_parameters[@deserializable_key] = deserialized_hash
@@ -51,18 +49,6 @@ def call(env)
5149
@app.call(env)
5250
end
5351
end
54-
55-
class DeserializeResource < DeserializationMiddleware
56-
def parser
57-
JSONAPI::Parser::Resource
58-
end
59-
end
60-
61-
class DeserializeRelationship < DeserializationMiddleware
62-
def parser
63-
JSONAPI::Parser::Relationship
64-
end
65-
end
6652
end
6753
end
6854
end

lib/jsonapi/rails/deserializable/resource_extensions.rb

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

lib/jsonapi/rails/railtie.rb

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,33 +10,40 @@ module Rails
1010
class Railtie < ::Rails::Railtie
1111
MEDIA_TYPE = 'application/vnd.api+json'.freeze
1212
PARSER = JSONAPI::Rails.parser
13+
RENDERERS = {
14+
jsonapi: JSONAPI::Rails.rails_renderer(SuccessRenderer),
15+
jsonapi_error: JSONAPI::Rails.rails_renderer(ErrorRenderer)
16+
}.freeze
1317

1418
initializer 'jsonapi-rails.action_controller' do
1519
ActiveSupport.on_load(:action_controller) do
1620
require 'jsonapi/rails/action_controller'
1721
include ::JSONAPI::Rails::ActionController
1822

1923
Mime::Type.register MEDIA_TYPE, :jsonapi
24+
2025
if ::Rails::VERSION::MAJOR >= 5
2126
::ActionDispatch::Request.parameter_parsers[:jsonapi] = PARSER
2227
else
2328
::ActionDispatch::ParamsParser::DEFAULT_PARSERS[Mime[:jsonapi]] = PARSER
2429
end
2530

26-
::ActionController::Renderers.add :jsonapi do |json, options|
27-
unless json.is_a?(String)
28-
json = JSONAPI::Rails::Renderer.render(json, options)
29-
end
30-
self.content_type ||= Mime[:jsonapi]
31-
self.response_body = json
31+
RENDERERS.each do |key, renderer|
32+
::ActionController::Renderers.add(key, &renderer)
3233
end
3334

34-
::ActionController::Renderers.add :jsonapi_errors do |json, options|
35-
unless json.is_a?(String)
36-
json = JSONAPI::Rails::ErrorRender.render_errors(json, options)
35+
JSONAPI::Deserializable::Resource.configure do |config|
36+
config.default_has_one do |key, _rel, id, type|
37+
key = key.to_s.singularize
38+
type = type.to_s.singularize.camelize
39+
{ "#{key}_id".to_sym => id, "#{key}_type".to_sym => type }
40+
end
41+
42+
config.default_has_many do |key, _rel, ids, types|
43+
key = key.to_s.singularize
44+
types = types.map { |t| t.to_s.singularize.camelize }
45+
{ "#{key}_ids".to_sym => ids, "#{key}_types".to_sym => types }
3746
end
38-
self.content_type ||= Mime[:jsonapi]
39-
self.response_body = json
4047
end
4148
end
4249
end

lib/jsonapi/rails/renderer.rb

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22

33
module JSONAPI
44
module Rails
5-
class Renderer
5+
class SuccessRenderer
66
def self.render(resources, options)
7-
# TODO(beauby): handle status option.
87
opts = options.dup
98
# TODO(beauby): Move this to a global configuration.
109
default_exposures = {
@@ -22,5 +21,16 @@ def self.render(errors, options)
2221
JSONAPI::Serializable::ErrorRenderer.render(errors, options)
2322
end
2423
end
24+
25+
module_function
26+
27+
# @api private
28+
def rails_renderer(renderer)
29+
proc do |json, options|
30+
json = renderer.render(json, options) unless json.is_a?(String)
31+
self.content_type ||= Mime[:jsonapi]
32+
self.response_body = json
33+
end
34+
end
2535
end
2636
end

spec/dummy/app/controllers/tweets_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
class TweetsController < ActionController::Base
2-
deserializable_resource :tweet, DeserializableTweet, only: [:create, :update]
2+
deserializable_resource :tweet, only: [:create, :update]
33

44
def index
55
tweets = Tweet.all

spec/requests/crud_spec.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@ def body
2424
type: 'tweets',
2525
attributes: {
2626
content: 'foo'
27+
},
28+
relationships: {
29+
author: {
30+
data: {
31+
id: 'foo',
32+
type: 'bar'
33+
}
34+
}
2735
}
2836
}
2937
}

0 commit comments

Comments
 (0)