graphql 1.11.8 → 1.12.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 (117) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/install_generator.rb +5 -5
  3. data/lib/generators/graphql/relay_generator.rb +63 -0
  4. data/lib/generators/graphql/templates/base_connection.erb +8 -0
  5. data/lib/generators/graphql/templates/base_edge.erb +8 -0
  6. data/lib/generators/graphql/templates/node_type.erb +9 -0
  7. data/lib/generators/graphql/templates/object.erb +1 -1
  8. data/lib/generators/graphql/templates/query_type.erb +1 -3
  9. data/lib/generators/graphql/templates/schema.erb +8 -35
  10. data/lib/graphql.rb +38 -4
  11. data/lib/graphql/analysis/analyze_query.rb +7 -0
  12. data/lib/graphql/analysis/ast.rb +11 -2
  13. data/lib/graphql/analysis/ast/visitor.rb +9 -1
  14. data/lib/graphql/backtrace.rb +28 -19
  15. data/lib/graphql/backtrace/legacy_tracer.rb +56 -0
  16. data/lib/graphql/backtrace/table.rb +22 -2
  17. data/lib/graphql/backtrace/tracer.rb +40 -9
  18. data/lib/graphql/backwards_compatibility.rb +1 -0
  19. data/lib/graphql/compatibility/execution_specification.rb +1 -0
  20. data/lib/graphql/compatibility/lazy_execution_specification.rb +2 -0
  21. data/lib/graphql/compatibility/query_parser_specification.rb +2 -0
  22. data/lib/graphql/compatibility/schema_parser_specification.rb +2 -0
  23. data/lib/graphql/dataloader.rb +197 -0
  24. data/lib/graphql/dataloader/null_dataloader.rb +21 -0
  25. data/lib/graphql/dataloader/request.rb +24 -0
  26. data/lib/graphql/dataloader/request_all.rb +22 -0
  27. data/lib/graphql/dataloader/source.rb +93 -0
  28. data/lib/graphql/define/assign_global_id_field.rb +1 -1
  29. data/lib/graphql/define/instance_definable.rb +32 -2
  30. data/lib/graphql/define/type_definer.rb +5 -5
  31. data/lib/graphql/deprecated_dsl.rb +5 -0
  32. data/lib/graphql/enum_type.rb +2 -0
  33. data/lib/graphql/execution/errors.rb +4 -0
  34. data/lib/graphql/execution/execute.rb +7 -0
  35. data/lib/graphql/execution/interpreter.rb +10 -6
  36. data/lib/graphql/execution/interpreter/arguments.rb +51 -14
  37. data/lib/graphql/execution/interpreter/handles_raw_value.rb +0 -7
  38. data/lib/graphql/execution/interpreter/runtime.rb +210 -124
  39. data/lib/graphql/execution/multiplex.rb +20 -6
  40. data/lib/graphql/function.rb +4 -0
  41. data/lib/graphql/input_object_type.rb +2 -0
  42. data/lib/graphql/interface_type.rb +3 -1
  43. data/lib/graphql/language/document_from_schema_definition.rb +50 -23
  44. data/lib/graphql/object_type.rb +2 -0
  45. data/lib/graphql/pagination/connection.rb +5 -1
  46. data/lib/graphql/pagination/connections.rb +6 -16
  47. data/lib/graphql/query.rb +2 -0
  48. data/lib/graphql/query/context.rb +4 -0
  49. data/lib/graphql/query/serial_execution.rb +1 -0
  50. data/lib/graphql/relay/base_connection.rb +7 -0
  51. data/lib/graphql/relay/connection_instrumentation.rb +4 -4
  52. data/lib/graphql/relay/connection_type.rb +1 -1
  53. data/lib/graphql/relay/mutation.rb +1 -0
  54. data/lib/graphql/relay/node.rb +3 -0
  55. data/lib/graphql/relay/type_extensions.rb +2 -0
  56. data/lib/graphql/scalar_type.rb +2 -0
  57. data/lib/graphql/schema.rb +69 -32
  58. data/lib/graphql/schema/argument.rb +25 -7
  59. data/lib/graphql/schema/build_from_definition.rb +139 -51
  60. data/lib/graphql/schema/directive.rb +76 -0
  61. data/lib/graphql/schema/directive/flagged.rb +57 -0
  62. data/lib/graphql/schema/enum.rb +3 -0
  63. data/lib/graphql/schema/enum_value.rb +12 -6
  64. data/lib/graphql/schema/field.rb +28 -9
  65. data/lib/graphql/schema/field/connection_extension.rb +3 -2
  66. data/lib/graphql/schema/input_object.rb +33 -22
  67. data/lib/graphql/schema/interface.rb +1 -0
  68. data/lib/graphql/schema/member.rb +4 -0
  69. data/lib/graphql/schema/member/base_dsl_methods.rb +1 -0
  70. data/lib/graphql/schema/member/build_type.rb +3 -3
  71. data/lib/graphql/schema/member/has_arguments.rb +24 -6
  72. data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
  73. data/lib/graphql/schema/member/has_directives.rb +98 -0
  74. data/lib/graphql/schema/member/has_validators.rb +31 -0
  75. data/lib/graphql/schema/member/type_system_helpers.rb +1 -1
  76. data/lib/graphql/schema/object.rb +11 -0
  77. data/lib/graphql/schema/printer.rb +5 -4
  78. data/lib/graphql/schema/resolver.rb +7 -0
  79. data/lib/graphql/schema/resolver/has_payload_type.rb +2 -0
  80. data/lib/graphql/schema/subscription.rb +19 -1
  81. data/lib/graphql/schema/timeout_middleware.rb +2 -0
  82. data/lib/graphql/schema/validation.rb +2 -0
  83. data/lib/graphql/schema/validator.rb +163 -0
  84. data/lib/graphql/schema/validator/exclusion_validator.rb +31 -0
  85. data/lib/graphql/schema/validator/format_validator.rb +49 -0
  86. data/lib/graphql/schema/validator/inclusion_validator.rb +33 -0
  87. data/lib/graphql/schema/validator/length_validator.rb +57 -0
  88. data/lib/graphql/schema/validator/numericality_validator.rb +71 -0
  89. data/lib/graphql/schema/validator/required_validator.rb +68 -0
  90. data/lib/graphql/static_validation/validator.rb +2 -0
  91. data/lib/graphql/subscriptions.rb +17 -20
  92. data/lib/graphql/tracing.rb +2 -2
  93. data/lib/graphql/tracing/appoptics_tracing.rb +3 -1
  94. data/lib/graphql/tracing/platform_tracing.rb +3 -1
  95. data/lib/graphql/tracing/skylight_tracing.rb +1 -1
  96. data/lib/graphql/types/relay.rb +11 -3
  97. data/lib/graphql/types/relay/base_connection.rb +2 -92
  98. data/lib/graphql/types/relay/base_edge.rb +2 -35
  99. data/lib/graphql/types/relay/connection_behaviors.rb +123 -0
  100. data/lib/graphql/types/relay/default_relay.rb +27 -0
  101. data/lib/graphql/types/relay/edge_behaviors.rb +42 -0
  102. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  103. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  104. data/lib/graphql/types/relay/node.rb +2 -4
  105. data/lib/graphql/types/relay/node_behaviors.rb +15 -0
  106. data/lib/graphql/types/relay/node_field.rb +1 -19
  107. data/lib/graphql/types/relay/nodes_field.rb +1 -19
  108. data/lib/graphql/types/relay/page_info.rb +2 -14
  109. data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
  110. data/lib/graphql/union_type.rb +2 -0
  111. data/lib/graphql/upgrader/member.rb +1 -0
  112. data/lib/graphql/upgrader/schema.rb +1 -0
  113. data/lib/graphql/version.rb +1 -1
  114. metadata +34 -9
  115. data/lib/graphql/types/relay/base_field.rb +0 -22
  116. data/lib/graphql/types/relay/base_interface.rb +0 -29
  117. 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(context)
