jsonapi-renderer 0.1.1.beta3 → 0.1.1
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 +8 -6
- data/lib/jsonapi/renderer/document.rb +7 -1
- data/lib/jsonapi/renderer/resources_processor.rb +52 -32
- data/lib/jsonapi/renderer.rb +6 -5
- metadata +20 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 07afefd2fe41039cb8c922578ba39e3aba41f5ec
|
4
|
+
data.tar.gz: e269e8a82ad892be4e7f9081e30487301c20d30d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2b79ebe7aa3d18209658d89042d8dfcc06d5a2a837688b57c9d3495b173aa50f65e6f35a0db0d4bb7c40b1fc0915db5b7733f016a4643e3b684b0878db9aac40
|
7
|
+
data.tar.gz: e320d995609cb5a3064533b08b01cf86133a513932ce22bfdc5eeede5c64d2b2c0899fcab2907d10251927910bb4ffd780f641377e722056aff80bb7a616253a
|
data/README.md
CHANGED
@@ -4,7 +4,9 @@ Ruby gem for rendering [JSON API](http://jsonapi.org) documents.
|
|
4
4
|
## Status
|
5
5
|
|
6
6
|
[](https://badge.fury.io/rb/jsonapi-renderer)
|
7
|
-
[](http://travis-ci.org/jsonapi-rb/renderer?branch=master)
|
7
|
+
[](http://travis-ci.org/jsonapi-rb/renderer?branch=master)
|
8
|
+
[](https://codecov.io/gh/jsonapi-rb/renderer)
|
9
|
+
[](https://gitter.im/jsonapi-rb/Lobby)
|
8
10
|
|
9
11
|
## Installation
|
10
12
|
```ruby
|
@@ -40,18 +42,18 @@ class ResourceInterface
|
|
40
42
|
# @return [String]
|
41
43
|
def jsonapi_id; end
|
42
44
|
|
43
|
-
# Returns a hash containing, for each included relationship, the
|
44
|
-
# to be included from that one.
|
45
|
+
# Returns a hash containing, for each included relationship, an array of the
|
46
|
+
# resources to be included from that one.
|
45
47
|
# @param [Array<Symbol>] included_relationships The keys of the relationships
|
46
48
|
# to be included.
|
47
|
-
# @return [Hash{Symbol =>
|
49
|
+
# @return [Hash{Symbol => Array<#ResourceInterface>}]
|
48
50
|
def jsonapi_related(included_relationships); end
|
49
51
|
|
50
52
|
# Returns a JSON API-compliant representation of the resource as a hash.
|
51
53
|
# @param [Hash] options
|
52
54
|
# @option [Array<Symbol>, Nil] fields The requested fields, or nil.
|
53
|
-
# @option [Array<Symbol
|
54
|
-
#
|
55
|
+
# @option [Array<Symbol>] include The requested relationships to
|
56
|
+
# include (defaults to []).
|
55
57
|
# @return [Hash]
|
56
58
|
def as_jsonapi(options = {}); end
|
57
59
|
end
|
@@ -9,7 +9,7 @@ module JSONAPI
|
|
9
9
|
@errors = params.fetch(:errors, [])
|
10
10
|
@meta = params.fetch(:meta, nil)
|
11
11
|
@links = params.fetch(:links, {})
|
12
|
-
@fields = params.fetch(:fields,
|
12
|
+
@fields = _symbolize_fields(params.fetch(:fields, {}))
|
13
13
|
@jsonapi = params.fetch(:jsonapi, nil)
|
14
14
|
@include = JSONAPI::IncludeDirective.new(params.fetch(:include, {}))
|
15
15
|
end
|
@@ -48,6 +48,12 @@ module JSONAPI
|
|
48
48
|
hash[:errors] = @errors.map(&:as_jsonapi)
|
49
49
|
end
|
50
50
|
end
|
51
|
+
|
52
|
+
def _symbolize_fields(fields)
|
53
|
+
fields.each_with_object({}) do |(k, v), h|
|
54
|
+
h[k.to_sym] = v.map(&:to_sym)
|
55
|
+
end
|
56
|
+
end
|
51
57
|
end
|
52
58
|
end
|
53
59
|
end
|
@@ -7,58 +7,78 @@ module JSONAPI
|
|
7
7
|
@resources = resources
|
8
8
|
@include = include
|
9
9
|
@fields = fields
|
10
|
-
@primary = []
|
11
|
-
@included = []
|
12
|
-
@hashes = {}
|
13
|
-
@queue = []
|
14
|
-
@processed = Set.new # NOTE(beauby): Set of [type, id, prefix].
|
15
10
|
end
|
16
11
|
|
17
12
|
def process
|
18
|
-
|
19
|
-
|
20
|
-
@processed.add([res.jsonapi_type, res.jsonapi_id, ''])
|
21
|
-
end
|
22
|
-
until @queue.empty?
|
23
|
-
res, prefix, include_dir = @queue.pop
|
24
|
-
process_resource(res, prefix, include_dir, false)
|
25
|
-
end
|
13
|
+
traverse_resources
|
14
|
+
process_resources
|
26
15
|
|
27
16
|
[@primary, @included]
|
28
17
|
end
|
29
18
|
|
30
19
|
private
|
31
20
|
|
32
|
-
def
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
21
|
+
def traverse_resources
|
22
|
+
@traversed = Set.new # [type, id, prefix]
|
23
|
+
@include_rels = {} # [type, id => Set]
|
24
|
+
@queue = []
|
25
|
+
@primary = []
|
26
|
+
@included = []
|
27
|
+
|
28
|
+
initialize_queue
|
29
|
+
traverse_queue
|
30
|
+
end
|
31
|
+
|
32
|
+
def initialize_queue
|
33
|
+
@resources.each do |res|
|
34
|
+
@traversed.add([res.jsonapi_type, res.jsonapi_id, ''])
|
35
|
+
traverse_resource(res, @include.keys, true)
|
36
|
+
enqueue_related_resources(res, '', @include)
|
38
37
|
end
|
39
38
|
end
|
40
39
|
|
41
|
-
def
|
40
|
+
def traverse_queue
|
41
|
+
until @queue.empty?
|
42
|
+
res, prefix, include_dir = @queue.shift
|
43
|
+
traverse_resource(res, include_dir.keys, false)
|
44
|
+
enqueue_related_resources(res, prefix, include_dir)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def traverse_resource(res, include_keys, primary)
|
42
49
|
ri = [res.jsonapi_type, res.jsonapi_id]
|
43
|
-
|
44
|
-
|
45
|
-
if @hashes.key?(ri)
|
46
|
-
merge_resources!(@hashes[ri], hash)
|
50
|
+
if @include_rels.include?(ri)
|
51
|
+
@include_rels[ri].merge!(include_keys)
|
47
52
|
else
|
48
|
-
|
53
|
+
@include_rels[ri] = Set.new(include_keys)
|
54
|
+
(primary ? @primary : @included) << res
|
49
55
|
end
|
50
|
-
process_relationships(res, prefix, include_dir)
|
51
56
|
end
|
52
57
|
|
53
|
-
def
|
58
|
+
def enqueue_related_resources(res, prefix, include_dir)
|
54
59
|
res.jsonapi_related(include_dir.keys).each do |key, data|
|
55
|
-
|
60
|
+
data.each do |child_res|
|
56
61
|
next if child_res.nil?
|
57
62
|
child_prefix = "#{prefix}.#{key}"
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
63
|
+
enqueue_resource(child_res, child_prefix, include_dir[key])
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def enqueue_resource(res, prefix, include_dir)
|
69
|
+
return unless @traversed.add?([res.jsonapi_type,
|
70
|
+
res.jsonapi_id,
|
71
|
+
prefix])
|
72
|
+
@queue << [res, prefix, include_dir]
|
73
|
+
end
|
74
|
+
|
75
|
+
def process_resources
|
76
|
+
[@primary, @included].each do |resources|
|
77
|
+
resources.map! do |res|
|
78
|
+
ri = [res.jsonapi_type, res.jsonapi_id]
|
79
|
+
include_dir = @include_rels[ri]
|
80
|
+
fields = @fields[res.jsonapi_type.to_sym]
|
81
|
+
res.as_jsonapi(include: include_dir, fields: fields)
|
62
82
|
end
|
63
83
|
end
|
64
84
|
end
|
data/lib/jsonapi/renderer.rb
CHANGED
@@ -7,13 +7,14 @@ module JSONAPI
|
|
7
7
|
#
|
8
8
|
# @param [Hash] params
|
9
9
|
# @option [(#jsonapi_id, #jsonapi_type, #jsonapi_related, #as_jsonapi),
|
10
|
-
# Array<(#jsonapi_id, #jsonapi_type, #jsonapi_related,
|
10
|
+
# Array<(#jsonapi_id, #jsonapi_type, #jsonapi_related,
|
11
|
+
# #as_jsonapi)>,
|
11
12
|
# nil] data Primary resource(s) to be rendered.
|
12
13
|
# @option [Array<#jsonapi_id>] errors Errors to be rendered.
|
13
|
-
# @option
|
14
|
-
#
|
15
|
-
# @option [Hash{Symbol, Array<Symbol>}
|
16
|
-
# for some or all of the resource types.
|
14
|
+
# @option include Relationships to be included. See
|
15
|
+
# JSONAPI::IncludeDirective.
|
16
|
+
# @option [Hash{Symbol, Array<Symbol>}, Hash{String, Array<String>}] fields
|
17
|
+
# List of requested fields for some or all of the resource types.
|
17
18
|
# @option [Hash] meta Non-standard top-level meta information to be
|
18
19
|
# included.
|
19
20
|
# @option [Hash] links Top-level links to be included.
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jsonapi-renderer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.1
|
4
|
+
version: 0.1.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: 2016-
|
11
|
+
date: 2016-12-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '3.5'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: codecov
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.1'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.1'
|
41
55
|
description: Efficiently render JSON API documents.
|
42
56
|
email: lucas.hosseini@gmail.com
|
43
57
|
executables: []
|
@@ -50,7 +64,7 @@ files:
|
|
50
64
|
- lib/jsonapi/renderer.rb
|
51
65
|
- lib/jsonapi/renderer/document.rb
|
52
66
|
- lib/jsonapi/renderer/resources_processor.rb
|
53
|
-
homepage: https://github.com/jsonapi-rb/renderer
|
67
|
+
homepage: https://github.com/jsonapi-rb/jsonapi-renderer
|
54
68
|
licenses:
|
55
69
|
- MIT
|
56
70
|
metadata: {}
|
@@ -65,12 +79,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
65
79
|
version: '0'
|
66
80
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
67
81
|
requirements:
|
68
|
-
- - "
|
82
|
+
- - ">="
|
69
83
|
- !ruby/object:Gem::Version
|
70
|
-
version:
|
84
|
+
version: '0'
|
71
85
|
requirements: []
|
72
86
|
rubyforge_project:
|
73
|
-
rubygems_version: 2.
|
87
|
+
rubygems_version: 2.6.8
|
74
88
|
signing_key:
|
75
89
|
specification_version: 4
|
76
90
|
summary: Render JSONAPI documents.
|