graphql 1.11.7 → 1.12.4

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 (140) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/install_generator.rb +7 -5
  3. data/lib/generators/graphql/relay.rb +55 -0
  4. data/lib/generators/graphql/relay_generator.rb +20 -0
  5. data/lib/generators/graphql/templates/base_connection.erb +8 -0
  6. data/lib/generators/graphql/templates/base_edge.erb +8 -0
  7. data/lib/generators/graphql/templates/node_type.erb +9 -0
  8. data/lib/generators/graphql/templates/object.erb +1 -1
  9. data/lib/generators/graphql/templates/query_type.erb +1 -3
  10. data/lib/generators/graphql/templates/schema.erb +8 -35
  11. data/lib/graphql.rb +38 -4
  12. data/lib/graphql/analysis/analyze_query.rb +7 -0
  13. data/lib/graphql/analysis/ast.rb +11 -2
  14. data/lib/graphql/analysis/ast/visitor.rb +9 -1
  15. data/lib/graphql/backtrace.rb +28 -19
  16. data/lib/graphql/backtrace/inspect_result.rb +0 -1
  17. data/lib/graphql/backtrace/legacy_tracer.rb +56 -0
  18. data/lib/graphql/backtrace/table.rb +22 -3
  19. data/lib/graphql/backtrace/traced_error.rb +0 -1
  20. data/lib/graphql/backtrace/tracer.rb +37 -10
  21. data/lib/graphql/backwards_compatibility.rb +2 -1
  22. data/lib/graphql/base_type.rb +1 -1
  23. data/lib/graphql/compatibility/execution_specification.rb +1 -0
  24. data/lib/graphql/compatibility/lazy_execution_specification.rb +2 -0
  25. data/lib/graphql/compatibility/query_parser_specification.rb +2 -0
  26. data/lib/graphql/compatibility/schema_parser_specification.rb +2 -0
  27. data/lib/graphql/dataloader.rb +208 -0
  28. data/lib/graphql/dataloader/null_dataloader.rb +21 -0
  29. data/lib/graphql/dataloader/request.rb +19 -0
  30. data/lib/graphql/dataloader/request_all.rb +19 -0
  31. data/lib/graphql/dataloader/source.rb +107 -0
  32. data/lib/graphql/define/assign_global_id_field.rb +1 -1
  33. data/lib/graphql/define/instance_definable.rb +32 -2
  34. data/lib/graphql/define/type_definer.rb +5 -5
  35. data/lib/graphql/deprecated_dsl.rb +7 -2
  36. data/lib/graphql/deprecation.rb +13 -0
  37. data/lib/graphql/enum_type.rb +2 -0
  38. data/lib/graphql/execution/errors.rb +4 -0
  39. data/lib/graphql/execution/execute.rb +7 -0
  40. data/lib/graphql/execution/interpreter.rb +11 -7
  41. data/lib/graphql/execution/interpreter/arguments.rb +51 -14
  42. data/lib/graphql/execution/interpreter/arguments_cache.rb +37 -14
  43. data/lib/graphql/execution/interpreter/handles_raw_value.rb +0 -7
  44. data/lib/graphql/execution/interpreter/resolve.rb +33 -25
  45. data/lib/graphql/execution/interpreter/runtime.rb +173 -123
  46. data/lib/graphql/execution/multiplex.rb +36 -23
  47. data/lib/graphql/function.rb +4 -0
  48. data/lib/graphql/input_object_type.rb +2 -0
  49. data/lib/graphql/interface_type.rb +3 -1
  50. data/lib/graphql/internal_representation/document.rb +2 -2
  51. data/lib/graphql/internal_representation/rewrite.rb +1 -1
  52. data/lib/graphql/language/document_from_schema_definition.rb +50 -23
  53. data/lib/graphql/object_type.rb +2 -2
  54. data/lib/graphql/pagination/connection.rb +5 -1
  55. data/lib/graphql/pagination/connections.rb +6 -16
  56. data/lib/graphql/parse_error.rb +0 -1
  57. data/lib/graphql/query.rb +10 -2
  58. data/lib/graphql/query/arguments.rb +1 -1
  59. data/lib/graphql/query/arguments_cache.rb +0 -1
  60. data/lib/graphql/query/context.rb +4 -2
  61. data/lib/graphql/query/executor.rb +0 -1
  62. data/lib/graphql/query/null_context.rb +3 -2
  63. data/lib/graphql/query/serial_execution.rb +1 -0
  64. data/lib/graphql/query/variable_validation_error.rb +1 -1
  65. data/lib/graphql/relay/base_connection.rb +7 -0
  66. data/lib/graphql/relay/connection_instrumentation.rb +4 -4
  67. data/lib/graphql/relay/connection_type.rb +1 -1
  68. data/lib/graphql/relay/mutation.rb +1 -0
  69. data/lib/graphql/relay/node.rb +3 -0
  70. data/lib/graphql/relay/type_extensions.rb +2 -0
  71. data/lib/graphql/scalar_type.rb +2 -0
  72. data/lib/graphql/schema.rb +64 -26
  73. data/lib/graphql/schema/argument.rb +86 -7
  74. data/lib/graphql/schema/build_from_definition.rb +139 -51
  75. data/lib/graphql/schema/directive.rb +76 -0
  76. data/lib/graphql/schema/directive/flagged.rb +57 -0
  77. data/lib/graphql/schema/enum.rb +3 -0
  78. data/lib/graphql/schema/enum_value.rb +12 -6
  79. data/lib/graphql/schema/field.rb +40 -16
  80. data/lib/graphql/schema/field/connection_extension.rb +3 -2
  81. data/lib/graphql/schema/find_inherited_value.rb +3 -1
  82. data/lib/graphql/schema/input_object.rb +39 -24
  83. data/lib/graphql/schema/interface.rb +1 -0
  84. data/lib/graphql/schema/member.rb +4 -0
  85. data/lib/graphql/schema/member/base_dsl_methods.rb +1 -0
  86. data/lib/graphql/schema/member/build_type.rb +3 -3
  87. data/lib/graphql/schema/member/has_arguments.rb +54 -49
  88. data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
  89. data/lib/graphql/schema/member/has_directives.rb +98 -0
  90. data/lib/graphql/schema/member/has_fields.rb +1 -4
  91. data/lib/graphql/schema/member/has_validators.rb +31 -0
  92. data/lib/graphql/schema/member/instrumentation.rb +0 -1
  93. data/lib/graphql/schema/member/type_system_helpers.rb +1 -1
  94. data/lib/graphql/schema/middleware_chain.rb +1 -1
  95. data/lib/graphql/schema/object.rb +11 -0
  96. data/lib/graphql/schema/printer.rb +5 -4
  97. data/lib/graphql/schema/resolver.rb +7 -0
  98. data/lib/graphql/schema/resolver/has_payload_type.rb +2 -0
  99. data/lib/graphql/schema/subscription.rb +19 -1
  100. data/lib/graphql/schema/timeout_middleware.rb +3 -1
  101. data/lib/graphql/schema/validation.rb +4 -2
  102. data/lib/graphql/schema/validator.rb +163 -0
  103. data/lib/graphql/schema/validator/exclusion_validator.rb +31 -0
  104. data/lib/graphql/schema/validator/format_validator.rb +49 -0
  105. data/lib/graphql/schema/validator/inclusion_validator.rb +33 -0
  106. data/lib/graphql/schema/validator/length_validator.rb +57 -0
  107. data/lib/graphql/schema/validator/numericality_validator.rb +71 -0
  108. data/lib/graphql/schema/validator/required_validator.rb +68 -0
  109. data/lib/graphql/static_validation/validator.rb +4 -0
  110. data/lib/graphql/subscriptions.rb +17 -20
  111. data/lib/graphql/subscriptions/event.rb +0 -1
  112. data/lib/graphql/subscriptions/instrumentation.rb +0 -1
  113. data/lib/graphql/subscriptions/serialize.rb +0 -1
  114. data/lib/graphql/subscriptions/subscription_root.rb +1 -1
  115. data/lib/graphql/tracing.rb +2 -2
  116. data/lib/graphql/tracing/appoptics_tracing.rb +3 -1
  117. data/lib/graphql/tracing/platform_tracing.rb +3 -1
  118. data/lib/graphql/tracing/skylight_tracing.rb +1 -1
  119. data/lib/graphql/types/relay.rb +11 -3
  120. data/lib/graphql/types/relay/base_connection.rb +2 -92
  121. data/lib/graphql/types/relay/base_edge.rb +2 -35
  122. data/lib/graphql/types/relay/connection_behaviors.rb +123 -0
  123. data/lib/graphql/types/relay/default_relay.rb +27 -0
  124. data/lib/graphql/types/relay/edge_behaviors.rb +42 -0
  125. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  126. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  127. data/lib/graphql/types/relay/node.rb +2 -4
  128. data/lib/graphql/types/relay/node_behaviors.rb +15 -0
  129. data/lib/graphql/types/relay/node_field.rb +1 -19
  130. data/lib/graphql/types/relay/nodes_field.rb +1 -19
  131. data/lib/graphql/types/relay/page_info.rb +2 -14
  132. data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
  133. data/lib/graphql/union_type.rb +2 -0
  134. data/lib/graphql/upgrader/member.rb +1 -0
  135. data/lib/graphql/upgrader/schema.rb +1 -0
  136. data/lib/graphql/version.rb +1 -1
  137. metadata +50 -93
  138. data/lib/graphql/types/relay/base_field.rb +0 -22
  139. data/lib/graphql/types/relay/base_interface.rb +0 -29
  140. data/lib/graphql/types/relay/base_object.rb +0 -26
