graphql 1.11.12 → 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 (124) 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/analysis/analyze_query.rb +7 -0
  11. data/lib/graphql/analysis/ast/visitor.rb +9 -1
  12. data/lib/graphql/analysis/ast.rb +11 -2
  13. data/lib/graphql/backtrace/legacy_tracer.rb +56 -0
  14. data/lib/graphql/backtrace/table.rb +22 -2
  15. data/lib/graphql/backtrace/tracer.rb +40 -9
  16. data/lib/graphql/backtrace.rb +28 -19
  17. data/lib/graphql/backwards_compatibility.rb +1 -0
  18. data/lib/graphql/compatibility/execution_specification.rb +1 -0
  19. data/lib/graphql/compatibility/lazy_execution_specification.rb +2 -0
  20. data/lib/graphql/compatibility/query_parser_specification.rb +2 -0
  21. data/lib/graphql/compatibility/schema_parser_specification.rb +2 -0
  22. data/lib/graphql/dataloader/null_dataloader.rb +21 -0
  23. data/lib/graphql/dataloader/request.rb +24 -0
  24. data/lib/graphql/dataloader/request_all.rb +22 -0
  25. data/lib/graphql/dataloader/source.rb +93 -0
  26. data/lib/graphql/dataloader.rb +197 -0
  27. data/lib/graphql/define/assign_global_id_field.rb +1 -1
  28. data/lib/graphql/define/instance_definable.rb +32 -2
  29. data/lib/graphql/define/type_definer.rb +5 -5
  30. data/lib/graphql/deprecated_dsl.rb +5 -0
  31. data/lib/graphql/enum_type.rb +2 -0
  32. data/lib/graphql/execution/errors.rb +4 -0
  33. data/lib/graphql/execution/execute.rb +7 -0
  34. data/lib/graphql/execution/interpreter/arguments.rb +51 -14
  35. data/lib/graphql/execution/interpreter/handles_raw_value.rb +0 -7
  36. data/lib/graphql/execution/interpreter/runtime.rb +210 -124
  37. data/lib/graphql/execution/interpreter.rb +10 -6
  38. data/lib/graphql/execution/multiplex.rb +20 -6
  39. data/lib/graphql/function.rb +4 -0
  40. data/lib/graphql/input_object_type.rb +2 -0
  41. data/lib/graphql/interface_type.rb +3 -1
  42. data/lib/graphql/language/document_from_schema_definition.rb +50 -23
  43. data/lib/graphql/language/nodes.rb +0 -5
  44. data/lib/graphql/language/visitor.rb +0 -1
  45. data/lib/graphql/object_type.rb +2 -0
  46. data/lib/graphql/pagination/connection.rb +5 -1
  47. data/lib/graphql/pagination/connections.rb +6 -16
  48. data/lib/graphql/query/context.rb +4 -0
  49. data/lib/graphql/query/serial_execution.rb +1 -0
  50. data/lib/graphql/query/validation_pipeline.rb +1 -1
  51. data/lib/graphql/query.rb +2 -0
  52. data/lib/graphql/relay/base_connection.rb +7 -0
  53. data/lib/graphql/relay/connection_instrumentation.rb +4 -4
  54. data/lib/graphql/relay/connection_type.rb +1 -1
  55. data/lib/graphql/relay/mutation.rb +1 -0
  56. data/lib/graphql/relay/node.rb +3 -0
  57. data/lib/graphql/relay/type_extensions.rb +2 -0
  58. data/lib/graphql/scalar_type.rb +2 -0
  59. data/lib/graphql/schema/argument.rb +30 -10
  60. data/lib/graphql/schema/build_from_definition.rb +145 -58
  61. data/lib/graphql/schema/directive/flagged.rb +57 -0
  62. data/lib/graphql/schema/directive.rb +76 -0
  63. data/lib/graphql/schema/enum.rb +3 -0
  64. data/lib/graphql/schema/enum_value.rb +13 -7
  65. data/lib/graphql/schema/field/connection_extension.rb +3 -2
  66. data/lib/graphql/schema/field.rb +28 -10
  67. data/lib/graphql/schema/input_object.rb +36 -28
  68. data/lib/graphql/schema/interface.rb +1 -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/member.rb +4 -0
  77. data/lib/graphql/schema/object.rb +11 -0
  78. data/lib/graphql/schema/printer.rb +5 -4
  79. data/lib/graphql/schema/resolver/has_payload_type.rb +2 -0
  80. data/lib/graphql/schema/resolver.rb +7 -0
  81. data/lib/graphql/schema/subscription.rb +19 -1
  82. data/lib/graphql/schema/timeout_middleware.rb +2 -0
  83. data/lib/graphql/schema/validation.rb +2 -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/schema/validator.rb +163 -0
  91. data/lib/graphql/schema.rb +72 -49
  92. data/lib/graphql/static_validation/base_visitor.rb +0 -3
  93. data/lib/graphql/static_validation/rules/fields_will_merge.rb +4 -4
  94. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
  95. data/lib/graphql/static_validation/validation_context.rb +1 -6
  96. data/lib/graphql/static_validation/validator.rb +12 -14
  97. data/lib/graphql/subscriptions.rb +17 -20
  98. data/lib/graphql/tracing/appoptics_tracing.rb +3 -1
  99. data/lib/graphql/tracing/platform_tracing.rb +3 -1
  100. data/lib/graphql/tracing/skylight_tracing.rb +1 -1
  101. data/lib/graphql/tracing.rb +2 -2
  102. data/lib/graphql/types/relay/base_connection.rb +2 -92
  103. data/lib/graphql/types/relay/base_edge.rb +2 -35
  104. data/lib/graphql/types/relay/connection_behaviors.rb +123 -0
  105. data/lib/graphql/types/relay/default_relay.rb +27 -0
  106. data/lib/graphql/types/relay/edge_behaviors.rb +42 -0
  107. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  108. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  109. data/lib/graphql/types/relay/node.rb +2 -4
  110. data/lib/graphql/types/relay/node_behaviors.rb +15 -0
  111. data/lib/graphql/types/relay/node_field.rb +1 -19
  112. data/lib/graphql/types/relay/nodes_field.rb +1 -19
  113. data/lib/graphql/types/relay/page_info.rb +2 -14
  114. data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
  115. data/lib/graphql/types/relay.rb +11 -3
  116. data/lib/graphql/union_type.rb +2 -0
  117. data/lib/graphql/upgrader/member.rb +1 -0
  118. data/lib/graphql/upgrader/schema.rb +1 -0
  119. data/lib/graphql/version.rb +1 -1
  120. data/lib/graphql.rb +38 -4
  121. metadata +34 -9
  122. data/lib/graphql/types/relay/base_field.rb +0 -22
  123. data/lib/graphql/types/relay/base_interface.rb +0 -29
  124. data/lib/graphql/types/relay/base_object.rb +0 -26
