roar-jsonapi 0.0.2 → 0.0.3

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: ab2ea6e72551ddf89ce11262cdb0dfbaa8cfb5c0
4
- data.tar.gz: a9b2759b687e1c1979b8ceaf12293431e9543630
3
+ metadata.gz: 71ddcd3402871acd7cf0d96ef5d8744fd94c4864
4
+ data.tar.gz: 63f93a300efc0a3d914faffef32fc2be050c9d5e
5
5
  SHA512:
6
- metadata.gz: ff1affc535bb8292dc85014417bfa388bad872e72ac3d26a195615f5e4d401d63fbf28030445014d5fe836dfbbcd63245d7565418f092702907580d69e464946
7
- data.tar.gz: 56d8ef80e9980d5abb6e967d4d5a04e21e335c6ce9dfd9e8db04ee289ddf2baf4acea781cb1784dd469511c9fba7c0eb521c4ffde189a5abf5da8d2a09896869
6
+ metadata.gz: 6a9c053a8ea8e43b8b1d0f09b62ec7d1bdacbfe42470b04405b00c94ce23ba9dadb09f0767e87402f260a4a3957aacd2795e30f2e1c8cc73434296951e1f0796
7
+ data.tar.gz: 35d8fab2888a1e5e4e49a59e54e98cb205b2590666560d855c40d8a6708630fe498dc7d35542ac3527fafb0061aa5570430baaaee47bc54199bf4abaaf1391f9
data/CHANGES.md CHANGED
@@ -1,3 +1,9 @@
1
+ # 0.0.3
2
+
3
+ * Make `Document` module part of public API. This allows other libraries to hook
4
+ ing into the parsing/rendering of all JSON API documents, whether their data
5
+ contains a single Resource Object or a collection of Resource Objects.
6
+
1
7
  # 0.0.2
2
8
 