37
39
  @tracers = schema.tracers + (context[:tracers] || [])
38
40
  # Support `context: {backtrace: true}`
39
41
  if context[:backtrace] && !@tracers.include?(GraphQL::Backtrace::Tracer)
@@ -79,20 +81,30 @@ module GraphQL
79
81
  multiplex.schema.query_execution_strategy.begin_multiplex(multiplex)
80
82
  queries = multiplex.queries
81
83
  # Do as much eager evaluation of the query as possible
82
- results = queries.map do |query|
83
- begin_query(query, multiplex)
84
+ results = []
85
+ queries.each_with_index do |query, idx|
86
+ multiplex.dataloader.enqueue {
87
+ results[idx] = begin_query(query, multiplex)
88
+ }
84
89
  end
85
90
 
91
+ multiplex.dataloader.run
92
+
86
93
  # Then, work through lazy results in a breadth-first way
87
- multiplex.schema.query_execution_strategy.finish_multiplex(results, multiplex)
94
+ multiplex.dataloader.enqueue {
95
+ multiplex.schema.query_execution_strategy.finish_multiplex(results, multiplex)
96
+ }
97
+ multiplex.dataloader.run
88
98
 
89
99
  # Then, find all errors and assign the result to the query object
90
- results.each_with_index.map do |data_result, idx|
100
+ results.each_with_index do |data_result, idx|
91
101
  query = queries[idx]