@@ -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,
@@ -133,8 +133,6 @@ module GraphQL
133
133
  end
134
134
 
135
135
  class << self
136
- # rubocop:disable Development/NoEvalCop This eval takes static inputs at load-time
137
-
138
136
  # Add a default `#visit_method` and `#children_method_name` using the class name
139
137
  def inherited(child_class)
140
138
  super
@@ -267,11 +265,8 @@ module GraphQL
267
265
  #{assignments.join("\n")}
268
266
  end
269
267
  RUBY
270
-
271
- # rubocop:enable Development/NoEvalCop
272
268
  end
273
269
  end
274
- # rubocop:enable Development/NoEvalCop
275
270
  end
276
271
  end
277
272
 
@@ -73,7 +73,6 @@ module GraphQL
73
73
  @document
74
74
  end
75
75
  end
76
- # rubocop:disable Development/NoEvalCop This eval takes static inputs at load-time
77
76
 
78
77
  # Call the user-defined handler for `node`.
79
78
  def visit_node(node, parent)
@@ -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],
@@ -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,
@@ -72,7 +72,7 @@ module GraphQL
72
72
  elsif @operation_name_error
73
73
  @validation_errors << @operation_name_error
74
74
  else
75
- validation_result = @schema.static_validator.validate(@query, validate: @validate, timeout: @schema.validate_timeout, max_errors: @schema.validate_max_errors)
75
+ validation_result = @schema.static_validator.validate(@query, validate: @validate, timeout: @schema.validate_timeout)
76
76
  @validation_errors.concat(validation_result[:errors])
77
77
  @internal_representation = validation_result[:irep]
78
78
 
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
@@ -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
@@ -12,6 +12,7 @@ module GraphQL
12
12
  # Define a custom connection type for this object type
13
13
  # @return [GraphQL::ObjectType]
14
14
  def define_connection(**kwargs, &block)
15
+ 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"
15
16
  GraphQL::Relay::ConnectionType.create_type(self, **kwargs, &block)
16
17
  end
17
18
 
@@ -23,6 +24,7 @@ module GraphQL
23
24
  # Define a custom edge type for this object type
24
25
  # @return [GraphQL::ObjectType]
25
26
  def define_edge(**kwargs, &block)
27
+ 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"
26
28
  GraphQL::Relay::EdgeType.create_type(self, **kwargs, &block)
27
29
  end
28
30
  end
@@ -2,6 +2,8 @@
2
2
  module GraphQL
