graphql 1.13.23 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/graphql/analysis/ast/query_complexity.rb +1 -1
- data/lib/graphql/analysis/ast/query_depth.rb +0 -1
- data/lib/graphql/analysis/ast/visitor.rb +1 -1
- data/lib/graphql/analysis/ast.rb +0 -10
- data/lib/graphql/analysis.rb +0 -7
- data/lib/graphql/backtrace/table.rb +0 -18
- data/lib/graphql/backtrace/tracer.rb +1 -2
- data/lib/graphql/backtrace.rb +2 -8
- data/lib/graphql/dig.rb +1 -1
- data/lib/graphql/execution/errors.rb +1 -9
- data/lib/graphql/execution/interpreter/runtime.rb +6 -13
- data/lib/graphql/execution/interpreter.rb +0 -22
- data/lib/graphql/execution/lazy.rb +1 -1
- data/lib/graphql/execution/lookahead.rb +6 -13
- data/lib/graphql/execution/multiplex.rb +50 -107
- data/lib/graphql/execution.rb +11 -3
- data/lib/graphql/introspection/directive_type.rb +2 -2
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +2 -15
- data/lib/graphql/introspection/field_type.rb +1 -1
- data/lib/graphql/introspection/schema_type.rb +2 -2
- data/lib/graphql/introspection/type_type.rb +5 -5
- data/lib/graphql/language/document_from_schema_definition.rb +0 -17
- data/lib/graphql/pagination/connections.rb +2 -28
- data/lib/graphql/query/context.rb +1 -185
- data/lib/graphql/query/input_validation_result.rb +0 -9
- data/lib/graphql/query/literal_input.rb +8 -13
- data/lib/graphql/query/validation_pipeline.rb +6 -34
- data/lib/graphql/query/variable_validation_error.rb +2 -2
- data/lib/graphql/query/variables.rb +8 -31
- data/lib/graphql/query.rb +5 -34
- data/lib/graphql/railtie.rb +0 -104
- data/lib/graphql/relay/range_add.rb +0 -4
- data/lib/graphql/relay.rb +0 -15
- data/lib/graphql/schema/addition.rb +1 -8
- data/lib/graphql/schema/argument.rb +1 -25
- data/lib/graphql/schema/build_from_definition.rb +0 -1
- data/lib/graphql/schema/directive.rb +1 -22
- data/lib/graphql/schema/enum.rb +3 -19
- data/lib/graphql/schema/enum_value.rb +0 -22
- data/lib/graphql/schema/field.rb +22 -220
- data/lib/graphql/schema/input_object.rb +11 -57
- data/lib/graphql/schema/interface.rb +1 -30
- data/lib/graphql/schema/introspection_system.rb +3 -8
- data/lib/graphql/schema/late_bound_type.rb +2 -2
- data/lib/graphql/schema/list.rb +3 -24
- data/lib/graphql/schema/loader.rb +0 -1
- data/lib/graphql/schema/member/base_dsl_methods.rb +1 -6
- data/lib/graphql/schema/member/build_type.rb +4 -6
- data/lib/graphql/schema/member/has_arguments.rb +16 -20
- data/lib/graphql/schema/member/has_fields.rb +3 -3
- data/lib/graphql/schema/member/has_interfaces.rb +1 -13
- data/lib/graphql/schema/member/validates_input.rb +2 -2
- data/lib/graphql/schema/member.rb +0 -6
- data/lib/graphql/schema/mutation.rb +0 -9
- data/lib/graphql/schema/non_null.rb +3 -9
- data/lib/graphql/schema/object.rb +0 -40
- data/lib/graphql/schema/relay_classic_mutation.rb +17 -28
- data/lib/graphql/schema/scalar.rb +1 -16
- data/lib/graphql/schema/union.rb +0 -16
- data/lib/graphql/schema/warden.rb +3 -12
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +106 -945
- data/lib/graphql/static_validation/base_visitor.rb +4 -21
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +12 -12
- data/lib/graphql/static_validation/validator.rb +2 -24
- data/lib/graphql/static_validation.rb +0 -2
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +38 -1
- data/lib/graphql/subscriptions/event.rb +1 -1
- data/lib/graphql/subscriptions/instrumentation.rb +0 -51
- data/lib/graphql/subscriptions.rb +4 -13
- data/lib/graphql/tracing/data_dog_tracing.rb +16 -20
- data/lib/graphql/tracing/platform_tracing.rb +4 -32
- data/lib/graphql/tracing.rb +0 -1
- data/lib/graphql/types/relay/connection_behaviors.rb +2 -6
- data/lib/graphql/types/relay/default_relay.rb +0 -10
- data/lib/graphql/types/relay/node_behaviors.rb +5 -1
- data/lib/graphql/types/relay.rb +0 -2
- data/lib/graphql/types/string.rb +1 -1
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +1 -66
- metadata +28 -167
- data/lib/graphql/analysis/analyze_query.rb +0 -98
- data/lib/graphql/analysis/field_usage.rb +0 -45
- data/lib/graphql/analysis/max_query_complexity.rb +0 -26
- data/lib/graphql/analysis/max_query_depth.rb +0 -26
- data/lib/graphql/analysis/query_complexity.rb +0 -88
- data/lib/graphql/analysis/query_depth.rb +0 -43
- data/lib/graphql/analysis/reducer_state.rb +0 -48
- data/lib/graphql/argument.rb +0 -131
- data/lib/graphql/authorization.rb +0 -82
- data/lib/graphql/backtrace/legacy_tracer.rb +0 -56
- data/lib/graphql/backwards_compatibility.rb +0 -61
- data/lib/graphql/base_type.rb +0 -232
- data/lib/graphql/boolean_type.rb +0 -2
- data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
- data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
- data/lib/graphql/compatibility/execution_specification.rb +0 -436
- data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
- data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -215
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -87
- data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
- data/lib/graphql/compatibility/query_parser_specification.rb +0 -266
- data/lib/graphql/compatibility/schema_parser_specification.rb +0 -682
- data/lib/graphql/compatibility.rb +0 -5
- data/lib/graphql/define/assign_argument.rb +0 -12
- data/lib/graphql/define/assign_connection.rb +0 -13
- data/lib/graphql/define/assign_enum_value.rb +0 -18
- data/lib/graphql/define/assign_global_id_field.rb +0 -11
- data/lib/graphql/define/assign_mutation_function.rb +0 -34
- data/lib/graphql/define/assign_object_field.rb +0 -42
- data/lib/graphql/define/defined_object_proxy.rb +0 -53
- data/lib/graphql/define/instance_definable.rb +0 -255
- data/lib/graphql/define/no_definition_error.rb +0 -7
- data/lib/graphql/define/non_null_with_bang.rb +0 -16
- data/lib/graphql/define/type_definer.rb +0 -31
- data/lib/graphql/define.rb +0 -31
- data/lib/graphql/deprecated_dsl.rb +0 -55
- data/lib/graphql/directive/deprecated_directive.rb +0 -2
- data/lib/graphql/directive/include_directive.rb +0 -2
- data/lib/graphql/directive/skip_directive.rb +0 -2
- data/lib/graphql/directive.rb +0 -107
- data/lib/graphql/enum_type.rb +0 -133
- data/lib/graphql/execution/execute.rb +0 -333
- data/lib/graphql/execution/flatten.rb +0 -40
- data/lib/graphql/execution/typecast.rb +0 -50
- data/lib/graphql/field/resolve.rb +0 -59
- data/lib/graphql/field.rb +0 -226
- data/lib/graphql/float_type.rb +0 -2
- data/lib/graphql/function.rb +0 -128
- data/lib/graphql/id_type.rb +0 -2
- data/lib/graphql/input_object_type.rb +0 -138
- data/lib/graphql/int_type.rb +0 -2
- data/lib/graphql/interface_type.rb +0 -72
- data/lib/graphql/internal_representation/document.rb +0 -27
- data/lib/graphql/internal_representation/node.rb +0 -206
- data/lib/graphql/internal_representation/print.rb +0 -51
- data/lib/graphql/internal_representation/rewrite.rb +0 -184
- data/lib/graphql/internal_representation/scope.rb +0 -88
- data/lib/graphql/internal_representation/visit.rb +0 -36
- data/lib/graphql/internal_representation.rb +0 -7
- data/lib/graphql/list_type.rb +0 -80
- data/lib/graphql/non_null_type.rb +0 -71
- data/lib/graphql/object_type.rb +0 -130
- data/lib/graphql/query/arguments.rb +0 -189
- data/lib/graphql/query/arguments_cache.rb +0 -24
- data/lib/graphql/query/executor.rb +0 -52
- data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
- data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
- data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
- data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
- data/lib/graphql/query/serial_execution.rb +0 -40
- data/lib/graphql/relay/array_connection.rb +0 -83
- data/lib/graphql/relay/base_connection.rb +0 -189
- data/lib/graphql/relay/connection_instrumentation.rb +0 -54
- data/lib/graphql/relay/connection_resolve.rb +0 -43
- data/lib/graphql/relay/connection_type.rb +0 -54
- data/lib/graphql/relay/edge.rb +0 -27
- data/lib/graphql/relay/edge_type.rb +0 -19
- data/lib/graphql/relay/edges_instrumentation.rb +0 -39
- data/lib/graphql/relay/global_id_resolve.rb +0 -17
- data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
- data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
- data/lib/graphql/relay/mutation/resolve.rb +0 -56
- data/lib/graphql/relay/mutation/result.rb +0 -38
- data/lib/graphql/relay/mutation.rb +0 -106
- data/lib/graphql/relay/node.rb +0 -39
- data/lib/graphql/relay/page_info.rb +0 -7
- data/lib/graphql/relay/relation_connection.rb +0 -188
- data/lib/graphql/relay/type_extensions.rb +0 -32
- data/lib/graphql/scalar_type.rb +0 -91
- data/lib/graphql/schema/catchall_middleware.rb +0 -35
- data/lib/graphql/schema/default_parse_error.rb +0 -10
- data/lib/graphql/schema/default_type_error.rb +0 -17
- data/lib/graphql/schema/member/accepts_definition.rb +0 -164
- data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -58
- data/lib/graphql/schema/member/instrumentation.rb +0 -131
- data/lib/graphql/schema/middleware_chain.rb +0 -82
- data/lib/graphql/schema/possible_types.rb +0 -44
- data/lib/graphql/schema/rescue_middleware.rb +0 -60
- data/lib/graphql/schema/timeout_middleware.rb +0 -88
- data/lib/graphql/schema/traversal.rb +0 -228
- data/lib/graphql/schema/validation.rb +0 -313
- data/lib/graphql/static_validation/default_visitor.rb +0 -15
- data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
- data/lib/graphql/string_type.rb +0 -2
- data/lib/graphql/subscriptions/subscription_root.rb +0 -76
- data/lib/graphql/tracing/skylight_tracing.rb +0 -70
- data/lib/graphql/types/relay/node_field.rb +0 -24
- data/lib/graphql/types/relay/nodes_field.rb +0 -43
- data/lib/graphql/union_type.rb +0 -115
- data/lib/graphql/upgrader/member.rb +0 -937
- data/lib/graphql/upgrader/schema.rb +0 -38
data/lib/graphql/schema/field.rb
CHANGED
@@ -5,8 +5,6 @@ require "graphql/schema/field/scope_extension"
|
|
5
5
|
module GraphQL
|
6
6
|
class Schema
|
7
7
|
class Field
|
8
|
-
include GraphQL::Schema::Member::CachedGraphQLDefinition
|
9
|
-
include GraphQL::Schema::Member::AcceptsDefinition
|
10
8
|
include GraphQL::Schema::Member::HasArguments
|
11
9
|
include GraphQL::Schema::Member::HasAstNode
|
12
10
|
include GraphQL::Schema::Member::HasPath
|
@@ -84,16 +82,6 @@ module GraphQL
|
|
84
82
|
# @return [GraphQL::Schema:Field] an instance of `self
|
85
83
|
# @see {.initialize} for other options
|
86
84
|
def self.from_options(name = nil, type = nil, desc = nil, resolver: nil, mutation: nil, subscription: nil,**kwargs, &block)
|
87
|
-
if kwargs[:field]
|
88
|
-
if kwargs[:field].is_a?(GraphQL::Field) && kwargs[:field] == GraphQL::Types::Relay::NodeField.graphql_definition
|
89
|
-
GraphQL::Deprecation.warn("Legacy-style `GraphQL::Relay::Node.field` is being added to a class-based type. See `GraphQL::Types::Relay::NodeField` for a replacement.")
|
90
|
-
return GraphQL::Types::Relay::NodeField
|
91
|
-
elsif kwargs[:field].is_a?(GraphQL::Field) && kwargs[:field] == GraphQL::Types::Relay::NodesField.graphql_definition
|
92
|
-
GraphQL::Deprecation.warn("Legacy-style `GraphQL::Relay::Node.plural_field` is being added to a class-based type. See `GraphQL::Types::Relay::NodesField` for a replacement.")
|
93
|
-
return GraphQL::Types::Relay::NodesField
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
85
|
if (parent_config = resolver || mutation || subscription)
|
98
86
|
# Get the parent config, merge in local overrides
|
99
87
|
kwargs = parent_config.field_options.merge(kwargs)
|
@@ -106,9 +94,6 @@ module GraphQL
|
|
106
94
|
end
|
107
95
|
|
108
96
|
if !type.nil?
|
109
|
-
if type.is_a?(GraphQL::Field)
|
110
|
-
raise ArgumentError, "A GraphQL::Field was passed as the second argument, use the `field:` keyword for this instead."
|
111
|
-
end
|
112
97
|
if desc
|
113
98
|
if kwargs[:description]
|
114
99
|
raise ArgumentError, "Provide description as a positional argument or `description:` keyword, but not both (#{desc.inspect}, #{kwargs[:description].inspect})"
|
@@ -176,8 +161,6 @@ module GraphQL
|
|
176
161
|
|
177
162
|
# @return Boolean
|
178
163
|
attr_reader :relay_node_field
|
179
|
-
# @return Boolean
|
180
|
-
attr_reader :relay_nodes_field
|
181
164
|
|
182
165
|
# @return [Boolean] Should we warn if this field's name conflicts with a built-in method?
|
183
166
|
def method_conflict_warning?
|
@@ -214,8 +197,7 @@ module GraphQL
|
|
214
197
|
# @param ast_node [Language::Nodes::FieldDefinition, nil] If this schema was parsed from definition, this AST node defined the field
|
215
198
|
# @param method_conflict_warning [Boolean] If false, skip the warning if this field's method conflicts with a built-in method
|
216
199
|
# @param validates [Array<Hash>] Configurations for validating this field
|
217
|
-
|
218
|
-
def initialize(type: nil, name: nil, owner: nil, null: true, field: nil, function: nil, description: nil, deprecation_reason: nil, method: nil, hash_key: nil, dig: nil, resolver_method: nil, resolve: nil, connection: nil, max_page_size: :not_given, scope: nil, introspection: false, camelize: true, trace: nil, complexity: 1, ast_node: nil, extras: EMPTY_ARRAY, extensions: EMPTY_ARRAY, connection_extension: self.class.connection_extension, resolver_class: nil, subscription_scope: nil, relay_node_field: false, relay_nodes_field: false, method_conflict_warning: true, broadcastable: nil, arguments: EMPTY_HASH, directives: EMPTY_HASH, validates: EMPTY_ARRAY, legacy_edge_class: nil, &definition_block)
|
200
|
+
def initialize(type: nil, name: nil, owner: nil, null: true, field: nil, function: nil, description: nil, deprecation_reason: nil, method: nil, hash_key: nil, dig: nil, resolver_method: nil, resolve: nil, connection: nil, max_page_size: :not_given, scope: nil, introspection: false, camelize: true, trace: nil, complexity: 1, ast_node: nil, extras: EMPTY_ARRAY, extensions: EMPTY_ARRAY, connection_extension: self.class.connection_extension, resolver_class: nil, subscription_scope: nil, relay_node_field: false, relay_nodes_field: false, method_conflict_warning: true, broadcastable: nil, arguments: EMPTY_HASH, directives: EMPTY_HASH, validates: EMPTY_ARRAY, &definition_block)
|
219
201
|
if name.nil?
|
220
202
|
raise ArgumentError, "missing first `name` argument or keyword `name:`"
|
221
203
|
end
|
@@ -229,7 +211,6 @@ module GraphQL
|
|
229
211
|
end
|
230
212
|
@original_name = name
|
231
213
|
name_s = -name.to_s
|
232
|
-
|
233
214
|
@underscored_name = -Member::BuildType.underscore(name_s)
|
234
215
|
@name = -(camelize ? Member::BuildType.camelize(name_s) : name_s)
|
235
216
|
@description = description
|
@@ -259,10 +240,6 @@ module GraphQL
|
|
259
240
|
# TODO: I think non-string/symbol hash keys are wrongly normalized (eg `1` will not work)
|
260
241
|
method_name = method || hash_key || name_s
|
261
242
|
@dig_keys = dig
|
262
|
-
if hash_key
|
263
|
-
@hash_key = hash_key
|
264
|
-
end
|
265
|
-
|
266
243
|
resolver_method ||= name_s.to_sym
|
267
244
|
|
268
245
|
@method_str = -method_name.to_s
|
@@ -284,7 +261,6 @@ module GraphQL
|
|
284
261
|
@relay_nodes_field = relay_nodes_field
|
285
262
|
@ast_node = ast_node
|
286
263
|
@method_conflict_warning = method_conflict_warning
|
287
|
-
@legacy_edge_class = legacy_edge_class
|
288
264
|
|
289
265
|
arguments.each do |name, arg|
|
290
266
|
case arg
|
@@ -478,13 +454,7 @@ module GraphQL
|
|
478
454
|
case defined_complexity
|
479
455
|
when Proc
|
480
456
|
arguments = query.arguments_for(nodes.first, self)
|
481
|
-
|
482
|
-
return child_complexity
|
483
|
-
elsif arguments.respond_to?(:keyword_arguments)
|
484
|
-
arguments = arguments.keyword_arguments
|
485
|
-
end
|
486
|
-
|
487
|
-
defined_complexity.call(query.context, arguments, child_complexity)
|
457
|
+
defined_complexity.call(query.context, arguments.keyword_arguments, child_complexity)
|
488
458
|
when Numeric
|
489
459
|
defined_complexity + child_complexity
|
490
460
|
else
|
@@ -521,82 +491,6 @@ module GraphQL
|
|
521
491
|
# @return [Integer, nil] Applied to connections if {#has_max_page_size?}
|
522
492
|
attr_reader :max_page_size
|
523
493
|
|
524
|
-
prepend Schema::Member::CachedGraphQLDefinition::DeprecatedToGraphQL
|
525
|
-
|
526
|
-
# @return [GraphQL::Field]
|
527
|
-
def to_graphql
|
528
|
-
field_defn = if @field
|
529
|
-
@field.dup
|
530
|
-
elsif @function
|
531
|
-
GraphQL::Function.build_field(@function)
|
532
|
-
else
|
533
|
-
GraphQL::Field.new
|
534
|
-
end
|
535
|
-
|
536
|
-
field_defn.name = @name
|
537
|
-
if @return_type_expr
|
538
|
-
field_defn.type = -> { type }
|
539
|
-
end
|
540
|
-
|
541
|
-
if @description
|
542
|
-
field_defn.description = @description
|
543
|
-
end
|
544
|
-
|
545
|
-
if self.deprecation_reason
|
546
|
-
field_defn.deprecation_reason = self.deprecation_reason
|
547
|
-
end
|
548
|
-
|
549
|
-
if @resolver_class
|
550
|
-
if @resolver_class < GraphQL::Schema::Mutation
|
551
|
-
field_defn.mutation = @resolver_class
|
552
|
-
end
|
553
|
-
field_defn.metadata[:resolver] = @resolver_class
|
554
|
-
end
|
555
|
-
|
556
|
-
if !@trace.nil?
|
557
|
-
field_defn.trace = @trace
|
558
|
-
end
|
559
|
-
|
560
|
-
if @relay_node_field
|
561
|
-
field_defn.relay_node_field = @relay_node_field
|
562
|
-
end
|
563
|
-
|
564
|
-
if @relay_nodes_field
|
565
|
-
field_defn.relay_nodes_field = @relay_nodes_field
|
566
|
-
end
|
567
|
-
|
568
|
-
if @legacy_edge_class
|
569
|
-
field_defn.edge_class = @legacy_edge_class
|
570
|
-
end
|
571
|
-
|
572
|
-
field_defn.resolve = self.method(:resolve_field)
|
573
|
-
field_defn.connection = connection?
|
574
|
-
field_defn.connection_max_page_size = max_page_size
|
575
|
-
field_defn.introspection = @introspection
|
576
|
-
field_defn.complexity = @complexity
|
577
|
-
field_defn.subscription_scope = @subscription_scope
|
578
|
-
field_defn.ast_node = ast_node
|
579
|
-
|
580
|
-
all_argument_definitions.each do |defn|
|
581
|
-
arg_graphql = defn.deprecated_to_graphql
|
582
|
-
field_defn.arguments[arg_graphql.name] = arg_graphql # rubocop:disable Development/ContextIsPassedCop -- legacy-related
|
583
|
-
end
|
584
|
-
|
585
|
-
# Support a passed-in proc, one way or another
|
586
|
-
@resolve_proc = if @resolve
|
587
|
-
@resolve
|
588
|
-
elsif @function
|
589
|
-
@function
|
590
|
-
elsif @field
|
591
|
-
@field.resolve_proc
|
592
|
-
end
|
593
|
-
|
594
|
-
# Ok, `self` isn't a class, but this is for consistency with the classes
|
595
|
-
field_defn.metadata[:type_class] = self
|
596
|
-
field_defn.arguments_class = GraphQL::Query::Arguments.construct_arguments_class(field_defn)
|
597
|
-
field_defn
|
598
|
-
end
|
599
|
-
|
600
494
|
class MissingReturnTypeError < GraphQL::Error; end
|
601
495
|
attr_writer :type
|
602
496
|
|
@@ -651,64 +545,31 @@ module GraphQL
|
|
651
545
|
arg_values = args
|
652
546
|
using_arg_values = false
|
653
547
|
end
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
if
|
661
|
-
|
662
|
-
|
663
|
-
next
|
664
|
-
else
|
665
|
-
application_arg_value = arg_value.value
|
666
|
-
if application_arg_value.is_a?(GraphQL::Execution::Interpreter::Arguments)
|
667
|
-
application_arg_value.keyword_arguments
|
668
|
-
end
|
669
|
-
end
|
548
|
+
# Faster than `.any?`
|
549
|
+
arguments(context).each_value do |arg|
|
550
|
+
arg_key = arg.keyword
|
551
|
+
if arg_values.key?(arg_key)
|
552
|
+
arg_value = arg_values[arg_key]
|
553
|
+
if using_arg_values
|
554
|
+
if arg_value.default_used?
|
555
|
+
# pass -- no auth required for default used
|
556
|
+
next
|
670
557
|
else
|
671
|
-
application_arg_value = arg_value
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
return false
|
558
|
+
application_arg_value = arg_value.value
|
559
|
+
if application_arg_value.is_a?(GraphQL::Execution::Interpreter::Arguments)
|
560
|
+
application_arg_value.keyword_arguments
|
561
|
+
end
|
676
562
|
end
|
563
|
+
else
|
564
|
+
application_arg_value = arg_value
|
677
565
|
end
|
678
|
-
end
|
679
|
-
end
|
680
|
-
true
|
681
|
-
end
|
682
|
-
end
|
683
566
|
|
684
|
-
|
685
|
-
|
686
|
-
# Eventually, we might hook up field instances to execution in another way. TBD.
|
687
|
-
# @see #resolve for how the interpreter hooks up to it
|
688
|
-
def resolve_field(obj, args, ctx)
|
689
|
-
ctx.schema.after_lazy(obj) do |after_obj|
|
690
|
-
# First, apply auth ...
|
691
|
-
query_ctx = ctx.query.context
|
692
|
-
# Some legacy fields can have `nil` here, not exactly sure why.
|
693
|
-
# @see https://github.com/rmosolgo/graphql-ruby/issues/1990 before removing
|
694
|
-
inner_obj = after_obj && after_obj.object
|
695
|
-
ctx.schema.after_lazy(to_ruby_args(after_obj, args, ctx)) do |ruby_args|
|
696
|
-
if authorized?(inner_obj, ruby_args, query_ctx)
|
697
|
-
# Then if it passed, resolve the field
|
698
|
-
if @resolve_proc
|
699
|
-
# Might be nil, still want to call the func in that case
|
700
|
-
with_extensions(inner_obj, ruby_args, query_ctx) do |extended_obj, extended_args|
|
701
|
-
# Pass the GraphQL args here for compatibility:
|
702
|
-
@resolve_proc.call(extended_obj, args, ctx)
|
703
|
-
end
|
704
|
-
else
|
705
|
-
public_send_field(after_obj, ruby_args, query_ctx)
|
567
|
+
if !arg.authorized?(object, application_arg_value, context)
|
568
|
+
return false
|
706
569
|
end
|
707
|
-
else
|
708
|
-
err = GraphQL::UnauthorizedFieldError.new(object: inner_obj, type: obj.class, context: ctx, field: self)
|
709
|
-
query_ctx.schema.unauthorized_field(err)
|
710
570
|
end
|
711
571
|
end
|
572
|
+
true
|
712
573
|
end
|
713
574
|
end
|
714
575
|
|
@@ -744,7 +605,7 @@ module GraphQL
|
|
744
605
|
err
|
745
606
|
end
|
746
607
|
|
747
|
-
# @param ctx [GraphQL::Query::Context
|
608
|
+
# @param ctx [GraphQL::Query::Context]
|
748
609
|
def fetch_extra(extra_name, ctx)
|
749
610
|
if extra_name != :path && extra_name != :ast_node && respond_to?(extra_name)
|
750
611
|
self.public_send(extra_name)
|
@@ -757,63 +618,6 @@ module GraphQL
|
|
757
618
|
|
758
619
|
private
|
759
620
|
|
760
|
-
NO_ARGS = {}.freeze
|
761
|
-
|
762
|
-
# Convert a GraphQL arguments instance into a Ruby-style hash.
|
763
|
-
#
|
764
|
-
# @param obj [GraphQL::Schema::Object] The object where this field is being resolved
|
765
|
-
# @param graphql_args [GraphQL::Query::Arguments]
|
766
|
-
# @param field_ctx [GraphQL::Query::Context::FieldResolutionContext]
|
767
|
-
# @return [Hash<Symbol => Any>]
|
768
|
-
def to_ruby_args(obj, graphql_args, field_ctx)
|
769
|
-
if graphql_args.any? || @extras.any?
|
770
|
-
# Splat the GraphQL::Arguments to Ruby keyword arguments
|
771
|
-
ruby_kwargs = graphql_args.to_kwargs
|
772
|
-
maybe_lazies = []
|
773
|
-
# Apply any `prepare` methods. Not great code organization, can this go somewhere better?
|
774
|
-
arguments(field_ctx).each do |name, arg_defn|
|
775
|
-
ruby_kwargs_key = arg_defn.keyword
|
776
|
-
|
777
|
-
if ruby_kwargs.key?(ruby_kwargs_key)
|
778
|
-
loads = arg_defn.loads
|
779
|
-
value = ruby_kwargs[ruby_kwargs_key]
|
780
|
-
loaded_value = if loads && !arg_defn.from_resolver?
|
781
|
-
if arg_defn.type.list?
|
782
|
-
loaded_values = value.map { |val| load_application_object(arg_defn, loads, val, field_ctx.query.context) }
|
783
|
-
field_ctx.schema.after_any_lazies(loaded_values) { |result| result }
|
784
|
-
else
|
785
|
-
load_application_object(arg_defn, loads, value, field_ctx.query.context)
|
786
|
-
end
|
787
|
-
elsif arg_defn.type.list? && value.is_a?(Array)
|
788
|
-
field_ctx.schema.after_any_lazies(value, &:itself)
|
789
|
-
else
|
790
|
-
value
|
791
|
-
end
|
792
|
-
|
793
|
-
maybe_lazies << field_ctx.schema.after_lazy(loaded_value) do |loaded_value|
|
794
|
-
prepared_value = if arg_defn.prepare
|
795
|
-
arg_defn.prepare_value(obj, loaded_value)
|
796
|
-
else
|
797
|
-
loaded_value
|
798
|
-
end
|
799
|
-
|
800
|
-
ruby_kwargs[ruby_kwargs_key] = prepared_value
|
801
|
-
end
|
802
|
-
end
|
803
|
-
end
|
804
|
-
|
805
|
-
@extras.each do |extra_arg|
|
806
|
-
ruby_kwargs[extra_arg] = fetch_extra(extra_arg, field_ctx)
|
807
|
-
end
|
808
|
-
|
809
|
-
field_ctx.schema.after_any_lazies(maybe_lazies) do
|
810
|
-
ruby_kwargs
|
811
|
-
end
|
812
|
-
else
|
813
|
-
NO_ARGS
|
814
|
-
end
|
815
|
-
end
|
816
|
-
|
817
621
|
def public_send_field(unextended_obj, unextended_ruby_kwargs, query_ctx)
|
818
622
|
with_extensions(unextended_obj, unextended_ruby_kwargs, query_ctx) do |obj, ruby_kwargs|
|
819
623
|
begin
|
@@ -829,7 +633,7 @@ module GraphQL
|
|
829
633
|
# Find a way to resolve this field, checking:
|
830
634
|
#
|
831
635
|
# - A method on the type instance;
|
832
|
-
# - Hash keys, if the wrapped object is a hash
|
636
|
+
# - Hash keys, if the wrapped object is a hash;
|
833
637
|
# - A method on the wrapped object;
|
834
638
|
# - Or, raise not implemented.
|
835
639
|
#
|
@@ -851,8 +655,6 @@ module GraphQL
|
|
851
655
|
else
|
852
656
|
inner_object[@method_str]
|
853
657
|
end
|
854
|
-
elsif defined?(@hash_key) && obj.object.respond_to?(:[])
|
855
|
-
obj.object[@hash_key]
|
856
658
|
elsif obj.object.respond_to?(@method_sym)
|
857
659
|
method_to_call = @method_sym
|
858
660
|
method_receiver = obj.object
|
@@ -2,7 +2,6 @@
|
|
2
2
|
module GraphQL
|
3
3
|
class Schema
|
4
4
|
class InputObject < GraphQL::Schema::Member
|
5
|
-
extend GraphQL::Schema::Member::AcceptsDefinition
|
6
5
|
extend Forwardable
|
7
6
|
extend GraphQL::Schema::Member::HasArguments
|
8
7
|
extend GraphQL::Schema::Member::HasArguments::ArgumentObjectLoader
|
@@ -13,49 +12,28 @@ module GraphQL
|
|
13
12
|
|
14
13
|
# @return [GraphQL::Query::Context] The context for this query
|
15
14
|
attr_reader :context
|
16
|
-
# @return [GraphQL::
|
15
|
+
# @return [GraphQL::Execution::Interpereter::Arguments] The underlying arguments instance
|
17
16
|
attr_reader :arguments
|
18
17
|
|
19
18
|
# Ruby-like hash behaviors, read-only
|
20
19
|
def_delegators :@ruby_style_hash, :keys, :values, :each, :map, :any?, :empty?
|
21
20
|
|
22
|
-
def initialize(arguments
|
21
|
+
def initialize(arguments, ruby_kwargs:, context:, defaults_used:)
|
23
22
|
@context = context
|
24
|
-
|
25
|
-
|
26
|
-
@arguments = arguments
|
27
|
-
else
|
28
|
-
@arguments = self.class.arguments_class.new(arguments, context: context, defaults_used: defaults_used)
|
29
|
-
# Symbolized, underscored hash:
|
30
|
-
@ruby_style_hash = @arguments.to_kwargs
|
31
|
-
end
|
23
|
+
@ruby_style_hash = ruby_kwargs
|
24
|
+
@arguments = arguments
|
32
25
|
# Apply prepares, not great to have it duplicated here.
|
33
|
-
maybe_lazies = []
|
34
26
|
self.class.arguments(context).each_value do |arg_defn|
|
35
27
|
ruby_kwargs_key = arg_defn.keyword
|
36
|
-
|
37
28
|
if @ruby_style_hash.key?(ruby_kwargs_key)
|
38
|
-
loads = arg_defn.loads
|
39
|
-
# Resolvers do this loading themselves;
|
40
|
-
# With the interpreter, it's done during `coerce_arguments`
|
41
|
-
if loads && !arg_defn.from_resolver? && !context.interpreter?
|
42
|
-
value = @ruby_style_hash[ruby_kwargs_key]
|
43
|
-
loaded_value = arg_defn.load_and_authorize_value(self, value, context)
|
44
|
-
maybe_lazies << context.schema.after_lazy(loaded_value) do |loaded_value|
|
45
|
-
overwrite_argument(ruby_kwargs_key, loaded_value)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
29
|
# Weirdly, procs are applied during coercion, but not methods.
|
50
30
|
# Probably because these methods require a `self`.
|
51
|
-
if arg_defn.prepare.is_a?(Symbol) || context.nil?
|
31
|
+
if arg_defn.prepare.is_a?(Symbol) || context.nil?
|
52
32
|
prepared_value = arg_defn.prepare_value(self, @ruby_style_hash[ruby_kwargs_key])
|
53
33
|
overwrite_argument(ruby_kwargs_key, prepared_value)
|
54
34
|
end
|
55
35
|
end
|
56
36
|
end
|
57
|
-
|
58
|
-
@maybe_lazies = maybe_lazies
|
59
37
|
end
|
60
38
|
|
61
39
|
def to_h
|
@@ -68,12 +46,10 @@ module GraphQL
|
|
68
46
|
|
69
47
|
def prepare
|
70
48
|
if @context
|
71
|
-
@context
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
self
|
76
|
-
end
|
49
|
+
object = @context[:current_object]
|
50
|
+
# Pass this object's class with `as` so that messages are rendered correctly from inherited validators
|
51
|
+
Schema::Validator.validate!(self.class.validators, object, @context, @ruby_style_hash, as: self.class)
|
52
|
+
self
|
77
53
|
else
|
78
54
|
self
|
79
55
|
end
|
@@ -83,7 +59,6 @@ module GraphQL
|
|
83
59
|
# Authorize each argument (but this doesn't apply if `prepare` is implemented):
|
84
60
|
if value.respond_to?(:key?)
|
85
61
|
arguments(ctx).each do |_name, input_obj_arg|
|
86
|
-
input_obj_arg = input_obj_arg.type_class
|
87
62
|
if value.key?(input_obj_arg.keyword) &&
|
88
63
|
!input_obj_arg.authorized?(obj, value[input_obj_arg.keyword], ctx)
|
89
64
|
return false
|
@@ -132,9 +107,6 @@ module GraphQL
|
|
132
107
|
end
|
133
108
|
|
134
109
|
class << self
|
135
|
-
# @return [Class<GraphQL::Arguments>]
|
136
|
-
attr_accessor :arguments_class
|
137
|
-
|
138
110
|
def argument(*args, **kwargs, &block)
|
139
111
|
argument_defn = super(*args, **kwargs, &block)
|
140
112
|
# Add a method access
|
@@ -147,25 +119,6 @@ module GraphQL
|
|
147
119
|
argument_defn
|
148
120
|
end
|
149
121
|
|
150
|
-
prepend Schema::Member::CachedGraphQLDefinition::DeprecatedToGraphQL
|
151
|
-
|
152
|
-
def to_graphql
|
153
|
-
type_defn = GraphQL::InputObjectType.new
|
154
|
-
type_defn.name = graphql_name
|
155
|
-
type_defn.description = description
|
156
|
-
type_defn.metadata[:type_class] = self
|
157
|
-
type_defn.mutation = mutation
|
158
|
-
type_defn.ast_node = ast_node
|
159
|
-
all_argument_definitions.each do |arg|
|
160
|
-
type_defn.arguments[arg.graphql_definition(silence_deprecation_warning: true).name] = arg.graphql_definition(silence_deprecation_warning: true) # rubocop:disable Development/ContextIsPassedCop -- legacy-related
|
161
|
-
end
|
162
|
-
# Make a reference to a classic-style Arguments class
|
163
|
-
self.arguments_class = GraphQL::Query::Arguments.construct_arguments_class(type_defn)
|
164
|
-
# But use this InputObject class at runtime
|
165
|
-
type_defn.arguments_class = self
|
166
|
-
type_defn
|
167
|
-
end
|
168
|
-
|
169
122
|
def kind
|
170
123
|
GraphQL::TypeKinds::INPUT_OBJECT
|
171
124
|
end
|
@@ -173,8 +126,9 @@ module GraphQL
|
|
173
126
|
# @api private
|
174
127
|
INVALID_OBJECT_MESSAGE = "Expected %{object} to be a key-value object responding to `to_h` or `to_unsafe_h`."
|
175
128
|
|
176
|
-
def validate_non_null_input(input, ctx
|
129
|
+
def validate_non_null_input(input, ctx)
|
177
130
|
result = GraphQL::Query::InputValidationResult.new
|
131
|
+
|
178
132
|
warden = ctx.warden
|
179
133
|
|
180
134
|
if input.is_a?(Array)
|
@@ -4,8 +4,6 @@ module GraphQL
|
|
4
4
|
module Interface
|
5
5
|
include GraphQL::Schema::Member::GraphQLTypeNames
|
6
6
|
module DefinitionMethods
|
7
|
-
include GraphQL::Schema::Member::CachedGraphQLDefinition
|
8
|
-
include GraphQL::Relay::TypeExtensions
|
9
7
|
include GraphQL::Schema::Member::BaseDSLMethods
|
10
8
|
# ConfigurationExtension's responsibilities are in `def included` below
|
11
9
|
include GraphQL::Schema::Member::TypeSystemHelpers
|
@@ -81,11 +79,7 @@ module GraphQL
|
|
81
79
|
end
|
82
80
|
elsif child_class < GraphQL::Schema::Object
|
83
81
|
# This is being included into an object type, make sure it's using `implements(...)`
|
84
|
-
backtrace_line =
|
85
|
-
location.base_label == "implements" &&
|
86
|
-
location.path.end_with?("schema/member/has_interfaces.rb")
|
87
|
-
end
|
88
|
-
|
82
|
+
backtrace_line = caller(0, 10).find { |line| line.include?("schema/member/has_interfaces.rb") && line.include?("in `implements'")}
|
89
83
|
if !backtrace_line
|
90
84
|
raise "Attach interfaces using `implements(#{self})`, not `include(#{self})`"
|
91
85
|
end
|
@@ -104,34 +98,11 @@ module GraphQL
|
|
104
98
|
end
|
105
99
|
end
|
106
100
|
|
107
|
-
prepend Schema::Member::CachedGraphQLDefinition::DeprecatedToGraphQL
|
108
|
-
|
109
|
-
def to_graphql
|
110
|
-
type_defn = GraphQL::InterfaceType.new
|
111
|
-
type_defn.name = graphql_name
|
112
|
-
type_defn.description = description
|
113
|
-
type_defn.orphan_types = orphan_types
|
114
|
-
type_defn.type_membership_class = self.type_membership_class
|
115
|
-
type_defn.ast_node = ast_node
|
116
|
-
fields.each do |field_name, field_inst| # rubocop:disable Development/ContextIsPassedCop -- legacy-related
|
117
|
-
field_defn = field_inst.graphql_definition(silence_deprecation_warning: true)
|
118
|
-
type_defn.fields[field_defn.name] = field_defn # rubocop:disable Development/ContextIsPassedCop -- legacy-related
|
119
|
-
end
|
120
|
-
type_defn.metadata[:type_class] = self
|
121
|
-
if respond_to?(:resolve_type)
|
122
|
-
type_defn.resolve_type = method(:resolve_type)
|
123
|
-
end
|
124
|
-
type_defn
|
125
|
-
end
|
126
|
-
|
127
101
|
def kind
|
128
102
|
GraphQL::TypeKinds::INTERFACE
|
129
103
|
end
|
130
104
|
end
|
131
105
|
|
132
|
-
# Extend this _after_ `DefinitionMethods` is defined, so it will be used
|
133
|
-
extend GraphQL::Schema::Member::AcceptsDefinition
|
134
|
-
|
135
106
|
extend DefinitionMethods
|
136
107
|
|
137
108
|
def unwrap
|
@@ -89,9 +89,9 @@ module GraphQL
|
|
89
89
|
case late_bound_type
|
90
90
|
when GraphQL::Schema::LateBoundType
|
91
91
|
@schema.get_type(late_bound_type.name)
|
92
|
-
when GraphQL::Schema::List
|
92
|
+
when GraphQL::Schema::List
|
93
93
|
resolve_late_binding(late_bound_type.of_type).to_list_type
|
94
|
-
when GraphQL::Schema::NonNull
|
94
|
+
when GraphQL::Schema::NonNull
|
95
95
|
resolve_late_binding(late_bound_type.of_type).to_non_null_type
|
96
96
|
when Module
|
97
97
|
# It's a normal type -- no change required
|
@@ -103,12 +103,7 @@ module GraphQL
|
|
103
103
|
|
104
104
|
def load_constant(class_name)
|
105
105
|
const = @custom_namespace.const_get(class_name)
|
106
|
-
|
107
|
-
dup_type_class(const)
|
108
|
-
else
|
109
|
-
# Use `.to_graphql` to get a freshly-made version, not shared between schemas
|
110
|
-
const.deprecated_to_graphql
|
111
|
-
end
|
106
|
+
dup_type_class(const)
|
112
107
|
rescue NameError
|
113
108
|
# Dup the built-in so that the cached fields aren't shared
|
114
109
|
dup_type_class(@built_in_namespace.const_get(class_name))
|
@@ -16,11 +16,11 @@ module GraphQL
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def to_non_null_type
|
19
|
-
@to_non_null_type ||= GraphQL::
|
19
|
+
@to_non_null_type ||= GraphQL::Schema::NonNull.new(self)
|
20
20
|
end
|
21
21
|
|
22
22
|
def to_list_type
|
23
|
-
@to_list_type ||= GraphQL::
|
23
|
+
@to_list_type ||= GraphQL::Schema::List.new(self)
|
24
24
|
end
|
25
25
|
|
26
26
|
def inspect
|
data/lib/graphql/schema/list.rb
CHANGED
@@ -8,12 +8,6 @@ module GraphQL
|
|
8
8
|
class List < GraphQL::Schema::Wrapper
|
9
9
|
include Schema::Member::ValidatesInput
|
10
10
|
|
11
|
-
prepend Schema::Member::CachedGraphQLDefinition::DeprecatedToGraphQL
|
12
|
-
|
13
|
-
def to_graphql
|
14
|
-
@of_type.graphql_definition(silence_deprecation_warning: true).to_list_type
|
15
|
-
end
|
16
|
-
|
17
11
|
# @return [GraphQL::TypeKinds::LIST]
|
18
12
|
def kind
|
19
13
|
GraphQL::TypeKinds::LIST
|
@@ -51,24 +45,15 @@ module GraphQL
|
|
51
45
|
end
|
52
46
|
end
|
53
47
|
|
54
|
-
def validate_non_null_input(value, ctx
|
48
|
+
def validate_non_null_input(value, ctx)
|
55
49
|
result = GraphQL::Query::InputValidationResult.new
|
56
50
|
ensure_array(value).each_with_index do |item, index|
|
57
51
|
item_result = of_type.validate_input(item, ctx)
|
58
|
-
|
59
|
-
if max_errors
|
60
|
-
if max_errors == 0
|
61
|
-
add_max_errros_reached_message(result)
|
62
|
-
break
|
63
|
-
end
|
64
|
-
|
65
|
-
max_errors -= 1
|
66
|
-
end
|
67
|
-
|
52
|
+
if !item_result.valid?
|
68
53
|
result.merge_result!(index, item_result)
|
69
54
|
end
|
70
55
|
end
|
71
|
-
result
|
56
|
+
result
|
72
57
|
end
|
73
58
|
|
74
59
|
private
|
@@ -81,12 +66,6 @@ module GraphQL
|
|
81
66
|
[value]
|
82
67
|
end
|
83
68
|
end
|
84
|
-
|
85
|
-
def add_max_errros_reached_message(result)
|
86
|
-
message = "Too many errors processing list variable, max validation error limit reached. Execution aborted"
|
87
|
-
item_result = GraphQL::Query::InputValidationResult.from_problem(message)
|
88
|
-
result.merge_result!(nil, item_result)
|
89
|
-
end
|
90
69
|
end
|
91
70
|
end
|
92
71
|
end
|
@@ -94,11 +94,6 @@ module GraphQL
|
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
97
|
-
# @return [GraphQL::BaseType] Convert this type to a legacy-style object.
|
98
|
-
def to_graphql
|
99
|
-
raise GraphQL::RequiredImplementationMissingError
|
100
|
-
end
|
101
|
-
|
102
97
|
alias :unwrap :itself
|
103
98
|
|
104
99
|
# Creates the default name for a schema member.
|
@@ -108,7 +103,7 @@ module GraphQL
|
|
108
103
|
@default_graphql_name ||= begin
|
109
104
|
raise GraphQL::RequiredImplementationMissingError, 'Anonymous class should declare a `graphql_name`' if name.nil?
|
110
105
|
|
111
|
-
|
106
|
+
name.split("::").last.sub(/Type\Z/, "")
|
112
107
|
end
|
113
108
|
end
|
114
109
|
|