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.

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