graphiti-rb 1.0.alpha.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -0
  4. data/.ruby-version +1 -0
  5. data/.travis.yml +20 -0
  6. data/.yardopts +2 -0
  7. data/Appraisals +11 -0
  8. data/CODE_OF_CONDUCT.md +49 -0
  9. data/Gemfile +12 -0
  10. data/Guardfile +32 -0
  11. data/LICENSE.txt +21 -0
  12. data/README.md +75 -0
  13. data/Rakefile +15 -0
  14. data/bin/appraisal +17 -0
  15. data/bin/console +14 -0
  16. data/bin/rspec +17 -0
  17. data/bin/setup +8 -0
  18. data/gemfiles/rails_4.gemfile +17 -0
  19. data/gemfiles/rails_5.gemfile +17 -0
  20. data/graphiti.gemspec +34 -0
  21. data/lib/generators/jsonapi/resource_generator.rb +169 -0
  22. data/lib/generators/jsonapi/templates/application_resource.rb.erb +15 -0
  23. data/lib/generators/jsonapi/templates/controller.rb.erb +61 -0
  24. data/lib/generators/jsonapi/templates/create_request_spec.rb.erb +30 -0
  25. data/lib/generators/jsonapi/templates/destroy_request_spec.rb.erb +20 -0
  26. data/lib/generators/jsonapi/templates/index_request_spec.rb.erb +22 -0
  27. data/lib/generators/jsonapi/templates/resource.rb.erb +11 -0
  28. data/lib/generators/jsonapi/templates/resource_reads_spec.rb.erb +62 -0
  29. data/lib/generators/jsonapi/templates/resource_writes_spec.rb.erb +63 -0
  30. data/lib/generators/jsonapi/templates/show_request_spec.rb.erb +21 -0
  31. data/lib/generators/jsonapi/templates/update_request_spec.rb.erb +34 -0
  32. data/lib/graphiti-rb.rb +1 -0
  33. data/lib/graphiti.rb +121 -0
  34. data/lib/graphiti/adapters/abstract.rb +516 -0
  35. data/lib/graphiti/adapters/active_record.rb +6 -0
  36. data/lib/graphiti/adapters/active_record/base.rb +249 -0
  37. data/lib/graphiti/adapters/active_record/belongs_to_sideload.rb +17 -0
  38. data/lib/graphiti/adapters/active_record/has_many_sideload.rb +17 -0
  39. data/lib/graphiti/adapters/active_record/has_one_sideload.rb +17 -0
  40. data/lib/graphiti/adapters/active_record/inferrence.rb +12 -0
  41. data/lib/graphiti/adapters/active_record/many_to_many_sideload.rb +30 -0
  42. data/lib/graphiti/adapters/null.rb +236 -0
  43. data/lib/graphiti/base.rb +70 -0
  44. data/lib/graphiti/configuration.rb +21 -0
  45. data/lib/graphiti/context.rb +16 -0
  46. data/lib/graphiti/deserializer.rb +208 -0
  47. data/lib/graphiti/errors.rb +309 -0
  48. data/lib/graphiti/extensions/boolean_attribute.rb +33 -0
  49. data/lib/graphiti/extensions/extra_attribute.rb +70 -0
  50. data/lib/graphiti/extensions/temp_id.rb +26 -0
  51. data/lib/graphiti/filter_operators.rb +25 -0
  52. data/lib/graphiti/hash_renderer.rb +57 -0
  53. data/lib/graphiti/jsonapi_serializable_ext.rb +50 -0
  54. data/lib/graphiti/query.rb +251 -0
  55. data/lib/graphiti/rails.rb +28 -0
  56. data/lib/graphiti/railtie.rb +74 -0
  57. data/lib/graphiti/renderer.rb +60 -0
  58. data/lib/graphiti/resource.rb +110 -0
  59. data/lib/graphiti/resource/configuration.rb +239 -0
  60. data/lib/graphiti/resource/dsl.rb +138 -0
  61. data/lib/graphiti/resource/interface.rb +32 -0
  62. data/lib/graphiti/resource/polymorphism.rb +68 -0
  63. data/lib/graphiti/resource/sideloading.rb +102 -0
  64. data/lib/graphiti/resource_proxy.rb +127 -0
  65. data/lib/graphiti/responders.rb +19 -0
  66. data/lib/graphiti/runner.rb +25 -0
  67. data/lib/graphiti/scope.rb +98 -0
  68. data/lib/graphiti/scoping/base.rb +99 -0
  69. data/lib/graphiti/scoping/default_filter.rb +58 -0
  70. data/lib/graphiti/scoping/extra_attributes.rb +29 -0
  71. data/lib/graphiti/scoping/filter.rb +93 -0
  72. data/lib/graphiti/scoping/filterable.rb +36 -0
  73. data/lib/graphiti/scoping/paginate.rb +87 -0
  74. data/lib/graphiti/scoping/sort.rb +64 -0
  75. data/lib/graphiti/sideload.rb +281 -0
  76. data/lib/graphiti/sideload/belongs_to.rb +34 -0
  77. data/lib/graphiti/sideload/has_many.rb +16 -0
  78. data/lib/graphiti/sideload/has_one.rb +9 -0
  79. data/lib/graphiti/sideload/many_to_many.rb +24 -0
  80. data/lib/graphiti/sideload/polymorphic_belongs_to.rb +108 -0
  81. data/lib/graphiti/stats/dsl.rb +89 -0
  82. data/lib/graphiti/stats/payload.rb +49 -0
  83. data/lib/graphiti/types.rb +172 -0
  84. data/lib/graphiti/util/attribute_check.rb +88 -0
  85. data/lib/graphiti/util/field_params.rb +16 -0
  86. data/lib/graphiti/util/hash.rb +51 -0
  87. data/lib/graphiti/util/hooks.rb +33 -0
  88. data/lib/graphiti/util/include_params.rb +39 -0
  89. data/lib/graphiti/util/persistence.rb +219 -0
  90. data/lib/graphiti/util/relationship_payload.rb +64 -0
  91. data/lib/graphiti/util/serializer_attributes.rb +97 -0
  92. data/lib/graphiti/util/sideload.rb +33 -0
  93. data/lib/graphiti/util/validation_response.rb +78 -0
  94. data/lib/graphiti/version.rb +3 -0
  95. metadata +317 -0