@@ -29,11 +29,13 @@ module GraphQL
29
29
 
30
30
  include Tracing::Traceable
31
31
 
32
- attr_reader :context, :queries, :schema, :max_complexity
32
+ attr_reader :context, :queries, :schema, :max_complexity, :dataloader
33
33
  def initialize(schema:, queries:, context:, max_complexity:)
34
34
  @schema = schema
35
35
  @queries = queries
36
+ @queries.each { |q| q.multiplex = self }
36
37
  @context = context
38
+ @context[:dataloader] = @dataloader = @schema.dataloader_class.new
37
39
  @tracers = schema.tracers + (context[:tracers] || [])
38
40
  # Support `context: {backtrace: true}`
39
41
  if context[:backtrace] && !@tracers.include?(GraphQL::Backtrace::Tracer)
@@ -72,6 +74,24 @@ module GraphQL
72
74
  end
73
75
  end
74
76
 
77
+ # @param query [GraphQL::Query]
78
+ def begin_query(results, idx, query, multiplex)
79
+ operation = query.selected_operation
80
+ result = if operation.nil? || !query.valid? || query.context.errors.any?
81
+ NO_OPERATION
82
+ else
83
+ begin
84
+ # These were checked to be the same in `#supports_multiplexing?`
85
+ query.schema.query_execution_strategy.begin_query(query, multiplex)
86
+ rescue GraphQL::ExecutionError => err
87
+ query.context.errors << err
88
+ NO_OPERATION
89
+ end
90
+ end
91
+ results[idx] = result
92
+ nil
93
+ end
94
+
75
95
  private
