graphql 1.13.24 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of graphql might be problematic. Click here for more details.
- 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/language/nodes.rb +0 -3
- 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 +6 -28
- data/lib/graphql/schema/build_from_definition.rb +7 -9
- data/lib/graphql/schema/directive.rb +1 -22
- data/lib/graphql/schema/enum.rb +3 -19
- data/lib/graphql/schema/enum_value.rb +1 -23
- data/lib/graphql/schema/field.rb +22 -221
- data/lib/graphql/schema/input_object.rb +17 -65
- 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 -164
- 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
@@ -1,71 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
# A non-null type modifies another type.
|
4
|
-
#
|
5
|
-
# Non-null types can be created with `!` (`InnerType!`)
|
6
|
-
# or {BaseType#to_non_null_type} (`InnerType.to_non_null_type`)
|
7
|
-
#
|
8
|
-
# For return types, it says that the returned value will _always_ be present.
|
9
|
-
#
|
10
|
-
# @example A field which _always_ returns an error
|
11
|
-
# field :items, !ItemType
|
12
|
-
# # or
|
13
|
-
# field :items, ItemType.to_non_null_type
|
14
|
-
#
|
15
|
-
# (If the application fails to return a value, {InvalidNullError} will be passed to {Schema#type_error}.)
|
16
|
-
#
|
17
|
-
# For input types, it says that the incoming value _must_ be provided by the query.
|
18
|
-
#
|
19
|
-
# @example A field which _requires_ a string input
|
20
|
-
# field :newNames do
|
21
|
-
# # ...
|
22
|
-
# argument :values, !types.String
|
23
|
-
# # or
|
24
|
-
# argument :values, types.String.to_non_null_type
|
25
|
-
# end
|
26
|
-
#
|
27
|
-
# (If a value isn't provided, {Query::VariableValidationError} will be raised).
|
28
|
-
#
|
29
|
-
# Given a non-null type, you can always get the underlying type with {#unwrap}.
|
30
|
-
#
|
31
|
-
class NonNullType < GraphQL::BaseType
|
32
|
-
include GraphQL::BaseType::ModifiesAnotherType
|
33
|
-
extend Forwardable
|
34
|
-
|
35
|
-
attr_reader :of_type
|
36
|
-
def initialize(of_type:)
|
37
|
-
super()
|
38
|
-
@of_type = of_type
|
39
|
-
end
|
40
|
-
|
41
|
-
def valid_input?(value, ctx)
|
42
|
-
validate_input(value, ctx).valid?
|
43
|
-
end
|
44
|
-
|
45
|
-
def validate_input(value, ctx)
|
46
|
-
if value.nil?
|
47
|
-
result = GraphQL::Query::InputValidationResult.new
|
48
|
-
result.add_problem("Expected value to not be null")
|
49
|
-
result
|
50
|
-
else
|
51
|
-
of_type.validate_input(value, ctx)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def_delegators :@of_type, :coerce_input, :coerce_result, :list?
|
56
|
-
|
57
|
-
def kind
|
58
|
-
GraphQL::TypeKinds::NON_NULL
|
59
|
-
end
|
60
|
-
|
61
|
-
def to_s
|
62
|
-
"#{of_type.to_s}!"
|
63
|
-
end
|
64
|
-
alias_method :inspect, :to_s
|
65
|
-
alias :to_type_signature :to_s
|
66
|
-
|
67
|
-
def non_null?
|
68
|
-
true
|
69
|
-
end
|
70
|
-
end
|
71
|
-
end
|
data/lib/graphql/object_type.rb
DELETED
@@ -1,130 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
# @api deprecated
|
4
|
-
class ObjectType < GraphQL::BaseType
|
5
|
-
extend Define::InstanceDefinable::DeprecatedDefine
|
6
|
-
|
7
|
-
deprecated_accepts_definitions :interfaces, :fields, :mutation, :relay_node_type, field: GraphQL::Define::AssignObjectField
|
8
|
-
deprecated_accepts_definitions implements: ->(type, *interfaces, inherit: false) { type.implements(interfaces, inherit: inherit) }
|
9
|
-
|
10
|
-
attr_accessor :fields, :mutation, :relay_node_type
|
11
|
-
ensure_defined(:fields, :mutation, :interfaces, :relay_node_type)
|
12
|
-
|
13
|
-
# @!attribute fields
|
14
|
-
# @return [Hash<String => GraphQL::Field>] Map String fieldnames to their {GraphQL::Field} implementations
|
15
|
-
|
16
|
-
# @!attribute mutation
|
17
|
-
# @return [GraphQL::Relay::Mutation, nil] The mutation this object type was derived from, if it is an auto-generated payload type.
|
18
|
-
|
19
|
-
def initialize
|
20
|
-
super
|
21
|
-
@fields = {}
|
22
|
-
@clean_inherited_fields = nil
|
23
|
-
@structural_interface_type_memberships = []
|
24
|
-
@inherited_interface_type_memberships = []
|
25
|
-
end
|
26
|
-
|
27
|
-
def initialize_copy(other)
|
28
|
-
super
|
29
|
-
@structural_interface_type_memberships = other.structural_interface_type_memberships.dup
|
30
|
-
@inherited_interface_type_memberships = other.inherited_interface_type_memberships.dup
|
31
|
-
@fields = other.fields.dup
|
32
|
-
end
|
33
|
-
|
34
|
-
# This method declares interfaces for this type AND inherits any field definitions
|
35
|
-
# @param new_interfaces [Array<GraphQL::Interface>] interfaces that this type implements
|
36
|
-
# @deprecated Use `implements` instead of `interfaces`.
|
37
|
-
def interfaces=(new_interfaces)
|
38
|
-
@structural_interface_type_memberships = []
|
39
|
-
@inherited_interface_type_memberships = []
|
40
|
-
@clean_inherited_fields = nil
|
41
|
-
implements(new_interfaces, inherit: true)
|
42
|
-
end
|
43
|
-
|
44
|
-
def interfaces(ctx = GraphQL::Query::NullContext)
|
45
|
-
ensure_defined
|
46
|
-
visible_ifaces = []
|
47
|
-
unfiltered = ctx == GraphQL::Query::NullContext
|
48
|
-
[@structural_interface_type_memberships, @inherited_interface_type_memberships].each do |tms|
|
49
|
-
tms.each do |type_membership|
|
50
|
-
if unfiltered || type_membership.visible?(ctx)
|
51
|
-
# if this is derived from a class-based object, we have to
|
52
|
-
# get the `.graphql_definition` of the attached interface.
|
53
|
-
visible_ifaces << GraphQL::BaseType.resolve_related_type(type_membership.abstract_type)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
visible_ifaces
|
59
|
-
end
|
60
|
-
|
61
|
-
def kind
|
62
|
-
GraphQL::TypeKinds::OBJECT
|
63
|
-
end
|
64
|
-
|
65
|
-
# This fields doesnt have instrumenation applied
|
66
|
-
# @see [Schema#get_field] Get field with instrumentation
|
67
|
-
# @return [GraphQL::Field] The field definition for `field_name` (may be inherited from interfaces)
|
68
|
-
def get_field(field_name)
|
69
|
-
fields[field_name] || interface_fields[field_name]
|
70
|
-
end
|
71
|
-
|
72
|
-
# These fields don't have instrumenation applied
|
73
|
-
# @see [Schema#get_fields] Get fields with instrumentation
|
74
|
-
# @return [Array<GraphQL::Field>] All fields, including ones inherited from interfaces
|
75
|
-
def all_fields
|
76
|
-
interface_fields.merge(self.fields).values
|
77
|
-
end
|
78
|
-
|
79
|
-
# Declare that this object implements this interface.
|
80
|
-
# This declaration will be validated when the schema is defined.
|
81
|
-
# @param interfaces [Array<GraphQL::Interface>] add a new interface that this type implements
|
82
|
-
# @param inherits [Boolean] If true, copy the interfaces' field definitions to this type
|
83
|
-
def implements(interfaces, inherit: false, **options)
|
84
|
-
if !interfaces.is_a?(Array)
|
85
|
-
raise ArgumentError, "`implements(interfaces)` must be an array, not #{interfaces.class} (#{interfaces})"
|
86
|
-
end
|
87
|
-
@clean_inherited_fields = nil
|
88
|
-
|
89
|
-
type_memberships = inherit ? @inherited_interface_type_memberships : @structural_interface_type_memberships
|
90
|
-
interfaces.each do |iface|
|
91
|
-
iface = BaseType.resolve_related_type(iface)
|
92
|
-
if iface.is_a?(GraphQL::InterfaceType)
|
93
|
-
type_memberships << iface.type_membership_class.new(iface, self, **options)
|
94
|
-
end
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
def resolve_type_proc
|
99
|
-
nil
|
100
|
-
end
|
101
|
-
|
102
|
-
attr_writer :structural_interface_type_memberships
|
103
|
-
|
104
|
-
protected
|
105
|
-
|
106
|
-
attr_reader :structural_interface_type_memberships, :inherited_interface_type_memberships
|
107
|
-
|
108
|
-
private
|
109
|
-
|
110
|
-
def normalize_interfaces(ifaces)
|
111
|
-
ifaces.map { |i_type| GraphQL::BaseType.resolve_related_type(i_type) }
|
112
|
-
end
|
113
|
-
|
114
|
-
def interface_fields
|
115
|
-
if @clean_inherited_fields
|
116
|
-
@clean_inherited_fields
|
117
|
-
else
|
118
|
-
ensure_defined
|
119
|
-
@clean_inherited_fields = {}
|
120
|
-
@inherited_interface_type_memberships.each do |type_membership|
|
121
|
-
iface = GraphQL::BaseType.resolve_related_type(type_membership.abstract_type)
|
122
|
-
if iface.is_a?(GraphQL::InterfaceType)
|
123
|
-
@clean_inherited_fields.merge!(iface.fields)
|
124
|
-
end
|
125
|
-
end
|
126
|
-
@clean_inherited_fields
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
@@ -1,189 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
class Query
|
4
|
-
# Read-only access to values, normalizing all keys to strings
|
5
|
-
#
|
6
|
-
# {Arguments} recursively wraps the input in {Arguments} instances.
|
7
|
-
class Arguments
|
8
|
-
extend Forwardable
|
9
|
-
include GraphQL::Dig
|
10
|
-
|
11
|
-
def self.construct_arguments_class(argument_owner)
|
12
|
-
argument_definitions = argument_owner.arguments # rubocop:disable Development/ContextIsPassedCop -- legacy-related
|
13
|
-
argument_owner.arguments_class = Class.new(self) do
|
14
|
-
self.argument_owner = argument_owner
|
15
|
-
self.argument_definitions = argument_definitions
|
16
|
-
|
17
|
-
argument_definitions.each do |_arg_name, arg_definition|
|
18
|
-
if arg_definition.method_access?
|
19
|
-
expose_as = arg_definition.expose_as.to_s.freeze
|
20
|
-
expose_as_underscored = GraphQL::Schema::Member::BuildType.underscore(expose_as).freeze
|
21
|
-
method_names = [expose_as, expose_as_underscored].uniq
|
22
|
-
method_names.each do |method_name|
|
23
|
-
# Don't define a helper method if it would override something.
|
24
|
-
if method_defined?(method_name)
|
25
|
-
GraphQL::Deprecation.warn(
|
26
|
-
"Unable to define a helper for argument with name '#{method_name}' "\
|
27
|
-
"as this is a reserved name. Add `method_access: false` to stop this warning."
|
28
|
-
)
|
29
|
-
else
|
30
|
-
define_method(method_name) do
|
31
|
-
# Always use `expose_as` here, since #[] doesn't accept underscored names
|
32
|
-
self[expose_as]
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
attr_reader :argument_values
|
42
|
-
|
43
|
-
def initialize(values, context:, defaults_used:)
|
44
|
-
@argument_values = values.inject({}) do |memo, (inner_key, inner_value)|
|
45
|
-
arg_name = inner_key.to_s
|
46
|
-
arg_defn = self.class.argument_definitions[arg_name] || raise("Not found #{arg_name} among #{self.class.argument_definitions.keys}")
|
47
|
-
arg_default_used = defaults_used.include?(arg_name)
|
48
|
-
arg_value = wrap_value(inner_value, arg_defn.type, context)
|
49
|
-
string_key = arg_defn.expose_as
|
50
|
-
memo[string_key] = ArgumentValue.new(string_key, arg_value, arg_defn, arg_default_used)
|
51
|
-
memo
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
# @param key [String, Symbol] name or index of value to access
|
56
|
-
# @return [Object] the argument at that key
|
57
|
-
def [](key)
|
58
|
-
key_s = key.is_a?(String) ? key : key.to_s
|
59
|
-
@argument_values.fetch(key_s, NULL_ARGUMENT_VALUE).value
|
60
|
-
end
|
61
|
-
|
62
|
-
# @param key [String, Symbol] name of value to access
|
63
|
-
# @return [Boolean] true if the argument was present in this field
|
64
|
-
def key?(key)
|
65
|
-
key_s = key.is_a?(String) ? key : key.to_s
|
66
|
-
@argument_values.key?(key_s)
|
67
|
-
end
|
68
|
-
|
69
|
-
# @param key [String, Symbol] name of value to access
|
70
|
-
# @return [Boolean] true if the argument default was passed as the argument value to the resolver
|
71
|
-
def default_used?(key)
|
72
|
-
key_s = key.is_a?(String) ? key : key.to_s
|
73
|
-
@argument_values.fetch(key_s, NULL_ARGUMENT_VALUE).default_used?
|
74
|
-
end
|
75
|
-
|
76
|
-
# Get the hash of all values, with stringified keys
|
77
|
-
# @return [Hash] the stringified hash
|
78
|
-
def to_h
|
79
|
-
@to_h ||= begin
|
80
|
-
h = {}
|
81
|
-
each_value do |arg_value|
|
82
|
-
arg_key = arg_value.definition.expose_as
|
83
|
-
h[arg_key] = unwrap_value(arg_value.value)
|
84
|
-
end
|
85
|
-
h
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
def_delegators :to_h, :keys, :values, :each
|
90
|
-
def_delegators :@argument_values, :any?
|
91
|
-
|
92
|
-
def prepare
|
93
|
-
self
|
94
|
-
end
|
95
|
-
|
96
|
-
# Access each key, value and type for the arguments in this set.
|
97
|
-
# @yield [argument_value] The {ArgumentValue} for each argument
|
98
|
-
# @yieldparam argument_value [ArgumentValue]
|
99
|
-
def each_value
|
100
|
-
@argument_values.each_value do |argument_value|
|
101
|
-
yield(argument_value)
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
class << self
|
106
|
-
attr_accessor :argument_definitions, :argument_owner
|
107
|
-
end
|
108
|
-
|
109
|
-
NoArguments = Class.new(self) do
|
110
|
-
self.argument_definitions = []
|
111
|
-
end
|
112
|
-
|
113
|
-
NO_ARGS = NoArguments.new({}, context: nil, defaults_used: Set.new)
|
114
|
-
|
115
|
-
# Convert this instance into valid Ruby keyword arguments
|
116
|
-
# @return [{Symbol=>Object}]
|
117
|
-
def to_kwargs
|
118
|
-
ruby_kwargs = {}
|
119
|
-
|
120
|
-
keys.each do |key|
|
121
|
-
ruby_kwargs[Schema::Member::BuildType.underscore(key).to_sym] = self[key]
|
122
|
-
end
|
123
|
-
|
124
|
-
ruby_kwargs
|
125
|
-
end
|
126
|
-
|
127
|
-
alias :to_hash :to_kwargs
|
128
|
-
|
129
|
-
private
|
130
|
-
|
131
|
-
class ArgumentValue
|
132
|
-
attr_reader :key, :value, :definition
|
133
|
-
attr_writer :default_used
|
134
|
-
|
135
|
-
def initialize(key, value, definition, default_used)
|
136
|
-
@key = key
|
137
|
-
@value = value
|
138
|
-
@definition = definition
|
139
|
-
@default_used = default_used
|
140
|
-
end
|
141
|
-
|
142
|
-
# @return [Boolean] true if the argument default was passed as the argument value to the resolver
|
143
|
-
def default_used?
|
144
|
-
@default_used
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
NULL_ARGUMENT_VALUE = ArgumentValue.new(nil, nil, nil, nil)
|
149
|
-
|
150
|
-
def wrap_value(value, arg_defn_type, context)
|
151
|
-
if value.nil?
|
152
|
-
nil
|
153
|
-
else
|
154
|
-
case arg_defn_type
|
155
|
-
when GraphQL::ListType
|
156
|
-
value.map { |item| wrap_value(item, arg_defn_type.of_type, context) }
|
157
|
-
when GraphQL::NonNullType
|
158
|
-
wrap_value(value, arg_defn_type.of_type, context)
|
159
|
-
when GraphQL::InputObjectType
|
160
|
-
if value.is_a?(Hash)
|
161
|
-
result = arg_defn_type.arguments_class.new(value, context: context, defaults_used: Set.new)
|
162
|
-
result.prepare
|
163
|
-
else
|
164
|
-
value
|
165
|
-
end
|
166
|
-
else
|
167
|
-
value
|
168
|
-
end
|
169
|
-
end
|
170
|
-
end
|
171
|
-
|
172
|
-
def unwrap_value(value)
|
173
|
-
case value
|
174
|
-
when Array
|
175
|
-
value.map { |item| unwrap_value(item) }
|
176
|
-
when Hash
|
177
|
-
value.inject({}) do |memo, (key, value)|
|
178
|
-
memo[key] = unwrap_value(value)
|
179
|
-
memo
|
180
|
-
end
|
181
|
-
when GraphQL::Query::Arguments, GraphQL::Schema::InputObject
|
182
|
-
value.to_h
|
183
|
-
else
|
184
|
-
value
|
185
|
-
end
|
186
|
-
end
|
187
|
-
end
|
188
|
-
end
|
189
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
class Query
|
4
|
-
module ArgumentsCache
|
5
|
-
# @return [Hash<InternalRepresentation::Node, GraphQL::Language::NodesDirectiveNode => Hash<GraphQL::Field, GraphQL::Directive => GraphQL::Query::Arguments>>]
|
6
|
-
def self.build(query)
|
7
|
-
Hash.new do |h1, irep_or_ast_node|
|
8
|
-
h1[irep_or_ast_node] = Hash.new do |h2, definition|
|
9
|
-
ast_node = irep_or_ast_node.is_a?(GraphQL::InternalRepresentation::Node) ? irep_or_ast_node.ast_node : irep_or_ast_node
|
10
|
-
h2[definition] = if definition.arguments(query.context).empty?
|
11
|
-
GraphQL::Query::Arguments::NO_ARGS
|
12
|
-
else
|
13
|
-
GraphQL::Query::LiteralInput.from_arguments(
|
14
|
-
ast_node.arguments,
|
15
|
-
definition,
|
16
|
-
query.variables,
|
17
|
-
)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
class Query
|
4
|
-
class Executor
|
5
|
-
class PropagateNull < StandardError; end
|
6
|
-
|
7
|
-
# @return [GraphQL::Query] the query being executed
|
8
|
-
attr_reader :query
|
9
|
-
|
10
|
-
def initialize(query)
|
11
|
-
@query = query
|
12
|
-
end
|
13
|
-
|
14
|
-
# Evaluate {operation_name} on {query}.
|
15
|
-
# Handle {GraphQL::ExecutionError}s by putting them in the "errors" key.
|
16
|
-
# @return [Hash] A GraphQL response, with either a "data" key or an "errors" key
|
17
|
-
def result
|
18
|
-
execute
|
19
|
-
rescue GraphQL::ExecutionError => err
|
20
|
-
query.context.errors << err
|
21
|
-
{"errors" => [err.to_h]}
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
25
|
-
|
26
|
-
def execute
|
27
|
-
operation = query.selected_operation
|
28
|
-
return {} if operation.nil?
|
29
|
-
|
30
|
-
op_type = operation.operation_type
|
31
|
-
root_type = query.root_type_for_operation(op_type)
|
32
|
-
execution_strategy_class = query.schema.execution_strategy_for_operation(op_type)
|
33
|
-
execution_strategy = execution_strategy_class.new
|
34
|
-
|
35
|
-
query.context.execution_strategy = execution_strategy
|
36
|
-
data_result = begin
|
37
|
-
execution_strategy.execute(operation, root_type, query)
|
38
|
-
rescue PropagateNull
|
39
|
-
nil
|
40
|
-
end
|
41
|
-
result = { "data" => data_result }
|
42
|
-
error_result = query.context.errors.map(&:to_h)
|
43
|
-
|
44
|
-
if error_result.any?
|
45
|
-
result["errors"] = error_result
|
46
|
-
end
|
47
|
-
|
48
|
-
result
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
@@ -1,92 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
class Query
|
4
|
-
class SerialExecution
|
5
|
-
class FieldResolution
|
6
|
-
attr_reader :irep_node, :parent_type, :target, :field, :arguments, :query
|
7
|
-
|
8
|
-
def initialize(selection, parent_type, target, query_ctx)
|
9
|
-
@irep_node = selection
|
10
|
-
@selection = selection
|
11
|
-
@parent_type = parent_type
|
12
|
-
@target = target
|
13
|
-
@query = query_ctx.query
|
14
|
-
@field = irep_node.definition
|
15
|
-
@field_ctx = query_ctx.spawn_child(
|
16
|
-
key: irep_node.name,
|
17
|
-
object: target,
|
18
|
-
irep_node: irep_node,
|
19
|
-
)
|
20
|
-
@arguments = @query.arguments_for(irep_node, @field)
|
21
|
-
end
|
22
|
-
|
23
|
-
def result
|
24
|
-
result_name = irep_node.name
|
25
|
-
raw_value = get_raw_value
|
26
|
-
if raw_value.is_a?(GraphQL::Execution::Execute::Skip)
|
27
|
-
{}
|
28
|
-
else
|
29
|
-
{ result_name => get_finished_value(raw_value) }
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
# GraphQL::Batch depends on this
|
34
|
-
def execution_context
|
35
|
-
@field_ctx
|
36
|
-
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
# After getting the value from the field's resolve method,
|
41
|
-
# continue by "finishing" the value, eg. executing sub-fields or coercing values
|
42
|
-
def get_finished_value(raw_value)
|
43
|
-
case raw_value
|
44
|
-
when GraphQL::ExecutionError
|
45
|
-
raw_value.ast_node = @field_ctx.ast_node
|
46
|
-
raw_value.path = @field_ctx.path
|
47
|
-
@query.context.errors.push(raw_value)
|
48
|
-
when Array
|
49
|
-
list_errors = raw_value.each_with_index.select { |value, _| value.is_a?(GraphQL::ExecutionError) }
|
50
|
-
if list_errors.any?
|
51
|
-
list_errors.each do |error, index|
|
52
|
-
error.ast_node = @field_ctx.ast_node
|
53
|
-
error.path = @field_ctx.path + [index]
|
54
|
-
@query.context.errors.push(error)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
begin
|
60
|
-
GraphQL::Query::SerialExecution::ValueResolution.resolve(
|
61
|
-
parent_type,
|
62
|
-
field,
|
63
|
-
field.type,
|
64
|
-
raw_value,
|
65
|
-
@selection,
|
66
|
-
@field_ctx,
|
67
|
-
)
|
68
|
-
rescue GraphQL::Query::Executor::PropagateNull
|
69
|
-
if field.type.kind.non_null?
|
70
|
-
raise
|
71
|
-
else
|
72
|
-
nil
|
73
|
-
end
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
# Get the result of:
|
78
|
-
# - Any middleware on this schema
|
79
|
-
# - The field's resolve method
|
80
|
-
# If the middleware chain returns a GraphQL::ExecutionError, its message
|
81
|
-
# is added to the "errors" key.
|
82
|
-
def get_raw_value
|
83
|
-
begin
|
84
|
-
@field_ctx.schema.middleware.invoke([parent_type, target, field, arguments, @field_ctx]) # rubocop:disable Development/ContextIsPassedCop -- unrelated
|
85
|
-
rescue GraphQL::ExecutionError => err
|
86
|
-
err
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
class Query
|
4
|
-
class SerialExecution
|
5
|
-
module OperationResolution
|
6
|
-
def self.resolve(selection, target, query)
|
7
|
-
result = query.context.execution_strategy.selection_resolution.resolve(
|
8
|
-
query.root_value,
|
9
|
-
target,
|
10
|
-
selection,
|
11
|
-
query.context,
|
12
|
-
)
|
13
|
-
|
14
|
-
result
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
class Query
|
4
|
-
class SerialExecution
|
5
|
-
module SelectionResolution
|
6
|
-
def self.resolve(target, current_type, selection, query_ctx)
|
7
|
-
selection_result = {}
|
8
|
-
|
9
|
-
selection.typed_children[current_type].each do |name, subselection|
|
10
|
-
selection_result.merge!(query_ctx.execution_strategy.field_resolution.new(
|
11
|
-
subselection,
|
12
|
-
current_type,
|
13
|
-
target,
|
14
|
-
query_ctx
|
15
|
-
).result)
|
16
|
-
end
|
17
|
-
|
18
|
-
selection_result
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
@@ -1,87 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
class Query
|
4
|
-
class SerialExecution
|
5
|
-
module ValueResolution
|
6
|
-
def self.resolve(parent_type, field_defn, field_type, value, selection, query_ctx)
|
7
|
-
if value.nil? || value.is_a?(GraphQL::ExecutionError)
|
8
|
-
if field_type.kind.non_null?
|
9
|
-
if value.nil?
|
10
|
-
type_error = GraphQL::InvalidNullError.new(parent_type, field_defn, value)
|
11
|
-
query_ctx.schema.type_error(type_error, query_ctx)
|
12
|
-
end
|
13
|
-
raise GraphQL::Query::Executor::PropagateNull
|
14
|
-
else
|
15
|
-
nil
|
16
|
-
end
|
17
|
-
else
|
18
|
-
case field_type.kind
|
19
|
-
when GraphQL::TypeKinds::SCALAR, GraphQL::TypeKinds::ENUM
|
20
|
-
field_type.coerce_result(value, query_ctx)
|
21
|
-
when GraphQL::TypeKinds::LIST
|
22
|
-
wrapped_type = field_type.of_type
|
23
|
-
result = []
|
24
|
-
i = 0
|
25
|
-
value.each do |inner_value|
|
26
|
-
inner_ctx = query_ctx.spawn_child(
|
27
|
-
key: i,
|
28
|
-
object: inner_value,
|
29
|
-
irep_node: selection,
|
30
|
-
)
|
31
|
-
|
32
|
-
result << resolve(
|
33
|
-
parent_type,
|
34
|
-
field_defn,
|
35
|
-
wrapped_type,
|
36
|
-
inner_value,
|
37
|
-
selection,
|
38
|
-
inner_ctx,
|
39
|
-
)
|
40
|
-
i += 1
|
41
|
-
end
|
42
|
-
result
|
43
|
-
when GraphQL::TypeKinds::NON_NULL
|
44
|
-
wrapped_type = field_type.of_type
|
45
|
-
resolve(
|
46
|
-
parent_type,
|
47
|
-
field_defn,
|
48
|
-
wrapped_type,
|
49
|
-
value,
|
50
|
-
selection,
|
51
|
-
query_ctx,
|
52
|
-
)
|
53
|
-
when GraphQL::TypeKinds::OBJECT
|
54
|
-
query_ctx.execution_strategy.selection_resolution.resolve(
|
55
|
-
value,
|
56
|
-
field_type,
|
57
|
-
selection,
|
58
|
-
query_ctx
|
59
|
-
)
|
60
|
-
when GraphQL::TypeKinds::UNION, GraphQL::TypeKinds::INTERFACE
|
61
|
-
query = query_ctx.query
|
62
|
-
resolved_type = query.resolve_type(value)
|
63
|
-
possible_types = query.possible_types(field_type)
|
64
|
-
|
65
|
-
if !possible_types.include?(resolved_type)
|
66
|
-
type_error = GraphQL::UnresolvedTypeError.new(value, field_defn, parent_type, resolved_type, possible_types)
|
67
|
-
query.schema.type_error(type_error, query_ctx)
|
68
|
-
raise GraphQL::Query::Executor::PropagateNull
|
69
|
-
else
|
70
|
-
resolve(
|
71
|
-
parent_type,
|
72
|
-
field_defn,
|
73
|
-
resolved_type,
|
74
|
-
value,
|
75
|
-
selection,
|
76
|
-
query_ctx,
|
77
|
-
)
|
78
|
-
end
|
79
|
-
else
|
80
|
-
raise("Unknown type kind: #{field_type.kind}")
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|