jsonapi-rails 0.1.2 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e4738972836e05a1bc9efcc9c19ceabd4ce9af7a
4
- data.tar.gz: 800b0f6bb491c2e4863e8e824d081d311753e08c
3
+ metadata.gz: 29c73976a2fb4451e84ad275247518ed54bfe660
4
+ data.tar.gz: 58417d63bcfc17109fce8a6e8527ef1324c234e8
5
5
  SHA512:
6
- metadata.gz: 06bd1dc83d80fae68fd62cadb624ddb9ab2028a0892ae6bfe763934e8e05660108121ddee9dbefb55a7f7c316d6bf5ce7c41fc2e862b3124fcf43a0c5a83e71d
7
- data.tar.gz: 4ba8bebdf11e2cf0b455307e78ed0d70bcc950ca5d0b0e1c72f041c5ff35b41fb0e7bcc2266077a46ed849e757e0570520ff4fc7c76891daaa429934e3778c26
6
+ metadata.gz: ef952c74fbf3c00e06ce25bfc7775ff92faf25c59fd080b64a9ceec0755ba5235e8f883986f411e24bf664de0ad22fcd947ddd49492f2b6fb0c435f379c042c8
7
+ data.tar.gz: 03b7cd4763b50cab7a90e357216f21fe7df4f2c892271896e76710d4e3fc084c4a7ceabdfd4e11d4cea988422a64ccb752146de9b6cb41d206eed0d9ab1c6e2f
@@ -4,20 +4,11 @@ require 'jsonapi/parser'
4
4
  module JSONAPI
5
5
  module Rails
6
6
  module ActionController
7
- REVERSE_MAPPING_KEY = 'jsonapi_deserializable.reverse_mapping'.freeze
7
+ extend ActiveSupport::Concern
8
8
 
9
- def self.prepended(base)
10
- base.class_eval do
11
- extend ClassMethods
12
- end
13
- end
14
-
15
- # def render(options = {})
16
- # reverse_mapping = request.env[REVERSE_MAPPING_KEY]
17
- # super(options.merge(_reverse_mapping: reverse_mapping))
18
- # end
9
+ JSONAPI_POINTERS_KEY = 'jsonapi_deserializable.jsonapi_pointers'.freeze
19
10
 
20
- module ClassMethods
11
+ class_methods do
21
12
  def deserializable_resource(key, options = {}, &block)
22
13
  _deserializable(key, options,
23
14
  JSONAPI::Deserializable::Resource, &block)
@@ -32,31 +23,19 @@ module JSONAPI
32
23
  def _deserializable(key, options, fallback, &block)
33
24
  options = options.dup
34
25
  klass = options.delete(:class) || Class.new(fallback, &block)
35
- use Deserialization, key, klass, options
36
- end
37
- end
38
26
 
39
- class Deserialization
40
- REQUEST_PARAMETERS_KEY =
41
- 'action_dispatch.request.request_parameters'.freeze
42
- def initialize(app, key, klass)
43
- @app = app
44
- @deserializable_key = key
45
- @deserializable_class = klass
46
- end
47
-
48
- def call(env)
49
- request = Rack::Request.new(env)
50
- body = JSON.parse(request.body.read)
51
- deserializable = @deserializable_class.new(body)
52
- env[REVERSE_MAPPING_KEY] = deserializable.reverse_mapping
53
- (env[REQUEST_PARAMETERS_KEY] ||= {}).tap do |request_parameters|
54
- request_parameters[@deserializable_key] = deserializable.to_hash
27
+ before_action(options) do |controller|
28
+ resource = klass.new(controller.params[:_jsonapi].to_unsafe_hash)
29
+ controller.request.env[JSONAPI_POINTERS_KEY] =
30
+ resource.reverse_mapping
31
+ controller.params[key.to_sym] = resource.to_hash
55
32
  end
56
-
57
- @app.call(env)
58
33
  end
59
34
  end
35
+
36
+ def jsonapi_pointers
37
+ request.env[JSONAPI_POINTERS_KEY]
38
+ end
60
39
  end
61
40
  end
62
41
  end
@@ -1,13 +1,12 @@
1
+ require 'jsonapi/deserializable'
2
+
1
3
  module JSONAPI
2
4
  module Rails
3
- module_function
5
+ PARSER = lambda do |body|
6
+ data = JSON.parse(body)
7
+ hash = { _jsonapi: data }
4
8
 
5
- def parser
6
- lambda do |body|
7
- data = JSON.parse(body)
8
- data = { _json: data } unless data.is_a?(Hash)
9
- data.with_indifferent_access
10
- end
9
+ hash.with_indifferent_access
11
10
  end
12
11
  end
13
12
  end
@@ -9,16 +9,15 @@ module JSONAPI
9
9
  module Rails
10
10
  class Railtie < ::Rails::Railtie
11
11
  MEDIA_TYPE = 'application/vnd.api+json'.freeze
12
- PARSER = JSONAPI::Rails.parser
13
12
  RENDERERS = {
14
- jsonapi: JSONAPI::Rails.rails_renderer(SuccessRenderer),
15
- jsonapi_errors: JSONAPI::Rails.rails_renderer(ErrorRenderer)
13
+ jsonapi: SuccessRenderer.new,
14
+ jsonapi_error: ErrorsRenderer.new
16
15
  }.freeze
17
16
 
18
17
  initializer 'jsonapi-rails.action_controller' do
19
18
  ActiveSupport.on_load(:action_controller) do
20
19
  require 'jsonapi/rails/action_controller'
