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.

Files changed (256) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/install_generator.rb +1 -1
  3. data/lib/generators/graphql/relay.rb +3 -17
  4. data/lib/generators/graphql/templates/schema.erb +3 -0
  5. data/lib/graphql/analysis/ast/field_usage.rb +3 -1
  6. data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
  7. data/lib/graphql/analysis/ast/query_complexity.rb +1 -1
  8. data/lib/graphql/analysis/ast/query_depth.rb +0 -1
  9. data/lib/graphql/analysis/ast/visitor.rb +43 -36
  10. data/lib/graphql/analysis/ast.rb +2 -12
  11. data/lib/graphql/analysis.rb +0 -7
  12. data/lib/graphql/backtrace/table.rb +2 -20
  13. data/lib/graphql/backtrace/tracer.rb +2 -3
  14. data/lib/graphql/backtrace.rb +2 -8
  15. data/lib/graphql/dataloader/null_dataloader.rb +3 -1
  16. data/lib/graphql/dataloader/source.rb +9 -0
  17. data/lib/graphql/dataloader.rb +4 -1
  18. data/lib/graphql/dig.rb +1 -1
  19. data/lib/graphql/execution/errors.rb +12 -82
  20. data/lib/graphql/execution/interpreter/resolve.rb +26 -0
  21. data/lib/graphql/execution/interpreter/runtime.rb +162 -119
  22. data/lib/graphql/execution/interpreter.rb +187 -78
  23. data/lib/graphql/execution/lazy.rb +7 -21
  24. data/lib/graphql/execution/lookahead.rb +44 -40
  25. data/lib/graphql/execution/multiplex.rb +3 -174
  26. data/lib/graphql/execution.rb +11 -4
  27. data/lib/graphql/introspection/dynamic_fields.rb +3 -8
  28. data/lib/graphql/introspection/entry_points.rb +2 -15
  29. data/lib/graphql/introspection/type_type.rb +8 -1
  30. data/lib/graphql/introspection.rb +4 -3
  31. data/lib/graphql/language/document_from_schema_definition.rb +18 -35
  32. data/lib/graphql/language/lexer.rb +216 -1488
  33. data/lib/graphql/language/lexer.ri +744 -0
  34. data/lib/graphql/language/nodes.rb +41 -33
  35. data/lib/graphql/language/parser.rb +375 -363
  36. data/lib/graphql/language/parser.y +48 -43
  37. data/lib/graphql/language/printer.rb +37 -21
  38. data/lib/graphql/language/visitor.rb +191 -83
  39. data/lib/graphql/pagination/active_record_relation_connection.rb +0 -8
  40. data/lib/graphql/pagination/array_connection.rb +4 -2
  41. data/lib/graphql/pagination/connection.rb +31 -4
  42. data/lib/graphql/pagination/connections.rb +3 -28
  43. data/lib/graphql/pagination/relation_connection.rb +2 -0
  44. data/lib/graphql/query/context.rb +155 -196
  45. data/lib/graphql/query/input_validation_result.rb +1 -1
  46. data/lib/graphql/query/null_context.rb +0 -3
  47. data/lib/graphql/query/validation_pipeline.rb +10 -34
  48. data/lib/graphql/query/variables.rb +7 -20
  49. data/lib/graphql/query.rb +32 -42
  50. data/lib/graphql/railtie.rb +0 -104
  51. data/lib/graphql/rake_task/validate.rb +1 -1
  52. data/lib/graphql/rake_task.rb +29 -1
  53. data/lib/graphql/relay/range_add.rb +9 -20
  54. data/lib/graphql/relay.rb +0 -15
  55. data/lib/graphql/schema/addition.rb +7 -9
  56. data/lib/graphql/schema/argument.rb +36 -43
  57. data/lib/graphql/schema/build_from_definition.rb +32 -18
  58. data/lib/graphql/schema/directive/one_of.rb +12 -0
  59. data/lib/graphql/schema/directive/transform.rb +1 -1
  60. data/lib/graphql/schema/directive.rb +11 -22
  61. data/lib/graphql/schema/enum.rb +28 -39
  62. data/lib/graphql/schema/enum_value.rb +5 -25
  63. data/lib/graphql/schema/field/connection_extension.rb +4 -0
  64. data/lib/graphql/schema/field.rb +214 -327
  65. data/lib/graphql/schema/input_object.rb +56 -67
  66. data/lib/graphql/schema/interface.rb +0 -35
  67. data/lib/graphql/schema/introspection_system.rb +3 -8
  68. data/lib/graphql/schema/late_bound_type.rb +8 -2
  69. data/lib/graphql/schema/list.rb +0 -6
  70. data/lib/graphql/schema/loader.rb +1 -2
  71. data/lib/graphql/schema/member/base_dsl_methods.rb +15 -19
  72. data/lib/graphql/schema/member/build_type.rb +5 -7
  73. data/lib/graphql/schema/member/has_arguments.rb +144 -53
  74. data/lib/graphql/schema/member/has_deprecation_reason.rb +3 -4
  75. data/lib/graphql/schema/member/has_directives.rb +71 -56
  76. data/lib/graphql/schema/member/has_fields.rb +15 -3
  77. data/lib/graphql/schema/member/has_interfaces.rb +47 -18
  78. data/lib/graphql/schema/member/has_validators.rb +31 -5
  79. data/lib/graphql/schema/member/relay_shortcuts.rb +28 -2
  80. data/lib/graphql/schema/member/type_system_helpers.rb +17 -0
  81. data/lib/graphql/schema/member/validates_input.rb +1 -1
  82. data/lib/graphql/schema/member.rb +0 -6
  83. data/lib/graphql/schema/mutation.rb +0 -9
  84. data/lib/graphql/schema/non_null.rb +1 -7
  85. data/lib/graphql/schema/object.rb +15 -52
  86. data/lib/graphql/schema/relay_classic_mutation.rb +53 -42
  87. data/lib/graphql/schema/resolver/has_payload_type.rb +20 -10
  88. data/lib/graphql/schema/resolver.rb +41 -42
  89. data/lib/graphql/schema/scalar.rb +7 -22
  90. data/lib/graphql/schema/subscription.rb +0 -7
  91. data/lib/graphql/schema/timeout.rb +24 -28
  92. data/lib/graphql/schema/type_membership.rb +3 -0
  93. data/lib/graphql/schema/union.rb +10 -17
  94. data/lib/graphql/schema/warden.rb +23 -6
  95. data/lib/graphql/schema/wrapper.rb +0 -5
  96. data/lib/graphql/schema.rb +240 -968
  97. data/lib/graphql/static_validation/all_rules.rb +1 -0
  98. data/lib/graphql/static_validation/base_visitor.rb +4 -21
  99. data/lib/graphql/static_validation/definition_dependencies.rb +7 -1
  100. data/lib/graphql/static_validation/error.rb +2 -2
  101. data/lib/graphql/static_validation/literal_validator.rb +19 -1
  102. data/lib/graphql/static_validation/rules/directives_are_defined.rb +11 -5
  103. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +12 -12
  104. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
  105. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
  106. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +12 -6
  107. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +1 -1
  108. data/lib/graphql/static_validation/validator.rb +3 -25
  109. data/lib/graphql/static_validation.rb +0 -2
  110. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +7 -1
  111. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +38 -1
  112. data/lib/graphql/subscriptions/event.rb +3 -8
  113. data/lib/graphql/subscriptions/instrumentation.rb +0 -51
  114. data/lib/graphql/subscriptions.rb +32 -20
  115. data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
  116. data/lib/graphql/tracing/appoptics_trace.rb +231 -0
  117. data/lib/graphql/tracing/appsignal_trace.rb +66 -0
  118. data/lib/graphql/tracing/data_dog_trace.rb +148 -0
  119. data/lib/graphql/tracing/data_dog_tracing.rb +2 -0
  120. data/lib/graphql/tracing/new_relic_trace.rb +75 -0
  121. data/lib/graphql/tracing/notifications_trace.rb +41 -0
  122. data/lib/graphql/tracing/platform_trace.rb +107 -0
  123. data/lib/graphql/tracing/platform_tracing.rb +26 -41
  124. data/lib/graphql/tracing/prometheus_trace.rb +89 -0
  125. data/lib/graphql/tracing/prometheus_tracing.rb +3 -3
  126. data/lib/graphql/tracing/scout_trace.rb +72 -0
  127. data/lib/graphql/tracing/statsd_trace.rb +56 -0
  128. data/lib/graphql/tracing.rb +136 -40
  129. data/lib/graphql/type_kinds.rb +6 -3
  130. data/lib/graphql/types/iso_8601_date.rb +4 -1
  131. data/lib/graphql/types/iso_8601_date_time.rb +4 -0
  132. data/lib/graphql/types/relay/base_connection.rb +16 -6
  133. data/lib/graphql/types/relay/connection_behaviors.rb +5 -25
  134. data/lib/graphql/types/relay/default_relay.rb +5 -9
  135. data/lib/graphql/types/relay/edge_behaviors.rb +1 -4
  136. data/lib/graphql/types/relay/node_behaviors.rb +5 -1
  137. data/lib/graphql/types/relay.rb +0 -2
  138. data/lib/graphql/types/string.rb +1 -1
  139. data/lib/graphql/version.rb +1 -1
  140. data/lib/graphql.rb +11 -72
  141. metadata +31 -132
  142. data/lib/graphql/analysis/analyze_query.rb +0 -98
  143. data/lib/graphql/analysis/field_usage.rb +0 -45
  144. data/lib/graphql/analysis/max_query_complexity.rb +0 -26
  145. data/lib/graphql/analysis/max_query_depth.rb +0 -26
  146. data/lib/graphql/analysis/query_complexity.rb +0 -88
  147. data/lib/graphql/analysis/query_depth.rb +0 -43
  148. data/lib/graphql/analysis/reducer_state.rb +0 -48
  149. data/lib/graphql/argument.rb +0 -131
  150. data/lib/graphql/authorization.rb +0 -82
  151. data/lib/graphql/backtrace/legacy_tracer.rb +0 -56
  152. data/lib/graphql/backwards_compatibility.rb +0 -61
  153. data/lib/graphql/base_type.rb +0 -232
  154. data/lib/graphql/boolean_type.rb +0 -2
  155. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
  156. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
  157. data/lib/graphql/compatibility/execution_specification.rb +0 -436
  158. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
  159. data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -215
  160. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -87
  161. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
  162. data/lib/graphql/compatibility/query_parser_specification.rb +0 -266
  163. data/lib/graphql/compatibility/schema_parser_specification.rb +0 -682
  164. data/lib/graphql/compatibility.rb +0 -5
  165. data/lib/graphql/define/assign_argument.rb +0 -12
  166. data/lib/graphql/define/assign_connection.rb +0 -13
  167. data/lib/graphql/define/assign_enum_value.rb +0 -18
  168. data/lib/graphql/define/assign_global_id_field.rb +0 -11
  169. data/lib/graphql/define/assign_mutation_function.rb +0 -34
  170. data/lib/graphql/define/assign_object_field.rb +0 -42
  171. data/lib/graphql/define/defined_object_proxy.rb +0 -53
  172. data/lib/graphql/define/instance_definable.rb +0 -255
  173. data/lib/graphql/define/no_definition_error.rb +0 -7
  174. data/lib/graphql/define/non_null_with_bang.rb +0 -16
  175. data/lib/graphql/define/type_definer.rb +0 -31
  176. data/lib/graphql/define.rb +0 -31
  177. data/lib/graphql/deprecated_dsl.rb +0 -55
  178. data/lib/graphql/directive/deprecated_directive.rb +0 -2
  179. data/lib/graphql/directive/include_directive.rb +0 -2
  180. data/lib/graphql/directive/skip_directive.rb +0 -2
  181. data/lib/graphql/directive.rb +0 -107
  182. data/lib/graphql/enum_type.rb +0 -133
  183. data/lib/graphql/execution/execute.rb +0 -333
  184. data/lib/graphql/execution/flatten.rb +0 -40
  185. data/lib/graphql/execution/instrumentation.rb +0 -92
  186. data/lib/graphql/execution/lazy/resolve.rb +0 -91
  187. data/lib/graphql/execution/typecast.rb +0 -50
  188. data/lib/graphql/field/resolve.rb +0 -59
  189. data/lib/graphql/field.rb +0 -226
  190. data/lib/graphql/float_type.rb +0 -2
  191. data/lib/graphql/function.rb +0 -128
  192. data/lib/graphql/id_type.rb +0 -2
  193. data/lib/graphql/input_object_type.rb +0 -138
  194. data/lib/graphql/int_type.rb +0 -2
  195. data/lib/graphql/interface_type.rb +0 -72
  196. data/lib/graphql/internal_representation/document.rb +0 -27
  197. data/lib/graphql/internal_representation/node.rb +0 -206
  198. data/lib/graphql/internal_representation/print.rb +0 -51
  199. data/lib/graphql/internal_representation/rewrite.rb +0 -184
  200. data/lib/graphql/internal_representation/scope.rb +0 -88
  201. data/lib/graphql/internal_representation/visit.rb +0 -36
  202. data/lib/graphql/internal_representation.rb +0 -7
  203. data/lib/graphql/language/lexer.rl +0 -260
  204. data/lib/graphql/list_type.rb +0 -80
  205. data/lib/graphql/non_null_type.rb +0 -71
  206. data/lib/graphql/object_type.rb +0 -130
  207. data/lib/graphql/query/arguments.rb +0 -189
  208. data/lib/graphql/query/arguments_cache.rb +0 -24
  209. data/lib/graphql/query/executor.rb +0 -52
  210. data/lib/graphql/query/literal_input.rb +0 -136
  211. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
  212. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
  213. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
  214. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
  215. data/lib/graphql/query/serial_execution.rb +0 -40
  216. data/lib/graphql/relay/array_connection.rb +0 -83
  217. data/lib/graphql/relay/base_connection.rb +0 -189
  218. data/lib/graphql/relay/connection_instrumentation.rb +0 -54
  219. data/lib/graphql/relay/connection_resolve.rb +0 -43
  220. data/lib/graphql/relay/connection_type.rb +0 -54
  221. data/lib/graphql/relay/edge.rb +0 -27
  222. data/lib/graphql/relay/edge_type.rb +0 -19
  223. data/lib/graphql/relay/edges_instrumentation.rb +0 -39
  224. data/lib/graphql/relay/global_id_resolve.rb +0 -17
  225. data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
  226. data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
  227. data/lib/graphql/relay/mutation/resolve.rb +0 -56
  228. data/lib/graphql/relay/mutation/result.rb +0 -38
  229. data/lib/graphql/relay/mutation.rb +0 -106
  230. data/lib/graphql/relay/node.rb +0 -39
  231. data/lib/graphql/relay/page_info.rb +0 -7
  232. data/lib/graphql/relay/relation_connection.rb +0 -188
  233. data/lib/graphql/relay/type_extensions.rb +0 -32
  234. data/lib/graphql/scalar_type.rb +0 -91
  235. data/lib/graphql/schema/catchall_middleware.rb +0 -35
  236. data/lib/graphql/schema/default_parse_error.rb +0 -10
  237. data/lib/graphql/schema/default_type_error.rb +0 -17
  238. data/lib/graphql/schema/member/accepts_definition.rb +0 -164
  239. data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -58
  240. data/lib/graphql/schema/member/instrumentation.rb +0 -131
  241. data/lib/graphql/schema/middleware_chain.rb +0 -82
  242. data/lib/graphql/schema/possible_types.rb +0 -44
  243. data/lib/graphql/schema/rescue_middleware.rb +0 -60
  244. data/lib/graphql/schema/timeout_middleware.rb +0 -88
  245. data/lib/graphql/schema/traversal.rb +0 -228
  246. data/lib/graphql/schema/validation.rb +0 -313
  247. data/lib/graphql/static_validation/default_visitor.rb +0 -15
  248. data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
  249. data/lib/graphql/string_type.rb +0 -2
  250. data/lib/graphql/subscriptions/subscription_root.rb +0 -76
  251. data/lib/graphql/tracing/skylight_tracing.rb +0 -70
  252. data/lib/graphql/types/relay/node_field.rb +0 -24
  253. data/lib/graphql/types/relay/nodes_field.rb +0 -43
  254. data/lib/graphql/union_type.rb +0 -115
  255. data/lib/graphql/upgrader/member.rb +0 -937
  256. data/lib/graphql/upgrader/schema.rb +0 -38