76
96
 
77
97
  def run_as_multiplex(multiplex)
@@ -79,20 +99,28 @@ module GraphQL
79
99
  multiplex.schema.query_execution_strategy.begin_multiplex(multiplex)
80
100
  queries = multiplex.queries
81
101
  # Do as much eager evaluation of the query as possible
82
- results = queries.map do |query|
83
- begin_query(query, multiplex)
102
+ results = []
103
+ queries.each_with_index do |query, idx|
104
+ multiplex.dataloader.append_job { begin_query(results, idx, query, multiplex) }
84
105
  end
85
106
 
107
+ multiplex.dataloader.run
108
+
86
109
  # Then, work through lazy results in a breadth-first way
87
- multiplex.schema.query_execution_strategy.finish_multiplex(results, multiplex)
110
+ multiplex.dataloader.append_job {
111
+ multiplex.schema.query_execution_strategy.finish_multiplex(results, multiplex)
112
+ }
113
+ multiplex.dataloader.run
88
114
 
89
115
  # Then, find all errors and assign the result to the query object
90
- results.each_with_index.map do |data_result, idx|
116
+ results.each_with_index do |data_result, idx|
91
117
  query = queries[idx]
92
118
  finish_query(data_result, query, multiplex)
93
119
  # Get the Query::Result, not the Hash
94
- query.result
120
+ results[idx] = query.result
95
121
  end
122
+
123
+ results
96
124
  rescue Exception
97
125
  # TODO rescue at a higher level so it will catch errors in analysis, too
98
126
  # Assign values here so that the query's `@executed` becomes true
@@ -100,23 +128,6 @@ module GraphQL
100
128
  raise