21
- prepend ::JSONAPI::Rails::ActionController
20
+ include ::JSONAPI::Rails::ActionController
22
21
 
23
22
  Mime::Type.register MEDIA_TYPE, :jsonapi
24
23
 
@@ -28,8 +27,19 @@ module JSONAPI
28
27
  ::ActionDispatch::ParamsParser::DEFAULT_PARSERS[Mime[:jsonapi]] = PARSER
29
28
  end
30
29
 
31
- RENDERERS.each do |key, renderer|
32
- ::ActionController::Renderers.add(key, &renderer)
30
+ ::ActionController::Renderers.add(:jsonapi) do |resources, options|
31
+ self.content_type ||= Mime[:jsonapi]
32
+
33
+ RENDERERS[:jsonapi].render(resources, options).to_json
34
+ end
35
+
36
+ ::ActionController::Renderers.add(:jsonapi_error) do |errors, options|
37
+ # Renderer proc is evaluated in the controller context, so it
38
+ # has access to the jsonapi_pointers method.
39
+ options = options.merge(_jsonapi_pointers: jsonapi_pointers)
40
+ self.content_type ||= Mime[:jsonapi]
41
+
42
+ RENDERERS[:jsonapi_error].render(errors, options).to_json
33
43
  end
34
44
 
35
45
  JSONAPI::Deserializable::Resource.configure do |config|
@@ -1,21 +1,15 @@
1
1
  require 'jsonapi/serializable/renderer'
2
2
 
3
- module Serializable
4
- class ActiveModelError < JSONAPI::Serializable::Error
5
- title do
6
- @message
7
- end
8
-
9
- source do
10
- pointer @pointer
11
- end
12
- end
13
- end
14
-
15
3
  module JSONAPI
16
4
  module Rails
17
5
  class SuccessRenderer
18
- def self.render(resources, options, _request)
6
+ def initialize(renderer = JSONAPI::Serializable::SuccessRenderer.new)
7
+ @renderer = renderer
8
+
9
+ freeze
10
+ end
11
+
12
+ def render(resources, options)
19
13
  opts = options.dup
20
14
  # TODO(beauby): Move this to a global configuration.
21
15
  default_exposures = {
@@ -24,33 +18,20 @@ module JSONAPI
24
18
  opts[:expose] = default_exposures.merge!(opts[:expose] || {})
25
19
  opts[:jsonapi] = opts.delete(:jsonapi_object)
26
20
 
27
- JSONAPI::Serializable::Renderer.render(resources, opts)
21
+ @renderer.render(resources, opts)
28
22
  end
29
23
  end
30
24
 
31
- class ErrorRenderer
32
- def self.render(errors, options, request)
33
- reverse_mapping =
34
- request.env['jsonapi_deserializable.reverse_mapping']
35
- if errors.is_a?(ActiveModel::Errors)
36
- errors = errors.messages.map do |attr, message|
37
- pointer = reverse_mapping[attr]
38
- ::Serializable::ActiveModelError.new(message: message,
39
- pointer: pointer)
40
- end
41
- end
42
- JSONAPI::Serializable::ErrorRenderer.render(errors, options)
43
- end
44
- end
25
+ class ErrorsRenderer
26
+ def initialize(renderer = JSONAPI::Serializable::ErrorsRenderer.new)
27
+ @renderer = renderer
45
28
 
46
- module_function
29
+ freeze
30
+ end
47
31
 
48
- # @api private
49
- def rails_renderer(renderer)
50
- proc do |json, options|
51
- json = renderer.render(json, options, request) unless json.is_a?(String)
52
- self.content_type ||= Mime[:jsonapi]
53
- self.response_body = json
32
+ def render(errors, options)
33
+ # TODO(beauby): SerializableError inference on AR validation errors.
34
+ @renderer.render(errors, options)
54
35
  end
55
36
  end
56
37
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jsonapi-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lucas Hosseini
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-23 00:00:00.000000000 Z
11
+ date: 2017-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jsonapi-rb
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.1'
19
+ version: 0.2.1
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.1'
26
+ version: 0.2.1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rails
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -80,20 +80,6 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '3.5'
83
- - !ruby/object:Gem::Dependency
84
- name: dry-validation
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - "~>"
88
- - !ruby/object:Gem::Version
89
- version: '0.10'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - "~>"
95
- - !ruby/object:Gem::Version
96
- version: '0.10'
97
83
  description: Efficient, convenient, non-intrusive JSONAPI framework for Rails.
98
84
  email:
99
85
  - lucas.hosseini@gmail.com
@@ -107,11 +93,9 @@ files:
107
93
  - lib/generators/jsonapi/serializable/templates/serializable.rb.erb
108
94
  - lib/jsonapi/rails.rb
109
95
  - lib/jsonapi/rails/action_controller.rb
110
- - lib/jsonapi/rails/active_record.rb
111
96
  - lib/jsonapi/rails/parser.rb
112
97
  - lib/jsonapi/rails/railtie.rb
113
98
  - lib/jsonapi/rails/renderer.rb
114
- - lib/jsonapi/rails/serializable_active_record_error.rb
115
99
  homepage: https://github.com/jsonapi-rb/jsonapi-rails
116
100
  licenses:
117
101
  - MIT
@@ -132,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
132
116
  version: '0'
133
117
  requirements: []
134
118
  rubyforge_project:
135
- rubygems_version: 2.6.8
119
+ rubygems_version: 2.6.12
136
120
  signing_key:
137
121
  specification_version: 4
138
122
  summary: jsonapi-rb integrations for Rails.
File without changes