3
3
  # @api deprecated
4
4
  class ScalarType < GraphQL::BaseType
5
+ extend Define::InstanceDefinable::DeprecatedDefine
6
+
5
7
  accepts_definitions :coerce, :coerce_input, :coerce_result
6
8
  ensure_defined :coerce_non_null_input, :coerce_result
7
9
 
@@ -10,6 +10,10 @@ module GraphQL
10
10
  include GraphQL::Schema::Member::AcceptsDefinition
11
11
  include GraphQL::Schema::Member::HasPath
12
12
  include GraphQL::Schema::Member::HasAstNode
13
+ include GraphQL::Schema::Member::HasDirectives
14
+ include GraphQL::Schema::Member::HasDeprecationReason
15
+ include GraphQL::Schema::Member::HasValidators
16
+ include GraphQL::Schema::FindInheritedValue::EmptyObjects
13
17
 
14
18
  NO_DEFAULT = :__no_default__
15
19
 
@@ -45,11 +49,12 @@ module GraphQL
45
49
  # @param camelize [Boolean] if true, the name will be camelized when building the schema
46
50
  # @param from_resolver [Boolean] if true, a Resolver class defined this argument
47
51
  # @param method_access [Boolean] If false, don't build method access on legacy {Query::Arguments} instances.
52
+ # @param directives [Hash{Class => Hash}]
48
53
  # @param deprecation_reason [String]
49
- def initialize(arg_name = nil, type_expr = nil, desc = nil, required:, type: nil, name: nil, loads: nil, description: nil, ast_node: nil, default_value: NO_DEFAULT, as: nil, from_resolver: false, camelize: true, prepare: nil, method_access: true, owner:, deprecation_reason: nil, &definition_block)
54
+ # @param validates [Hash, nil] Options for building validators, if any should be applied
55
+ def initialize(arg_name = nil, type_expr = nil, desc = nil, required:, type: nil, name: nil, loads: nil, description: nil, ast_node: nil, default_value: NO_DEFAULT, as: nil, from_resolver: false, camelize: true, prepare: nil, method_access: true, owner:, validates: nil, directives: nil, deprecation_reason: nil, &definition_block)
50
56
  arg_name ||= name
51
57
  @name = -(camelize ? Member::BuildType.camelize(arg_name.to_s) : arg_name.to_s)
52
- NameValidator.validate!(@name)
53
58
  @type_expr = type_expr || type
54
59
  @description = desc || description
55
60
  @null = !required
@@ -64,9 +69,20 @@ module GraphQL
64
69
  @method_access = method_access
65
70
  self.deprecation_reason = deprecation_reason
66
71
 
72
+ if directives
73
+ directives.each do |dir_class, dir_options|
74
+ directive(dir_class, **dir_options)
75
+ end
76
+ end
77
+
78
+ self.validates(validates)
79
+
67
80
  if definition_block
68
- # `self` will still be self, it will also be the first argument to the block:
69
- instance_exec(self, &definition_block)
81
+ if definition_block.arity == 1
82
+ instance_exec(self, &definition_block)
83
+ else
84
+ instance_eval(&definition_block)
85
+ end
70
86
  end
71
87
  end
72
88
 
@@ -92,14 +108,16 @@ module GraphQL
92
108
  # @return [String] Deprecation reason for this argument
93
109
  def deprecation_reason(text = nil)
94
110
  if text
95
- validate_deprecated_or_optional(null: @null, deprecation_reason: text)
96
- @deprecation_reason = text
111
+ self.deprecation_reason = text
97
112
  else
98
- @deprecation_reason
113
+ super()
99
114
  end
100
115
  end
101
116
 
102
- alias_method :deprecation_reason=, :deprecation_reason
117
+ def deprecation_reason=(new_reason)
118
+ validate_deprecated_or_optional(null: @null, deprecation_reason: new_reason)
119
+ super
120
+ end
103
121
 
104
122
  def visible?(context)
105
123
  true
@@ -155,8 +173,8 @@ module GraphQL
155
173
  if NO_DEFAULT != @default_value
156
174
  argument.default_value = @default_value
157
175
  end
158
- if @deprecation_reason
159
- argument.deprecation_reason = @deprecation_reason
176
+ if self.deprecation_reason
177
+ argument.deprecation_reason = self.deprecation_reason
160
178
  end
161
179
  argument
162
180
  end
@@ -197,6 +215,8 @@ module GraphQL
197
215
  value = value.prepare
198
216
  end
199
217
 
218
+ Schema::Validator.validate!(validators, obj, context, value)
219
+
200
220
  if @prepare.nil?
201
221
  value
202
222
  elsif @prepare.is_a?(String) || @prepare.is_a?(Symbol)