@@ -0,0 +1,64 @@
1
+ module Graphiti
2
+ module Util
3
+ # Helper methods for traversing the 'relationships' JSONAPI payloads
4
+ # @api private
5
+ class RelationshipPayload
6
+ attr_reader :resource, :payload
7
+
8
+ def self.iterate(resource:, relationships: {}, only: [], except: [])
9
+ instance = new(resource, relationships, only: only, except: except)
10
+ instance.iterate do |sideload, relationship_data, sub_relationships|
11
+ yield sideload, relationship_data, sub_relationships
12
+ end
13
+ end
14
+
15
+ def initialize(resource, payload, only: [], except: [])
16
+ @resource = resource
17
+ @payload = payload
18
+ @only = only
19
+ @except = except
20
+ end
21
+
22
+ def iterate
23
+ payload.each_pair do |relationship_name, relationship_payload|
24
+ if sl = resource.class.sideload(relationship_name.to_sym)
25
+ if should_yield?(sl.type)
26
+ if relationship_payload.is_a?(Array)
27
+ relationship_payload.each do |rp|
28
+ yield payload_for(sl, rp)
29
+ end
30
+ else
31
+ yield payload_for(sl, relationship_payload)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def should_yield?(type)
41
+ (@only.length > 0 && @only.include?(type)) ||
42
+ (@except.length > 0 && !@except.include?(type))
43
+ end
44
+
45
+ def payload_for(sideload, relationship_payload)
46
+ if sideload.polymorphic_parent?
47
+ type = relationship_payload[:meta][:jsonapi_type]
48
+ sideload = sideload.child_for_type(type.to_sym)
49
+ end
50
+ relationship_payload[:meta][:method] ||= :update
51
+
52
+ {
53
+ sideload: sideload,
54
+ is_polymorphic: sideload.polymorphic_child?,
55
+ primary_key: sideload.primary_key,
56
+ foreign_key: sideload.foreign_key,
57
+ attributes: relationship_payload[:attributes],
58
+ meta: relationship_payload[:meta],
59
+ relationships: relationship_payload[:relationships]
60
+ }
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,97 @@
1
+ module Graphiti
2
+ module Util
3
+ class SerializerAttribute
4
+ def initialize(name, attr, resource, serializer, extra)
5
+ @name = name
6
+ @attr = attr
7
+ @resource = resource
8
+ @serializer = serializer
9
+ @extra = extra
10
+ end
11
+
12
+ def apply
13
+ return unless readable?
14
+
15
+ if @name == :id
16
+ @serializer.id(&@attr[:proc]) if @attr[:proc]
17
+ elsif @attr[:proc]
18
+ @serializer.send(_method, @name, serializer_options, &proc)
19
+ else
20
+ if @serializer.attribute_blocks[@name].nil?
21
+ @serializer.send(_method, @name, serializer_options, &proc)
22
+ else
23
+ inner = @serializer.attribute_blocks.delete(@name)
24
+ wrapped = wrap_proc(inner)
25
+ @serializer.send(_method, @name, serializer_options, &wrapped)
26
+ end
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ def _method
33
+ extra? ? :extra_attribute : :attribute
34
+ end
35
+
36
+ def extra?
37
+ !!@extra
38
+ end
39
+
40
+ def readable?
41
+ !!@attr[:readable]
42
+ end
43
+
44
+ def guard
45
+ _method = @attr[:readable]
46
+ instance = @resource.new
47
+ -> { instance.instance_eval(&_method) }
48
+ end
49
+
50
+ def guard?
51
+ @attr[:readable] != true
52
+ end
53
+
54
+ def serializer_options
55
+ {}.tap do |opts|
56
+ opts[:if] = guard if guard?
57
+ end
58
+ end
59
+
60
+ def default_proc
61
+ _name = @name
62
+ _resource = @resource.new
63
+ ->(_) {
64
+ _resource.typecast(_name, @object.send(_name), :readable)
65
+ }
66
+ end
67
+
68
+ def wrap_proc(inner)
69
+ type_name = @attr[:type]
70
+ ->(serializer_instance = nil) {
71
+ type = Graphiti::Types[type_name]
72
+ type[:read][serializer_instance.instance_eval(&inner)]
73
+ }
74
+ end
75
+
76
+ def proc
77
+ @attr[:proc] ? wrap_proc(@attr[:proc]) : default_proc
78
+ end
79
+ end
80
+
81
+ class SerializerAttributes
82
+ def initialize(resource, attributes, extra = false)
83
+ @resource = resource
84
+ @serializer = resource.serializer
85
+ @attributes = attributes
86
+ @extra = extra
87
+ end
88
+
89
+ def apply
90
+ @attributes.each_pair do |name, attr|
91
+ SerializerAttribute
92
+ .new(name, attr, @resource, @serializer, @extra).apply
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,33 @@
1
+ module Graphiti
2
+ module Util
3
+ # @api private
4
+ class Sideload
5
+ # Determine the namespace for the sideload
6
+ #
7
+ # In other words, given a query like
8
+ # /things?include=a.b
9
+ #
10
+ # When 'a' is sideloading 'b', b's namespace is 'b'.
11
+ #
12
+ # However, consider a recursive tree structure:
13
+ #
14
+ # /things?include=children.children
15
+ #
16
+ # The first occurrance of "children" will have the namespace
17
+ # "children", the second will be "children.children" and so forth.
18
+ #
19
+ # This is used to match up other criteria in the query:
20
+ #
21
+ # ?filter[children.children][a]=b
22
+ #
23
+ # @api private
24
+ def self.namespace(a, b)
25
+ if a.to_s.split('.')[0] == b.to_s
26
+ :"#{a}.#{b}"
27
+ else
28
+ b
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,78 @@
1
+ # We need to know two things in the response of a persistence call:
2
+ #
3
+ # * The model we just tried to persist
4
+ # * Was the persistence successful?
5
+ #
6
+ # This object wraps those bits of data. The call is considered
7
+ # unsuccessful when it adheres to the ActiveModel#errors interface,
8
+ # and #errors is not blank. In other words, it is not successful if
9
+ # there were validation errors.
10
+ #
11
+ # @attr_reader object the object we are saving
12
+ class Graphiti::Util::ValidationResponse
13
+ attr_reader :object
14
+
15
+ # @param object the model instance we tried to save
16
+ # @param deserialized_params see Base#deserialized_params
17
+ def initialize(object, deserialized_params)
18
+ @object = object
19
+ @deserialized_params = deserialized_params
20
+ end
21
+
22
+ # Check to ensure no validation errors.
23
+ # @return [Boolean] did the persistence call succeed?
24
+ def success?
25
+ all_valid?(object, relationships)
26
+ end
27
+
28
+ # @return [Array] the object and success state
29
+ def to_a
30
+ [object, success?]
31
+ end
32
+
33
+ def validate!
34
+ unless success?
35
+ raise ::Graphiti::Errors::ValidationError.new(self)
36
+ end
37
+ self
38
+ end
39
+
40
+ private
41
+
42
+ def relationships
43
+ if @deserialized_params
44
+ @deserialized_params.relationships
45
+ else
46
+ {}
47
+ end
48
+ end
49
+
50
+ def valid_object?(object)
51
+ !object.respond_to?(:errors) ||
52
+ (object.respond_to?(:errors) && object.errors.blank?)
53
+ end
54
+
55
+ def all_valid?(model, deserialized_params)
56
+ valid = true
57
+ return false unless valid_object?(model)
58
+ deserialized_params.each_pair do |name, payload|
59
+ if payload.is_a?(Array)
60
+ related_objects = model.send(name)
61
+ related_objects.each do |r|
62
+ valid = valid_object?(r)
63
+
64
+ if valid
65
+ valid = all_valid?(r, deserialized_params[:relationships] || {})
66
+ end
67
+ end
68
+ else
69
+ related_object = model.send(name)
70
+ valid = valid_object?(related_object)
71
+ if valid
72
+ valid = all_valid?(related_object, deserialized_params[:relationships] || {})
73
+ end
74
+ end
75
+ end
76
+ valid
77
+ end
78
+ end
@@ -0,0 +1,3 @@
1
+ module Graphiti
2
+ VERSION = "1.0.alpha.1"
3
+ end
metadata ADDED
@@ -0,0 +1,317 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: graphiti-rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.alpha.1
5
+ platform: ruby
6
+ authors:
7
+ - Lee Richmond
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-07-31 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: jsonapi-serializable
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.3.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.3.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: dry-types
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.13'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.13'
41
+ - !ruby/object:Gem::Dependency
42
+ name: jsonapi_errorable
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.9'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.9'
55
+ - !ruby/object:Gem::Dependency
56
+ name: concurrent-ruby
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: activerecord
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '4.1'
76
+ - - "<"
77
+ - !ruby/object:Gem::Version
78
+ version: '6'
79
+ type: :development
80
+ prerelease: false
81
+ version_requirements: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '4.1'
86
+ - - "<"
87
+ - !ruby/object:Gem::Version
88
+ version: '6'
89
+ - !ruby/object:Gem::Dependency
90
+ name: kaminari
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '0.17'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '0.17'
103
+ - !ruby/object:Gem::Dependency
104
+ name: bundler
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.12'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1.12'
117
+ - !ruby/object:Gem::Dependency
118
+ name: rake
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '10.0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '10.0'
131
+ - !ruby/object:Gem::Dependency
132
+ name: sqlite3
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ - !ruby/object:Gem::Dependency
146
+ name: database_cleaner
147
+ requirement: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - ">="
150
+ - !ruby/object:Gem::Version
151
+ version: '0'
152
+ type: :development
153
+ prerelease: false
154
+ version_requirements: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ - !ruby/object:Gem::Dependency
160
+ name: activemodel
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '4.1'
166
+ - - "<"
167
+ - !ruby/object:Gem::Version
168
+ version: '6'
169
+ type: :development
170
+ prerelease: false
171
+ version_requirements: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - ">="
174
+ - !ruby/object:Gem::Version
175
+ version: '4.1'
176
+ - - "<"
177
+ - !ruby/object:Gem::Version
178
+ version: '6'
179
+ - !ruby/object:Gem::Dependency
180
+ name: jsonapi_spec_helpers
181
+ requirement: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - ">="
184
+ - !ruby/object:Gem::Version
185
+ version: 1.0.alpha.1
186
+ type: :development
187
+ prerelease: false
188
+ version_requirements: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - ">="
191
+ - !ruby/object:Gem::Version
192
+ version: 1.0.alpha.1
193
+ description:
194
+ email:
195
+ - richmolj@gmail.com
196
+ executables: []
197
+ extensions: []
198
+ extra_rdoc_files: []
199
+ files:
200
+ - ".gitignore"
201
+ - ".rspec"
202
+ - ".ruby-version"
203
+ - ".travis.yml"
204
+ - ".yardopts"
205
+ - Appraisals
206
+ - CODE_OF_CONDUCT.md
207
+ - Gemfile
208
+ - Guardfile
209
+ - LICENSE.txt
210
+ - README.md
211
+ - Rakefile
212
+ - bin/appraisal
213
+ - bin/console
214
+ - bin/rspec
215
+ - bin/setup
216
+ - gemfiles/rails_4.gemfile
217
+ - gemfiles/rails_5.gemfile
218
+ - graphiti.gemspec
219
+ - lib/generators/jsonapi/resource_generator.rb
220
+ - lib/generators/jsonapi/templates/application_resource.rb.erb
221
+ - lib/generators/jsonapi/templates/controller.rb.erb
222
+ - lib/generators/jsonapi/templates/create_request_spec.rb.erb
223
+ - lib/generators/jsonapi/templates/destroy_request_spec.rb.erb
224
+ - lib/generators/jsonapi/templates/index_request_spec.rb.erb
225
+ - lib/generators/jsonapi/templates/resource.rb.erb
226
+ - lib/generators/jsonapi/templates/resource_reads_spec.rb.erb
227
+ - lib/generators/jsonapi/templates/resource_writes_spec.rb.erb
228
+ - lib/generators/jsonapi/templates/show_request_spec.rb.erb
229
+ - lib/generators/jsonapi/templates/update_request_spec.rb.erb
230
+ - lib/graphiti-rb.rb
231
+ - lib/graphiti.rb
232
+ - lib/graphiti/adapters/abstract.rb
233
+ - lib/graphiti/adapters/active_record.rb
234
+ - lib/graphiti/adapters/active_record/base.rb
235
+ - lib/graphiti/adapters/active_record/belongs_to_sideload.rb
236
+ - lib/graphiti/adapters/active_record/has_many_sideload.rb
237
+ - lib/graphiti/adapters/active_record/has_one_sideload.rb
238
+ - lib/graphiti/adapters/active_record/inferrence.rb
239
+ - lib/graphiti/adapters/active_record/many_to_many_sideload.rb
240
+ - lib/graphiti/adapters/null.rb
241
+ - lib/graphiti/base.rb
242
+ - lib/graphiti/configuration.rb
243
+ - lib/graphiti/context.rb
244
+ - lib/graphiti/deserializer.rb
245
+ - lib/graphiti/errors.rb
246
+ - lib/graphiti/extensions/boolean_attribute.rb
247
+ - lib/graphiti/extensions/extra_attribute.rb
248
+ - lib/graphiti/extensions/temp_id.rb
249
+ - lib/graphiti/filter_operators.rb
250
+ - lib/graphiti/hash_renderer.rb
251
+ - lib/graphiti/jsonapi_serializable_ext.rb
252
+ - lib/graphiti/query.rb
253
+ - lib/graphiti/rails.rb
254
+ - lib/graphiti/railtie.rb
255
+ - lib/graphiti/renderer.rb
256
+ - lib/graphiti/resource.rb
257
+ - lib/graphiti/resource/configuration.rb
258
+ - lib/graphiti/resource/dsl.rb
259
+ - lib/graphiti/resource/interface.rb
260
+ - lib/graphiti/resource/polymorphism.rb
261
+ - lib/graphiti/resource/sideloading.rb
262
+ - lib/graphiti/resource_proxy.rb
263
+ - lib/graphiti/responders.rb
264
+ - lib/graphiti/runner.rb
265
+ - lib/graphiti/scope.rb
266
+ - lib/graphiti/scoping/base.rb
267
+ - lib/graphiti/scoping/default_filter.rb
268
+ - lib/graphiti/scoping/extra_attributes.rb
269
+ - lib/graphiti/scoping/filter.rb
270
+ - lib/graphiti/scoping/filterable.rb
271
+ - lib/graphiti/scoping/paginate.rb
272
+ - lib/graphiti/scoping/sort.rb
273
+ - lib/graphiti/sideload.rb
274
+ - lib/graphiti/sideload/belongs_to.rb
275
+ - lib/graphiti/sideload/has_many.rb
276
+ - lib/graphiti/sideload/has_one.rb
277
+ - lib/graphiti/sideload/many_to_many.rb
278
+ - lib/graphiti/sideload/polymorphic_belongs_to.rb
279
+ - lib/graphiti/stats/dsl.rb
280
+ - lib/graphiti/stats/payload.rb
281
+ - lib/graphiti/types.rb
282
+ - lib/graphiti/util/attribute_check.rb
283
+ - lib/graphiti/util/field_params.rb
284
+ - lib/graphiti/util/hash.rb
285
+ - lib/graphiti/util/hooks.rb
286
+ - lib/graphiti/util/include_params.rb
287
+ - lib/graphiti/util/persistence.rb
288
+ - lib/graphiti/util/relationship_payload.rb
289
+ - lib/graphiti/util/serializer_attributes.rb
290
+ - lib/graphiti/util/sideload.rb
291
+ - lib/graphiti/util/validation_response.rb
292
+ - lib/graphiti/version.rb
293
+ homepage:
294
+ licenses:
295
+ - MIT
296
+ metadata: {}
297
+ post_install_message:
298
+ rdoc_options: []
299
+ require_paths:
300
+ - lib
301
+ required_ruby_version: !ruby/object:Gem::Requirement
302
+ requirements:
303
+ - - ">="
304
+ - !ruby/object:Gem::Version
305
+ version: '0'
306
+ required_rubygems_version: !ruby/object:Gem::Requirement
307
+ requirements:
308
+ - - ">"
309
+ - !ruby/object:Gem::Version
310
+ version: 1.3.1
311
+ requirements: []
312
+ rubyforge_project:
313
+ rubygems_version: 2.6.11
314
+ signing_key:
315
+ specification_version: 4
316
+ summary: Easily build jsonapi.org-compatible APIs
317
+ test_files: []