graphiti_gql 0.2.22 → 0.2.23
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/Gemfile.lock +4 -4
- data/lib/graphiti_gql/graphiti_hax.rb +2 -14
- data/lib/graphiti_gql/loaders/many_to_many.rb +6 -4
- data/lib/graphiti_gql/schema/fields/attribute.rb +3 -21
- data/lib/graphiti_gql/schema/fields/to_many.rb +53 -14
- data/lib/graphiti_gql/schema/query.rb +2 -23
- data/lib/graphiti_gql/schema/resource_type.rb +33 -7
- 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: c5dfc016180ec5fd536f236be63b24cad42471a74d44ab234dee1966f2de942e
|
4
|
+
data.tar.gz: f97bbe243fa4a205004abdbd522942005b09e87fa37ba1db465000b383e355d0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '08c76642c2b6be4401a6efcce4c9070c52eee1661c333bcefc30a328826a0558aa6ed013028cb4d173bb2b47565aeeda18c2648a946d6ebe1dbcde2147325ced'
|
7
|
+
data.tar.gz: d16a38a32815b6df020817bb5797ac26ce6507a443375955aad3c2c1fe8fe29192dbf0f01a854d6d565946daae1fe9a713c67df050bbc230c320c282a35e339f
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
graphiti_gql (0.2.
|
4
|
+
graphiti_gql (0.2.23)
|
5
5
|
activemodel (> 6.0, < 8.0)
|
6
6
|
graphiti (~> 1.3.9)
|
7
7
|
graphql (~> 2.0)
|
@@ -48,13 +48,13 @@ GEM
|
|
48
48
|
graphql-batch (0.5.1)
|
49
49
|
graphql (>= 1.10, < 3)
|
50
50
|
promise.rb (~> 0.7.2)
|
51
|
-
i18n (1.
|
51
|
+
i18n (1.12.0)
|
52
52
|
concurrent-ruby (~> 1.0)
|
53
53
|
jsonapi-renderer (0.2.2)
|
54
54
|
jsonapi-serializable (0.3.1)
|
55
55
|
jsonapi-renderer (~> 0.2.0)
|
56
56
|
method_source (1.0.0)
|
57
|
-
minitest (5.
|
57
|
+
minitest (5.16.2)
|
58
58
|
promise.rb (0.7.4)
|
59
59
|
pry (0.13.1)
|
60
60
|
coderay (~> 1.1)
|
@@ -76,7 +76,7 @@ GEM
|
|
76
76
|
diff-lcs (>= 1.2.0, < 2.0)
|
77
77
|
rspec-support (~> 3.11.0)
|
78
78
|
rspec-support (3.11.0)
|
79
|
-
tzinfo (2.0.
|
79
|
+
tzinfo (2.0.5)
|
80
80
|
concurrent-ruby (~> 1.0)
|
81
81
|
|
82
82
|
PLATFORMS
|
@@ -196,26 +196,14 @@ module GraphitiGql
|
|
196
196
|
module ManyToManyExtras
|
197
197
|
def self.prepended(klass)
|
198
198
|
klass.class_eval do
|
199
|
-
attr_reader :join_table_alias, :edge_magic
|
200
|
-
|
201
|
-
class << self
|
202
|
-
attr_reader :edge_resource
|
203
|
-
|
204
|
-
def attribute(*args, &blk)
|
205
|
-
@edge_resource ||= Class.new(Graphiti::Resource) do
|
206
|
-
def self.abstract_class?
|
207
|
-
true
|
208
|
-
end
|
209
|
-
end
|
210
|
-
@edge_resource.attribute(*args, &blk)
|
211
|
-
end
|
212
|
-
end
|
199
|
+
attr_reader :join_table_alias, :edge_magic, :edge_resource
|
213
200
|
end
|
214
201
|
end
|
215
202
|
|
216
203
|
def initialize(name, opts = {})
|
217
204
|
@join_table_alias = opts[:join_table_alias]
|
218
205
|
@edge_magic = opts[:edge_magic] == false ? false : true
|
206
|
+
@edge_resource = opts[:edge_resource]
|
219
207
|
super
|
220
208
|
end
|
221
209
|
|
@@ -16,13 +16,15 @@ module GraphitiGql
|
|
16
16
|
|
17
17
|
private
|
18
18
|
|
19
|
+
def thru_model
|
20
|
+
thru = @sideload.foreign_key.keys.first
|
21
|
+
reflection = @sideload.parent_resource.model.reflect_on_association(thru)
|
22
|
+
reflection.klass
|
23
|
+
end
|
24
|
+
|
19
25
|
def add_join_table_magic(proxy)
|
20
26
|
return unless @sideload.edge_magic
|
21
27
|
if defined?(ActiveRecord) && proxy.resource.model.ancestors.include?(ActiveRecord::Base)
|
22
|
-
thru = @sideload.foreign_key.keys.first
|
23
|
-
reflection = @sideload.parent_resource.model.reflect_on_association(thru)
|
24
|
-
thru_model = reflection.klass
|
25
|
-
|
26
28
|
thru_table_name = @sideload.join_table_alias || thru_model.table_name
|
27
29
|
names = thru_model.column_names.map do |n|
|
28
30
|
next if n == :id
|
@@ -3,12 +3,11 @@ module GraphitiGql
|
|
3
3
|
module Fields
|
4
4
|
class Attribute
|
5
5
|
# If sideload is present, we're applying m2m metadata to an edge
|
6
|
-
def initialize(resource, name, config
|
6
|
+
def initialize(resource, name, config)
|
7
7
|
@resource = resource
|
8
8
|
@config = config
|
9
9
|
@name = name
|
10
10
|
@alias = config[:alias]
|
11
|
-
@sideload = sideload # is_edge: true
|
12
11
|
end
|
13
12
|
|
14
13
|
def apply(type)
|
@@ -16,13 +15,11 @@ module GraphitiGql
|
|
16
15
|
_config = @config
|
17
16
|
_name = @name
|
18
17
|
_alias = @alias
|
19
|
-
_sideload = @sideload
|
20
18
|
opts = @config.slice(:null, :deprecation_reason)
|
21
19
|
type.field(_name, field_type, **opts)
|
22
20
|
type.define_method _name do
|
23
21
|
if (readable = _config[:readable]).is_a?(Symbol)
|
24
22
|
obj = object
|
25
|
-
obj = object.node if _sideload
|
26
23
|
resource = obj.instance_variable_get(:@__graphiti_resource)
|
27
24
|
unless resource.send(readable)
|
28
25
|
path = Graphiti.context[:object][:current_path].join(".")
|
@@ -30,25 +27,10 @@ module GraphitiGql
|
|
30
27
|
end
|
31
28
|
end
|
32
29
|
|
33
|
-
edge_attrs = nil
|
34
|
-
if _sideload
|
35
|
-
edge_attrs = object.node.attributes
|
36
|
-
.select { |k, v| k.to_s.starts_with?("_edge_") }
|
37
|
-
edge_attrs.transform_keys! { |k| k.to_s.gsub("_edge_", "").to_sym }
|
38
|
-
end
|
39
|
-
|
40
30
|
value = if _config[:proc]
|
41
|
-
|
42
|
-
instance_exec(edge_attrs, object.node, &_config[:proc])
|
43
|
-
else
|
44
|
-
instance_eval(&_config[:proc])
|
45
|
-
end
|
31
|
+
instance_eval(&_config[:proc])
|
46
32
|
else
|
47
|
-
|
48
|
-
edge_attrs[_alias || _name]
|
49
|
-
else
|
50
|
-
object.send(_alias || _name)
|
51
|
-
end
|
33
|
+
object.send(_alias || _name)
|
52
34
|
end
|
53
35
|
return if value.nil?
|
54
36
|
Graphiti::Types[_config[:type]][:read].call(value)
|
@@ -35,7 +35,7 @@ module GraphitiGql
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def customized_edge?
|
38
|
-
@sideload.type == :many_to_many && @sideload.
|
38
|
+
@sideload.type == :many_to_many && @sideload.edge_resource
|
39
39
|
end
|
40
40
|
|
41
41
|
def find_or_build_connection
|
@@ -59,21 +59,60 @@ module GraphitiGql
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def build_edge_type_class(sideload_type)
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
62
|
+
klass = build_friendly_graphql_edge_type_class \
|
63
|
+
sideload_type.edge_type_class
|
64
|
+
name = edge_type_class_name(sideload_type)
|
65
|
+
klass.define_method(:graphql_name) { name }
|
66
|
+
klass.graphql_name(name)
|
67
|
+
edge_resource = @sideload.edge_resource
|
68
|
+
ResourceType.add_fields(klass, edge_resource, id: false)
|
69
|
+
ResourceType.add_relationships(edge_resource, klass)
|
70
|
+
klass
|
71
|
+
end
|
72
|
+
|
73
|
+
# Normally we reference 'object', but edges work differently
|
74
|
+
# This makes 'object' work everywhere
|
75
|
+
# Needed when evaluating fields/relationships for consistent interface
|
76
|
+
def build_friendly_graphql_edge_type_class(superklass)
|
77
|
+
klass = Class.new(superklass) do
|
78
|
+
alias :original_object :object
|
79
|
+
def object
|
80
|
+
return @_object if @_object # avoid conflict
|
81
|
+
|
82
|
+
node = original_object.node # the 'parent' record we joined with
|
83
|
+
edge_attrs = node.attributes.select { |k,v| k.to_s.starts_with?('_edge') }
|
84
|
+
edge_attrs.transform_keys! { |k| k.to_s.gsub('_edge_', '') }
|
85
|
+
edge_model = model.new(edge_attrs)
|
86
|
+
edge_model.instance_variable_set(:@__graphiti_resource, resource)
|
87
|
+
@_object = edge_model
|
88
|
+
@_object
|
89
|
+
end
|
90
|
+
|
91
|
+
def cursor
|
92
|
+
original_object.cursor
|
93
|
+
end
|
94
|
+
|
95
|
+
def node
|
96
|
+
original_object.node
|
97
|
+
end
|
68
98
|
end
|
69
|
-
|
99
|
+
|
100
|
+
# used in #object
|
101
|
+
thru = @sideload.foreign_key.keys.first
|
102
|
+
reflection = @sideload.parent_resource.model.reflect_on_association(thru)
|
103
|
+
thru_model = reflection.klass
|
104
|
+
edge_resource = @sideload.edge_resource.new
|
105
|
+
klass.define_method(:model) { thru_model }
|
106
|
+
klass.define_method(:resource) { edge_resource }
|
107
|
+
|
108
|
+
klass
|
109
|
+
end
|
110
|
+
|
111
|
+
def edge_type_class_name(sideload_type)
|
112
|
+
registered_parent = Schema.registry.get \
|
113
|
+
@sideload.parent_resource.class
|
70
114
|
parent_name = registered_parent[:type].graphql_name
|
71
|
-
|
72
|
-
edge_type_class.define_method :graphql_name do
|
73
|
-
edge_type_class_name
|
74
|
-
end
|
75
|
-
edge_type_class.graphql_name(edge_type_class_name)
|
76
|
-
edge_type_class
|
115
|
+
"#{parent_name}To#{sideload_type.graphql_name}Edge"
|
77
116
|
end
|
78
117
|
end
|
79
118
|
end
|
@@ -30,30 +30,9 @@ module GraphitiGql
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def add_relationships
|
33
|
-
each_relationship do |type, sideload_type, sideload|
|
34
|
-
if [:has_many, :many_to_many, :has_one].include?(sideload.type)
|
35
|
-
Fields::ToMany.new(sideload, sideload_type).apply(type)
|
36
|
-
else
|
37
|
-
Fields::ToOne.new(sideload, sideload_type).apply(type)
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def each_relationship
|
43
33
|
registry.resource_types.each do |registered|
|
44
|
-
registered[:resource]
|
45
|
-
|
46
|
-
|
47
|
-
registered_sl = if sl.type == :polymorphic_belongs_to
|
48
|
-
PolymorphicBelongsToInterface
|
49
|
-
.new(registered[:resource], sl)
|
50
|
-
.build
|
51
|
-
else
|
52
|
-
registry.get(sl.resource.class)
|
53
|
-
end
|
54
|
-
|
55
|
-
yield registered[:type], registered_sl[:type], sl
|
56
|
-
end
|
34
|
+
resource, type = registered[:resource], registered[:type]
|
35
|
+
ResourceType.add_relationships(resource, type)
|
57
36
|
end
|
58
37
|
end
|
59
38
|
end
|
@@ -14,6 +14,36 @@ module GraphitiGql
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
+
def self.add_fields(type, resource, id: true)
|
18
|
+
resource.attributes.each_pair do |name, config|
|
19
|
+
next if name == :id && id == false
|
20
|
+
if config[:readable]
|
21
|
+
Fields::Attribute.new(resource, name, config).apply(type)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.add_relationships(resource, type)
|
27
|
+
resource.sideloads.each do |name, sideload|
|
28
|
+
next unless sideload.readable?
|
29
|
+
|
30
|
+
registered_sl = if sideload.type == :polymorphic_belongs_to
|
31
|
+
PolymorphicBelongsToInterface
|
32
|
+
.new(resource, sideload)
|
33
|
+
.build
|
34
|
+
else
|
35
|
+
Schema.registry.get(sideload.resource.class)
|
36
|
+
end
|
37
|
+
sideload_type = registered_sl[:type]
|
38
|
+
|
39
|
+
if [:has_many, :many_to_many, :has_one].include?(sideload.type)
|
40
|
+
Fields::ToMany.new(sideload, sideload_type).apply(type)
|
41
|
+
else
|
42
|
+
Fields::ToOne.new(sideload, sideload_type).apply(type)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
17
47
|
def initialize(resource, implements: nil)
|
18
48
|
@resource = resource
|
19
49
|
@implements = implements
|
@@ -86,14 +116,10 @@ module GraphitiGql
|
|
86
116
|
def name
|
87
117
|
registry.key_for(@resource)
|
88
118
|
end
|
89
|
-
|
119
|
+
|
90
120
|
def add_fields(type, resource)
|
91
|
-
|
92
|
-
|
93
|
-
Fields::Attribute.new(@resource, name, config).apply(type)
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
121
|
+
self.class.add_fields(type, resource)
|
122
|
+
end
|
97
123
|
|
98
124
|
def build_connection_class
|
99
125
|
klass = Class.new(GraphQL::Types::Relay::BaseConnection)
|
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.23
|
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-08-
|
11
|
+
date: 2022-08-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: graphql
|