graphql 1.13.23 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (194) hide show
  1. checksums.yaml +4 -4
  2. data/lib/graphql/analysis/ast/query_complexity.rb +1 -1
  3. data/lib/graphql/analysis/ast/query_depth.rb +0 -1
  4. data/lib/graphql/analysis/ast/visitor.rb +1 -1
  5. data/lib/graphql/analysis/ast.rb +0 -10
  6. data/lib/graphql/analysis.rb +0 -7
  7. data/lib/graphql/backtrace/table.rb +0 -18
  8. data/lib/graphql/backtrace/tracer.rb +1 -2
  9. data/lib/graphql/backtrace.rb +2 -8
  10. data/lib/graphql/dig.rb +1 -1
  11. data/lib/graphql/execution/errors.rb +1 -9
  12. data/lib/graphql/execution/interpreter/runtime.rb +6 -13
  13. data/lib/graphql/execution/interpreter.rb +0 -22
  14. data/lib/graphql/execution/lazy.rb +1 -1
  15. data/lib/graphql/execution/lookahead.rb +6 -13
  16. data/lib/graphql/execution/multiplex.rb +50 -107
  17. data/lib/graphql/execution.rb +11 -3
  18. data/lib/graphql/introspection/directive_type.rb +2 -2
  19. data/lib/graphql/introspection/dynamic_fields.rb +3 -8
  20. data/lib/graphql/introspection/entry_points.rb +2 -15
  21. data/lib/graphql/introspection/field_type.rb +1 -1
  22. data/lib/graphql/introspection/schema_type.rb +2 -2
  23. data/lib/graphql/introspection/type_type.rb +5 -5
  24. data/lib/graphql/language/document_from_schema_definition.rb +0 -17
  25. data/lib/graphql/pagination/connections.rb +2 -28
  26. data/lib/graphql/query/context.rb +1 -185
  27. data/lib/graphql/query/input_validation_result.rb +0 -9
  28. data/lib/graphql/query/literal_input.rb +8 -13
  29. data/lib/graphql/query/validation_pipeline.rb +6 -34
  30. data/lib/graphql/query/variable_validation_error.rb +2 -2
  31. data/lib/graphql/query/variables.rb +8 -31
  32. data/lib/graphql/query.rb +5 -34
  33. data/lib/graphql/railtie.rb +0 -104
  34. data/lib/graphql/relay/range_add.rb +0 -4
  35. data/lib/graphql/relay.rb +0 -15
  36. data/lib/graphql/schema/addition.rb +1 -8
  37. data/lib/graphql/schema/argument.rb +1 -25
  38. data/lib/graphql/schema/build_from_definition.rb +0 -1
  39. data/lib/graphql/schema/directive.rb +1 -22
  40. data/lib/graphql/schema/enum.rb +3 -19
  41. data/lib/graphql/schema/enum_value.rb +0 -22
  42. data/lib/graphql/schema/field.rb +22 -220
  43. data/lib/graphql/schema/input_object.rb +11 -57
  44. data/lib/graphql/schema/interface.rb +1 -30
  45. data/lib/graphql/schema/introspection_system.rb +3 -8
  46. data/lib/graphql/schema/late_bound_type.rb +2 -2
  47. data/lib/graphql/schema/list.rb +3 -24
  48. data/lib/graphql/schema/loader.rb +0 -1
  49. data/lib/graphql/schema/member/base_dsl_methods.rb +1 -6
  50. data/lib/graphql/schema/member/build_type.rb +4 -6
  51. data/lib/graphql/schema/member/has_arguments.rb +16 -20
  52. data/lib/graphql/schema/member/has_fields.rb +3 -3
  53. data/lib/graphql/schema/member/has_interfaces.rb +1 -13
  54. data/lib/graphql/schema/member/validates_input.rb +2 -2
  55. data/lib/graphql/schema/member.rb +0 -6
  56. data/lib/graphql/schema/mutation.rb +0 -9
  57. data/lib/graphql/schema/non_null.rb +3 -9
  58. data/lib/graphql/schema/object.rb +0 -40
  59. data/lib/graphql/schema/relay_classic_mutation.rb +17 -28
  60. data/lib/graphql/schema/scalar.rb +1 -16
  61. data/lib/graphql/schema/union.rb +0 -16
  62. data/lib/graphql/schema/warden.rb +3 -12
  63. data/lib/graphql/schema/wrapper.rb +0 -5
  64. data/lib/graphql/schema.rb +106 -945
  65. data/lib/graphql/static_validation/base_visitor.rb +4 -21
  66. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +12 -12
  67. data/lib/graphql/static_validation/validator.rb +2 -24
  68. data/lib/graphql/static_validation.rb +0 -2
  69. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +38 -1
  70. data/lib/graphql/subscriptions/event.rb +1 -1
  71. data/lib/graphql/subscriptions/instrumentation.rb +0 -51
  72. data/lib/graphql/subscriptions.rb +4 -13
  73. data/lib/graphql/tracing/data_dog_tracing.rb +16 -20
  74. data/lib/graphql/tracing/platform_tracing.rb +4 -32
  75. data/lib/graphql/tracing.rb +0 -1
  76. data/lib/graphql/types/relay/connection_behaviors.rb +2 -6
  77. data/lib/graphql/types/relay/default_relay.rb +0 -10
  78. data/lib/graphql/types/relay/node_behaviors.rb +5 -1
  79. data/lib/graphql/types/relay.rb +0 -2
  80. data/lib/graphql/types/string.rb +1 -1
  81. data/lib/graphql/version.rb +1 -1
  82. data/lib/graphql.rb +1 -66
  83. metadata +28 -167
  84. data/lib/graphql/analysis/analyze_query.rb +0 -98
  85. data/lib/graphql/analysis/field_usage.rb +0 -45
  86. data/lib/graphql/analysis/max_query_complexity.rb +0 -26
  87. data/lib/graphql/analysis/max_query_depth.rb +0 -26
  88. data/lib/graphql/analysis/query_complexity.rb +0 -88
  89. data/lib/graphql/analysis/query_depth.rb +0 -43
  90. data/lib/graphql/analysis/reducer_state.rb +0 -48
  91. data/lib/graphql/argument.rb +0 -131
  92. data/lib/graphql/authorization.rb +0 -82
  93. data/lib/graphql/backtrace/legacy_tracer.rb +0 -56
  94. data/lib/graphql/backwards_compatibility.rb +0 -61
  95. data/lib/graphql/base_type.rb +0 -232
  96. data/lib/graphql/boolean_type.rb +0 -2
  97. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
  98. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
  99. data/lib/graphql/compatibility/execution_specification.rb +0 -436
  100. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
  101. data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -215
  102. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -87
  103. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
  104. data/lib/graphql/compatibility/query_parser_specification.rb +0 -266
  105. data/lib/graphql/compatibility/schema_parser_specification.rb +0 -682
  106. data/lib/graphql/compatibility.rb +0 -5
  107. data/lib/graphql/define/assign_argument.rb +0 -12
  108. data/lib/graphql/define/assign_connection.rb +0 -13
  109. data/lib/graphql/define/assign_enum_value.rb +0 -18
  110. data/lib/graphql/define/assign_global_id_field.rb +0 -11
  111. data/lib/graphql/define/assign_mutation_function.rb +0 -34
  112. data/lib/graphql/define/assign_object_field.rb +0 -42
  113. data/lib/graphql/define/defined_object_proxy.rb +0 -53
  114. data/lib/graphql/define/instance_definable.rb +0 -255
  115. data/lib/graphql/define/no_definition_error.rb +0 -7
  116. data/lib/graphql/define/non_null_with_bang.rb +0 -16
  117. data/lib/graphql/define/type_definer.rb +0 -31
  118. data/lib/graphql/define.rb +0 -31
  119. data/lib/graphql/deprecated_dsl.rb +0 -55
  120. data/lib/graphql/directive/deprecated_directive.rb +0 -2
  121. data/lib/graphql/directive/include_directive.rb +0 -2
  122. data/lib/graphql/directive/skip_directive.rb +0 -2
  123. data/lib/graphql/directive.rb +0 -107
  124. data/lib/graphql/enum_type.rb +0 -133
  125. data/lib/graphql/execution/execute.rb +0 -333
  126. data/lib/graphql/execution/flatten.rb +0 -40
  127. data/lib/graphql/execution/typecast.rb +0 -50
  128. data/lib/graphql/field/resolve.rb +0 -59
  129. data/lib/graphql/field.rb +0 -226
  130. data/lib/graphql/float_type.rb +0 -2
  131. data/lib/graphql/function.rb +0 -128
  132. data/lib/graphql/id_type.rb +0 -2
  133. data/lib/graphql/input_object_type.rb +0 -138
  134. data/lib/graphql/int_type.rb +0 -2
  135. data/lib/graphql/interface_type.rb +0 -72
  136. data/lib/graphql/internal_representation/document.rb +0 -27
  137. data/lib/graphql/internal_representation/node.rb +0 -206
  138. data/lib/graphql/internal_representation/print.rb +0 -51
  139. data/lib/graphql/internal_representation/rewrite.rb +0 -184
  140. data/lib/graphql/internal_representation/scope.rb +0 -88
  141. data/lib/graphql/internal_representation/visit.rb +0 -36
  142. data/lib/graphql/internal_representation.rb +0 -7
  143. data/lib/graphql/list_type.rb +0 -80
  144. data/lib/graphql/non_null_type.rb +0 -71
  145. data/lib/graphql/object_type.rb +0 -130
  146. data/lib/graphql/query/arguments.rb +0 -189
  147. data/lib/graphql/query/arguments_cache.rb +0 -24
  148. data/lib/graphql/query/executor.rb +0 -52
  149. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
  150. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
  151. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
  152. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
  153. data/lib/graphql/query/serial_execution.rb +0 -40
  154. data/lib/graphql/relay/array_connection.rb +0 -83
  155. data/lib/graphql/relay/base_connection.rb +0 -189
  156. data/lib/graphql/relay/connection_instrumentation.rb +0 -54
  157. data/lib/graphql/relay/connection_resolve.rb +0 -43
  158. data/lib/graphql/relay/connection_type.rb +0 -54
  159. data/lib/graphql/relay/edge.rb +0 -27
  160. data/lib/graphql/relay/edge_type.rb +0 -19
  161. data/lib/graphql/relay/edges_instrumentation.rb +0 -39
  162. data/lib/graphql/relay/global_id_resolve.rb +0 -17
  163. data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
  164. data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
  165. data/lib/graphql/relay/mutation/resolve.rb +0 -56
  166. data/lib/graphql/relay/mutation/result.rb +0 -38
  167. data/lib/graphql/relay/mutation.rb +0 -106
  168. data/lib/graphql/relay/node.rb +0 -39
  169. data/lib/graphql/relay/page_info.rb +0 -7
  170. data/lib/graphql/relay/relation_connection.rb +0 -188
  171. data/lib/graphql/relay/type_extensions.rb +0 -32
  172. data/lib/graphql/scalar_type.rb +0 -91
  173. data/lib/graphql/schema/catchall_middleware.rb +0 -35
  174. data/lib/graphql/schema/default_parse_error.rb +0 -10
  175. data/lib/graphql/schema/default_type_error.rb +0 -17
  176. data/lib/graphql/schema/member/accepts_definition.rb +0 -164
  177. data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -58
  178. data/lib/graphql/schema/member/instrumentation.rb +0 -131
  179. data/lib/graphql/schema/middleware_chain.rb +0 -82
  180. data/lib/graphql/schema/possible_types.rb +0 -44
  181. data/lib/graphql/schema/rescue_middleware.rb +0 -60
  182. data/lib/graphql/schema/timeout_middleware.rb +0 -88
  183. data/lib/graphql/schema/traversal.rb +0 -228
  184. data/lib/graphql/schema/validation.rb +0 -313
  185. data/lib/graphql/static_validation/default_visitor.rb +0 -15
  186. data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
  187. data/lib/graphql/string_type.rb +0 -2
  188. data/lib/graphql/subscriptions/subscription_root.rb +0 -76
  189. data/lib/graphql/tracing/skylight_tracing.rb +0 -70
  190. data/lib/graphql/types/relay/node_field.rb +0 -24
  191. data/lib/graphql/types/relay/nodes_field.rb +0 -43
  192. data/lib/graphql/union_type.rb +0 -115
  193. data/lib/graphql/upgrader/member.rb +0 -937
  194. 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
@@ -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