92
102
  finish_query(data_result, query, multiplex)
93
103
  # Get the Query::Result, not the Hash
94
- query.result
104
+ results[idx] = query.result
95
105
  end
106
+
107
+ results
96
108
  rescue Exception
97
109
  # TODO rescue at a higher level so it will catch errors in analysis, too
98
110
  # Assign values here so that the query's `@executed` becomes true
@@ -144,6 +156,8 @@ module GraphQL
144
156
 
145
157
  # use the old `query_execution_strategy` etc to run this query
146
158
  def run_one_legacy(schema, query)
159
+ 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"
160
+
147
161
  query.result_values = if !query.valid?
148
162
  all_errors = query.validation_errors + query.analysis_errors + query.context.errors
149
163
  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
+ 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
@@ -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
 
@@ -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
+ 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],
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
@@ -158,6 +158,10 @@ module GraphQL
158
158
  @scoped_context = {}
159
159
  end
160
160
 
161
+ def dataloader
162
+ @dataloader ||= query.multiplex.dataloader
163
+ end
164
+
161
165
  # @api private
162
166
  attr_writer :interpreter
163
167
 
@@ -16,6 +16,7 @@ module GraphQL
16
16
  # @param query_object [GraphQL::Query] the query object for this execution
17
17
  # @return [Hash] a spec-compliant GraphQL result, as a hash
18
18
  def execute(ast_operation, root_type, query_object)
