jsonapi-rails 0.1.1.beta1 → 0.1.1.beta2
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 +4 -4
- data/README.md +7 -14
- data/lib/jsonapi/rails.rb +0 -1
- data/lib/jsonapi/rails/action_controller.rb +71 -0
- data/lib/jsonapi/rails/parser.rb +0 -3
- data/lib/jsonapi/rails/railtie.rb +16 -8
- data/lib/jsonapi/rails/renderer.rb +27 -0
- metadata +13 -23
- data/lib/generators/jsonapi/deserializable/serializable_generator.rb +0 -0
- data/lib/generators/jsonapi/deserializable/templates/serializable.rb +0 -1
- data/lib/generators/jsonapi/deserializable/templates/serializable.rb.erb +0 -34
- data/lib/generators/jsonapi/serializable/templates/serializable.rb +0 -3
- data/lib/generators/serializable_generator.rb +0 -5
- data/lib/jsonapi/rails/deserializable/model_extensions.rb +0 -20
- data/lib/jsonapi/rails/render.rb +0 -33
- data/lib/jsonapi/rails/serializable/model_extensions.rb +0 -20
- data/lib/jsonapi/rails/version.rb +0 -5
- data/lib/tasks/jsonapi/rails_tasks.rake +0 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a2187b8d1ba0e20c3d0e23745e04e2072b56e43a
|
4
|
+
data.tar.gz: 6bb485f12b4d58a8132388faf76695cd503ddf94
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1ae73e72c786c2751afe9168eed6f5251ca9479bf45faca4594f08243cedca1e8aac8c59468258689601f32b228a71057d3510efb1851b664e8c14bf961da154
|
7
|
+
data.tar.gz: 6490dcde60b48fab7e83bc14036575a5b7644ddba4b9aac4f1b80fd77a09443aa25318bd542ceeeec2b5c6ae34c81f575fd0ba41d4b1740afa7539fede4a7fce
|
data/README.md
CHANGED
@@ -1,5 +1,10 @@
|
|
1
1
|
# jsonapi-rails
|
2
|
-
Rails
|
2
|
+
Rails integration for [jsonapi-rb](https://github.com/jsonapi-rb/jsonapi-rb).
|
3
|
+
|
4
|
+
## Status
|
5
|
+
|
6
|
+
[](https://badge.fury.io/rb/jsonapi-rails)
|
7
|
+
[](http://travis-ci.org/jsonapi-rb/rails?branch=master)
|
3
8
|
|
4
9
|
## Installation
|
5
10
|
|
@@ -20,18 +25,6 @@ $ gem install jsonapi-rails
|
|
20
25
|
|
21
26
|
TODO
|
22
27
|
|
23
|
-
## Contributing
|
24
|
-
|
25
|
-
1. Fork the [official repository](https://github.com/beauby/jsonapi-rails).
|
26
|
-
2. Make your changes in a topic branch.
|
27
|
-
3. Send a pull request.
|
28
|
-
|
29
|
-
Notes:
|
30
|
-
|
31
|
-
* Contributions without tests won't be accepted.
|
32
|
-
* Please don't update the Gem version.
|
33
|
-
|
34
28
|
## License
|
35
29
|
|
36
|
-
|
37
|
-
[LICENSE](LICENSE) file.
|
30
|
+
jsonapi-rails is released under the [MIT License](http://www.opensource.org/licenses/MIT).
|
data/lib/jsonapi/rails.rb
CHANGED
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'jsonapi/deserializable'
|
2
|
+
require 'jsonapi/parser'
|
3
|
+
|
4
|
+
module JSONAPI
|
5
|
+
module Rails
|
6
|
+
module ActionController
|
7
|
+
def self.included(base)
|
8
|
+
base.class_eval do
|
9
|
+
extend ClassMethods
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
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
|
21
|
+
end
|
22
|
+
|
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
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class DeserializationMiddleware
|
34
|
+
JSONAPI_KEYS = %w(data meta links jsonapi).freeze
|
35
|
+
def initialize(app, key, klass)
|
36
|
+
@app = app
|
37
|
+
@deserializable_key = key
|
38
|
+
@deserializable_class = klass
|
39
|
+
end
|
40
|
+
|
41
|
+
def call(env)
|
42
|
+
request = Rack::Request.new(env)
|
43
|
+
body = request.params.slice(*JSONAPI_KEYS)
|
44
|
+
parser.parse!(body)
|
45
|
+
deserialized_hash = @deserializable_class.call(body)
|
46
|
+
jsonapi = {}
|
47
|
+
JSONAPI_KEYS.each do |key|
|
48
|
+
next unless request.params.key?(key)
|
49
|
+
jsonapi[key.to_sym] = request.delete_param(key)
|
50
|
+
end
|
51
|
+
request.update_param(:_jsonapi, jsonapi)
|
52
|
+
request.update_param(@deserializable_key, deserialized_hash)
|
53
|
+
|
54
|
+
@app.call(env)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
class DeserializeResource < DeserializationMiddleware
|
59
|
+
def parser
|
60
|
+
JSONAPI::Parser::Resource
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
class DeserializeRelationship < DeserializationMiddleware
|
65
|
+
def parser
|
66
|
+
JSONAPI::Parser::Relationship
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
data/lib/jsonapi/rails/parser.rb
CHANGED
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'jsonapi/parser'
|
2
|
-
|
3
1
|
module JSONAPI
|
4
2
|
module Rails
|
5
3
|
module_function
|
@@ -7,7 +5,6 @@ module JSONAPI
|
|
7
5
|
def parser
|
8
6
|
lambda do |body|
|
9
7
|
data = JSON.parse(body)
|
10
|
-
JSONAPI.parse_resource!(body)
|
11
8
|
data = { _json: data } unless data.is_a?(Hash)
|
12
9
|
data.with_indifferent_access
|
13
10
|
end
|
@@ -1,18 +1,15 @@
|
|
1
1
|
require 'rails/railtie'
|
2
2
|
require 'action_controller'
|
3
3
|
require 'action_controller/railtie'
|
4
|
+
require 'active_support'
|
4
5
|
|
5
6
|
require 'jsonapi/rails/parser'
|
6
|
-
require 'jsonapi/rails/
|
7
|
+
require 'jsonapi/rails/renderer'
|
7
8
|
|
8
9
|
module JSONAPI
|
9
10
|
module Rails
|
10
11
|
class Railtie < ::Rails::Railtie
|
11
12
|
MEDIA_TYPE = 'application/vnd.api+json'.freeze
|
12
|
-
HEADERS = {
|
13
|
-
response: { 'CONTENT_TYPE'.freeze => MEDIA_TYPE },
|
14
|
-
request: { 'ACCEPT'.freeze => MEDIA_TYPE }
|
15
|
-
}.freeze
|
16
13
|
PARSER = JSONAPI::Rails.parser
|
17
14
|
|
18
15
|
initializer 'JSONAPI::Rails.initialize' do
|
@@ -22,17 +19,28 @@ module JSONAPI
|
|
22
19
|
else
|
23
20
|
ActionDispatch::ParamsParser::DEFAULT_PARSERS[Mime[:jsonapi]] = PARSER
|
24
21
|
end
|
22
|
+
|
25
23
|
ActionController::Renderers.add :jsonapi do |json, options|
|
26
24
|
unless json.is_a?(String)
|
27
|
-
json = JSONAPI::Rails.render(json, options)
|
28
|
-
.to_json(options)
|
25
|
+
json = JSONAPI::Rails::Renderer.render(json, options)
|
29
26
|
end
|
30
27
|
self.content_type ||= Mime[:jsonapi]
|
31
28
|
self.response_body = json
|
32
29
|
end
|
33
30
|
|
34
|
-
|
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
|
35
38
|
end
|
36
39
|
end
|
37
40
|
end
|
38
41
|
end
|
42
|
+
|
43
|
+
ActiveSupport.on_load(:action_controller) do
|
44
|
+
require 'jsonapi/rails/action_controller'
|
45
|
+
include JSONAPI::Rails::ActionController
|
46
|
+
end
|
@@ -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
|
metadata
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jsonapi-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.1.
|
4
|
+
version: 0.1.1.beta2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
- L. Preston Sego III
|
8
7
|
- Lucas Hosseini
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2016-
|
11
|
+
date: 2016-11-16 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: jsonapi-renderer
|
@@ -17,14 +16,14 @@ dependencies:
|
|
17
16
|
requirements:
|
18
17
|
- - '='
|
19
18
|
- !ruby/object:Gem::Version
|
20
|
-
version: 0.1.1.
|
19
|
+
version: 0.1.1.beta3
|
21
20
|
type: :runtime
|
22
21
|
prerelease: false
|
23
22
|
version_requirements: !ruby/object:Gem::Requirement
|
24
23
|
requirements:
|
25
24
|
- - '='
|
26
25
|
- !ruby/object:Gem::Version
|
27
|
-
version: 0.1.1.
|
26
|
+
version: 0.1.1.beta3
|
28
27
|
- !ruby/object:Gem::Dependency
|
29
28
|
name: jsonapi-parser
|
30
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -45,14 +44,14 @@ dependencies:
|
|
45
44
|
requirements:
|
46
45
|
- - '='
|
47
46
|
- !ruby/object:Gem::Version
|
48
|
-
version: 0.1.1.
|
47
|
+
version: 0.1.1.beta3
|
49
48
|
type: :runtime
|
50
49
|
prerelease: false
|
51
50
|
version_requirements: !ruby/object:Gem::Requirement
|
52
51
|
requirements:
|
53
52
|
- - '='
|
54
53
|
- !ruby/object:Gem::Version
|
55
|
-
version: 0.1.1.
|
54
|
+
version: 0.1.1.beta3
|
56
55
|
- !ruby/object:Gem::Dependency
|
57
56
|
name: jsonapi-deserializable
|
58
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -115,17 +114,16 @@ dependencies:
|
|
115
114
|
requirements:
|
116
115
|
- - "~>"
|
117
116
|
- !ruby/object:Gem::Version
|
118
|
-
version: '3.
|
117
|
+
version: '3.5'
|
119
118
|
type: :development
|
120
119
|
prerelease: false
|
121
120
|
version_requirements: !ruby/object:Gem::Requirement
|
122
121
|
requirements:
|
123
122
|
- - "~>"
|
124
123
|
- !ruby/object:Gem::Version
|
125
|
-
version: '3.
|
126
|
-
description:
|
124
|
+
version: '3.5'
|
125
|
+
description: Efficient, convenient, non-intrusive JSONAPI framework for Rails.
|
127
126
|
email:
|
128
|
-
- LPSego3+dev@gmail.com
|
129
127
|
- lucas.hosseini@gmail.com
|
130
128
|
executables: []
|
131
129
|
extensions: []
|
@@ -134,25 +132,17 @@ files:
|
|
134
132
|
- README.md
|
135
133
|
- lib/generators/jsonapi/deserializable/USAGE
|
136
134
|
- lib/generators/jsonapi/deserializable/deserializable_generator.rb
|
137
|
-
- lib/generators/jsonapi/deserializable/serializable_generator.rb
|
138
135
|
- lib/generators/jsonapi/deserializable/templates/deserializable.rb.erb
|
139
|
-
- lib/generators/jsonapi/deserializable/templates/serializable.rb
|
140
|
-
- lib/generators/jsonapi/deserializable/templates/serializable.rb.erb
|
141
136
|
- lib/generators/jsonapi/serializable/USAGE
|
142
137
|
- lib/generators/jsonapi/serializable/serializable_generator.rb
|
143
|
-
- lib/generators/jsonapi/serializable/templates/serializable.rb
|
144
138
|
- lib/generators/jsonapi/serializable/templates/serializable.rb.erb
|
145
|
-
- lib/generators/serializable_generator.rb
|
146
139
|
- lib/jsonapi/rails.rb
|
147
|
-
- lib/jsonapi/rails/
|
140
|
+
- lib/jsonapi/rails/action_controller.rb
|
148
141
|
- lib/jsonapi/rails/deserializable/resource_extensions.rb
|
149
142
|
- lib/jsonapi/rails/parser.rb
|
150
143
|
- lib/jsonapi/rails/railtie.rb
|
151
|
-
- lib/jsonapi/rails/
|
152
|
-
|
153
|
-
- lib/jsonapi/rails/version.rb
|
154
|
-
- lib/tasks/jsonapi/rails_tasks.rake
|
155
|
-
homepage: https://github.com/beauby/jsonapi-rails
|
144
|
+
- lib/jsonapi/rails/renderer.rb
|
145
|
+
homepage: https://github.com/jsonapi-rb/rails
|
156
146
|
licenses:
|
157
147
|
- MIT
|
158
148
|
metadata: {}
|
@@ -175,5 +165,5 @@ rubyforge_project:
|
|
175
165
|
rubygems_version: 2.5.1
|
176
166
|
signing_key:
|
177
167
|
specification_version: 4
|
178
|
-
summary:
|
168
|
+
summary: jsonapi-rb integrations for Rails.
|
179
169
|
test_files: []
|
File without changes
|
@@ -1 +0,0 @@
|
|
1
|
-
# Blah blah
|
@@ -1,34 +0,0 @@
|
|
1
|
-
<% module_namespacing do -%>
|
2
|
-
class Deserializable<%= class_name %> < JSONAPI::Deserializable::Model
|
3
|
-
id
|
4
|
-
|
5
|
-
<% attr_names.each do |attr| -%>
|
6
|
-
attribute :<%= attr %>
|
7
|
-
<% end -%>
|
8
|
-
|
9
|
-
<% has_one_rel_names.each do |name, reflection| -%>
|
10
|
-
has_one :<%= name %> do
|
11
|
-
field :<%= has_one_id_field_name(name) %> do |rel|
|
12
|
-
rel['data'] && rel['data']['id']
|
13
|
-
end
|
14
|
-
<% if reflection.polymorphic? -%>
|
15
|
-
field :<%= has_one_type_field_name(name) %> do
|
16
|
-
rel['data'] && rel['data']['type']
|
17
|
-
end
|
18
|
-
<% end -%>
|
19
|
-
end
|
20
|
-
<% end -%>
|
21
|
-
<% has_many_rel_names.each do |rel| -%>
|
22
|
-
has_many :<%= rel %> do
|
23
|
-
field :<%= has_many_id_field_name(name) %> do |rel|
|
24
|
-
rel['data'].map { |ri| ri['id'] }
|
25
|
-
end
|
26
|
-
<% if reflection.polymorphic? -%>
|
27
|
-
field :<%= has_one_type_field_name(name) %> do
|
28
|
-
rel['data'].map { |ri| ri['type'] }
|
29
|
-
end
|
30
|
-
<% end -%>
|
31
|
-
end
|
32
|
-
<% end -%>
|
33
|
-
end
|
34
|
-
<% end -%>
|
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'jsonapi/deserializable/model'
|
2
|
-
|
3
|
-
module JSONAPI
|
4
|
-
module Rails
|
5
|
-
module Deserializable
|
6
|
-
module ModelExtensions
|
7
|
-
def initialize(params = {})
|
8
|
-
params[:url_helper] ||= ::Rails.application.routes.url_helpers
|
9
|
-
super(params)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
module Serializable
|
16
|
-
class Model
|
17
|
-
prepend JSONAPI::Rails::Serializable::ModelExtensions
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
data/lib/jsonapi/rails/render.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
require 'jsonapi/renderer'
|
2
|
-
require 'jsonapi/serializable/model'
|
3
|
-
|
4
|
-
module JSONAPI
|
5
|
-
module Rails
|
6
|
-
module_function
|
7
|
-
|
8
|
-
def render(resources, options)
|
9
|
-
unless resources.respond_to?(:jsonapi_type)
|
10
|
-
resources = serializable_resources_for(resources)
|
11
|
-
end
|
12
|
-
JSONAPI::Renderer.new(resources, options).as_json
|
13
|
-
end
|
14
|
-
|
15
|
-
def serializable_resources_for(resources)
|
16
|
-
if resources.respond_to?(:each)
|
17
|
-
resources.map { |r| serializable_model_for(r) }
|
18
|
-
else
|
19
|
-
serializable_model_for(resources)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def serializable_model_for(model)
|
24
|
-
serializable_klass_for(model).new(model: model)
|
25
|
-
end
|
26
|
-
|
27
|
-
def serializable_klass_for(model)
|
28
|
-
# TODO(beauby): Move resource inference on class level in
|
29
|
-
# jsonapi-serializable.
|
30
|
-
JSONAPI::Serializable::Model.new.resource_klass_for(model.class)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'jsonapi/serializable/model'
|
2
|
-
|
3
|
-
module JSONAPI
|
4
|
-
module Rails
|
5
|
-
module Serializable
|
6
|
-
module ModelExtensions
|
7
|
-
def initialize(params = {})
|
8
|
-
params[:url_helpers] ||= ::Rails.application.routes.url_helpers
|
9
|
-
super(params)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
module Serializable
|
16
|
-
class Model
|
17
|
-
prepend JSONAPI::Rails::Serializable::ModelExtensions
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|