graphql_includable 0.5.0 → 1.0.0.beta.0

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.
@@ -1,83 +0,0 @@
1
- module GraphQLIncludable
2
- module Relay
3
- module Instrumentation
4
- class Connection
5
- # rubocop:disable Metrics/AbcSize
6
- def instrument(_type, field)
7
- return field unless edge_with_node_connection?(field)
8
-
9
- raise ArgumentError, 'Connection does not support fetching using :property' if field.property.present?
10
-
11
- validate!(field)
12
- edge_to_node_property = field.metadata[:edge_to_node_property]
13
- explicit_includes = field.metadata[:includes]
14
- edges_prop = explicit_includes[:edges]
15
- nodes_prop = explicit_includes[:nodes]
16
-
17
- if proc_based?(field)
18
- edges_resolver = field.metadata[:resolve_edges]
19
- nodes_resolver = field.metadata[:resolve_nodes]
20
- else
21
- # Use the edges and nodes symbols from the incldues pattern as the propeties to fetch
22
- edges_resolver = ->(obj, _args, _ctx) { obj.public_send(edges_prop) }
23
- nodes_resolver = ->(obj, _args, _ctx) { obj.public_send(nodes_prop) }
24
- end
25
-
26
- _original_resolve = field.resolve_proc
27
- new_resolve_proc = ->(obj, args, ctx) do
28
- ConnectionEdgesAndNodes.new(obj, args, ctx,
29
- edges_prop, nodes_prop, edge_to_node_property,
30
- edges_resolver, nodes_resolver)
31
- end
32
-
33
- field.redefine { resolve(new_resolve_proc) }
34
- end
35
- # rubocop:enable Metrics/AbcSize
36
-
37
- private
38
-
39
- def edge_with_node_connection?(field)
40
- field.connection? && field.type.fields['edges'].metadata.key?(:_includable_connection_marker)
41
- end
42
-
43
- def proc_based?(field)
44
- required_metadata = [:resolve_edges, :resolve_nodes]
45
- has_a_resolver = required_metadata.any? { |key| field.metadata.key?(key) }
46
-
47
- return false unless has_a_resolver
48
- unless required_metadata.all? { |key| field.metadata.key?(key) }
49
- raise ArgumentError, "Missing one of #{required_metadata}"
50
- end
51
-
52
- true
53
- end
54
-
55
- # rubocop:disable Metrics/AbcSize
56
- def validate!(field)
57
- unless field.metadata.key?(:edge_to_node_property)
58
- raise ArgumentError, 'Missing edge_to_node_property definition for field'
59
- end
60
- unless field.metadata[:edge_to_node_property].is_a?(Symbol)
61
- raise ArgumentError, ':edge_to_node_property must be a symbol'
62
- end
63
-
64
- raise ArgumentError, 'Missing includes definition for field' unless field.metadata.key?(:includes)
65
- includes = field.metadata[:includes]
66
- unless includes.is_a?(Hash)
67
- raise ArgumentError, 'Connection includes must be a hash containing :edges and :nodes keys'
68
- end
69
- raise ArgumentError, 'Missing :nodes includes' unless includes.key?(:nodes)
70
- raise ArgumentError, 'Missing :edges includes' unless includes.key?(:edges)
71
- raise ArgumentError, ':edges must be a symbol' unless includes[:edges].is_a?(Symbol)
72
- raise ArgumentError, ':nodes must be a symbol' unless includes[:edges].is_a?(Symbol)
73
- end
74
- # rubocop:enable Metrics/AbcSize
75
- end
76
-
77
- GraphQL::Relay::BaseConnection.register_connection_implementation(
78
- GraphQLIncludable::Relay::ConnectionEdgesAndNodes,
79
- GraphQLIncludable::Relay::EdgeWithNodeConnection
80
- )
81
- end
82
- end
83
- end