graphql 1.13.19 → 2.0.19
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/generators/graphql/install_generator.rb +1 -1
- data/lib/generators/graphql/relay.rb +3 -17
- data/lib/generators/graphql/templates/schema.erb +3 -0
- data/lib/graphql/analysis/ast/field_usage.rb +3 -1
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
- 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 +43 -36
- data/lib/graphql/analysis/ast.rb +2 -12
- data/lib/graphql/analysis.rb +0 -7
- data/lib/graphql/backtrace/table.rb +2 -20
- data/lib/graphql/backtrace/tracer.rb +2 -3
- data/lib/graphql/backtrace.rb +2 -8
- data/lib/graphql/dataloader/null_dataloader.rb +3 -1
- data/lib/graphql/dataloader/source.rb +9 -0
- data/lib/graphql/dataloader.rb +4 -1
- data/lib/graphql/dig.rb +1 -1
- data/lib/graphql/execution/errors.rb +12 -82
- data/lib/graphql/execution/interpreter/resolve.rb +26 -0
- data/lib/graphql/execution/interpreter/runtime.rb +162 -119
- data/lib/graphql/execution/interpreter.rb +187 -78
- data/lib/graphql/execution/lazy.rb +7 -21
- data/lib/graphql/execution/lookahead.rb +44 -40
- data/lib/graphql/execution/multiplex.rb +3 -174
- data/lib/graphql/execution.rb +11 -4
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +2 -15
- data/lib/graphql/introspection/type_type.rb +8 -1
- data/lib/graphql/introspection.rb +4 -3
- data/lib/graphql/language/document_from_schema_definition.rb +18 -35
- data/lib/graphql/language/lexer.rb +216 -1488
- data/lib/graphql/language/lexer.ri +744 -0
- data/lib/graphql/language/nodes.rb +41 -33
- data/lib/graphql/language/parser.rb +375 -363
- data/lib/graphql/language/parser.y +48 -43
- data/lib/graphql/language/printer.rb +37 -21
- data/lib/graphql/language/visitor.rb +191 -83
- data/lib/graphql/pagination/active_record_relation_connection.rb +0 -8
- data/lib/graphql/pagination/array_connection.rb +4 -2
- data/lib/graphql/pagination/connection.rb +31 -4
- data/lib/graphql/pagination/connections.rb +3 -28
- data/lib/graphql/pagination/relation_connection.rb +2 -0
- data/lib/graphql/query/context.rb +155 -196
- data/lib/graphql/query/input_validation_result.rb +1 -1
- data/lib/graphql/query/null_context.rb +0 -3
- data/lib/graphql/query/validation_pipeline.rb +10 -34
- data/lib/graphql/query/variables.rb +7 -20
- data/lib/graphql/query.rb +32 -42
- data/lib/graphql/railtie.rb +0 -104
- data/lib/graphql/rake_task/validate.rb +1 -1
- data/lib/graphql/rake_task.rb +29 -1
- data/lib/graphql/relay/range_add.rb +9 -20
- data/lib/graphql/relay.rb +0 -15
- data/lib/graphql/schema/addition.rb +7 -9
- data/lib/graphql/schema/argument.rb +36 -43
- data/lib/graphql/schema/build_from_definition.rb +32 -18
- data/lib/graphql/schema/directive/one_of.rb +12 -0
- data/lib/graphql/schema/directive/transform.rb +1 -1
- data/lib/graphql/schema/directive.rb +11 -22
- data/lib/graphql/schema/enum.rb +28 -39
- data/lib/graphql/schema/enum_value.rb +5 -25
- data/lib/graphql/schema/field/connection_extension.rb +4 -0
- data/lib/graphql/schema/field.rb +214 -327
- data/lib/graphql/schema/input_object.rb +56 -67
- data/lib/graphql/schema/interface.rb +0 -35
- data/lib/graphql/schema/introspection_system.rb +3 -8
- data/lib/graphql/schema/late_bound_type.rb +8 -2
- data/lib/graphql/schema/list.rb +0 -6
- data/lib/graphql/schema/loader.rb +1 -2
- data/lib/graphql/schema/member/base_dsl_methods.rb +15 -19
- data/lib/graphql/schema/member/build_type.rb +5 -7
- data/lib/graphql/schema/member/has_arguments.rb +144 -53
- data/lib/graphql/schema/member/has_deprecation_reason.rb +3 -4
- data/lib/graphql/schema/member/has_directives.rb +71 -56
- data/lib/graphql/schema/member/has_fields.rb +15 -3
- data/lib/graphql/schema/member/has_interfaces.rb +47 -18
- data/lib/graphql/schema/member/has_validators.rb +31 -5
- data/lib/graphql/schema/member/relay_shortcuts.rb +28 -2
- data/lib/graphql/schema/member/type_system_helpers.rb +17 -0
- data/lib/graphql/schema/member/validates_input.rb +1 -1
- data/lib/graphql/schema/member.rb +0 -6
- data/lib/graphql/schema/mutation.rb +0 -9
- data/lib/graphql/schema/non_null.rb +1 -7
- data/lib/graphql/schema/object.rb +15 -52
- data/lib/graphql/schema/relay_classic_mutation.rb +53 -42
- data/lib/graphql/schema/resolver/has_payload_type.rb +20 -10
- data/lib/graphql/schema/resolver.rb +41 -42
- data/lib/graphql/schema/scalar.rb +7 -22
- data/lib/graphql/schema/subscription.rb +0 -7
- data/lib/graphql/schema/timeout.rb +24 -28
- data/lib/graphql/schema/type_membership.rb +3 -0
- data/lib/graphql/schema/union.rb +10 -17
- data/lib/graphql/schema/warden.rb +23 -6
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +240 -968
- data/lib/graphql/static_validation/all_rules.rb +1 -0
- data/lib/graphql/static_validation/base_visitor.rb +4 -21
- data/lib/graphql/static_validation/definition_dependencies.rb +7 -1
- data/lib/graphql/static_validation/error.rb +2 -2
- data/lib/graphql/static_validation/literal_validator.rb +19 -1
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +11 -5
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +12 -12
- data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
- data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +12 -6
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +1 -1
- data/lib/graphql/static_validation/validator.rb +3 -25
- data/lib/graphql/static_validation.rb +0 -2
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +7 -1
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +38 -1
- data/lib/graphql/subscriptions/event.rb +3 -8
- data/lib/graphql/subscriptions/instrumentation.rb +0 -51
- data/lib/graphql/subscriptions.rb +32 -20
- data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
- data/lib/graphql/tracing/appoptics_trace.rb +231 -0
- data/lib/graphql/tracing/appsignal_trace.rb +66 -0
- data/lib/graphql/tracing/data_dog_trace.rb +148 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +2 -0
- data/lib/graphql/tracing/new_relic_trace.rb +75 -0
- data/lib/graphql/tracing/notifications_trace.rb +41 -0
- data/lib/graphql/tracing/platform_trace.rb +107 -0
- data/lib/graphql/tracing/platform_tracing.rb +26 -41
- data/lib/graphql/tracing/prometheus_trace.rb +89 -0
- data/lib/graphql/tracing/prometheus_tracing.rb +3 -3
- data/lib/graphql/tracing/scout_trace.rb +72 -0
- data/lib/graphql/tracing/statsd_trace.rb +56 -0
- data/lib/graphql/tracing.rb +136 -40
- data/lib/graphql/type_kinds.rb +6 -3
- data/lib/graphql/types/iso_8601_date.rb +4 -1
- data/lib/graphql/types/iso_8601_date_time.rb +4 -0
- data/lib/graphql/types/relay/base_connection.rb +16 -6
- data/lib/graphql/types/relay/connection_behaviors.rb +5 -25
- data/lib/graphql/types/relay/default_relay.rb +5 -9
- data/lib/graphql/types/relay/edge_behaviors.rb +1 -4
- 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 +11 -72
- metadata +31 -132
- 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/instrumentation.rb +0 -92
- data/lib/graphql/execution/lazy/resolve.rb +0 -91
- 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/language/lexer.rl +0 -260
- 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/literal_input.rb +0 -136
- 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,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,136 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
class Query
|
4
|
-
# Turn query string values into something useful for query execution
|
5
|
-
class LiteralInput
|
6
|
-
def self.coerce(type, ast_node, variables)
|
7
|
-
case ast_node
|
8
|
-
when nil
|
9
|
-
nil
|
10
|
-
when Language::Nodes::NullValue
|
11
|
-
nil
|
12
|
-
when Language::Nodes::VariableIdentifier
|
13
|
-
variables[ast_node.name]
|
14
|
-
else
|
15
|
-
case type.kind.name
|
16
|
-
when "SCALAR"
|
17
|
-
# TODO smell
|
18
|
-
# This gets used for plain values during subscriber.trigger
|
19
|
-
if variables
|
20
|
-
type.coerce_input(ast_node, variables.context)
|
21
|
-
else
|
22
|
-
type.coerce_isolated_input(ast_node)
|
23
|
-
end
|
24
|
-
when "ENUM"
|
25
|
-
# TODO smell
|
26
|
-
# This gets used for plain values sometimes
|
27
|
-
v = ast_node.is_a?(GraphQL::Language::Nodes::Enum) ? ast_node.name : ast_node
|
28
|
-
if variables
|
29
|
-
type.coerce_input(v, variables.context)
|
30
|
-
else
|
31
|
-
type.coerce_isolated_input(v)
|
32
|
-
end
|
33
|
-
when "NON_NULL"
|
34
|
-
LiteralInput.coerce(type.of_type, ast_node, variables)
|
35
|
-
when "LIST"
|
36
|
-
if ast_node.is_a?(Array)
|
37
|
-
ast_node.map { |element_ast| LiteralInput.coerce(type.of_type, element_ast, variables) }
|
38
|
-
else
|
39
|
-
[LiteralInput.coerce(type.of_type, ast_node, variables)]
|
40
|
-
end
|
41
|
-
when "INPUT_OBJECT"
|
42
|
-
# TODO smell: handling AST vs handling plain Ruby
|
43
|
-
next_args = ast_node.is_a?(Hash) ? ast_node : ast_node.arguments
|
44
|
-
from_arguments(next_args, type, variables)
|
45
|
-
else
|
46
|
-
raise "Invariant: unexpected type to coerce to: #{type}"
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def self.from_arguments(ast_arguments, argument_owner, variables)
|
52
|
-
context = variables ? variables.context : nil
|
53
|
-
values_hash = {}
|
54
|
-
defaults_used = Set.new
|
55
|
-
|
56
|
-
indexed_arguments = case ast_arguments
|
57
|
-
when Hash
|
58
|
-
ast_arguments
|
59
|
-
when Array
|
60
|
-
ast_arguments.each_with_object({}) { |a, memo| memo[a.name] = a }
|
61
|
-
else
|
62
|
-
raise ArgumentError, "Unexpected ast_arguments: #{ast_arguments}"
|
63
|
-
end
|
64
|
-
|
65
|
-
argument_defns = argument_owner.arguments(context || GraphQL::Query::NullContext)
|
66
|
-
argument_defns.each do |arg_name, arg_defn|
|
67
|
-
ast_arg = indexed_arguments[arg_name]
|
68
|
-
# First, check the argument in the AST.
|
69
|
-
# If the value is a variable,
|
70
|
-
# only add a value if the variable is actually present.
|
71
|
-
# Otherwise, coerce the value in the AST, prepare the value and add it.
|
72
|
-
#
|
73
|
-
# TODO: since indexed_arguments can come from a plain Ruby hash,
|
74
|
-
# have to check for `false` or `nil` as hash values. This is getting smelly :S
|
75
|
-
if indexed_arguments.key?(arg_name)
|
76
|
-
arg_value = ast_arg.is_a?(GraphQL::Language::Nodes::Argument) ? ast_arg.value : ast_arg
|
77
|
-
|
78
|
-
value_is_a_variable = arg_value.is_a?(GraphQL::Language::Nodes::VariableIdentifier)
|
79
|
-
|
80
|
-
if (!value_is_a_variable || (value_is_a_variable && variables.key?(arg_value.name)))
|
81
|
-
|
82
|
-
value = coerce(arg_defn.type, arg_value, variables)
|
83
|
-
# Legacy `prepare` application
|
84
|
-
if arg_defn.is_a?(GraphQL::Argument)
|
85
|
-
value = arg_defn.prepare(value, context)
|
86
|
-
end
|
87
|
-
|
88
|
-
if value.is_a?(GraphQL::ExecutionError)
|
89
|
-
value.ast_node = ast_arg
|
90
|
-
raise value
|
91
|
-
end
|
92
|
-
|
93
|
-
values_hash[arg_name] = value
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
# Then, the definition for a default value.
|
98
|
-
# If the definition has a default value and
|
99
|
-
# a value wasn't provided from the AST,
|
100
|
-
# then add the default value.
|
101
|
-
if arg_defn.default_value? && !values_hash.key?(arg_name)
|
102
|
-
value = arg_defn.default_value
|
103
|
-
defaults_used << arg_name
|
104
|
-
# `context` isn't present when pre-calculating defaults
|
105
|
-
if context
|
106
|
-
if arg_defn.is_a?(GraphQL::Argument)
|
107
|
-
value = arg_defn.prepare(value, context)
|
108
|
-
end
|
109
|
-
if value.is_a?(GraphQL::ExecutionError)
|
110
|
-
value.ast_node = ast_arg
|
111
|
-
raise value
|
112
|
-
end
|
113
|
-
end
|
114
|
-
values_hash[arg_name] = value
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
if argument_owner.is_a?(Class) || argument_owner.is_a?(GraphQL::Schema::Field)
|
119
|
-
# A Schema::InputObject, Schema::GraphQL::Field, Schema::Directive, logic from Query::Arguments#to_kwargs
|
120
|
-
ruby_kwargs = {}
|
121
|
-
values_hash.each do |key, value|
|
122
|
-
ruby_kwargs[Schema::Member::BuildType.underscore(key).to_sym] = value
|
123
|
-
end
|
124
|
-
if argument_owner.is_a?(Class) && argument_owner < GraphQL::Schema::InputObject
|
125
|
-
argument_owner.new(ruby_kwargs: ruby_kwargs, context: context, defaults_used: defaults_used)
|
126
|
-
else
|
127
|
-
ruby_kwargs
|
128
|
-
end
|
129
|
-
else
|
130
|
-
result = argument_owner.arguments_class.new(values_hash, context: context, defaults_used: defaults_used)
|
131
|
-
result.prepare
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
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
|
@@ -1,40 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require "graphql/query/serial_execution/value_resolution"
|
3
|
-
require "graphql/query/serial_execution/field_resolution"
|
4
|
-
require "graphql/query/serial_execution/operation_resolution"
|
5
|
-
require "graphql/query/serial_execution/selection_resolution"
|
6
|
-
|
7
|
-
module GraphQL
|
8
|
-
class Query
|
9
|
-
class SerialExecution
|
10
|
-
# This is the only required method for an Execution strategy.
|
11
|
-
# You could create a custom execution strategy and configure your schema to
|
12
|
-
# use that custom strategy instead.
|
13
|
-
#
|
14
|
-
# @param ast_operation [GraphQL::Language::Nodes::OperationDefinition] The operation definition to run
|
15
|
-
# @param root_type [GraphQL::ObjectType] either the query type or the mutation type
|
16
|
-
# @param query_object [GraphQL::Query] the query object for this execution
|
17
|
-
# @return [Hash] a spec-compliant GraphQL result, as a hash
|
18
|
-
def execute(ast_operation, root_type, query_object)
|
19
|
-
GraphQL::Deprecation.warn "#{self.class} will be removed in GraphQL-Ruby 2.0, please upgrade to the Interpreter: https://graphql-ruby.org/queries/interpreter.html"
|
20
|
-
operation_resolution.resolve(
|
21
|
-
query_object.irep_selection,
|
22
|
-
root_type,
|
23
|
-
query_object
|
24
|
-
)
|
25
|
-
end
|
26
|
-
|
27
|
-
def field_resolution
|
28
|
-
self.class::FieldResolution
|
29
|
-
end
|
30
|
-
|
31
|
-
def operation_resolution
|
32
|
-
self.class::OperationResolution
|
33
|
-
end
|
34
|
-
|
35
|
-
def selection_resolution
|
36
|
-
self.class::SelectionResolution
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|