graphql 1.13.24 → 2.0.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.

Potentially problematic release.


This version of graphql might be problematic. Click here for more details.

Files changed (195) hide show
  1. checksums.yaml +4 -4
  2. data/lib/graphql/analysis/ast/query_complexity.rb +1 -1
  3. data/lib/graphql/analysis/ast/query_depth.rb +0 -1
  4. data/lib/graphql/analysis/ast/visitor.rb +1 -1
  5. data/lib/graphql/analysis/ast.rb +0 -10
  6. data/lib/graphql/analysis.rb +0 -7
  7. data/lib/graphql/backtrace/table.rb +0 -18
  8. data/lib/graphql/backtrace/tracer.rb +1 -2
  9. data/lib/graphql/backtrace.rb +2 -8
  10. data/lib/graphql/dig.rb +1 -1
  11. data/lib/graphql/execution/errors.rb +1 -9
  12. data/lib/graphql/execution/interpreter/runtime.rb +6 -13
  13. data/lib/graphql/execution/interpreter.rb +0 -22
  14. data/lib/graphql/execution/lazy.rb +1 -1
  15. data/lib/graphql/execution/lookahead.rb +6 -13
  16. data/lib/graphql/execution/multiplex.rb +50 -107
  17. data/lib/graphql/execution.rb +11 -3
  18. data/lib/graphql/introspection/directive_type.rb +2 -2
  19. data/lib/graphql/introspection/dynamic_fields.rb +3 -8
  20. data/lib/graphql/introspection/entry_points.rb +2 -15
  21. data/lib/graphql/introspection/field_type.rb +1 -1
  22. data/lib/graphql/introspection/schema_type.rb +2 -2
  23. data/lib/graphql/introspection/type_type.rb +5 -5
  24. data/lib/graphql/language/document_from_schema_definition.rb +0 -17
  25. data/lib/graphql/language/nodes.rb +0 -3
  26. data/lib/graphql/pagination/connections.rb +2 -28
  27. data/lib/graphql/query/context.rb +1 -185
  28. data/lib/graphql/query/input_validation_result.rb +0 -9
  29. data/lib/graphql/query/literal_input.rb +8 -13
  30. data/lib/graphql/query/validation_pipeline.rb +6 -34
  31. data/lib/graphql/query/variable_validation_error.rb +2 -2
  32. data/lib/graphql/query/variables.rb +8 -31
  33. data/lib/graphql/query.rb +5 -34
  34. data/lib/graphql/railtie.rb +0 -104
  35. data/lib/graphql/relay/range_add.rb +0 -4
  36. data/lib/graphql/relay.rb +0 -15
  37. data/lib/graphql/schema/addition.rb +1 -8
  38. data/lib/graphql/schema/argument.rb +6 -28
  39. data/lib/graphql/schema/build_from_definition.rb +7 -9
  40. data/lib/graphql/schema/directive.rb +1 -22
  41. data/lib/graphql/schema/enum.rb +3 -19
  42. data/lib/graphql/schema/enum_value.rb +1 -23
  43. data/lib/graphql/schema/field.rb +22 -221
  44. data/lib/graphql/schema/input_object.rb +17 -65
  45. data/lib/graphql/schema/interface.rb +1 -30
  46. data/lib/graphql/schema/introspection_system.rb +3 -8
  47. data/lib/graphql/schema/late_bound_type.rb +2 -2
  48. data/lib/graphql/schema/list.rb +3 -24
  49. data/lib/graphql/schema/loader.rb +0 -1
  50. data/lib/graphql/schema/member/base_dsl_methods.rb +1 -6
  51. data/lib/graphql/schema/member/build_type.rb +4 -6
  52. data/lib/graphql/schema/member/has_arguments.rb +16 -20
  53. data/lib/graphql/schema/member/has_fields.rb +3 -3
  54. data/lib/graphql/schema/member/has_interfaces.rb +1 -13
  55. data/lib/graphql/schema/member/validates_input.rb +2 -2
  56. data/lib/graphql/schema/member.rb +0 -6
  57. data/lib/graphql/schema/mutation.rb +0 -9
  58. data/lib/graphql/schema/non_null.rb +3 -9
  59. data/lib/graphql/schema/object.rb +0 -40
  60. data/lib/graphql/schema/relay_classic_mutation.rb +17 -28
  61. data/lib/graphql/schema/scalar.rb +1 -16
  62. data/lib/graphql/schema/union.rb +0 -16
  63. data/lib/graphql/schema/warden.rb +3 -12
  64. data/lib/graphql/schema/wrapper.rb +0 -5
  65. data/lib/graphql/schema.rb +106 -945
  66. data/lib/graphql/static_validation/base_visitor.rb +4 -21
  67. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +12 -12
  68. data/lib/graphql/static_validation/validator.rb +2 -24
  69. data/lib/graphql/static_validation.rb +0 -2
  70. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +38 -1
  71. data/lib/graphql/subscriptions/event.rb +1 -1
  72. data/lib/graphql/subscriptions/instrumentation.rb +0 -51
  73. data/lib/graphql/subscriptions.rb +4 -13
  74. data/lib/graphql/tracing/data_dog_tracing.rb +16 -20
  75. data/lib/graphql/tracing/platform_tracing.rb +4 -32
  76. data/lib/graphql/tracing.rb +0 -1
  77. data/lib/graphql/types/relay/connection_behaviors.rb +2 -6
  78. data/lib/graphql/types/relay/default_relay.rb +0 -10
  79. data/lib/graphql/types/relay/node_behaviors.rb +5 -1
  80. data/lib/graphql/types/relay.rb +0 -2
  81. data/lib/graphql/types/string.rb +1 -1
  82. data/lib/graphql/version.rb +1 -1
  83. data/lib/graphql.rb +1 -66
  84. metadata +28 -164
  85. data/lib/graphql/analysis/analyze_query.rb +0 -98
  86. data/lib/graphql/analysis/field_usage.rb +0 -45
  87. data/lib/graphql/analysis/max_query_complexity.rb +0 -26
  88. data/lib/graphql/analysis/max_query_depth.rb +0 -26
  89. data/lib/graphql/analysis/query_complexity.rb +0 -88
  90. data/lib/graphql/analysis/query_depth.rb +0 -43
  91. data/lib/graphql/analysis/reducer_state.rb +0 -48
  92. data/lib/graphql/argument.rb +0 -131
  93. data/lib/graphql/authorization.rb +0 -82
  94. data/lib/graphql/backtrace/legacy_tracer.rb +0 -56
  95. data/lib/graphql/backwards_compatibility.rb +0 -61
  96. data/lib/graphql/base_type.rb +0 -232
  97. data/lib/graphql/boolean_type.rb +0 -2
  98. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
  99. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
  100. data/lib/graphql/compatibility/execution_specification.rb +0 -436
  101. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
  102. data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -215
  103. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -87
  104. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
  105. data/lib/graphql/compatibility/query_parser_specification.rb +0 -266
  106. data/lib/graphql/compatibility/schema_parser_specification.rb +0 -682
  107. data/lib/graphql/compatibility.rb +0 -5
  108. data/lib/graphql/define/assign_argument.rb +0 -12
  109. data/lib/graphql/define/assign_connection.rb +0 -13
  110. data/lib/graphql/define/assign_enum_value.rb +0 -18
  111. data/lib/graphql/define/assign_global_id_field.rb +0 -11
  112. data/lib/graphql/define/assign_mutation_function.rb +0 -34
  113. data/lib/graphql/define/assign_object_field.rb +0 -42
  114. data/lib/graphql/define/defined_object_proxy.rb +0 -53
  115. data/lib/graphql/define/instance_definable.rb +0 -255
  116. data/lib/graphql/define/no_definition_error.rb +0 -7
  117. data/lib/graphql/define/non_null_with_bang.rb +0 -16
  118. data/lib/graphql/define/type_definer.rb +0 -31
  119. data/lib/graphql/define.rb +0 -31
  120. data/lib/graphql/deprecated_dsl.rb +0 -55
  121. data/lib/graphql/directive/deprecated_directive.rb +0 -2
  122. data/lib/graphql/directive/include_directive.rb +0 -2
  123. data/lib/graphql/directive/skip_directive.rb +0 -2
  124. data/lib/graphql/directive.rb +0 -107
  125. data/lib/graphql/enum_type.rb +0 -133
  126. data/lib/graphql/execution/execute.rb +0 -333
  127. data/lib/graphql/execution/flatten.rb +0 -40
  128. data/lib/graphql/execution/typecast.rb +0 -50
  129. data/lib/graphql/field/resolve.rb +0 -59
  130. data/lib/graphql/field.rb +0 -226
  131. data/lib/graphql/float_type.rb +0 -2
  132. data/lib/graphql/function.rb +0 -128
  133. data/lib/graphql/id_type.rb +0 -2
  134. data/lib/graphql/input_object_type.rb +0 -138
  135. data/lib/graphql/int_type.rb +0 -2
  136. data/lib/graphql/interface_type.rb +0 -72
  137. data/lib/graphql/internal_representation/document.rb +0 -27
  138. data/lib/graphql/internal_representation/node.rb +0 -206
  139. data/lib/graphql/internal_representation/print.rb +0 -51
  140. data/lib/graphql/internal_representation/rewrite.rb +0 -184
  141. data/lib/graphql/internal_representation/scope.rb +0 -88
  142. data/lib/graphql/internal_representation/visit.rb +0 -36
  143. data/lib/graphql/internal_representation.rb +0 -7
  144. data/lib/graphql/list_type.rb +0 -80
  145. data/lib/graphql/non_null_type.rb +0 -71
  146. data/lib/graphql/object_type.rb +0 -130
  147. data/lib/graphql/query/arguments.rb +0 -189
  148. data/lib/graphql/query/arguments_cache.rb +0 -24
  149. data/lib/graphql/query/executor.rb +0 -52
  150. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
  151. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
  152. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
  153. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
  154. data/lib/graphql/query/serial_execution.rb +0 -40
  155. data/lib/graphql/relay/array_connection.rb +0 -83
  156. data/lib/graphql/relay/base_connection.rb +0 -189
  157. data/lib/graphql/relay/connection_instrumentation.rb +0 -54
  158. data/lib/graphql/relay/connection_resolve.rb +0 -43
  159. data/lib/graphql/relay/connection_type.rb +0 -54
  160. data/lib/graphql/relay/edge.rb +0 -27
  161. data/lib/graphql/relay/edge_type.rb +0 -19
  162. data/lib/graphql/relay/edges_instrumentation.rb +0 -39
  163. data/lib/graphql/relay/global_id_resolve.rb +0 -17
  164. data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
  165. data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
  166. data/lib/graphql/relay/mutation/resolve.rb +0 -56
  167. data/lib/graphql/relay/mutation/result.rb +0 -38
  168. data/lib/graphql/relay/mutation.rb +0 -106
  169. data/lib/graphql/relay/node.rb +0 -39
  170. data/lib/graphql/relay/page_info.rb +0 -7
  171. data/lib/graphql/relay/relation_connection.rb +0 -188
  172. data/lib/graphql/relay/type_extensions.rb +0 -32
  173. data/lib/graphql/scalar_type.rb +0 -91
  174. data/lib/graphql/schema/catchall_middleware.rb +0 -35
  175. data/lib/graphql/schema/default_parse_error.rb +0 -10
  176. data/lib/graphql/schema/default_type_error.rb +0 -17
  177. data/lib/graphql/schema/member/accepts_definition.rb +0 -164
  178. data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -58
  179. data/lib/graphql/schema/member/instrumentation.rb +0 -131
  180. data/lib/graphql/schema/middleware_chain.rb +0 -82
  181. data/lib/graphql/schema/possible_types.rb +0 -44
  182. data/lib/graphql/schema/rescue_middleware.rb +0 -60
  183. data/lib/graphql/schema/timeout_middleware.rb +0 -88
  184. data/lib/graphql/schema/traversal.rb +0 -228
  185. data/lib/graphql/schema/validation.rb +0 -313
  186. data/lib/graphql/static_validation/default_visitor.rb +0 -15
  187. data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
  188. data/lib/graphql/string_type.rb +0 -2
  189. data/lib/graphql/subscriptions/subscription_root.rb +0 -76
  190. data/lib/graphql/tracing/skylight_tracing.rb +0 -70
  191. data/lib/graphql/types/relay/node_field.rb +0 -24
  192. data/lib/graphql/types/relay/nodes_field.rb +0 -43
  193. data/lib/graphql/union_type.rb +0 -115
  194. data/lib/graphql/upgrader/member.rb +0 -937
  195. data/lib/graphql/upgrader/schema.rb +0 -38