3
9
  * Require Representable 3.0.3, which replaces `Uber::Option` with the new [`Declarative::Option`](https://github.com/apotonick/declarative-option).
@@ -7,10 +7,13 @@ require 'roar/json/json_api/member_name'
7
7
  require 'roar/json/json_api/defaults'
8
8
  require 'roar/json/json_api/meta'
9
9
  require 'roar/json/json_api/declarative'
10
- require 'roar/json/json_api/for_collection'
11
10
  require 'roar/json/json_api/options'
12
11
  require 'roar/json/json_api/document'
13
12
 
13
+ require 'roar/json/json_api/single_resource'
14
+ require 'roar/json/json_api/resource_collection'
15
+ require 'roar/json/json_api/for_collection'
16
+
14
17
  module Roar
15
18
  module JSON
16
19
  module JSONAPI
@@ -101,6 +104,7 @@ module Roar
101
104
  extend JSONAPI::Declarative
102
105
  extend JSONAPI::ForCollection
103
106
  include JSONAPI::Document
107
+ include JSONAPI::SingleResource
104
108
  self.representation_wrap = :data
105
109
 
106
110
  nested :relationships do
@@ -9,7 +9,7 @@ module Roar
9
9
  # @example Simple rendering
10
10
  # representer.to_json
11
11
  #
12
- # @example Rendering with compount documents and sparse fieldsets
12
+ # @example Rendering with compound documents and sparse fieldsets
13
13
  # uri = Addressable::URI.parse('/articles/1?include=author,comments.author')
14
14
  # query = Rack::Utils.parse_nested_query(uri.query)
15
15
  # # => {"include"=>"author", "fields"=>{"articles"=>"title,body", "people"=>"name"}}
@@ -51,52 +51,7 @@ module Roar
51
51
  #
52
52
  # @api public
53
53
  def to_hash(options = {})
54
- document = super(Options::Include.(options, mappings))
55
- unwrapped = options[:wrap] == false
56
- resource = unwrapped ? document : document['data']
57
- resource['type'] = JSONAPI::MemberName.(self.class.type)
58
-
59
- links = Renderer::Links.new.(resource, options)
60
- meta = render_meta(options)
61
-
62
- resource.reject! do |_, v| v && v.empty? end
63
-
64
- unless unwrapped
65
- included = resource.delete('included')
66
-
67
- HashUtils.store_if_any(document, 'included',
68
- Fragment::Included.(included, options))
69
- end
70
-
71
- HashUtils.store_if_any(resource, 'links', links)
72
- HashUtils.store_if_any(document, 'meta', meta)
73
-
74
- document
75
- end
76
-
77
- private
78
-
79
- def mappings
80
- @mappings ||= begin
81
- mappings = {}
82
- mappings[:id] = find_id_mapping
83
- mappings[:relationships] = find_relationship_mappings
84
- mappings[:relationships]['_self'] = self.class.type
85
- mappings
86
- end
87
- end
88
-
89
- def find_id_mapping
90
- self.class.definitions.detect { |definition|
91
- definition[:as] && definition[:as].(:value) == 'id'
92
- }.name
93
- end
94
-
95
- def find_relationship_mappings
96
- included_definitions = self.class.definitions['included'].representer_module.definitions
97
- included_definitions.each_with_object({}) do |definition, hash|
98
- hash[definition.name] = definition.representer_module.type
99
- end
54
+ super
100
55
  end
101
56
  end
102
57
  end
@@ -8,25 +8,9 @@ module Roar
8
8
 
9
9
  nested_builder.(_base: default_nested_class, _features: [Roar::JSON, Roar::Hypermedia, JSONAPI::Defaults, JSONAPI::Meta], _block: proc do
10
10
  collection :to_a, as: :data, decorator: singular, wrap: false
11
- # rubocop:disable Lint/NestedMethodDefinition
12
- def to_hash(options = {})
13
- document = super(to_a: options, user_options: options[:user_options]) # [{data: {..}, data: {..}}]
14
11
 
15
- links = Renderer::Links.new.(document, options)
16
- meta = render_meta(options)
17
- included = []
18
- document['data'].each do |single|
19
- included += single.delete('included') || []
20
- end
21
-
22
- HashUtils.store_if_any(document, 'included',
23
- Fragment::Included.(included, options))
24
- HashUtils.store_if_any(document, 'links', links)
25
- HashUtils.store_if_any(document, 'meta', meta)
26
-
27
- document
28
- end
29
- # rubocop:enable Lint/NestedMethodDefinition
12
+ include Document
13
+ include ResourceCollection
30
14
  end)
31
15
  end
32
16
  end
@@ -6,7 +6,7 @@ module Roar
6
6
  # Transforms `field:` and `include:`` options to their internal
7
7
  # equivalents.
8
8
  #
9
- # @see Document#to_hash
9
+ # @see SingleResource#to_hash
10
10
  class Include
11
11
  DEFAULT_INTERNAL_INCLUDES = [:attributes, :relationships].freeze
12
12
 
@@ -0,0 +1,29 @@
1
+ module Roar
2
+ module JSON
3
+ module JSONAPI
4
+ # Instance method API for JSON API Documents representing an array of Resources
5
+ #
6
+ # @api private
7
+ module ResourceCollection
8
+ # @see Document#to_hash
9
+ def to_hash(options = {})
10
+ document = super(to_a: options, user_options: options[:user_options]) # [{data: {..}, data: {..}}]
11
+
12
+ links = Renderer::Links.new.(document, options)
13
+ meta = render_meta(options)
14
+ included = []
15
+ document['data'].each do |single|
16
+ included += single.delete('included') || []
17
+ end
18
+
19
+ HashUtils.store_if_any(document, 'included',
20
+ Fragment::Included.(included, options))
21
+ HashUtils.store_if_any(document, 'links', links)
22
+ HashUtils.store_if_any(document, 'meta', meta)
23
+
24
+ document
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,60 @@
1
+ module Roar
2
+ module JSON
3
+ module JSONAPI
4
+ # Instance method API for JSON API Documents representing a single Resource
5
+ #
6
+ # @api private
7
+ module SingleResource
8
+ # @see Document#to_hash
9
+ def to_hash(options = {})
10
+ document = super(Options::Include.(options, mappings))
11
+ unwrapped = options[:wrap] == false
12
+ resource = unwrapped ? document : document['data']
13
+ resource['type'] = JSONAPI::MemberName.(self.class.type)
14
+
15
+ links = Renderer::Links.new.(resource, options)
16
+ meta = render_meta(options)
17
+
18
+ resource.reject! do |_, v| v && v.empty? end
19
+
20
+ unless unwrapped
21
+ included = resource.delete('included')
22
+
23
+ HashUtils.store_if_any(document, 'included',
24
+ Fragment::Included.(included, options))
25
+ end
26
+
27
+ HashUtils.store_if_any(resource, 'links', links)
28
+ HashUtils.store_if_any(document, 'meta', meta)
29
+
30
+ document
31
+ end
32
+
33
+ private
34
+
35
+ def mappings
36
+ @mappings ||= begin
37
+ mappings = {}
38
+ mappings[:id] = find_id_mapping
39
+ mappings[:relationships] = find_relationship_mappings
40
+ mappings[:relationships]['_self'] = self.class.type
41
+ mappings
42
+ end
43
+ end
44
+
45
+ def find_id_mapping
46
+ self.class.definitions.detect { |definition|
47
+ definition[:as] && definition[:as].(:value) == 'id'
48
+ }.name
49
+ end
50
+
51
+ def find_relationship_mappings
52
+ included_definitions = self.class.definitions['included'].representer_module.definitions
53
+ included_definitions.each_with_object({}) do |definition, hash|
54
+ hash[definition.name] = definition.representer_module.type
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -1,7 +1,7 @@
1
1
  module Roar
2
2
  module JSON
3
3
  module JSONAPI
4
- VERSION = '0.0.2'.freeze
4
+ VERSION = '0.0.3'.freeze
5
5
  end
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: roar-jsonapi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nick Sutterer
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-01-28 00:00:00.000000000 Z
12
+ date: 2017-02-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: roar
@@ -115,6 +115,8 @@ files:
115
115
  - lib/roar/json/json_api/member_name.rb
116
116
  - lib/roar/json/json_api/meta.rb
117
117
  - lib/roar/json/json_api/options.rb
118
+ - lib/roar/json/json_api/resource_collection.rb
119
+ - lib/roar/json/json_api/single_resource.rb
118
120
  - lib/roar/json/json_api/version.rb
119
121
  - roar-jsonapi.gemspec
120
122
  - test/jsonapi/collection_render_test.rb