101
129
  end
102
130
 
103
- # @param query [GraphQL::Query]
104
- # @return [Hash] The initial result (may not be finished if there are lazy values)
105
- def begin_query(query, multiplex)
106
- operation = query.selected_operation
107
- if operation.nil? || !query.valid? || query.context.errors.any?
108
- NO_OPERATION
109
- else
110
- begin
111
- # These were checked to be the same in `#supports_multiplexing?`
112
- query.schema.query_execution_strategy.begin_query(query, multiplex)
113
- rescue GraphQL::ExecutionError => err
114
- query.context.errors << err
115
- NO_OPERATION
116
- end
117
- end
118
- end
119
-
120
131
  # @param data_result [Hash] The result for the "data" key, if any
121
132
  # @param query [GraphQL::Query] The query which was run
122
133
  # @return [Hash] final result of this query, including all values and errors
@@ -144,6 +155,8 @@ module GraphQL
144
155
 
145
156
  # use the old `query_execution_strategy` etc to run this query
146
157
  def run_one_legacy(schema, query)
158
+ GraphQL::Deprecation.warn "Multiplex.run_one_legacy will be removed from GraphQL-Ruby 2.0, upgrade to the Interpreter to avoid this deprecated codepath: https://graphql-ruby.org/queries/interpreter.html"
159
+
147
160
  query.result_values = if !query.valid?
148
161
  all_errors = query.validation_errors + query.analysis_errors + query.context.errors
149
162
  if all_errors.any?
@@ -2,6 +2,10 @@
2
2
  module GraphQL
3
3
  # @api deprecated
4
4
  class Function
5
+ def self.inherited(subclass)
6
+ GraphQL::Deprecation.warn "GraphQL::Function (used for #{subclass}) will be removed from GraphQL-Ruby 2.0, please upgrade to resolvers: https://graphql-ruby.org/fields/resolvers.html"
7
+ end
8
+
5
9
  # @return [Hash<String => GraphQL::Argument>] Arguments, keyed by name
6
10
  def arguments
7
11
  self.class.arguments
@@ -2,6 +2,8 @@
2
2
  module GraphQL
3
3
  # @api deprecated
4
4
  class InputObjectType < GraphQL::BaseType
5
+ extend Define::InstanceDefinable::DeprecatedDefine
6
+
5
7
  accepts_definitions(
6
8
  :arguments, :mutation,
7
9
  input_field: GraphQL::Define::AssignArgument,
@@ -2,10 +2,12 @@
2
2
  module GraphQL
3
3
  # @api deprecated
4
4
  class InterfaceType < GraphQL::BaseType
5
+ extend Define::InstanceDefinable::DeprecatedDefine
6
+
5
7
  accepts_definitions :fields, :orphan_types, :resolve_type, field: GraphQL::Define::AssignObjectField
6
8
 
7
9
  attr_accessor :fields, :orphan_types, :resolve_type_proc
8
- attr_writer :type_membership_class
10
+ attr_writer :type_membership_class
9
11
  ensure_defined :fields, :orphan_types, :resolve_type_proc, :resolve_type
10
12
 
11
13
  def initialize
@@ -14,12 +14,12 @@ module GraphQL
14
14
  end
15
15
 
16
16
  def [](key)
17
- warn "#{self.class}#[] is deprecated; use `operation_definitions[]` instead"
17
+ GraphQL::Deprecation.warn "#{self.class}#[] is deprecated; use `operation_definitions[]` instead"
18
18
  operation_definitions[key]
19
19
  end
20
20
 
21
21
  def each(&block)
22
- warn "#{self.class}#each is deprecated; use `operation_definitions.each` instead"
22
+ GraphQL::Deprecation.warn "#{self.class}#each is deprecated; use `operation_definitions.each` instead"
23
23
  operation_definitions.each(&block)
24
24
  end
25
25
  end
@@ -60,7 +60,7 @@ module GraphQL
60
60
 
61
61
  # @return [Hash<String, Node>] Roots of this query
62
62
  def operations
63
- warn "#{self.class}#operations is deprecated; use `document.operation_definitions` instead"
63
+ GraphQL::Deprecation.warn "#{self.class}#operations is deprecated; use `document.operation_definitions` instead"
64
64
  @document.operation_definitions
65
65
  end
66
66
 
@@ -49,6 +49,8 @@ module GraphQL
49
49
  subscription: (s = warden.root_type_for_operation("subscription")) && s.graphql_name,
50
50
  # This only supports directives from parsing,
51
51
  # use a custom printer to add to this list.
52
+ #
53
+ # `@schema.directives` is covered by `build_definition_nodes`
52
54
  directives: ast_directives(@schema),
53
55
  )
