graphiti_gql 0.2.10 → 0.2.14
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/lib/graphiti_gql/active_resource.rb +31 -19
- data/lib/graphiti_gql/graphiti_hax.rb +43 -2
- data/lib/graphiti_gql/loaders/belongs_to.rb +10 -3
- data/lib/graphiti_gql/loaders/has_many.rb +8 -1
- data/lib/graphiti_gql/loaders/many.rb +1 -1
- data/lib/graphiti_gql/loaders/many_to_many.rb +3 -1
- data/lib/graphiti_gql/schema/fields/show.rb +3 -1
- data/lib/graphiti_gql/spec_helper.rb +11 -3
- data/lib/graphiti_gql/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5a4faaf029a4624626f9bfa68815734bc6571381fa6b2d153830df1825c2d61f
|
|
4
|
+
data.tar.gz: 2f73a19e8b84280c83bc7d6ab0f574ffb5d4b2fb6b7328ca75de6d47a145ecc0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d00b4b5b4e2314efd6e1d4ff6b72a357ba582a045dcab28214596130054fc8e15b22b8267fa1157e1746ddceda7c0b25602a0441ccaa82b4bda29fa27aab412c
|
|
7
|
+
data.tar.gz: 7a6d2a5ee610af959d292e87c492aa770ff2ab2d0546339dc3f30236811a3b44ab7edf9110773c457707d19bb0d06c9b62884a69ea94c13ad90d227eb8540bce
|
|
@@ -13,10 +13,14 @@ module GraphitiGql
|
|
|
13
13
|
if (sideload = resource.sideload(key))
|
|
14
14
|
if value.key?(:edges)
|
|
15
15
|
@edges[key] = value[:edges].map do |edge|
|
|
16
|
-
node_id = edge[:node][:id]
|
|
16
|
+
node_id = edge[:node][:id] if edge[:node]
|
|
17
17
|
Node.new(edge.except(:node).merge(node_id: node_id))
|
|
18
18
|
end
|
|
19
|
-
|
|
19
|
+
if value[:edges].any? { |e| e[:node] }
|
|
20
|
+
hash[key] = value[:edges].map { |v| Node.new(v[:node], sideload.resource.class) }
|
|
21
|
+
else
|
|
22
|
+
hash[key] = value[:edges]
|
|
23
|
+
end
|
|
20
24
|
elsif value.key?(:nodes)
|
|
21
25
|
hash[key] = value[:nodes].map { |n| Node.new(n, sideload.resource.class) }
|
|
22
26
|
else
|
|
@@ -47,7 +51,7 @@ module GraphitiGql
|
|
|
47
51
|
end
|
|
48
52
|
|
|
49
53
|
class Proxy
|
|
50
|
-
def initialize(resource, params, ctx, query)
|
|
54
|
+
def initialize(resource, params, ctx, query, options = {})
|
|
51
55
|
@query = query
|
|
52
56
|
@resource = resource
|
|
53
57
|
@ctx = ctx
|
|
@@ -56,17 +60,22 @@ module GraphitiGql
|
|
|
56
60
|
sort[:att] = sort[:att].to_s.camelize(:lower)
|
|
57
61
|
sort[:dir] = sort[:dir].to_s
|
|
58
62
|
end
|
|
63
|
+
@with_pagination = !!options[:with_pagination]
|
|
59
64
|
end
|
|
60
65
|
|
|
61
|
-
def
|
|
66
|
+
def run!(symbolize_keys: true)
|
|
62
67
|
result = GraphitiGql.run(query, @params, @ctx)
|
|
63
68
|
result = result.deep_symbolize_keys if symbolize_keys
|
|
64
69
|
@response = result
|
|
65
70
|
result
|
|
66
71
|
end
|
|
67
72
|
|
|
68
|
-
def node(id)
|
|
69
|
-
|
|
73
|
+
def node(id = nil)
|
|
74
|
+
if @resource.singular
|
|
75
|
+
Node.new(underscore(data[data.keys.first]), @resource)
|
|
76
|
+
else
|
|
77
|
+
nodes.find { |n| n.id == id.to_s }
|
|
78
|
+
end
|
|
70
79
|
end
|
|
71
80
|
|
|
72
81
|
def nodes
|
|
@@ -76,12 +85,12 @@ module GraphitiGql
|
|
|
76
85
|
else
|
|
77
86
|
data[data.keys.first][:nodes] || []
|
|
78
87
|
end
|
|
79
|
-
elements.map { |n| Node.new(underscore(n), @resource) }
|
|
88
|
+
elements.compact.map { |n| Node.new(underscore(n), @resource) }
|
|
80
89
|
end
|
|
81
90
|
alias :to_a :nodes
|
|
82
91
|
|
|
83
92
|
def response
|
|
84
|
-
@response ||=
|
|
93
|
+
@response ||= run!
|
|
85
94
|
end
|
|
86
95
|
|
|
87
96
|
def data
|
|
@@ -207,15 +216,18 @@ module GraphitiGql
|
|
|
207
216
|
end
|
|
208
217
|
end
|
|
209
218
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
+
q << %|
|
|
220
|
+
}
|
|
221
|
+
}|
|
|
222
|
+
if @with_pagination
|
|
223
|
+
q << %|
|
|
224
|
+
pageInfo {
|
|
225
|
+
startCursor
|
|
226
|
+
endCursor
|
|
227
|
+
hasNextPage
|
|
228
|
+
hasPreviousPage
|
|
229
|
+
}|
|
|
230
|
+
end
|
|
219
231
|
|
|
220
232
|
if @params[:stats]
|
|
221
233
|
q << %|
|
|
@@ -251,8 +263,8 @@ module GraphitiGql
|
|
|
251
263
|
end
|
|
252
264
|
|
|
253
265
|
class_methods do
|
|
254
|
-
def gql(params = {}, ctx = {}, query = nil)
|
|
255
|
-
Proxy.new(self, params, ctx, query)
|
|
266
|
+
def gql(params = {}, ctx = {}, query = nil, opts = {})
|
|
267
|
+
Proxy.new(self, params, ctx, query, opts)
|
|
256
268
|
end
|
|
257
269
|
end
|
|
258
270
|
end
|
|
@@ -2,15 +2,40 @@
|
|
|
2
2
|
# Ideally we eventually rip out the parts of Graphiti we need and roll this into
|
|
3
3
|
# that effort.
|
|
4
4
|
module GraphitiGql
|
|
5
|
+
module RunnerExtras
|
|
6
|
+
def jsonapi_resource
|
|
7
|
+
@jsonapi_resource ||= begin
|
|
8
|
+
r = @resource_class.new
|
|
9
|
+
r.instance_variable_set(:@params, @params)
|
|
10
|
+
r
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
Graphiti::Runner.send(:prepend, RunnerExtras)
|
|
15
|
+
|
|
5
16
|
module ResourceExtras
|
|
6
17
|
extend ActiveSupport::Concern
|
|
7
18
|
|
|
8
19
|
included do
|
|
9
20
|
class << self
|
|
10
|
-
attr_accessor :graphql_name
|
|
21
|
+
attr_accessor :graphql_name, :singular
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def filterings
|
|
26
|
+
@filterings ||= begin
|
|
27
|
+
if @params.key?(:filter)
|
|
28
|
+
@params[:filter].keys
|
|
29
|
+
else
|
|
30
|
+
[]
|
|
31
|
+
end
|
|
11
32
|
end
|
|
12
33
|
end
|
|
13
34
|
|
|
35
|
+
def parent_field
|
|
36
|
+
context[:current_arguments][:lookahead].field.owner
|
|
37
|
+
end
|
|
38
|
+
|
|
14
39
|
def selections
|
|
15
40
|
return @selections if @selections
|
|
16
41
|
lookahead = context[:current_arguments]
|
|
@@ -42,6 +67,14 @@ module GraphitiGql
|
|
|
42
67
|
att[:name] = args.first # for easier lookup
|
|
43
68
|
end
|
|
44
69
|
end
|
|
70
|
+
|
|
71
|
+
def filter_group(filter_names, *args)
|
|
72
|
+
if filter_names.blank?
|
|
73
|
+
config[:grouped_filters] = {}
|
|
74
|
+
else
|
|
75
|
+
super
|
|
76
|
+
end
|
|
77
|
+
end
|
|
45
78
|
end
|
|
46
79
|
end
|
|
47
80
|
Graphiti::Resource.send(:include, ResourceExtras)
|
|
@@ -145,8 +178,10 @@ module GraphitiGql
|
|
|
145
178
|
module ManyToManyExtras
|
|
146
179
|
def self.prepended(klass)
|
|
147
180
|
klass.class_eval do
|
|
181
|
+
attr_reader :join_table_alias, :edge_magic
|
|
182
|
+
|
|
148
183
|
class << self
|
|
149
|
-
|
|
184
|
+
attr_reader :edge_resource
|
|
150
185
|
|
|
151
186
|
def attribute(*args, &blk)
|
|
152
187
|
@edge_resource ||= Class.new(Graphiti::Resource) do
|
|
@@ -159,6 +194,12 @@ module GraphitiGql
|
|
|
159
194
|
end
|
|
160
195
|
end
|
|
161
196
|
end
|
|
197
|
+
|
|
198
|
+
def initialize(name, opts = {})
|
|
199
|
+
@join_table_alias = opts[:join_table_alias]
|
|
200
|
+
@edge_magic = opts[:edge_magic] == false ? false : true
|
|
201
|
+
super
|
|
202
|
+
end
|
|
162
203
|
|
|
163
204
|
def apply_belongs_to_many_filter
|
|
164
205
|
super
|
|
@@ -53,11 +53,18 @@ module GraphitiGql
|
|
|
53
53
|
fulfill(id, val[:data][0])
|
|
54
54
|
end
|
|
55
55
|
else
|
|
56
|
-
params = {filter: {id: {eq: ids.join(",")}}}
|
|
57
56
|
resource = Schema.registry.get(@sideload.resource.class)[:resource]
|
|
57
|
+
params = {}
|
|
58
|
+
unless resource.singular
|
|
59
|
+
params[:filter] = {id: { eq: ids.join(",") } }
|
|
60
|
+
end
|
|
58
61
|
records = resource.all(params).data
|
|
59
|
-
|
|
60
|
-
|
|
62
|
+
if resource.singular
|
|
63
|
+
ids.each { |id| fulfill(id, records[0]) }
|
|
64
|
+
else
|
|
65
|
+
map = records.index_by { |record| record.id }
|
|
66
|
+
ids.each { |id| fulfill(id, map[id]) }
|
|
67
|
+
end
|
|
61
68
|
end
|
|
62
69
|
end
|
|
63
70
|
end
|
|
@@ -3,7 +3,14 @@ module GraphitiGql
|
|
|
3
3
|
class HasMany < Many
|
|
4
4
|
def assign(parent_records, proxy)
|
|
5
5
|
records = proxy.data
|
|
6
|
-
|
|
6
|
+
|
|
7
|
+
foreign_key = @sideload.foreign_key
|
|
8
|
+
config = @sideload.resource.attributes[foreign_key]
|
|
9
|
+
if config && config[:alias]
|
|
10
|
+
foreign_key = config[:alias]
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
map = records.group_by { |record| record.send(foreign_key) }
|
|
7
14
|
parent_records.each do |pr|
|
|
8
15
|
data = [map[pr.send(@sideload.primary_key)] || [], proxy]
|
|
9
16
|
fulfill(pr, data)
|
|
@@ -57,7 +57,7 @@ module GraphitiGql
|
|
|
57
57
|
elsif @sideload.type == :many_to_many
|
|
58
58
|
fk = @sideload.foreign_key.values.first
|
|
59
59
|
@params[:filter].merge!(fk => { eq: ids.join(",") })
|
|
60
|
-
|
|
60
|
+
elsif !@sideload.parent_resource.class.singular
|
|
61
61
|
@params[:filter].merge!(@sideload.foreign_key => { eq: ids.join(",") })
|
|
62
62
|
end
|
|
63
63
|
|
|
@@ -17,14 +17,16 @@ module GraphitiGql
|
|
|
17
17
|
private
|
|
18
18
|
|
|
19
19
|
def add_join_table_magic(proxy)
|
|
20
|
+
return unless @sideload.edge_magic
|
|
20
21
|
if defined?(ActiveRecord) && proxy.resource.model.ancestors.include?(ActiveRecord::Base)
|
|
21
22
|
thru = @sideload.foreign_key.keys.first
|
|
22
23
|
reflection = @sideload.parent_resource.model.reflect_on_association(thru)
|
|
23
24
|
thru_model = reflection.klass
|
|
24
25
|
|
|
26
|
+
thru_table_name = @sideload.join_table_alias || thru_model.table_name
|
|
25
27
|
names = thru_model.column_names.map do |n|
|
|
26
28
|
next if n == :id
|
|
27
|
-
"#{
|
|
29
|
+
"#{thru_table_name}.#{n} as _edge_#{n}"
|
|
28
30
|
end
|
|
29
31
|
scope = proxy.scope.object
|
|
30
32
|
scope = scope.select(["#{proxy.resource.model.table_name}.*"] + names)
|
|
@@ -11,7 +11,9 @@ module GraphitiGql
|
|
|
11
11
|
@registered[:type],
|
|
12
12
|
null: true,
|
|
13
13
|
extras: [:lookahead]
|
|
14
|
-
|
|
14
|
+
unless @registered[:resource].singular
|
|
15
|
+
field.argument(:id, String, required: true)
|
|
16
|
+
end
|
|
15
17
|
_registered = @registered
|
|
16
18
|
query.define_method name do |**arguments|
|
|
17
19
|
params = Util.params_from_args(arguments)
|
|
@@ -69,13 +69,17 @@ module GraphitiGql
|
|
|
69
69
|
|
|
70
70
|
def proxy
|
|
71
71
|
q = defined?(query) ? query : nil
|
|
72
|
-
|
|
72
|
+
with_pagination = respond_to?(:with_pagination) ? send(:with_pagination) : false
|
|
73
|
+
opts = { with_pagination: with_pagination }
|
|
74
|
+
resource.gql(params.merge(fields: fields), ctx, q, opts)
|
|
73
75
|
end
|
|
74
76
|
|
|
77
|
+
|
|
75
78
|
def run
|
|
76
79
|
lambda do
|
|
77
|
-
proxy
|
|
78
|
-
|
|
80
|
+
instance = proxy
|
|
81
|
+
instance.run!
|
|
82
|
+
instance
|
|
79
83
|
end
|
|
80
84
|
end
|
|
81
85
|
|
|
@@ -86,5 +90,9 @@ module GraphitiGql
|
|
|
86
90
|
def result
|
|
87
91
|
@result ||= run!
|
|
88
92
|
end
|
|
93
|
+
|
|
94
|
+
def json
|
|
95
|
+
@json ||= result.response
|
|
96
|
+
end
|
|
89
97
|
end
|
|
90
98
|
end
|
data/lib/graphiti_gql/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: graphiti_gql
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.14
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Lee Richmond
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2022-07-
|
|
11
|
+
date: 2022-07-24 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: graphql
|