graphiti 1.0.alpha.25 → 1.0.alpha.26
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/graphiti/adapters/abstract.rb +1 -11
- data/lib/graphiti/adapters/active_record.rb +3 -13
- data/lib/graphiti/adapters/active_record/many_to_many_sideload.rb +42 -3
- data/lib/graphiti/errors.rb +13 -0
- data/lib/graphiti/resource.rb +2 -2
- data/lib/graphiti/resource/interface.rb +4 -0
- data/lib/graphiti/resource/sideloading.rb +8 -3
- data/lib/graphiti/resource_proxy.rb +2 -1
- data/lib/graphiti/sideload.rb +3 -3
- data/lib/graphiti/util/persistence.rb +8 -3
- data/lib/graphiti/util/serializer_relationships.rb +1 -1
- data/lib/graphiti/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cc547267adde832aa6910fc38c5ee48af7f38ab5
|
4
|
+
data.tar.gz: 9b3b27ba180c2c1d6e1b599ed7302d5ca9b6dd54
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 92f560e227cb8084807d503b85190f631daf696d22e4c649041573ad18c4553350b5525ab52f3d3bcf4270094fc5cd1f2141409de73609140c0c3bb651130b4a
|
7
|
+
data.tar.gz: fb1eb584414a97b7a3afb65fb5cf397a6504868c160e0dd4cd5d844bd9249af3047de4d1702888e787a8ff2452e2f66cde2367890e3c944c6311268181c1ffe1
|
@@ -447,17 +447,7 @@ module Graphiti
|
|
447
447
|
raise 'you must override #update in an adapter subclass'
|
448
448
|
end
|
449
449
|
|
450
|
-
|
451
|
-
# @param [Integer] id the id for this model
|
452
|
-
# @return the model instance just destroyed
|
453
|
-
# @see Resource.model
|
454
|
-
# @example ActiveRecord default
|
455
|
-
# def destroy(model_class, id)
|
456
|
-
# instance = model_class.find(id)
|
457
|
-
# instance.destroy
|
458
|
-
# instance
|
459
|
-
# end
|
460
|
-
def destroy(model_class, id)
|
450
|
+
def destroy(model)
|
461
451
|
raise 'you must override #destroy in an adapter subclass'
|
462
452
|
end
|
463
453
|
|
@@ -200,14 +200,6 @@ module Graphiti
|
|
200
200
|
end
|
201
201
|
end
|
202
202
|
|
203
|
-
def belongs_to_many_filter(sideload, scope, value)
|
204
|
-
scope
|
205
|
-
.includes(sideload.through_relationship_name)
|
206
|
-
.where(sideload.through_table_name => {
|
207
|
-
sideload.true_foreign_key => value
|
208
|
-
})
|
209
|
-
end
|
210
|
-
|
211
203
|
def associate_all(parent, children, association_name, association_type)
|
212
204
|
if activerecord_associate?(parent, children[0], association_name)
|
213
205
|
association = parent.association(association_name)
|
@@ -264,11 +256,9 @@ module Graphiti
|
|
264
256
|
instance
|
265
257
|
end
|
266
258
|
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
instance.destroy
|
271
|
-
instance
|
259
|
+
def destroy(model)
|
260
|
+
model.destroy
|
261
|
+
model
|
272
262
|
end
|
273
263
|
end
|
274
264
|
end
|
@@ -8,10 +8,49 @@ class Graphiti::Adapters::ActiveRecord::ManyToManySideload < Graphiti::Sideload:
|
|
8
8
|
foreign_key.keys.first
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
11
|
+
def belongs_to_many_filter(scope, value)
|
12
|
+
scope
|
13
|
+
.includes(through_relationship_name)
|
14
|
+
.where(belongs_to_many_clause(value))
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def belongs_to_many_clause(value)
|
20
|
+
where = { true_foreign_key => value }.tap do |c|
|
21
|
+
if polymorphic?
|
22
|
+
c[foreign_type_column] = foreign_type_value
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
{ through_table_name => where }
|
27
|
+
end
|
28
|
+
|
29
|
+
def foreign_type_column
|
30
|
+
through_reflection.type
|
31
|
+
end
|
32
|
+
|
33
|
+
def foreign_type_value
|
34
|
+
through_reflection.active_record.name
|
35
|
+
end
|
36
|
+
|
37
|
+
def polymorphic?
|
38
|
+
!!foreign_type_column
|
39
|
+
end
|
40
|
+
|
41
|
+
def through_reflection
|
42
|
+
through = parent_reflection.options[:through]
|
43
|
+
parent_resource_class.model.reflections[through.to_s]
|
44
|
+
end
|
45
|
+
|
46
|
+
def parent_reflection
|
12
47
|
parent_model = parent_resource_class.model
|
13
|
-
|
14
|
-
|
48
|
+
parent_model.reflections[name.to_s]
|
49
|
+
end
|
50
|
+
|
51
|
+
def infer_foreign_key
|
52
|
+
key = parent_reflection.options[:through]
|
53
|
+
value = through_reflection.foreign_key.to_sym
|
15
54
|
{ key => value }
|
16
55
|
end
|
17
56
|
end
|
data/lib/graphiti/errors.rb
CHANGED
@@ -16,6 +16,19 @@ The adapter #{@adapter.class} does not implement method '#{@method}', which was
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
+
class UnwritableRelationship < Base
|
20
|
+
def initialize(resource, sideload)
|
21
|
+
@resource = resource
|
22
|
+
@sideload = sideload
|
23
|
+
end
|
24
|
+
|
25
|
+
def message
|
26
|
+
<<-MSG
|
27
|
+
#{@resource.class}: Tried to persist sideload #{@sideload.name.inspect} but marked writable: false
|
28
|
+
MSG
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
19
32
|
class SingularSideload < Base
|
20
33
|
def initialize(sideload, parent_length)
|
21
34
|
@sideload = sideload
|
data/lib/graphiti/resource.rb
CHANGED
@@ -17,6 +17,10 @@ module Graphiti
|
|
17
17
|
|
18
18
|
def find(params = {}, base_scope = nil)
|
19
19
|
validate!(params)
|
20
|
+
_find(params, base_scope)
|
21
|
+
end
|
22
|
+
|
23
|
+
def _find(params = {}, base_scope = nil)
|
20
24
|
id = params[:data].try(:[], :id) || params.delete(:id)
|
21
25
|
params[:filter] ||= {}
|
22
26
|
params[:filter].merge!(id: id) if id
|
@@ -17,11 +17,15 @@ module Graphiti
|
|
17
17
|
parent.children[name] = sideload
|
18
18
|
else
|
19
19
|
config[:sideloads][name] = sideload
|
20
|
-
|
20
|
+
apply_sideload_to_serializer(name) if eagerly_apply_sideload?(sideload)
|
21
21
|
end
|
22
22
|
sideload
|
23
23
|
end
|
24
24
|
|
25
|
+
def apply_sideload_to_serializer(name)
|
26
|
+
Util::SerializerRelationships.new(self, config[:sideloads].slice(name)).apply
|
27
|
+
end
|
28
|
+
|
25
29
|
def apply_sideloads_to_serializer
|
26
30
|
Util::SerializerRelationships.new(self, config[:sideloads]).apply
|
27
31
|
end
|
@@ -105,8 +109,9 @@ module Graphiti
|
|
105
109
|
memo
|
106
110
|
end
|
107
111
|
|
108
|
-
def
|
109
|
-
defined?(::Rails) && !::Rails.application.config.eager_load
|
112
|
+
def eagerly_apply_sideload?(sideload)
|
113
|
+
autoloading = defined?(::Rails) && !::Rails.application.config.eager_load
|
114
|
+
autoloading || sideload.resource_class_loaded?
|
110
115
|
end
|
111
116
|
end
|
112
117
|
end
|
@@ -89,8 +89,9 @@ module Graphiti
|
|
89
89
|
end
|
90
90
|
|
91
91
|
def destroy
|
92
|
+
record = data
|
92
93
|
validator = @resource.transaction do
|
93
|
-
model = @resource.destroy(
|
94
|
+
model = @resource.destroy(record)
|
94
95
|
model.instance_variable_set(:@__serializer_klass, @resource.serializer)
|
95
96
|
validator = ::Graphiti::Util::ValidationResponse.new \
|
96
97
|
model, @payload
|
data/lib/graphiti/sideload.rb
CHANGED
@@ -181,8 +181,8 @@ module Graphiti
|
|
181
181
|
end
|
182
182
|
|
183
183
|
if relevant_children.is_a?(Array)
|
184
|
-
|
185
|
-
|
184
|
+
associated |= relevant_children if track_associated
|
185
|
+
associate_all(parent, relevant_children)
|
186
186
|
else
|
187
187
|
associated << relevant_children if track_associated && relevant_children
|
188
188
|
associate(parent, relevant_children)
|
@@ -278,7 +278,7 @@ module Graphiti
|
|
278
278
|
fk_type = parent_resource_class.attributes[:id][:type]
|
279
279
|
resource_class.filter true_foreign_key, fk_type do
|
280
280
|
eq do |scope, value|
|
281
|
-
_self.
|
281
|
+
_self.belongs_to_many_filter(scope, value)
|
282
282
|
end
|
283
283
|
end
|
284
284
|
end
|
@@ -149,7 +149,8 @@ class Graphiti::Util::Persistence
|
|
149
149
|
def persist_object(method, attributes)
|
150
150
|
case method
|
151
151
|
when :destroy
|
152
|
-
|
152
|
+
model = @resource.class._find(attributes.slice(:id)).data
|
153
|
+
call_resource_method(:destroy, model, @caller_model)
|
153
154
|
when :update, nil, :disassociate
|
154
155
|
call_resource_method(:update, attributes, @caller_model)
|
155
156
|
else
|
@@ -172,8 +173,12 @@ class Graphiti::Util::Persistence
|
|
172
173
|
def process_belongs_to(relationships)
|
173
174
|
[].tap do |processed|
|
174
175
|
iterate(only: [:polymorphic_belongs_to, :belongs_to]) do |x|
|
175
|
-
|
176
|
-
|
176
|
+
if x[:sideload].writable?
|
177
|
+
x[:object] = x[:sideload].resource
|
178
|
+
.persist_with_relationships(x[:meta], x[:attributes], x[:relationships])
|
179
|
+
else
|
180
|
+
raise Graphiti::Errors::UnwritableRelationship.new(@resource, x[:sideload])
|
181
|
+
end
|
177
182
|
processed << x
|
178
183
|
end
|
179
184
|
end
|
@@ -62,7 +62,7 @@ module Graphiti
|
|
62
62
|
def data_proc
|
63
63
|
_sl = @sideload
|
64
64
|
->(_) {
|
65
|
-
if records = @object.public_send(_sl.
|
65
|
+
if records = @object.public_send(_sl.association_name)
|
66
66
|
if records.respond_to?(:to_ary)
|
67
67
|
records.each { |r| _sl.resource.decorate_record(r) }
|
68
68
|
else
|
data/lib/graphiti/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphiti
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.alpha.
|
4
|
+
version: 1.0.alpha.26
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lee Richmond
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-09-
|
11
|
+
date: 2018-09-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jsonapi-serializable
|