54
56
  end
@@ -59,7 +61,7 @@ module GraphQL
59
61
  interfaces: warden.interfaces(object_type).sort_by(&:graphql_name).map { |iface| build_type_name_node(iface) },
60
62
  fields: build_field_nodes(warden.fields(object_type)),
61
63
  description: object_type.description,
62
- directives: ast_directives(object_type),
64
+ directives: directives(object_type),
63
65
  )
64
66
  end
65
67
 
@@ -69,7 +71,7 @@ module GraphQL
69
71
  arguments: build_argument_nodes(warden.arguments(field)),
70
72
  type: build_type_name_node(field.type),
71
73
  description: field.description,
72
- directives: ast_directives(field),
74
+ directives: directives(field),
73
75
  )
74
76
  end
75
77
 
@@ -78,7 +80,7 @@ module GraphQL
78
80
  name: union_type.graphql_name,
79
81
  description: union_type.description,
80
82
  types: warden.possible_types(union_type).sort_by(&:graphql_name).map { |type| build_type_name_node(type) },
81
- directives: ast_directives(union_type),
83
+ directives: directives(union_type),
82
84
  )
83
85
  end
84
86
 
@@ -87,7 +89,7 @@ module GraphQL
87
89
  name: interface_type.graphql_name,
88
90
  description: interface_type.description,
89
91
  fields: build_field_nodes(warden.fields(interface_type)),
90
- directives: ast_directives(interface_type),
92
+ directives: directives(interface_type),
91
93
  )
92
94
  end
93
95
 
@@ -98,7 +100,7 @@ module GraphQL
98
100
  build_enum_value_node(enum_value)
99
101
  end,
100
102
  description: enum_type.description,
101
- directives: ast_directives(enum_type),
103
+ directives: directives(enum_type),
102
104
  )
103
105
  end
104
106
 
@@ -106,7 +108,7 @@ module GraphQL
106
108
  GraphQL::Language::Nodes::EnumValueDefinition.new(
107
109
  name: enum_value.graphql_name,
108
110
  description: enum_value.description,
109
- directives: ast_directives(enum_value),
111
+ directives: directives(enum_value),
110
112
  )
111
113
  end
112
114
 
@@ -114,7 +116,7 @@ module GraphQL
114
116
  GraphQL::Language::Nodes::ScalarTypeDefinition.new(
115
117
  name: scalar_type.graphql_name,
116
118
  description: scalar_type.description,
117
- directives: ast_directives(scalar_type),
119
+ directives: directives(scalar_type),
118
120
  )
119
121
  end
120
122
 
@@ -130,7 +132,7 @@ module GraphQL
130
132
  description: argument.description,
131
133
  type: build_type_name_node(argument.type),
132
134
  default_value: default_value,
133
- directives: ast_directives(argument),
135
+ directives: directives(argument),
134
136
  )
135
137
 
136
138
  argument_node
@@ -141,7 +143,7 @@ module GraphQL
141
143
  name: input_object.graphql_name,
142
144
  fields: build_argument_nodes(warden.arguments(input_object)),
143
145
  description: input_object.description,
144
- directives: ast_directives(input_object),
146
+ directives: directives(input_object),
145
147
  )
146
148
  end
147
149
 
@@ -155,7 +157,7 @@ module GraphQL
155
157
  end
156
158
 
157
159
  def build_directive_location_nodes(locations)
158
- locations.map { |location| build_directive_location_node(location) }
160
+ locations.sort.map { |location| build_directive_location_node(location) }
159
161
  end
160
162
 
161
163
  def build_directive_location_node(location)
@@ -283,14 +285,37 @@ module GraphQL
283
285
  (schema.subscription.nil? || schema.subscription.graphql_name == 'Subscription')
284
286
  end
285
287
 
286
- def ast_directives(member)
287
- ast_directives = member.ast_node ? member.ast_node.directives : []
288
+ def directives(member)
289
+ definition_directives(member)
290
+ end
288
291
 
