jsonapi-hanami 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 +15 -3
- data/lib/jsonapi/hanami/action.rb +4 -4
- data/lib/jsonapi/hanami/commands/generate/deserializable.rb +12 -0
- data/lib/jsonapi/hanami/{deserializable.rb → deserialization.rb} +19 -10
- data/lib/jsonapi/hanami/generators/deserializable.rb +7 -0
- data/lib/jsonapi/hanami/rendering.rb +67 -0
- data/lib/jsonapi/hanami/rendering/dsl.rb +47 -0
- metadata +19 -16
- data/lib/jsonapi/hanami/renderer.rb +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b0b7a3e38db607b870ef29a1c25959f8eff78b4d
|
4
|
+
data.tar.gz: 61936fb8435c552b44a5f7b498efbcd436c7d168
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eefac983e6f2d404a2f85ae2d7469a5bb5f7370062dcf5b41e3363479f2449f5d45eb447b640a32cce1bf1bdbc492e47faa789607645c5cb35240561eb908c7f
|
7
|
+
data.tar.gz: e0a1656fa2b6f5eb1913efbd377c411fff3339c62619b83e3d786316e022f3017cef1093b9d783a9aec63795cf8723c4da288880313766231ac7719587365e86
|
data/README.md
CHANGED
@@ -40,9 +40,21 @@ module API::Controllers::Posts
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def call(params)
|
43
|
-
|
44
|
-
|
45
|
-
|
43
|
+
unless params.valid?
|
44
|
+
self.errors = params.errors
|
45
|
+
return
|
46
|
+
end
|
47
|
+
|
48
|
+
repo = UserRepository.new
|
49
|
+
user = repo.create(params[:user])
|
50
|
+
|
51
|
+
self.data = user
|
52
|
+
self.meta = { foo: 'bar' }
|
53
|
+
self.links = { self: 'foo://bar' }
|
54
|
+
self.jsonapi = { version: '1.0', meta: { foo: 'bar' } }
|
55
|
+
# Also available:
|
56
|
+
# self.included = { posts: [:author, comments: [:author]] }
|
57
|
+
# self.fields = { posts: [:title, :date], users: [:name] }
|
46
58
|
end
|
47
59
|
end
|
48
60
|
end
|
@@ -1,13 +1,13 @@
|
|
1
|
-
require 'jsonapi/hanami/
|
2
|
-
require 'jsonapi/hanami/
|
1
|
+
require 'jsonapi/hanami/deserialization'
|
2
|
+
require 'jsonapi/hanami/rendering'
|
3
3
|
|
4
4
|
module JSONAPI
|
5
5
|
module Hanami
|
6
6
|
module Action
|
7
7
|
def self.included(base)
|
8
8
|
base.class_eval do
|
9
|
-
include
|
10
|
-
include
|
9
|
+
include Deserialization
|
10
|
+
include Rendering
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
@@ -3,7 +3,7 @@ require 'jsonapi/parser'
|
|
3
3
|
|
4
4
|
module JSONAPI
|
5
5
|
module Hanami
|
6
|
-
module
|
6
|
+
module Deserialization
|
7
7
|
def self.included(base)
|
8
8
|
base.extend ClassMethods
|
9
9
|
end
|
@@ -13,19 +13,21 @@ module JSONAPI
|
|
13
13
|
if klass.nil?
|
14
14
|
klass = Class.new(JSONAPI::Deserializable::Resource, &block)
|
15
15
|
end
|
16
|
-
use
|
16
|
+
use DeserializeResource, key, klass
|
17
17
|
end
|
18
18
|
|
19
19
|
def deserializable_relationship(key, klass = nil, &block)
|
20
20
|
if klass.nil?
|
21
21
|
klass = Class.new(JSONAPI::Deserializable::Relationship, &block)
|
22
22
|
end
|
23
|
-
use
|
23
|
+
use DeserializeRelationship, key, klass
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
class
|
27
|
+
class DeserializationMiddleware
|
28
28
|
ROUTER_PARAMS = 'router.params'.freeze
|
29
|
+
ROUTER_PARSED_BODY = 'router.parsed_body'.freeze
|
30
|
+
JSONAPI_KEYS = [:data, :meta, :links, :jsonapi].freeze
|
29
31
|
|
30
32
|
def initialize(app, key, klass)
|
31
33
|
@app = app
|
@@ -34,22 +36,29 @@ module JSONAPI
|
|
34
36
|
end
|
35
37
|
|
36
38
|
def call(env)
|
37
|
-
env[
|
38
|
-
|
39
|
-
|
40
|
-
|
39
|
+
body = env[ROUTER_PARSED_BODY]
|
40
|
+
parser.parse!(body)
|
41
|
+
deserialized_hash = @deserializable_class.call(body)
|
42
|
+
params = env[ROUTER_PARAMS]
|
43
|
+
# TODO(beauby): Actually replace the request body upstream instead
|
44
|
+
# of hacking it here.
|
45
|
+
params[:_jsonapi] = {}
|
46
|
+
JSONAPI_KEYS.each do |key|
|
47
|
+
params[:_jsonapi][key] = params.delete(key) if params.key?(key)
|
41
48
|
end
|
49
|
+
params[@deserializable_key] = deserialized_hash
|
50
|
+
|
42
51
|
@app.call(env)
|
43
52
|
end
|
44
53
|
end
|
45
54
|
|
46
|
-
class
|
55
|
+
class DeserializeResource < DeserializationMiddleware
|
47
56
|
def parser
|
48
57
|
JSONAPI::Parser::Resource
|
49
58
|
end
|
50
59
|
end
|
51
60
|
|
52
|
-
class
|
61
|
+
class DeserializeRelationship < DeserializationMiddleware
|
53
62
|
def parser
|
54
63
|
JSONAPI::Parser::Relationship
|
55
64
|
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'jsonapi/serializable'
|
2
|
+
require 'jsonapi/hanami/rendering/dsl'
|
3
|
+
|
4
|
+
module JSONAPI
|
5
|
+
module Hanami
|
6
|
+
module Rendering
|
7
|
+
def self.included(base)
|
8
|
+
base.class_eval do
|
9
|
+
include JSONAPI::Hanami::Rendering::DSL
|
10
|
+
|
11
|
+
after do
|
12
|
+
_jsonapi_render if @_body.nil?
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def _jsonapi_render
|
18
|
+
if @_jsonapi.key?(:errors)
|
19
|
+
_jsonapi_render_error
|
20
|
+
else
|
21
|
+
_jsonapi_render_success
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def _jsonapi_render_success
|
26
|
+
self.format = :jsonapi if @format.nil?
|
27
|
+
return unless @_jsonapi.key?(:data)
|
28
|
+
self.body = JSONAPI::Serializable::Renderer.render(@_jsonapi[:data],
|
29
|
+
_jsonapi_params)
|
30
|
+
end
|
31
|
+
|
32
|
+
# NOTE(beauby): It might be worth factoring those methods out into a
|
33
|
+
# class.
|
34
|
+
def _jsonapi_params
|
35
|
+
# TODO(beauby): Inject global params (toplevel jsonapi, etc.).
|
36
|
+
@_jsonapi.dup.merge!(expose: _jsonapi_exposures)
|
37
|
+
end
|
38
|
+
|
39
|
+
def _jsonapi_exposures
|
40
|
+
{ routes: routes }.merge!(exposures)
|
41
|
+
end
|
42
|
+
|
43
|
+
def _jsonapi_render_error
|
44
|
+
document =
|
45
|
+
JSONAPI::Serializable::ErrorRenderer.render(@_jsonapi[:errors],
|
46
|
+
_jsonapi_error_params)
|
47
|
+
self.status = _jsonapi_error_status unless @_status
|
48
|
+
self.format = :jsonapi if @format.nil?
|
49
|
+
self.body = document
|
50
|
+
end
|
51
|
+
|
52
|
+
def _jsonapi_error_status
|
53
|
+
# TODO(beauby): Set HTTP status code accordingly.
|
54
|
+
400
|
55
|
+
end
|
56
|
+
|
57
|
+
def _jsonapi_error_params
|
58
|
+
@_jsonapi
|
59
|
+
end
|
60
|
+
|
61
|
+
def _jsonapi_errors
|
62
|
+
# TODO(beauby): Implement inferrence for Hanami::Validations.
|
63
|
+
@_jsonapi[:errors]
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module JSONAPI
|
2
|
+
module Hanami
|
3
|
+
module Rendering
|
4
|
+
module DSL
|
5
|
+
def data=(value)
|
6
|
+
(@_jsonapi ||= {}).merge!(data: value)
|
7
|
+
end
|
8
|
+
|
9
|
+
def errors=(value)
|
10
|
+
(@_jsonapi ||= {}).merge!(errors: value)
|
11
|
+
end
|
12
|
+
|
13
|
+
def include=(value)
|
14
|
+
(@_jsonapi ||= {}).merge!(include: value)
|
15
|
+
end
|
16
|
+
|
17
|
+
def fields=(value)
|
18
|
+
(@_jsonapi ||= {}).merge!(fields: value)
|
19
|
+
end
|
20
|
+
|
21
|
+
def meta=(value)
|
22
|
+
(@_jsonapi ||= {}).merge!(meta: value)
|
23
|
+
end
|
24
|
+
|
25
|
+
def links=(value)
|
26
|
+
(@_jsonapi ||= {}).merge!(links: value)
|
27
|
+
end
|
28
|
+
|
29
|
+
def jsonapi=(value)
|
30
|
+
(@_jsonapi ||= {}).merge!(jsonapi: value)
|
31
|
+
end
|
32
|
+
|
33
|
+
def serializable_class=(value)
|
34
|
+
(@_jsonapi ||= {}).merge!(class: value)
|
35
|
+
end
|
36
|
+
|
37
|
+
def serializable_namespace=(value)
|
38
|
+
(@_jsonapi ||= {}).merge!(namespace: value)
|
39
|
+
end
|
40
|
+
|
41
|
+
def serializable_inferer=(value)
|
42
|
+
(@_jsonapi ||= {}).merge!(inferer: value)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jsonapi-hanami
|
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
7
|
- Lucas Hosseini
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jsonapi-renderer
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.1.1.
|
19
|
+
version: 0.1.1.beta3
|
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.1.
|
26
|
+
version: 0.1.1.beta3
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: jsonapi-parser
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - '='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.1.1.
|
47
|
+
version: 0.1.1.beta3
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.1.1.
|
54
|
+
version: 0.1.1.beta3
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: jsonapi-deserializable
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -70,31 +70,31 @@ dependencies:
|
|
70
70
|
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '11.3'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '11.3'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rspec
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '3.
|
89
|
+
version: '3.5'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '3.
|
97
|
-
description:
|
96
|
+
version: '3.5'
|
97
|
+
description: Efficient, convenient, non-intrusive JSONAPI framework for Hanami.
|
98
98
|
email: lucas.hosseini@gmail.com
|
99
99
|
executables: []
|
100
100
|
extensions: []
|
@@ -104,8 +104,11 @@ files:
|
|
104
104
|
- lib/generators/hanami/serializable.rb
|
105
105
|
- lib/jsonapi/hanami.rb
|
106
106
|
- lib/jsonapi/hanami/action.rb
|
107
|
-
- lib/jsonapi/hanami/deserializable.rb
|
108
|
-
- lib/jsonapi/hanami/
|
107
|
+
- lib/jsonapi/hanami/commands/generate/deserializable.rb
|
108
|
+
- lib/jsonapi/hanami/deserialization.rb
|
109
|
+
- lib/jsonapi/hanami/generators/deserializable.rb
|
110
|
+
- lib/jsonapi/hanami/rendering.rb
|
111
|
+
- lib/jsonapi/hanami/rendering/dsl.rb
|
109
112
|
homepage: https://github.com/jsonapi-rb/hanami
|
110
113
|
licenses:
|
111
114
|
- MIT
|
@@ -129,5 +132,5 @@ rubyforge_project:
|
|
129
132
|
rubygems_version: 2.5.1
|
130
133
|
signing_key:
|
131
134
|
specification_version: 4
|
132
|
-
summary:
|
135
|
+
summary: jsonapi-rb integrations for Hanami.
|
133
136
|
test_files: []
|
@@ -1,13 +0,0 @@
|
|
1
|
-
require 'jsonapi/renderer'
|
2
|
-
|
3
|
-
module JSONAPI
|
4
|
-
module Hanami
|
5
|
-
module Renderer
|
6
|
-
def jsonapi_render(resources, params = {})
|
7
|
-
# TODO(beauby): Serializable inference with helpers injection.
|
8
|
-
# TODO(beauby): Inject global params (toplevel jsonapi, etc.).
|
9
|
-
JSONAPI::Renderer.new(resources, params).as_json
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|