@@ -1,107 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- # Directives are server-defined hooks for modifying execution.
4
- #
5
- # Two directives are included out-of-the-box:
6
- # - `@skip(if: ...)` Skips the tagged field if the value of `if` is true
7
- # - `@include(if: ...)` Includes the tagged field _only_ if `if` is true
8
- #
9
- class Directive
10
- include GraphQL::Define::InstanceDefinable
11
- deprecated_accepts_definitions :locations, :name, :description, :arguments, :default_directive, argument: GraphQL::Define::AssignArgument
12
-
13
- attr_accessor :locations, :arguments, :name, :description, :arguments_class
14
- attr_accessor :ast_node
15
- # @api private
16
- attr_writer :default_directive
17
- ensure_defined(:locations, :arguments, :graphql_name, :name, :description, :default_directive?)
18
-
19
- # Future-compatible alias
20
- # @see {GraphQL::SchemaMember}
21
- alias :graphql_name :name
22
-
23
- # Future-compatible alias
24
- # @see {GraphQL::SchemaMember}
25
- alias :graphql_definition :itself
26
-
27
- LOCATIONS = [
28
- QUERY = :QUERY,
29
- MUTATION = :MUTATION,
30
- SUBSCRIPTION = :SUBSCRIPTION,
31
- FIELD = :FIELD,
32
- FRAGMENT_DEFINITION = :FRAGMENT_DEFINITION,
33
- FRAGMENT_SPREAD = :FRAGMENT_SPREAD,
34
- INLINE_FRAGMENT = :INLINE_FRAGMENT,
35
- SCHEMA = :SCHEMA,
36
- SCALAR = :SCALAR,
37
- OBJECT = :OBJECT,
38
- FIELD_DEFINITION = :FIELD_DEFINITION,
39
- ARGUMENT_DEFINITION = :ARGUMENT_DEFINITION,
40
- INTERFACE = :INTERFACE,
41
- UNION = :UNION,
42
- ENUM = :ENUM,
43
- ENUM_VALUE = :ENUM_VALUE,
44
- INPUT_OBJECT = :INPUT_OBJECT,
45
- INPUT_FIELD_DEFINITION = :INPUT_FIELD_DEFINITION,
46
- ]
47
-
48
- LOCATION_DESCRIPTIONS = {
49
- QUERY: 'Location adjacent to a query operation.',
50
- MUTATION: 'Location adjacent to a mutation operation.',
51
- SUBSCRIPTION: 'Location adjacent to a subscription operation.',
52
- FIELD: 'Location adjacent to a field.',
53
- FRAGMENT_DEFINITION: 'Location adjacent to a fragment definition.',
54
- FRAGMENT_SPREAD: 'Location adjacent to a fragment spread.',
55
- INLINE_FRAGMENT: 'Location adjacent to an inline fragment.',
56
- SCHEMA: 'Location adjacent to a schema definition.',
57
- SCALAR: 'Location adjacent to a scalar definition.',
58
- OBJECT: 'Location adjacent to an object type definition.',
59
- FIELD_DEFINITION: 'Location adjacent to a field definition.',
60
- ARGUMENT_DEFINITION: 'Location adjacent to an argument definition.',
61
- INTERFACE: 'Location adjacent to an interface definition.',
62
- UNION: 'Location adjacent to a union definition.',
63
- ENUM: 'Location adjacent to an enum definition.',
64
- ENUM_VALUE: 'Location adjacent to an enum value definition.',
65
- INPUT_OBJECT: 'Location adjacent to an input object type definition.',
66
- INPUT_FIELD_DEFINITION: 'Location adjacent to an input object field definition.',
67
- }
68
-
69
- def initialize
70
- @arguments = {}
71
- @default_directive = false
72
- end
73
-
74
- def to_s
75
- "<GraphQL::Directive #{name}>"
76
- end
77
-
78
- def on_field?
79
- locations.include?(FIELD)
80
- end
81
-
82
- def on_fragment?
83
- locations.include?(FRAGMENT_SPREAD) && locations.include?(INLINE_FRAGMENT)
84
- end
85
-
86
- def on_operation?
87
- locations.include?(QUERY) && locations.include?(MUTATION) && locations.include?(SUBSCRIPTION)
88
- end
89
-
90
- # @return [Boolean] Is this directive supplied by default? (eg `@skip`)
91
- def default_directive?
92
- @default_directive
93
- end
94
-
95
- def inspect
96
- "#<GraphQL::Directive #{name}>"
97
- end
98
-
99
- def type_class
100
- metadata[:type_class]
101
- end
102
-
103
- def get_argument(argument_name)
104
- arguments[argument_name]
105
- end
106
- end
107
- end
@@ -1,133 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- # @api deprecated
4
- class EnumType < GraphQL::BaseType
5
- extend Define::InstanceDefinable::DeprecatedDefine
6
-
7
- deprecated_accepts_definitions :values, value: GraphQL::Define::AssignEnumValue
8
- ensure_defined(:values, :validate_non_null_input, :coerce_non_null_input, :coerce_result)
9
- attr_accessor :ast_node
10
-
11
- def initialize
12
- super
13
- @values_by_name = {}
14
- end
15
-
16
- def initialize_copy(other)
17
- super
18
- self.values = other.values.values
19
- end
20
-
21
- # @param new_values [Array<EnumValue>] The set of values contained in this type
22
- def values=(new_values)
23
- @values_by_name = {}
24
- new_values.each { |enum_value| add_value(enum_value) }
25
- end
26
-
27
- # @param enum_value [EnumValue] A value to add to this type's set of values
28
- def add_value(enum_value)
29
- if @values_by_name.key?(enum_value.name)
30
- raise "Enum value names must be unique. Value `#{enum_value.name}` already exists on Enum `#{name}`."
31
- end
32
-
33
- @values_by_name[enum_value.name] = enum_value
34
- end
35
-
36
- # @return [Hash<String => EnumValue>] `{name => value}` pairs contained in this type
37
- def values(_context = nil)
38
- @values_by_name
39
- end
40
-
41
- def enum_values(_context = nil)
42
- values.values
43
- end
44
-
45
- def kind
46
- GraphQL::TypeKinds::ENUM
47
- end
48
-
49
- def coerce_result(value, ctx = nil)
50
- if ctx.nil?
51
- warn_deprecated_coerce("coerce_isolated_result")
52
- ctx = GraphQL::Query::NullContext
53
- end
54
-
55
- warden = ctx.warden
56
- all_values = warden ? warden.enum_values(self) : @values_by_name.each_value
57
- enum_value = all_values.find { |val| val.value == value }
58
- if enum_value
59
- enum_value.name
60
- else
61
- raise(UnresolvedValueError, "Can't resolve enum #{name} for #{value.inspect}")
62
- end
63
- end
64
-
65
- def to_s
66
- name
67
- end
68
-
69
- # A value within an {EnumType}
70
- #
71
- # Created with the `value` helper
72
- class EnumValue
73
- include GraphQL::Define::InstanceDefinable
74
- ATTRIBUTES = [:name, :description, :deprecation_reason, :value]
75
- deprecated_accepts_definitions(*ATTRIBUTES)
76
- attr_accessor(*ATTRIBUTES)
77
- attr_accessor :ast_node
78
- ensure_defined(*ATTRIBUTES)
79
-
80
- undef name=
81
- def name=(new_name)
82
- # Validate that the name is correct
83
- GraphQL::NameValidator.validate!(new_name)
84
- @name = new_name
85
- end
86
-
87
- def graphql_name
88
- name
89
- end
90
-
91
- def type_class
92
- metadata[:type_class]
93
- end
94
- end
95
-
96
- class UnresolvedValueError < GraphQL::Error
97
- end
98
-
99
- private
100
-
101
- # Get the underlying value for this enum value
102
- #
103
- # @example get episode value from Enum
104
- # episode = EpisodeEnum.coerce("NEWHOPE")
105
- # episode # => 6
106
- #
107
- # @param value_name [String] the string representation of this enum value
108
- # @return [Object] the underlying value for this enum value
109
- def coerce_non_null_input(value_name, ctx)
110
- if @values_by_name.key?(value_name)
111
- @values_by_name.fetch(value_name).value
112
- elsif match_by_value = @values_by_name.find { |k, v| v.value == value_name }
113
- # this is for matching default values, which are "inputs", but they're
114
- # the Ruby value, not the GraphQL string.
115
- match_by_value[1].value
116
- else
117
- nil
118
- end
119
- end
120
-
121
- def validate_non_null_input(value_name, ctx)
122
- result = GraphQL::Query::InputValidationResult.new
123
- allowed_values = ctx.warden.enum_values(self)
124
- matching_value = allowed_values.find { |v| v.name == value_name }
125
-
126
- if matching_value.nil?
127
- result.add_problem("Expected #{GraphQL::Language.serialize(value_name)} to be one of: #{allowed_values.map(&:name).join(', ')}")
128
- end
129
-
130
- result
131
- end
132
- end
133
- end
@@ -1,333 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Execution
4
- # A valid execution strategy
5
- # @api private
6
- class Execute
7
-
8
- # @api private
9
- class Skip < GraphQL::Error; end
10
-
11
- # Just a singleton for implementing {Query::Context#skip}
12
- # @api private
13
- SKIP = Skip.new
14
-
15
- # @api private
16
- class PropagateNull
17
- end
18
- # @api private
19
- PROPAGATE_NULL = PropagateNull.new
20
-
21
- def self.use(schema_class)
22
- schema_class.query_execution_strategy(self)
23
- schema_class.mutation_execution_strategy(self)
24
- schema_class.subscription_execution_strategy(self)
25
- end
26
-
27
- def execute(ast_operation, root_type, query)
28
- 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"
29
- result = resolve_root_selection(query)
30
- lazy_resolve_root_selection(result, **{query: query})
31
- GraphQL::Execution::Flatten.call(query.context)
32
- end
33
-
34
- def self.begin_multiplex(_multiplex)
35
- end
36
-
37
- def self.begin_query(query, _multiplex)
38
- ExecutionFunctions.resolve_root_selection(query)
39
- end
40
-
41
- def self.finish_multiplex(results, multiplex)
42
- ExecutionFunctions.lazy_resolve_root_selection(results, multiplex: multiplex)
43
- end
44
-
45
- def self.finish_query(query, _multiplex)
46
- {
47
- "data" => Execution::Flatten.call(query.context)
48
- }
49
- end
50
-
51
- # @api private
52
- module ExecutionFunctions
53
- module_function
54
-
55
- def resolve_root_selection(query)
56
- query.trace("execute_query", query: query) do
57
- operation = query.selected_operation
58
- op_type = operation.operation_type
59
- root_type = query.root_type_for_operation(op_type)
60
- if query.context[:__root_unauthorized]
61
- # This was set by member/instrumentation.rb so that we wouldn't continue.
62
- else
63
- resolve_selection(
64
- query.root_value,
65
- root_type,
66
- query.context,
67
- mutation: query.mutation?
68
- )
69
- end
70
- end
71
- end
72
-
73
- def lazy_resolve_root_selection(result, query: nil, multiplex: nil)
74
- if query.nil? && multiplex.queries.length == 1
75
- query = multiplex.queries[0]
76
- end
77
-
78
- tracer = (query || multiplex)
79
- tracer.trace("execute_query_lazy", {multiplex: multiplex, query: query}) do
80
- GraphQL::Execution::Lazy.resolve(result)
81
- end
82
- end
83
-
84
- def resolve_selection(object, current_type, current_ctx, mutation: false )
85
- # Assign this _before_ resolving the children
86
- # so that when a child propagates null, the selection result is
87
- # ready for it.
88
- current_ctx.value = {}
89
-
90
- selections_on_type = current_ctx.irep_node.typed_children[current_type]
91
-
92
- selections_on_type.each do |name, child_irep_node|
93
- field_ctx = current_ctx.spawn_child(
94
- key: name,
95
- object: object,
96
- irep_node: child_irep_node,
97
- )
98
-
99
- field_result = resolve_field(
100
- object,
101
- field_ctx
102
- )
103
-
104
- if field_result.is_a?(Skip)
105
- next
106
- end
107
-
108
- if mutation
109
- GraphQL::Execution::Lazy.resolve(field_ctx)
110
- end
111
-
112
-
113
- # If the last subselection caused a null to propagate to _this_ selection,
114
- # then we may as well quit executing fields because they
115
- # won't be in the response
116
- if current_ctx.invalid_null?
117
- break
118
- else
119
- current_ctx.value[name] = field_ctx
120
- end
121
- end
122
-
123
- current_ctx.value
124
- end
125
-
126
- def resolve_field(object, field_ctx)
127
- query = field_ctx.query
128
- irep_node = field_ctx.irep_node
129
- parent_type = irep_node.owner_type
130
- field = field_ctx.field
131
-
132
- raw_value = begin
133
- begin
134
- arguments = query.arguments_for(irep_node, field)
135
- field_ctx.trace("execute_field", { context: field_ctx }) do
136
- field_ctx.schema.middleware.invoke([parent_type, object, field, arguments, field_ctx])
137
- end
138
- rescue GraphQL::UnauthorizedFieldError => err
139
- err.field ||= field
140
- field_ctx.schema.unauthorized_field(err)
141
- rescue GraphQL::UnauthorizedError => err
142
- field_ctx.schema.unauthorized_object(err)
143
- end
144
- rescue GraphQL::ExecutionError => err
145
- err
146
- end
147
-
148
- if field_ctx.schema.lazy?(raw_value)
149
- field_ctx.value = Execution::Lazy.new {
150
- inner_value = field_ctx.trace("execute_field_lazy", {context: field_ctx}) {
151
- begin
152
- begin
153
- field_ctx.field.lazy_resolve(raw_value, arguments, field_ctx)
154
- rescue GraphQL::UnauthorizedError => err
155
- field_ctx.schema.unauthorized_object(err)
156
- end
157
- rescue GraphQL::ExecutionError => err
158
- err
159
- end
160
- }
161
- continue_or_wait(inner_value, field_ctx.type, field_ctx)
162
- }
163
- else
164
- continue_or_wait(raw_value, field_ctx.type, field_ctx)
165
- end
166
- end
167
-
168
- # If the returned object is lazy (unfinished),
169
- # assign the lazy object to `.value=` so we can resolve it later.
170
- # When we resolve it later, reassign it to `.value=` so that
171
- # the finished value replaces the unfinished one.
172
- #
173
- # If the returned object is finished, continue to coerce
174
- # and resolve child fields
175
- def continue_or_wait(raw_value, field_type, field_ctx)
176
- if field_ctx.schema.lazy?(raw_value)
177
- field_ctx.value = Execution::Lazy.new {
178
- inner_value = begin
179
- begin
180
- field_ctx.schema.sync_lazy(raw_value)
181
- rescue GraphQL::UnauthorizedError => err
182
- field_ctx.schema.unauthorized_object(err)
183
- end
184
- rescue GraphQL::ExecutionError => err
185
- err
186
- end
187
-
188
- field_ctx.value = continue_or_wait(inner_value, field_type, field_ctx)
189
- }
190
- else
191
- field_ctx.value = continue_resolve_field(raw_value, field_type, field_ctx)
192
- end
193
- end
194
-
195
- def continue_resolve_field(raw_value, field_type, field_ctx)
196
- if field_ctx.parent.invalid_null?
197
- return nil
198
- end
199
- query = field_ctx.query
200
-
201
- case raw_value
202
- when GraphQL::ExecutionError
203
- raw_value.ast_node ||= field_ctx.ast_node
204
- raw_value.path = field_ctx.path
205
- query.context.errors.push(raw_value)
206
- when Array
207
- if field_type.non_null?
208
- # List type errors are handled above, this is for the case of fields returning an array of errors
209
- list_errors = raw_value.each_with_index.select { |value, _| value.is_a?(GraphQL::ExecutionError) }
210
- if list_errors.any?
211
- list_errors.each do |error, index|
212
- error.ast_node = field_ctx.ast_node
213
- error.path = field_ctx.path + (field_ctx.type.list? ? [index] : [])
214
- query.context.errors.push(error)
215
- end
216
- end
217
- end
218
- end
219
-
220
- resolve_value(
221
- raw_value,
222
- field_type,
223
- field_ctx,
224
- )
225
- end
226
-
227
- def resolve_value(value, field_type, field_ctx)
228
- field_defn = field_ctx.field
229
-
230
- if value.nil?
231
- if field_type.kind.non_null?
232
- parent_type = field_ctx.irep_node.owner_type
233
- type_error = GraphQL::InvalidNullError.new(parent_type, field_defn, value)
234
- field_ctx.schema.type_error(type_error, field_ctx)
235
- PROPAGATE_NULL
236
- else
237
- nil
238
- end
239
- elsif value.is_a?(GraphQL::ExecutionError)
240
- if field_type.kind.non_null?
241
- PROPAGATE_NULL
242
- else
243
- nil
244
- end
245
- elsif value.is_a?(Array) && value.any? && value.all? {|v| v.is_a?(GraphQL::ExecutionError)}
246
- if field_type.kind.non_null?
247
- PROPAGATE_NULL
248
- else
249
- nil
250
- end
251
- elsif value.is_a?(Skip)
252
- field_ctx.value = value
253
- else
254
- case field_type.kind
255
- when GraphQL::TypeKinds::SCALAR, GraphQL::TypeKinds::ENUM
256
- field_type.coerce_result(value, field_ctx)
257
- when GraphQL::TypeKinds::LIST
258
- inner_type = field_type.of_type
259
- i = 0
260
- result = []
261
- field_ctx.value = result
262
-
263
- value.each do |inner_value|
264
- inner_ctx = field_ctx.spawn_child(
265
- key: i,
266
- object: inner_value,
267
- irep_node: field_ctx.irep_node,
268
- )
269
-
270
- inner_result = continue_or_wait(
271
- inner_value,
272
- inner_type,
273
- inner_ctx,
274
- )
275
-
276
- return PROPAGATE_NULL if inner_result == PROPAGATE_NULL
277
-
278
- result << inner_ctx
279
- i += 1
280
- end
281
-
282
- result
283
- when GraphQL::TypeKinds::NON_NULL
284
- inner_type = field_type.of_type
285
- resolve_value(
286
- value,
287
- inner_type,
288
- field_ctx,
289
- )
290
- when GraphQL::TypeKinds::OBJECT
291
- resolve_selection(
292
- value,
293
- field_type,
294
- field_ctx
295
- )
296
- when GraphQL::TypeKinds::UNION, GraphQL::TypeKinds::INTERFACE
297
- query = field_ctx.query
298
- resolved_type_or_lazy = field_type.resolve_type(value, field_ctx)
299
- query.schema.after_lazy(resolved_type_or_lazy) do |resolved_type|
300
- possible_types = query.possible_types(field_type)
301
-
302
- if !possible_types.include?(resolved_type)
303
- parent_type = field_ctx.irep_node.owner_type
304
- type_error = GraphQL::UnresolvedTypeError.new(value, field_defn, parent_type, resolved_type, possible_types)
305
- field_ctx.schema.type_error(type_error, field_ctx)
306
- PROPAGATE_NULL
307
- else
308
- resolve_value(
309
- value,
310
- resolved_type,
311
- field_ctx,
312
- )
313
- end
314
- end
315
- else
316
- raise("Unknown type kind: #{field_type.kind}")
317
- end
318
- end
319
- end
320
- end
321
-
322
- include ExecutionFunctions
323
-
324
- # A `.call`-able suitable to be the last step in a middleware chain
325
- module FieldResolveStep
326
- # Execute the field's resolve method
327
- def self.call(_parent_type, parent_object, field_definition, field_args, context, _next = nil)
328
- field_definition.resolve(parent_object, field_args, context)
329
- end
330
- end
331
- end
332
- end
333
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Execution
4
- # Starting from a root context,
5
- # create a hash out of the context tree.
6
- # @api private
7
- module Flatten
8
- def self.call(ctx)
9
- flatten(ctx)
10
- end
11
-
12
- class << self
13
- private
14
-
15
- def flatten(obj)
16
- case obj
17
- when Hash
18
- flattened = {}
19
- obj.each do |key, val|
20
- flattened[key] = flatten(val)
21
- end
22
- flattened
23
- when Array
24
- obj.map { |v| flatten(v) }
25
- when Query::Context::SharedMethods
26
- if obj.invalid_null?
27
- nil
28
- elsif obj.skipped? && obj.value.empty?
29
- nil
30
- else
31
- flatten(obj.value)
32
- end
33
- else
34
- obj
35
- end
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,92 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Execution
4
- module Instrumentation
5
- # This function implements the instrumentation policy:
6
- #
7
- # - Instrumenters are a stack; the first `before_query` will have the last `after_query`
8
- # - If a `before_` hook returned without an error, its corresponding `after_` hook will run.
9
- # - If the `before_` hook did _not_ run, the `after_` hook will not be called.
10
- #
11
- # When errors are raised from `after_` hooks:
12
- # - Subsequent `after_` hooks _are_ called
13
- # - The first raised error is captured; later errors are ignored
14
- # - If an error was capture, it's re-raised after all hooks are finished
15
- #
16
- # Partial runs of instrumentation are possible:
17
- # - If a `before_multiplex` hook raises an error, no `before_query` hooks will run
18
- # - If a `before_query` hook raises an error, subsequent `before_query` hooks will not run (on any query)
19
- def self.apply_instrumenters(multiplex)
20
- schema = multiplex.schema
21
- queries = multiplex.queries
22
- query_instrumenters = schema.instrumenters[:query]
23
- multiplex_instrumenters = schema.instrumenters[:multiplex]
24
-
25
- # First, run multiplex instrumentation, then query instrumentation for each query
26
- call_hooks(multiplex_instrumenters, multiplex, :before_multiplex, :after_multiplex) do
27
- each_query_call_hooks(query_instrumenters, queries) do
28
- # Let them be executed
29
- yield
30
- end
31
- end
32
- end
33
-
34
- class << self
35
- private
36
- # Call the before_ hooks of each query,
37
- # Then yield if no errors.
38
- # `call_hooks` takes care of appropriate cleanup.
39
- def each_query_call_hooks(instrumenters, queries, i = 0)
40
- if i >= queries.length
41
- yield
42
- else
43
- query = queries[i]
44
- call_hooks(instrumenters, query, :before_query, :after_query) {
45
- each_query_call_hooks(instrumenters, queries, i + 1) {
46
- yield
47
- }
48
- }
49
- end
50
- end
51
-
52
- # Call each before hook, and if they all succeed, yield.
53
- # If they don't all succeed, call after_ for each one that succeeded.
54
- def call_hooks(instrumenters, object, before_hook_name, after_hook_name)
55
- begin
56
- successful = []
57
- instrumenters.each do |instrumenter|
58
- instrumenter.public_send(before_hook_name, object)
59
- successful << instrumenter
60
- end
61
-
62
- # if any before hooks raise an exception, quit calling before hooks,
63
- # but call the after hooks on anything that succeeded but also
64
- # raise the exception that came from the before hook.
65
- rescue GraphQL::ExecutionError => err
66
- object.context.errors << err
67
- rescue => e
68
- raise call_after_hooks(successful, object, after_hook_name, e)
69
- end
70
-
71
- begin
72
- yield # Call the user code
73
- ensure
74
- ex = call_after_hooks(successful, object, after_hook_name, nil)
75
- raise ex if ex
76
- end
77
- end
78
-
79
- def call_after_hooks(instrumenters, object, after_hook_name, ex)
80
- instrumenters.reverse_each do |instrumenter|
81
- begin
82
- instrumenter.public_send(after_hook_name, object)
83
- rescue => e
84
- ex = e
85
- end
86
- end
87
- ex
88
- end
89
- end
90
- end
91
- end
92
- end