289
- # If this schema was built from IDL, it will already have `@deprecated` in `ast_node.directives`
290
- if member.respond_to?(:deprecation_reason) &&
291
- (reason = member.deprecation_reason) &&
292
- ast_directives.none? { |d| d.name == "deprecated" }
292
+ def definition_directives(member)
293
+ dirs = if !member.respond_to?(:directives) || member.directives.empty?
294
+ []
295
+ else
296
+ member.directives.map do |dir|
297
+ args = []
298
+ dir.arguments.argument_values.each_value do |arg_value|
299
+ arg_defn = arg_value.definition
300
+ if arg_defn.default_value? && arg_value.value == arg_defn.default_value
301
+ next
302
+ else
303
+ value_node = build_default_value(arg_value.value, arg_value.definition.type)
304
+ args << GraphQL::Language::Nodes::Argument.new(
305
+ name: arg_value.definition.name,
306
+ value: value_node,
307
+ )
308
+ end
309
+ end
310
+ GraphQL::Language::Nodes::Directive.new(
311
+ name: dir.class.graphql_name,
312
+ arguments: args
313
+ )
314
+ end
315
+ end
293
316
 
317
+ # This is just for printing legacy `.define { ... }` schemas, where `deprecation_reason` isn't added to `.directives`.
318
+ if !member.respond_to?(:directives) && member.respond_to?(:deprecation_reason) && (reason = member.deprecation_reason)
294
319
  arguments = []
295
320
 
296
321
  if reason != GraphQL::Schema::Directive::DEFAULT_DEPRECATION_REASON
@@ -300,15 +325,17 @@ module GraphQL
300
325
  )
301
326
  end
302
327
 
303
- ast_directives += [
304
- GraphQL::Language::Nodes::Directive.new(
305
- name: GraphQL::Directive::DeprecatedDirective.graphql_name,
306
- arguments: arguments
307
- )
308
- ]
328
+ dirs << GraphQL::Language::Nodes::Directive.new(
329
+ name: GraphQL::Directive::DeprecatedDirective.graphql_name,
330
+ arguments: arguments
331
+ )
309
332
  end
310
333
 
311
- ast_directives
334
+ dirs
335
+ end
336
+
337
+ def ast_directives(member)
338
+ member.ast_node ? member.ast_node.directives : []
312
339
  end
313
340
 
314
341
  attr_reader :schema, :warden, :always_include_schema,
@@ -2,6 +2,8 @@
2
2
  module GraphQL
3
3
  # @api deprecated
4
4
  class ObjectType < GraphQL::BaseType
5
+ extend Define::InstanceDefinable::DeprecatedDefine
6
+
5
7
  accepts_definitions :interfaces, :fields, :mutation, :relay_node_type, field: GraphQL::Define::AssignObjectField
6
8
  accepts_definitions implements: ->(type, *interfaces, inherit: false) { type.implements(interfaces, inherit: inherit) }
7
9
 
@@ -119,8 +121,6 @@ module GraphQL
119
121
  iface = GraphQL::BaseType.resolve_related_type(type_membership.abstract_type)
120
122
  if iface.is_a?(GraphQL::InterfaceType)
121
123
  @clean_inherited_fields.merge!(iface.fields)
122
- else
123
- pp iface
124
124
  end
125
125
  end
126
126
  @clean_inherited_fields
@@ -53,10 +53,11 @@ module GraphQL
53
53
  # @param last [Integer, nil] Limit parameter from the client, if provided
54
54
  # @param before [String, nil] A cursor for pagination, if the client provided one.
55
55
  # @param max_page_size [Integer, nil] A configured value to cap the result size. Applied as `first` if neither first or last are given.
56
- def initialize(items, parent: nil, context: nil, first: nil, after: nil, max_page_size: :not_given, last: nil, before: nil, edge_class: nil)
56
+ def initialize(items, parent: nil, field: nil, context: nil, first: nil, after: nil, max_page_size: :not_given, last: nil, before: nil, edge_class: nil)
57
57
  @items = items
58
58
  @parent = parent
59
59
  @context = context
60
+ @field = field
60
61
  @first_value = first
61
62
  @after_value = after
62
63
  @last_value = last
@@ -118,6 +119,9 @@ module GraphQL
118
119
  # @return [Class] A wrapper class for edges of this connection
119
120
  attr_accessor :edge_class
120
121
 