@@ -1,56 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Relay
4
- class Mutation
5
- # Wrap a user-provided resolve function,
6
- # wrapping the returned value in a {Mutation::Result}.
7
- # Also, pass the `clientMutationId` to that result object.
8
- # @api private
9
- class Resolve
10
- def initialize(mutation, resolve)
11
- @mutation = mutation
12
- @resolve = resolve
13
- @wrap_result = mutation.is_a?(GraphQL::Relay::Mutation) && mutation.has_generated_return_type?
14
- @class_based = mutation.is_a?(Class)
15
- end
16
-
17
- def call(obj, args, ctx)
18
- mutation_result = begin
19
- @resolve.call(obj, args[:input], ctx)
20
- rescue GraphQL::ExecutionError => err
21
- err
22
- end
23
-
24
- ctx.schema.after_lazy(mutation_result) do |res|
25
- build_result(res, args, ctx)
26
- end
27
- end
28
-
29
- private
30
-
31
- def build_result(mutation_result, args, ctx)
32
- if mutation_result.is_a?(GraphQL::ExecutionError)
33
- ctx.add_error(mutation_result)
34
- mutation_result = nil
35
- end
36
-
37
- if mutation_result.nil?
38
- nil
39
- elsif @wrap_result
40
- if mutation_result && !mutation_result.is_a?(Hash)
41
- raise StandardError, "Expected `#{mutation_result}` to be a Hash."\
42
- " Return a hash when using `return_field` or specify a custom `return_type`."
43
- end
44
-
45
- @mutation.result_class.new(client_mutation_id: args[:input][:clientMutationId], result: mutation_result)
46
- elsif @class_based
47
- mutation_result[:client_mutation_id] = args[:input][:client_mutation_id]
48
- mutation_result
49
- else
50
- mutation_result
51
- end
52
- end
53
- end
54
- end
55
- end
56
- end
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Relay
4
- class Mutation
5
- # Use this when the mutation's return type was generated from `return_field`s.
6
- # It delegates field lookups to the hash returned from `resolve`.
7
- # @api private
8
- class Result
9
- attr_reader :client_mutation_id
10
- def initialize(client_mutation_id:, result:)
11
- @client_mutation_id = client_mutation_id
12
- result && result.each do |key, value|
13
- self.public_send("#{key}=", value)
14
- end
15
- end
16
-
17
- class << self
18
- attr_accessor :mutation
19
- end
20
-
21
- # Build a subclass whose instances have a method
22
- # for each of `mutation_defn`'s `return_field`s
23
- # @param mutation_defn [GraphQL::Relay::Mutation]
24
- # @return [Class]
25
- def self.define_subclass(mutation_defn)
26
- subclass = Class.new(self) do
27
- mutation_result_methods = mutation_defn.return_type.all_fields.map do |f|
28
- f.property || f.name
29
- end
30
- attr_accessor(*mutation_result_methods)
31
- self.mutation = mutation_defn
32
- end
33
- subclass
34
- end
35
- end
36
- end
37
- end
38
- end
@@ -1,106 +0,0 @@
1
- # frozen_string_literal: true
2
- require "graphql/relay/mutation/instrumentation"
3
- require "graphql/relay/mutation/resolve"
4
- require "graphql/relay/mutation/result"
5
-
6
- module GraphQL
7
- module Relay
8
- # @api deprecated
9
- class Mutation
10
- include GraphQL::Define::InstanceDefinable
11
- deprecated_accepts_definitions(
12
- :name, :description, :resolve,
13
- :return_type,
14
- :return_interfaces,
15
- input_field: GraphQL::Define::AssignArgument,
16
- return_field: GraphQL::Define::AssignObjectField,
17
- function: GraphQL::Define::AssignMutationFunction,
18
- )
19
- attr_accessor :name, :description, :fields, :arguments
20
- attr_writer :return_type, :return_interfaces
21
-
22
- ensure_defined(
23
- :input_fields, :return_fields, :name, :description,
24
- :fields, :arguments, :return_type,
25
- :return_interfaces, :resolve=,
26
- :field, :result_class, :input_type
27
- )
28
- # For backwards compat, but do we need this separate API?
29
- alias :return_fields :fields
30
- alias :input_fields :arguments
31
-
32
- def initialize
33
- GraphQL::Deprecation.warn "GraphQL::Relay::Mutation will be removed from GraphQL-Ruby 2.0, use GraphQL::Schema::RelayClassicMutation instead: https://graphql-ruby.org/mutations/mutation_classes"
34
- @fields = {}
35
- @arguments = {}
36
- @has_generated_return_type = false
37
- end
38
-
39
- def has_generated_return_type?
40
- # Trigger the generation of the return type, if it is dynamically generated:
41
- return_type
42
- @has_generated_return_type
43
- end
44
-
45
- def resolve=(new_resolve_proc)
46
- @resolve_proc = new_resolve_proc
47
- end
48
-
49
- def field
50
- @field ||= begin
51
- relay_mutation = self
52
- field_resolve_proc = @resolve_proc
53
- GraphQL::Field.define do
54
- type(relay_mutation.return_type)
55
- description(relay_mutation.description)
56
- argument :input, !relay_mutation.input_type
57
- resolve(field_resolve_proc)
58
- mutation(relay_mutation)
59
- end
60
- end
61
- end
62
-
63
- def return_interfaces
64
- @return_interfaces ||= []
65
- end
66
-
67
- def return_type
68
- @return_type ||= begin
69
- @has_generated_return_type = true
70
- relay_mutation = self
71
- GraphQL::ObjectType.define do
72
- name("#{relay_mutation.name}Payload")
73
- description("Autogenerated return type of #{relay_mutation.name}")
74
- field :clientMutationId, types.String, "A unique identifier for the client performing the mutation.", property: :client_mutation_id
75
- interfaces relay_mutation.return_interfaces
76
- relay_mutation.return_fields.each do |name, field_obj|
77
- field name, field: field_obj
78
- end
79
- mutation(relay_mutation)
80
- end
81
- end
82
- end
83
-
84
- def input_type
85
- @input_type ||= begin
86
- relay_mutation = self
87
- input_object_type = GraphQL::InputObjectType.define do
88
- name("#{relay_mutation.name}Input")
89
- description("Autogenerated input type of #{relay_mutation.name}")
90
- input_field :clientMutationId, types.String, "A unique identifier for the client performing the mutation."
91
- mutation(relay_mutation)
92
- end
93
- input_fields.each do |name, arg|
94
- input_object_type.arguments[name] = arg
95
- end
96
-
97
- input_object_type
98
- end
99
- end
100
-
101
- def result_class
102
- @result_class ||= Result.define_subclass(self)
103
- end
104
- end
105
- end
106
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Relay
4
- # Helpers for working with Relay-specific Node objects.
5
- module Node
6
- # @return [GraphQL::Field] a field for finding objects by their global ID.
7
- def self.field(**kwargs, &block)
8
- GraphQL::Deprecation.warn "GraphQL::Relay::Node.field will be removed from GraphQL-Ruby 2.0, use GraphQL::Types::Relay::NodeField instead"
9
- # We have to define it fresh each time because
10
- # its name will be modified and its description
11
- # _may_ be modified.
12
- field = GraphQL::Types::Relay::NodeField.graphql_definition
13
-
14
- if kwargs.any? || block
15
- field = field.redefine(**kwargs, &block)
16
- end
17
-
18
- field
19
- end
20
-
21
- def self.plural_field(**kwargs, &block)
22
- GraphQL::Deprecation.warn "GraphQL::Relay::Nodes.field will be removed from GraphQL-Ruby 2.0, use GraphQL::Types::Relay::NodesField instead"
23
- field = GraphQL::Types::Relay::NodesField.graphql_definition
24
-
25
- if kwargs.any? || block
26
- field = field.redefine(**kwargs, &block)
27
- end
28
-
29
- field
30
- end
31
-
32
- # @return [GraphQL::InterfaceType] The interface which all Relay types must implement
33
- def self.interface
34
- GraphQL::Deprecation.warn "GraphQL::Relay::Node.interface will be removed from GraphQL-Ruby 2.0, use GraphQL::Types::Relay::Node instead"
35
- @interface ||= GraphQL::Types::Relay::Node.graphql_definition
36
- end
37
- end
38
- end
39
- end
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Relay
4
- # Wrap a Connection and expose its page info
5
- PageInfo = GraphQL::Types::Relay::PageInfo.graphql_definition(silence_deprecation_warning: true)
6
- end
7
- end
@@ -1,188 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Relay
4
- # A connection implementation to expose SQL collection objects.
5
- # It works for:
6
- # - `ActiveRecord::Relation`
7
- # - `Sequel::Dataset`
8
- class RelationConnection < BaseConnection
9
- def cursor_from_node(item)
10
- item_index = paged_nodes.index(item)
11
- if item_index.nil?
12
- raise("Can't generate cursor, item not found in connection: #{item}")
13
- else
14
- offset = item_index + 1 + ((paged_nodes_offset || 0) - (relation_offset(sliced_nodes) || 0))
15
-
16
- if after
17
- offset += offset_from_cursor(after)
18
- elsif before
19
- offset += offset_from_cursor(before) - 1 - sliced_nodes_count
20
- end
21
-
22
- encode(offset.to_s)
23
- end
24
- end
25
-
26
- def has_next_page
27
- if first
28
- if defined?(ActiveRecord::Relation) && nodes.is_a?(ActiveRecord::Relation)
29
- initial_offset = after ? offset_from_cursor(after) : 0
30
- return paged_nodes.length >= first && nodes.offset(first + initial_offset).exists?
31
- end
32
- return paged_nodes.length >= first && sliced_nodes_count > first
33
- end
34
- if GraphQL::Relay::ConnectionType.bidirectional_pagination && last
35
- return sliced_nodes_count >= last
36
- end
37
- false
38
- end
39
-
40
- def has_previous_page
41
- if last
42
- paged_nodes.length >= last && sliced_nodes_count > last
43
- elsif GraphQL::Relay::ConnectionType.bidirectional_pagination && after
44
- # We've already paginated through the collection a bit,
45
- # there are nodes behind us
46
- offset_from_cursor(after) > 0
47
- else
48
- false
49
- end
50
- end
51
-
52
- def first
53
- @first ||= begin
54
- capped = limit_pagination_argument(arguments[:first], max_page_size)
55
- if capped.nil? && last.nil?
56
- capped = max_page_size
57
- end
58
- capped
59
- end
60
- end
61
-
62
- def last
63
- @last ||= limit_pagination_argument(arguments[:last], max_page_size)
64
- end
65
-
66
- private
67
-
68
- # apply first / last limit results
69
- # @return [Array]
70
- def paged_nodes
71
- return @paged_nodes if defined? @paged_nodes
72
-
73
- items = sliced_nodes
74
-
75
- if first
76
- if relation_limit(items).nil? || relation_limit(items) > first
77
- items = items.limit(first)
78
- end
79
- end
80
-
81
- if last
82
- if relation_limit(items)
83
- if last <= relation_limit(items)
84
- offset = (relation_offset(items) || 0) + (relation_limit(items) - last)
85
- items = items.offset(offset).limit(last)
86
- end
87
- else
88
- slice_count = relation_count(items)
89
- offset = (relation_offset(items) || 0) + slice_count - [last, slice_count].min
90
- items = items.offset(offset).limit(last)
91
- end
92
- end
93
-
94
- if max_page_size && !first && !last
95
- if relation_limit(items).nil? || relation_limit(items) > max_page_size
96
- items = items.limit(max_page_size)
97
- end
98
- end
99
-
100
- # Store this here so we can convert the relation to an Array
101
- # (this avoids an extra DB call on Sequel)
102
- @paged_nodes_offset = relation_offset(items)
103
- @paged_nodes = items.to_a
104
- end
105
-
106
- def paged_nodes_offset
107
- paged_nodes && @paged_nodes_offset
108
- end
109
-
110
- def relation_offset(relation)
111
- if relation.respond_to?(:offset_value)
112
- relation.offset_value
113
- else
114
- relation.opts[:offset]
115
- end
116
- end
117
-
118
- def relation_limit(relation)
119
- if relation.respond_to?(:limit_value)
120
- relation.limit_value
121
- else
122
- relation.opts[:limit]
123
- end
124
- end
125
-
126
- # If a relation contains a `.group` clause, a `.count` will return a Hash.
127
- def relation_count(relation)
128
- count_or_hash = if(defined?(ActiveRecord::Relation) && relation.is_a?(ActiveRecord::Relation))
129
- relation.respond_to?(:unscope)? relation.unscope(:order).count(:all) : relation.count(:all)
130
- else # eg, Sequel::Dataset, don't mess up others
131
- relation.count
132
- end
133
- count_or_hash.is_a?(Integer) ? count_or_hash : count_or_hash.length
134
- end
135
-
136
- # Apply cursors to edges
137
- def sliced_nodes
138
- return @sliced_nodes if defined? @sliced_nodes
139
-
140
- @sliced_nodes = nodes
141
-
142
- if after
143
- offset = (relation_offset(@sliced_nodes) || 0) + offset_from_cursor(after)
144
- @sliced_nodes = @sliced_nodes.offset(offset)
145
- end
146
-
147
- if before && after
148
- if offset_from_cursor(after) < offset_from_cursor(before)
149
- @sliced_nodes = limit_nodes(@sliced_nodes, offset_from_cursor(before) - offset_from_cursor(after) - 1)
150
- else
151
- @sliced_nodes = limit_nodes(@sliced_nodes, 0)
152
- end
153
-
154
- elsif before
155
- @sliced_nodes = limit_nodes(@sliced_nodes, offset_from_cursor(before) - 1)
156
- end
157
-
158
- @sliced_nodes
159
- end
160
-
161
- def limit_nodes(sliced_nodes, limit)
162
- if limit > 0 || defined?(ActiveRecord::Relation) && sliced_nodes.is_a?(ActiveRecord::Relation)
163
- sliced_nodes.limit(limit)
164
- else
165
- sliced_nodes.where(false)
166
- end
167
- end
168
-
169
- def sliced_nodes_count
170
- return @sliced_nodes_count if defined? @sliced_nodes_count
171
-
172
- # If a relation contains a `.group` clause, a `.count` will return a Hash.
173
- @sliced_nodes_count = relation_count(sliced_nodes)
174
- end
175
-
176
- def offset_from_cursor(cursor)
177
- decode(cursor).to_i
178
- end
179
- end
180
-
181
- if defined?(ActiveRecord::Relation)
182
- BaseConnection.register_connection_implementation(ActiveRecord::Relation, RelationConnection)
183
- end
184
- if defined?(Sequel::Dataset)
185
- BaseConnection.register_connection_implementation(Sequel::Dataset, RelationConnection)
186
- end
187
- end
188
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Relay
4
- # Mixin for Relay-related methods in type objects
5
- # (used by BaseType and Schema::Member).
6
- module TypeExtensions
7
- # @return [GraphQL::ObjectType] The default connection type for this object type
8
- def connection_type
9
- @connection_type ||= define_connection
10
- end
11
-
12
- # Define a custom connection type for this object type
13
- # @return [GraphQL::ObjectType]
14
- def define_connection(**kwargs, &block)
15
- GraphQL::Deprecation.warn ".connection_type and .define_connection will be removed from GraphQL-Ruby 2.0, use class-based type definitions instead: https://graphql-ruby.org/schema/class_based_api.html"
16
- GraphQL::Relay::ConnectionType.create_type(self, **kwargs, &block)
17
- end
18
-
19
- # @return [GraphQL::ObjectType] The default edge type for this object type
20
- def edge_type
21
- @edge_type ||= define_edge
22
- end
23
-
24
- # Define a custom edge type for this object type
25
- # @return [GraphQL::ObjectType]
26
- def define_edge(**kwargs, &block)
27
- GraphQL::Deprecation.warn ".edge_type and .define_edge will be removed from GraphQL-Ruby 2.0, use class-based type definitions instead: https://graphql-ruby.org/schema/class_based_api.html"
28
- GraphQL::Relay::EdgeType.create_type(self, **kwargs, &block)
29
- end
30
- end
31
- end
32
- end
@@ -1,91 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- # @api deprecated
4
- class ScalarType < GraphQL::BaseType
5
- extend Define::InstanceDefinable::DeprecatedDefine
6
-
7
- deprecated_accepts_definitions :coerce, :coerce_input, :coerce_result
8
- ensure_defined :coerce_non_null_input, :coerce_result
9
-
10
- module NoOpCoerce
11
- def self.call(val, ctx)
12
- val
13
- end
14
- end
15
-
16
- def initialize
17
- super
18
- self.coerce = NoOpCoerce
19
- end
20
-
21
- def coerce=(proc)
22
- self.coerce_input = proc
23
- self.coerce_result = proc
24
- end
25
-
26
- def coerce_input=(coerce_input_fn)
27
- if !coerce_input_fn.nil?
28
- @coerce_input_proc = ensure_two_arg(coerce_input_fn, :coerce_input)
29
- end
30
- end
31
-
32
- def coerce_result(value, ctx = nil)
33
- if ctx.nil?
34
- warn_deprecated_coerce("coerce_isolated_result")
35
- ctx = GraphQL::Query::NullContext
36
- end
37
- @coerce_result_proc.call(value, ctx)
38
- end
39
-
40
- def coerce_result=(coerce_result_fn)
41
- if !coerce_result_fn.nil?
42
- @coerce_result_proc = ensure_two_arg(coerce_result_fn, :coerce_result)
43
- end
44
- end
45
-
46
- def kind
47
- GraphQL::TypeKinds::SCALAR
48
- end
49
-
50
- private
51
-
52
- def ensure_two_arg(callable, method_name)
53
- GraphQL::BackwardsCompatibility.wrap_arity(callable, from: 1, to: 2, name: "#{name}.#{method_name}(val, ctx)")
54
- end
55
-
56
- def coerce_non_null_input(value, ctx)
57
- @coerce_input_proc.call(raw_coercion_input(value), ctx)
58
- end
59
-
60
- def raw_coercion_input(value)
61
- if value.is_a?(GraphQL::Language::Nodes::InputObject)
62
- value.to_h
63
- elsif value.is_a?(Array)
64
- value.map { |element| raw_coercion_input(element) }
65
- else
66
- value
67
- end
68
- end
69
-
70
- def validate_non_null_input(value, ctx)
71
- result = Query::InputValidationResult.new
72
-
73
- coerced_result = begin
74
- coerce_non_null_input(value, ctx)
75
- rescue GraphQL::CoercionError => err
76
- err
77
- end
78
-
79
- if value.is_a?(GraphQL::Language::Nodes::Enum) || coerced_result.nil?
80
- result.add_problem("Could not coerce value #{GraphQL::Language.serialize(value)} to #{name}")
81
- elsif coerced_result.is_a?(GraphQL::CoercionError)
82
- result.add_problem(
83
- coerced_result.message,
84
- message: coerced_result.message,
85
- extensions: coerced_result.extensions
86
- )
87
- end
88
- result
89
- end
90
- end
91
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- class Schema
4
- # In early GraphQL versions, errors would be "automatically"
5
- # rescued and replaced with `"Internal error"`. That behavior
6
- # was undesirable but this middleware is offered for people who
7
- # want to preserve it.
8
- #
9
- # It has a couple of differences from the previous behavior:
10
- #
11
- # - Other parts of the query _will_ be run (previously,
12
- # execution would stop when the error was raised and the result
13
- # would have no `"data"` key at all)
14
- # - The entry in {Query::Context#errors} is a {GraphQL::ExecutionError}, _not_
15
- # the originally-raised error.
16
- # - The entry in the `"errors"` key includes the location of the field
17
- # which raised the errors.
18
- #
19
- # @example Use CatchallMiddleware with your schema
20
- # # All errors will be suppressed and replaced with "Internal error" messages
21
- # MySchema.middleware << GraphQL::Schema::CatchallMiddleware
22
- #
23
- module CatchallMiddleware
24
- MESSAGE = "Internal error"
25
-
26
- # Rescue any error and replace it with a {GraphQL::ExecutionError}
27
- # whose message is {MESSAGE}
28
- def self.call(parent_type, parent_object, field_definition, field_args, query_context)
29
- yield
30
- rescue StandardError
31
- GraphQL::ExecutionError.new(MESSAGE)
32
- end
33
- end
34
- end
35
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- class Schema
4
- module DefaultParseError
5
- def self.call(parse_error, ctx)
6
- ctx.errors.push(parse_error)
7
- end
8
- end
9
- end
10
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- class Schema
4
- module DefaultTypeError
5
- def self.call(type_error, ctx)
6
- case type_error
7
- when GraphQL::InvalidNullError
8
- ctx.errors << type_error
9
- when GraphQL::UnresolvedTypeError, GraphQL::StringEncodingError, GraphQL::IntegerEncodingError
10
- raise type_error
11
- when GraphQL::IntegerDecodingError
12
- nil
13
- end
14
- end
15
- end
16
- end
17
- end