graphiti_graphql 0.1.4 → 0.1.5
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
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 432533feee410a6ea882ec0362ff202b1c79f1bad917c1e24eb01fc83e4de147
|
4
|
+
data.tar.gz: 2dda92eb996d6152538d4575fbe7c6e72c8afeff4a66e150a422e9c2c2cc131b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29d66aab18e94862648b6e1385ccb74503b17c80c6a8c745abc2adfe4d394c93869b2b8fb272cad98f053613defff9d3c37730c51881126ae295c31fc811c023
|
7
|
+
data.tar.gz: badaf32c3b391fa21033fd0184b8785c607aa13837fbeeeef654f564f679267071e3a487d9dd1a1e8c7224b1f3b2b46006889456defa8cc6843abe470bb6586b
|
data/Gemfile.lock
CHANGED
@@ -21,6 +21,18 @@ module GraphitiGraphQL
|
|
21
21
|
@relationships[name].instance_eval(&blk)
|
22
22
|
end
|
23
23
|
end
|
24
|
+
|
25
|
+
def polymorphic?
|
26
|
+
@type_name.is_a?(Hash)
|
27
|
+
end
|
28
|
+
|
29
|
+
def klass_name
|
30
|
+
if polymorphic?
|
31
|
+
"I#{@relationships.keys[0].to_s.camelize}"
|
32
|
+
else
|
33
|
+
@type_name
|
34
|
+
end
|
35
|
+
end
|
24
36
|
end
|
25
37
|
end
|
26
38
|
end
|
@@ -64,18 +64,30 @@ module GraphitiGraphQL
|
|
64
64
|
# * Add to the list of external graphql-ruby types we need in schema
|
65
65
|
# * Add a gql-specific attribute to the serializer that gives apollo
|
66
66
|
# the representation it needs.
|
67
|
-
def federated_belongs_to(name, type: nil, foreign_key: nil)
|
67
|
+
def federated_belongs_to(name, type: nil, foreign_key: nil, foreign_type: nil)
|
68
68
|
type ||= name.to_s.camelize
|
69
69
|
foreign_key ||= :"#{name.to_s.underscore}_id"
|
70
70
|
resource = FederatedResource.new(type)
|
71
71
|
federated_resources << resource
|
72
72
|
resource.add_relationship(:belongs_to, name, self, foreign_key)
|
73
73
|
|
74
|
+
foreign_type ||= :"#{name.to_s.underscore}_type" if resource.polymorphic?
|
75
|
+
|
74
76
|
opts = {readable: :gql?, only: [:readable], schema: false}
|
75
77
|
attribute name, :hash, opts do
|
76
78
|
prc = self.class.attribute_blocks[foreign_key]
|
77
79
|
fk = prc ? instance_eval(&prc) : @object.send(foreign_key)
|
78
|
-
|
80
|
+
|
81
|
+
typename = type
|
82
|
+
if resource.polymorphic?
|
83
|
+
prc = self.class.attribute_blocks[foreign_type]
|
84
|
+
ft = prc ? instance_eval(&prc) : @object.send(foreign_type)
|
85
|
+
typename = type[ft]
|
86
|
+
end
|
87
|
+
|
88
|
+
if fk && typename.present?
|
89
|
+
{__typename: typename, id: fk.to_s}
|
90
|
+
end
|
79
91
|
end
|
80
92
|
end
|
81
93
|
end
|
@@ -66,19 +66,39 @@ module GraphitiGraphQL
|
|
66
66
|
pre_registered = !!type_registry[federated_resource.type_name]
|
67
67
|
type_class = if pre_registered
|
68
68
|
type_registry[federated_resource.type_name][:type]
|
69
|
+
elsif federated_resource.polymorphic?
|
70
|
+
add_federated_resource_interface(federated_resource)
|
69
71
|
else
|
70
|
-
add_federated_resource_type(federated_resource.
|
72
|
+
add_federated_resource_type(federated_resource.klass_name)
|
71
73
|
end
|
72
74
|
|
73
75
|
yield type_class, federated_resource
|
74
76
|
end
|
75
77
|
end
|
76
78
|
|
77
|
-
def
|
79
|
+
def add_federated_resource_interface(federated_resource)
|
80
|
+
interface = define_polymorphic_federated_resource_interface(federated_resource.klass_name)
|
81
|
+
federated_resource.type_name.values.each do |name|
|
82
|
+
add_federated_resource_type(name, interface: interface)
|
83
|
+
end
|
84
|
+
interface
|
85
|
+
end
|
86
|
+
|
87
|
+
def define_polymorphic_federated_resource_interface(klass_name)
|
88
|
+
interface = Module.new
|
89
|
+
interface.send(:include, @schema.class.base_interface)
|
90
|
+
interface.graphql_name(klass_name)
|
91
|
+
interface.field :id, String, null: false, external: true
|
92
|
+
type_registry[klass_name] = {type: interface, interface: true}
|
93
|
+
interface
|
94
|
+
end
|
95
|
+
|
96
|
+
def add_federated_resource_type(klass_name, interface: nil)
|
78
97
|
federated_type = Class.new(@schema.class.base_object)
|
79
98
|
federated_type.graphql_name klass_name
|
80
99
|
federated_type.key(fields: "id")
|
81
100
|
federated_type.extend_type
|
101
|
+
federated_type.implements(interface) if interface
|
82
102
|
federated_type.field :id, String, null: false, external: true
|
83
103
|
federated_type.class_eval do
|
84
104
|
def self.resolve_reference(reference, _context, _lookup)
|
@@ -161,7 +181,7 @@ module GraphitiGraphQL
|
|
161
181
|
|
162
182
|
local_types.each do |local|
|
163
183
|
local.field relationship.name,
|
164
|
-
type_registry[federated_resource.
|
184
|
+
type_registry[federated_resource.klass_name][:type],
|
165
185
|
null: true
|
166
186
|
end
|
167
187
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphiti_graphql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lee Richmond
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-06-
|
11
|
+
date: 2021-06-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: graphiti
|