122
+ # @return [GraphQL::Schema::Field] The field this connection was returned by
123
+ attr_accessor :field
124
+
121
125
  # @return [Array<Object>] A slice of {items}, constrained by {@first_value}/{@after_value}/{@last_value}/{@before_value}
122
126
  def nodes
123
127
  raise PaginationImplementationMissingError, "Implement #{self.class}#nodes to paginate `@items`"
@@ -6,20 +6,13 @@ module GraphQL
6
6
  #
7
7
  # Attach as a plugin.
8
8
  #
9
- # @example Using new default connections
10
- # class MySchema < GraphQL::Schema
11
- # use GraphQL::Pagination::Connections
12
- # end
13
- #
14
9
  # @example Adding a custom wrapper
15
10
  # class MySchema < GraphQL::Schema
16
- # use GraphQL::Pagination::Connections
17
11
  # connections.add(MyApp::SearchResults, MyApp::SearchResultsConnection)
18
12
  # end
19
13
  #
20
14
  # @example Removing default connection support for arrays (they can still be manually wrapped)
21
15
  # class MySchema < GraphQL::Schema
22
- # use GraphQL::Pagination::Connections
23
16
  # connections.delete(Array)
24
17
  # end
25
18
  #
@@ -29,14 +22,10 @@ module GraphQL
29
22
  end
30
23
 
31
24
  def self.use(schema_defn)
32
- if schema_defn.is_a?(Class)
33
- schema_defn.connections = self.new(schema: schema_defn)
34
- else
35
- # Unwrap a `.define` object
36
- schema_defn = schema_defn.target
37
- schema_defn.connections = self.new(schema: schema_defn)
38
- schema_defn.class.connections = schema_defn.connections
25
+ if schema_defn.plugins.any? { |(plugin, args)| plugin == self }
26
+ GraphQL::Deprecation.warn("#{self} is now the default, remove `use #{self}` from #{caller(2,1).first}")
39
27
  end
28
+ schema_defn.connections = self.new(schema: schema_defn)
40
29
  end
41
30
 
42
31
  def initialize(schema:)
@@ -76,9 +65,9 @@ module GraphQL
76
65
 
77
66
  # Used by the runtime to wrap values in connection wrappers.
78
67
  # @api Private
79
- def wrap(field, parent, items, arguments, context, wrappers: all_wrappers)
68
+ def wrap(field, parent, items, arguments, context)
80
69
  return items if GraphQL::Execution::Interpreter::RawValue === items
81
-
70
+ wrappers = context ? context.namespace(:connections)[:all_wrappers] : all_wrappers
82
71
  impl = wrapper_for(items, wrappers: wrappers)
83
72
 
84
73
  if impl.nil?
@@ -89,6 +78,7 @@ module GraphQL
89
78
  items,
90
79
  context: context,
91
80
  parent: parent,
81
+ field: field,
92
82
  max_page_size: field.max_page_size || context.schema.default_max_page_size,
93
83
  first: arguments[:first],
94
84
  after: arguments[:after],
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # test_via: language/parser.rb
3
2
  module GraphQL
4
3
  class ParseError < GraphQL::Error
5
4
  attr_reader :line, :col, :query
data/lib/graphql/query.rb CHANGED
@@ -153,6 +153,8 @@ module GraphQL
153
153
  @interpreter
154
154
  end
155
155
 
156
+ attr_accessor :multiplex
157
+
156
158
  def subscription_update?
157
159
  @subscription_topic && subscription?
158
160
  end
@@ -249,12 +251,18 @@ module GraphQL
249
251
  # @param parent_object [GraphQL::Schema::Object]
250
252
  # @return Hash{Symbol => Object}
251
253
  def arguments_for(ast_node, definition, parent_object: nil)
254
+ if interpreter?
255
+ arguments_cache.fetch(ast_node, definition, parent_object)
256
+ else
257
+ arguments_cache[ast_node][definition]
258
+ end
259
+ end
260
+
261
+ def arguments_cache
252
262
  if interpreter?
253
263
  @arguments_cache ||= Execution::Interpreter::ArgumentsCache.new(self)
254
- @arguments_cache.fetch(ast_node, definition, parent_object)
255
264
  else
256
265
  @arguments_cache ||= ArgumentsCache.build(self)
257
- @arguments_cache[ast_node][definition]
258
266
  end
259
267
  end
260
268