19
+ warn "#{self.class} will be removed in GraphQL-Ruby 2.0, please upgrade to the Interpreter: https://graphql-ruby.org/queries/interpreter.html"
19
20
  operation_resolution.resolve(
20
21
  query_object.irep_selection,
21
22
  root_type,
@@ -59,6 +59,13 @@ module GraphQL
59
59
  # @param parent [Object] The object which this collection belongs to
60
60
  # @param context [GraphQL::Query::Context] The context from the field being resolved
61
61
  def initialize(nodes, arguments, field: nil, max_page_size: nil, parent: nil, context: nil)
62
+ warn "GraphQL::Relay::BaseConnection (used for #{self.class}) will be removed from GraphQL-Ruby 2.0, use GraphQL::Pagination::Connections instead: https://graphql-ruby.org/pagination/overview.html"
63
+
64
+ deprecated_caller = caller(0, 10).find { |c| !c.include?("lib/graphql") }
65
+ if deprecated_caller
66
+ warn " -> called from #{deprecated_caller}"
67
+ end
68
+
62
69
  @context = context
63
70
  @nodes = nodes
64
71
  @arguments = arguments
@@ -10,10 +10,10 @@ module GraphQL
10
10
  def self.default_arguments
11
11
  @default_arguments ||= begin
12
12
  argument_definitions = [
13
- ["first", GraphQL::INT_TYPE, "Returns the first _n_ elements from the list."],
14
- ["after", GraphQL::STRING_TYPE, "Returns the elements in the list that come after the specified cursor."],
15
- ["last", GraphQL::INT_TYPE, "Returns the last _n_ elements from the list."],
16
- ["before", GraphQL::STRING_TYPE, "Returns the elements in the list that come before the specified cursor."],
13
+ ["first", GraphQL::DEPRECATED_INT_TYPE, "Returns the first _n_ elements from the list."],
14
+ ["after", GraphQL::DEPRECATED_STRING_TYPE, "Returns the elements in the list that come after the specified cursor."],
15
+ ["last", GraphQL::DEPRECATED_INT_TYPE, "Returns the last _n_ elements from the list."],
16
+ ["before", GraphQL::DEPRECATED_STRING_TYPE, "Returns the elements in the list that come before the specified cursor."],
17
17
  ]
18
18
 
19
19
  argument_definitions.reduce({}) do |memo, arg_defn|
@@ -20,7 +20,7 @@ module GraphQL
20
20
  # Any call that would trigger `wrapped_type.ensure_defined`
21
21
  # must be inside this lazy block, otherwise we get weird
22
22
  # cyclical dependency errors :S
23
- ObjectType.define do
23
+ ObjectType.deprecated_define do
24
24
  type_name = wrapped_type.is_a?(GraphQL::BaseType) ? wrapped_type.name : wrapped_type.graphql_name
25
25
  edge_type ||= wrapped_type.edge_type
26
26
  name("#{type_name}Connection")
@@ -30,6 +30,7 @@ module GraphQL
30
30
  alias :input_fields :arguments
31
31
 
32
32
  def initialize
33
+ warn "GraphQL::Relay::Mutation will be removed from GraphQL-Ruby 2.0, use GraphQL::Schema::RelayClassicMutation instead: https://graphql-ruby.org/mutations/mutation_classes"
33
34
  @fields = {}
34
35
  @arguments = {}
35
36
  @has_generated_return_type = false
@@ -5,6 +5,7 @@ module GraphQL
5
5
  module Node
6
6
  # @return [GraphQL::Field] a field for finding objects by their global ID.
7
7
  def self.field(**kwargs, &block)
8
+ warn "GraphQL::Relay::Node.field will be removed from GraphQL-Ruby 2.0, use GraphQL::Types::Relay::NodeField instead"
8
9
  # We have to define it fresh each time because
9
10
  # its name will be modified and its description
10
11
  # _may_ be modified.
@@ -18,6 +19,7 @@ module GraphQL
18
19
  end
19
20
 
20
21
  def self.plural_field(**kwargs, &block)
22
+ warn "GraphQL::Relay::Nodes.field will be removed from GraphQL-Ruby 2.0, use GraphQL::Types::Relay::NodesField instead"
21
23
  field = GraphQL::Types::Relay::NodesField.graphql_definition
22
24
 
23
25
  if kwargs.any? || block
@@ -29,6 +31,7 @@ module GraphQL
29
31
 
30
32
  # @return [GraphQL::InterfaceType] The interface which all Relay types must implement
31
33
  def self.interface
34
+ warn "GraphQL::Relay::Node.interface will be removed from GraphQL-Ruby 2.0, use GraphQL::Types::Relay::Node instead"
32
35
  @interface ||= GraphQL::Types::Relay::Node.graphql_definition
33
36
  end
34
37
  end