graphql 2.0.30 → 2.3.6

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.
Files changed (157) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/install/mutation_root_generator.rb +2 -2
  3. data/lib/generators/graphql/install/templates/base_mutation.erb +2 -0
  4. data/lib/generators/graphql/install/templates/mutation_type.erb +2 -0
  5. data/lib/generators/graphql/install_generator.rb +3 -0
  6. data/lib/generators/graphql/templates/base_argument.erb +2 -0
  7. data/lib/generators/graphql/templates/base_connection.erb +2 -0
  8. data/lib/generators/graphql/templates/base_edge.erb +2 -0
  9. data/lib/generators/graphql/templates/base_enum.erb +2 -0
  10. data/lib/generators/graphql/templates/base_field.erb +2 -0
  11. data/lib/generators/graphql/templates/base_input_object.erb +2 -0
  12. data/lib/generators/graphql/templates/base_interface.erb +2 -0
  13. data/lib/generators/graphql/templates/base_object.erb +2 -0
  14. data/lib/generators/graphql/templates/base_resolver.erb +6 -0
  15. data/lib/generators/graphql/templates/base_scalar.erb +2 -0
  16. data/lib/generators/graphql/templates/base_union.erb +2 -0
  17. data/lib/generators/graphql/templates/graphql_controller.erb +2 -0
  18. data/lib/generators/graphql/templates/loader.erb +2 -0
  19. data/lib/generators/graphql/templates/mutation.erb +2 -0
  20. data/lib/generators/graphql/templates/node_type.erb +2 -0
  21. data/lib/generators/graphql/templates/query_type.erb +2 -0
  22. data/lib/generators/graphql/templates/schema.erb +5 -0
  23. data/lib/graphql/analysis/analyzer.rb +89 -0
  24. data/lib/graphql/analysis/field_usage.rb +82 -0
  25. data/lib/graphql/analysis/max_query_complexity.rb +20 -0
  26. data/lib/graphql/analysis/max_query_depth.rb +20 -0
  27. data/lib/graphql/analysis/query_complexity.rb +183 -0
  28. data/lib/graphql/analysis/query_depth.rb +58 -0
  29. data/lib/graphql/analysis/visitor.rb +282 -0
  30. data/lib/graphql/analysis.rb +92 -1
  31. data/lib/graphql/backtrace/inspect_result.rb +0 -12
  32. data/lib/graphql/backtrace/trace.rb +12 -15
  33. data/lib/graphql/coercion_error.rb +1 -9
  34. data/lib/graphql/dataloader/async_dataloader.rb +88 -0
  35. data/lib/graphql/dataloader/null_dataloader.rb +1 -1
  36. data/lib/graphql/dataloader/request.rb +5 -0
  37. data/lib/graphql/dataloader/source.rb +11 -3
  38. data/lib/graphql/dataloader.rb +112 -142
  39. data/lib/graphql/duration_encoding_error.rb +16 -0
  40. data/lib/graphql/execution/interpreter/argument_value.rb +5 -1
  41. data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +175 -0
  42. data/lib/graphql/execution/interpreter/runtime.rb +163 -365
  43. data/lib/graphql/execution/interpreter.rb +92 -158
  44. data/lib/graphql/execution/lookahead.rb +88 -21
  45. data/lib/graphql/introspection/dynamic_fields.rb +1 -1
  46. data/lib/graphql/introspection/entry_points.rb +11 -5
  47. data/lib/graphql/introspection/schema_type.rb +3 -1
  48. data/lib/graphql/language/block_string.rb +34 -18
  49. data/lib/graphql/language/definition_slice.rb +1 -1
  50. data/lib/graphql/language/document_from_schema_definition.rb +38 -38
  51. data/lib/graphql/language/lexer.rb +305 -193
  52. data/lib/graphql/language/nodes.rb +113 -66
  53. data/lib/graphql/language/parser.rb +787 -1986
  54. data/lib/graphql/language/printer.rb +303 -146
  55. data/lib/graphql/language/sanitized_printer.rb +20 -22
  56. data/lib/graphql/language/static_visitor.rb +167 -0
  57. data/lib/graphql/language/visitor.rb +20 -81
  58. data/lib/graphql/language.rb +61 -0
  59. data/lib/graphql/load_application_object_failed_error.rb +5 -1
  60. data/lib/graphql/pagination/array_connection.rb +6 -6
  61. data/lib/graphql/pagination/connection.rb +28 -1
  62. data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -2
  63. data/lib/graphql/query/context/scoped_context.rb +101 -0
  64. data/lib/graphql/query/context.rb +66 -131
  65. data/lib/graphql/query/null_context.rb +4 -11
  66. data/lib/graphql/query/validation_pipeline.rb +4 -4
  67. data/lib/graphql/query/variables.rb +3 -3
  68. data/lib/graphql/query.rb +17 -26
  69. data/lib/graphql/railtie.rb +9 -6
  70. data/lib/graphql/rake_task.rb +3 -12
  71. data/lib/graphql/rubocop/graphql/base_cop.rb +1 -1
  72. data/lib/graphql/schema/addition.rb +21 -11
  73. data/lib/graphql/schema/argument.rb +43 -8
  74. data/lib/graphql/schema/base_64_encoder.rb +3 -5
  75. data/lib/graphql/schema/build_from_definition.rb +9 -12
  76. data/lib/graphql/schema/directive/one_of.rb +12 -0
  77. data/lib/graphql/schema/directive/specified_by.rb +14 -0
  78. data/lib/graphql/schema/directive.rb +3 -1
  79. data/lib/graphql/schema/enum.rb +3 -3
  80. data/lib/graphql/schema/field/connection_extension.rb +1 -15
  81. data/lib/graphql/schema/field/scope_extension.rb +8 -1
  82. data/lib/graphql/schema/field.rb +49 -35
  83. data/lib/graphql/schema/has_single_input_argument.rb +157 -0
  84. data/lib/graphql/schema/input_object.rb +4 -4
  85. data/lib/graphql/schema/interface.rb +10 -10
  86. data/lib/graphql/schema/introspection_system.rb +4 -2
  87. data/lib/graphql/schema/late_bound_type.rb +4 -0
  88. data/lib/graphql/schema/list.rb +2 -2
  89. data/lib/graphql/schema/loader.rb +2 -3
  90. data/lib/graphql/schema/member/base_dsl_methods.rb +2 -1
  91. data/lib/graphql/schema/member/has_arguments.rb +63 -73
  92. data/lib/graphql/schema/member/has_directives.rb +1 -1
  93. data/lib/graphql/schema/member/has_fields.rb +8 -5
  94. data/lib/graphql/schema/member/has_interfaces.rb +23 -9
  95. data/lib/graphql/schema/member/relay_shortcuts.rb +1 -1
  96. data/lib/graphql/schema/member/scoped.rb +19 -0
  97. data/lib/graphql/schema/member/type_system_helpers.rb +1 -2
  98. data/lib/graphql/schema/member/validates_input.rb +3 -3
  99. data/lib/graphql/schema/mutation.rb +7 -0
  100. data/lib/graphql/schema/object.rb +8 -0
  101. data/lib/graphql/schema/printer.rb +8 -7
  102. data/lib/graphql/schema/relay_classic_mutation.rb +6 -128
  103. data/lib/graphql/schema/resolver.rb +27 -13
  104. data/lib/graphql/schema/scalar.rb +3 -3
  105. data/lib/graphql/schema/subscription.rb +11 -4
  106. data/lib/graphql/schema/union.rb +1 -1
  107. data/lib/graphql/schema/unique_within_type.rb +1 -1
  108. data/lib/graphql/schema/warden.rb +96 -95
  109. data/lib/graphql/schema.rb +323 -102
  110. data/lib/graphql/static_validation/all_rules.rb +1 -1
  111. data/lib/graphql/static_validation/base_visitor.rb +1 -1
  112. data/lib/graphql/static_validation/literal_validator.rb +2 -3
  113. data/lib/graphql/static_validation/rules/fields_will_merge.rb +2 -2
  114. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +1 -1
  115. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +2 -2
  116. data/lib/graphql/static_validation/validation_context.rb +5 -5
  117. data/lib/graphql/static_validation/validator.rb +3 -0
  118. data/lib/graphql/static_validation.rb +0 -1
  119. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +4 -3
  120. data/lib/graphql/subscriptions/broadcast_analyzer.rb +1 -1
  121. data/lib/graphql/subscriptions/event.rb +8 -2
  122. data/lib/graphql/subscriptions/serialize.rb +2 -0
  123. data/lib/graphql/subscriptions.rb +15 -13
  124. data/lib/graphql/testing/helpers.rb +151 -0
  125. data/lib/graphql/testing.rb +2 -0
  126. data/lib/graphql/tracing/appoptics_trace.rb +2 -2
  127. data/lib/graphql/tracing/appoptics_tracing.rb +2 -2
  128. data/lib/graphql/tracing/legacy_hooks_trace.rb +74 -0
  129. data/lib/graphql/tracing/platform_tracing.rb +3 -1
  130. data/lib/graphql/tracing/{prometheus_tracing → prometheus_trace}/graphql_collector.rb +3 -1
  131. data/lib/graphql/tracing/prometheus_trace.rb +9 -9
  132. data/lib/graphql/tracing/sentry_trace.rb +112 -0
  133. data/lib/graphql/tracing/trace.rb +1 -0
  134. data/lib/graphql/tracing.rb +3 -1
  135. data/lib/graphql/type_kinds.rb +1 -1
  136. data/lib/graphql/types/iso_8601_duration.rb +77 -0
  137. data/lib/graphql/types/relay/connection_behaviors.rb +32 -2
  138. data/lib/graphql/types/relay/edge_behaviors.rb +7 -0
  139. data/lib/graphql/types.rb +1 -0
  140. data/lib/graphql/version.rb +1 -1
  141. data/lib/graphql.rb +13 -13
  142. data/readme.md +12 -2
  143. metadata +33 -26
  144. data/lib/graphql/analysis/ast/analyzer.rb +0 -84
  145. data/lib/graphql/analysis/ast/field_usage.rb +0 -57
  146. data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -22
  147. data/lib/graphql/analysis/ast/max_query_depth.rb +0 -22
  148. data/lib/graphql/analysis/ast/query_complexity.rb +0 -230
  149. data/lib/graphql/analysis/ast/query_depth.rb +0 -55
  150. data/lib/graphql/analysis/ast/visitor.rb +0 -276
  151. data/lib/graphql/analysis/ast.rb +0 -81
  152. data/lib/graphql/deprecation.rb +0 -9
  153. data/lib/graphql/filter.rb +0 -59
  154. data/lib/graphql/language/parser.y +0 -560
  155. data/lib/graphql/schema/base_64_bp.rb +0 -26
  156. data/lib/graphql/static_validation/type_stack.rb +0 -216
  157. data/lib/graphql/subscriptions/instrumentation.rb +0 -28
@@ -0,0 +1,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQL
4
+ module Tracing
5
+ module SentryTrace
6
+ include PlatformTrace
7
+
8
+ # @param set_transaction_name [Boolean] If true, the GraphQL operation name will be used as the transaction name.
9
+ # This is not advised if you run more than one query per HTTP request, for example, with `graphql-client` or multiplexing.
10
+ # It can also be specified per-query with `context[:set_sentry_transaction_name]`.
11
+ def initialize(set_transaction_name: false, **_rest)
12
+ @set_transaction_name = set_transaction_name
13
+ super
14
+ end
15
+
16
+ def execute_query(**data)
17
+ set_this_txn_name = data[:query].context[:set_sentry_transaction_name]
18
+ if set_this_txn_name == true || (set_this_txn_name.nil? && @set_transaction_name)
19
+ Sentry.configure_scope do |scope|
20
+ scope.set_transaction_name(transaction_name(data[:query]))
21
+ end
22
+ end
23
+ instrument_sentry_execution("graphql.execute", "execute_query", data) { super }
24
+ end
25
+
26
+ {
27
+ "lex" => "graphql.lex",
28
+ "parse" => "graphql.parse",
29
+ "validate" => "graphql.validate",
30
+ "analyze_query" => "graphql.analyze",
31
+ "analyze_multiplex" => "graphql.analyze_multiplex",
32
+ "execute_multiplex" => "graphql.execute_multiplex",
33
+ "execute_query_lazy" => "graphql.execute"
34
+ }.each do |trace_method, platform_key|
35
+ module_eval <<-RUBY, __FILE__, __LINE__
36
+ def #{trace_method}(**data)
37
+ instrument_sentry_execution("#{platform_key}", "#{trace_method}", data) { super }
38
+ end
39
+ RUBY
40
+ end
41
+
42
+ def platform_execute_field(platform_key, &block)
43
+ instrument_sentry_execution(platform_key, "execute_field", &block)
44
+ end
45
+
46
+ def platform_execute_field_lazy(platform_key, &block)
47
+ instrument_sentry_execution(platform_key, "execute_field_lazy", &block)
48
+ end
49
+
50
+ def platform_authorized(platform_key, &block)
51
+ instrument_sentry_execution(platform_key, "authorized", &block)
52
+ end
53
+
54
+ def platform_authorized_lazy(platform_key, &block)
55
+ instrument_sentry_execution(platform_key, "authorized_lazy", &block)
56
+ end
57
+
58
+ def platform_resolve_type(platform_key, &block)
59
+ instrument_sentry_execution(platform_key, "resolve_type", &block)
60
+ end
61
+
62
+ def platform_resolve_type_lazy(platform_key, &block)
63
+ instrument_sentry_execution(platform_key, "resolve_type_lazy", &block)
64
+ end
65
+
66
+ def platform_field_key(field)
67
+ "graphql.field.#{field.path}"
68
+ end
69
+
70
+ def platform_authorized_key(type)
71
+ "graphql.authorized.#{type.graphql_name}"
72
+ end
73
+
74
+ def platform_resolve_type_key(type)
75
+ "graphql.resolve_type.#{type.graphql_name}"
76
+ end
77
+
78
+ private
79
+
80
+ def instrument_sentry_execution(platform_key, trace_method, data=nil, &block)
81
+ return yield unless Sentry.initialized?
82
+
83
+ Sentry.with_child_span(op: platform_key, start_timestamp: Sentry.utc_now.to_f) do |span|
84
+ result = yield
85
+ return result unless span
86
+
87
+ span.finish
88
+ if trace_method == "execute_multiplex" && data.key?(:multiplex)
89
+ operation_names = data[:multiplex].queries.map{|q| operation_name(q) }
90
+ span.set_description(operation_names.join(", "))
91
+ elsif trace_method == "execute_query" && data.key?(:query)
92
+ span.set_description(operation_name(data[:query]))
93
+ span.set_data('graphql.document', data[:query].query_string)
94
+ span.set_data('graphql.operation.name', data[:query].selected_operation_name) if data[:query].selected_operation_name
95
+ span.set_data('graphql.operation.type', data[:query].selected_operation.operation_type)
96
+ end
97
+
98
+ result
99
+ end
100
+ end
101
+
102
+ def operation_name(query)
103
+ selected_op = query.selected_operation
104
+ if selected_op
105
+ [selected_op.operation_type, selected_op.name].compact.join(' ')
106
+ else
107
+ 'GraphQL Operation'
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
@@ -15,6 +15,7 @@ module GraphQL
15
15
  @query = query
16
16
  end
17
17
 
18
+ # The Ruby parser doesn't call this method (`graphql/c_parser` does.)
18
19
  def lex(query_string:)
19
20
  yield
20
21
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  require "graphql/tracing/trace"
3
3
  require "graphql/tracing/legacy_trace"
4
+ require "graphql/tracing/legacy_hooks_trace"
4
5
 
5
6
  # Legacy tracing:
6
7
  require "graphql/tracing/active_support_notifications_tracing"
@@ -21,11 +22,12 @@ require "graphql/tracing/appsignal_trace"
21
22
  require "graphql/tracing/data_dog_trace"
22
23
  require "graphql/tracing/new_relic_trace"
23
24
  require "graphql/tracing/notifications_trace"
25
+ require "graphql/tracing/sentry_trace"
24
26
  require "graphql/tracing/scout_trace"
25
27
  require "graphql/tracing/statsd_trace"
26
28
  require "graphql/tracing/prometheus_trace"
27
29
  if defined?(PrometheusExporter::Server)
28
- require "graphql/tracing/prometheus_tracing/graphql_collector"
30
+ require "graphql/tracing/prometheus_trace/graphql_collector"
29
31
  end
30
32
 
31
33
  module GraphQL
@@ -16,7 +16,7 @@ module GraphQL
16
16
  @description = description
17
17
  end
18
18
 
19
- # Does this TypeKind have multiple possible implementors?
19
+ # Does this TypeKind have multiple possible implementers?
20
20
  # @deprecated Use `abstract?` instead of `resolves?`.
21
21
  def resolves?; @abstract; end
22
22
  # Is this TypeKind abstract?
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Types
4
+ # This scalar takes `Duration`s and transmits them as strings,
5
+ # using ISO 8601 format. ActiveSupport >= 5.0 must be loaded to use
6
+ # this scalar.
7
+ #
8
+ # Use it for fields or arguments as follows:
9
+ #
10
+ # field :age, GraphQL::Types::ISO8601Duration, null: false
11
+ #
12
+ # argument :interval, GraphQL::Types::ISO8601Duration, null: false
13
+ #
14
+ # Alternatively, use this built-in scalar as inspiration for your
15
+ # own Duration type.
16
+ class ISO8601Duration < GraphQL::Schema::Scalar
17
+ description "An ISO 8601-encoded duration"
18
+
19
+ # @return [Integer, nil]
20
+ def self.seconds_precision
21
+ # ActiveSupport::Duration precision defaults to whatever input was given
22
+ @seconds_precision
23
+ end
24
+
25
+ # @param [Integer, nil] value
26
+ def self.seconds_precision=(value)
27
+ @seconds_precision = value
28
+ end
29
+
30
+ # @param value [ActiveSupport::Duration, String]
31
+ # @return [String]
32
+ # @raise [GraphQL::Error] if ActiveSupport::Duration is not defined or if an incompatible object is passed
33
+ def self.coerce_result(value, _ctx)
34
+ unless defined?(ActiveSupport::Duration)
35
+ raise GraphQL::Error, "ActiveSupport >= 5.0 must be loaded to use the built-in ISO8601Duration type."
36
+ end
37
+
38
+ begin
39
+ case value
40
+ when ActiveSupport::Duration
41
+ value.iso8601(precision: seconds_precision)
42
+ when ::String
43
+ ActiveSupport::Duration.parse(value).iso8601(precision: seconds_precision)
44
+ else
45
+ # Try calling as ActiveSupport::Duration compatible as a fallback
46
+ value.iso8601(precision: seconds_precision)
47
+ end
48
+ rescue StandardError => error
49
+ raise GraphQL::Error, "An incompatible object (#{value.class}) was given to #{self}. Make sure that only ActiveSupport::Durations and well-formatted Strings are used with this type. (#{error.message})"
50
+ end
51
+ end
52
+
53
+ # @param value [String, ActiveSupport::Duration]
54
+ # @return [ActiveSupport::Duration, nil]
55
+ # @raise [GraphQL::Error] if ActiveSupport::Duration is not defined
56
+ # @raise [GraphQL::DurationEncodingError] if duration cannot be parsed
57
+ def self.coerce_input(value, ctx)
58
+ unless defined?(ActiveSupport::Duration)
59
+ raise GraphQL::Error, "ActiveSupport >= 5.0 must be loaded to use the built-in ISO8601Duration type."
60
+ end
61
+
62
+ begin
63
+ if value.is_a?(ActiveSupport::Duration)
64
+ value
65
+ elsif value.nil?
66
+ nil
67
+ else
68
+ ActiveSupport::Duration.parse(value)
69
+ end
70
+ rescue ArgumentError, TypeError
71
+ err = GraphQL::DurationEncodingError.new(value)
72
+ ctx.schema.type_error(err, ctx)
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -67,9 +67,8 @@ module GraphQL
67
67
  type: [edge_type_class, null: edge_nullable],
68
68
  null: edges_nullable,
69
69
  description: "A list of edges.",
70
+ scope: false, # Assume that the connection was already scoped.
70
71
  connection: false,
71
- # Assume that the connection was scoped before this step:
72
- scope: false,
73
72
  }
74
73
 
75
74
  if field_options
@@ -88,6 +87,19 @@ module GraphQL
88
87
  node_type.scope_items(items, context)
89
88
  end
90
89
 
90
+ # The connection will skip auth on its nodes if the node_type is configured for that
91
+ def reauthorize_scoped_objects(new_value = nil)
92
+ if new_value.nil?
93
+ if @reauthorize_scoped_objects != nil
94
+ @reauthorize_scoped_objects
95
+ else
96
+ node_type.reauthorize_scoped_objects
97
+ end
98
+ else
99
+ @reauthorize_scoped_objects = new_value
100
+ end
101
+ end
102
+
91
103
  # Add the shortcut `nodes` field to this connection and its subclasses
92
104
  def nodes_field(node_nullable: self.node_nullable, field_options: nil)
93
105
  define_nodes_field(node_nullable, field_options: field_options)
@@ -170,6 +182,24 @@ module GraphQL
170
182
  obj_type.field :page_info, GraphQL::Types::Relay::PageInfo, null: false, description: "Information to aid in pagination."
171
183
  end
172
184
  end
185
+
186
+ def edges
187
+ # Assume that whatever authorization needed to happen
188
+ # already happened at the connection level.
189
+ current_runtime_state = Thread.current[:__graphql_runtime_info]
190
+ query_runtime_state = current_runtime_state[context.query]
191
+ query_runtime_state.was_authorized_by_scope_items = @object.was_authorized_by_scope_items?
192
+ @object.edges
193
+ end
194
+
195
+ def nodes
196
+ # Assume that whatever authorization needed to happen
197
+ # already happened at the connection level.
198
+ current_runtime_state = Thread.current[:__graphql_runtime_info]
199
+ query_runtime_state = current_runtime_state[context.query]
200
+ query_runtime_state.was_authorized_by_scope_items = @object.was_authorized_by_scope_items?
201
+ @object.nodes
202
+ end
173
203
  end
174
204
  end
175
205
  end
@@ -12,6 +12,13 @@ module GraphQL
12
12
  child_class.node_nullable(true)
13
13
  end
14
14
 
15
+ def node
16
+ current_runtime_state = Thread.current[:__graphql_runtime_info]
17
+ query_runtime_state = current_runtime_state[context.query]
18
+ query_runtime_state.was_authorized_by_scope_items = @object.was_authorized_by_scope_items?
19
+ @object.node
20
+ end
21
+
15
22
  module ClassMethods
16
23
  def inherited(child_class)
17
24
  super
data/lib/graphql/types.rb CHANGED
@@ -6,6 +6,7 @@ require "graphql/types/id"
6
6
  require "graphql/types/int"
7
7
  require "graphql/types/iso_8601_date"
8
8
  require "graphql/types/iso_8601_date_time"
9
+ require "graphql/types/iso_8601_duration"
9
10
  require "graphql/types/json"
10
11
  require "graphql/types/string"
11
12
  require "graphql/types/relay"
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module GraphQL
3
- VERSION = "2.0.30"
3
+ VERSION = "2.3.6"
4
4
  end
data/lib/graphql.rb CHANGED
@@ -6,14 +6,6 @@ require "singleton"
6
6
  require "forwardable"
7
7
 
8
8
  module GraphQL
9
- # forwards-compat for argument handling
10
- module Ruby2Keywords
11
- if RUBY_VERSION < "2.7"
12
- def ruby2_keywords(*)
13
- end
14
- end
15
- end
16
-
17
9
  class Error < StandardError
18
10
  end
19
11
 
@@ -42,8 +34,8 @@ This is probably a bug in GraphQL-Ruby, please report this error on GitHub: http
42
34
  # Turn a query string or schema definition into an AST
43
35
  # @param graphql_string [String] a GraphQL query string or schema definition
44
36
  # @return [GraphQL::Language::Nodes::Document]
45
- def self.parse(graphql_string, trace: GraphQL::Tracing::NullTrace)
46
- default_parser.parse(graphql_string, trace: trace)
37
+ def self.parse(graphql_string, trace: GraphQL::Tracing::NullTrace, filename: nil, max_tokens: nil)
38
+ default_parser.parse(graphql_string, trace: trace, filename: filename, max_tokens: max_tokens)
47
39
  end
48
40
 
49
41
  # Read the contents of `filename` and parse them as GraphQL
@@ -60,6 +52,7 @@ This is probably a bug in GraphQL-Ruby, please report this error on GitHub: http
60
52
  end
61
53
 
62
54
  def self.parse_with_racc(string, filename: nil, trace: GraphQL::Tracing::NullTrace)
55
+ warn "`GraphQL.parse_with_racc` is deprecated; GraphQL-Ruby no longer uses racc for parsing. Call `GraphQL.parse` or `GraphQL::Language::Parser.parse` instead."
63
56
  GraphQL::Language::Parser.parse(string, filename: filename, trace: trace)
64
57
  end
65
58
 
@@ -73,6 +66,13 @@ This is probably a bug in GraphQL-Ruby, please report this error on GitHub: http
73
66
  EMPTY_HASH = {}.freeze
74
67
  EMPTY_ARRAY = [].freeze
75
68
  end
69
+
70
+ class << self
71
+ # If true, the parser should raise when an integer or float is followed immediately by an identifier (instead of a space or punctuation)
72
+ attr_accessor :reject_numbers_followed_by_names
73
+ end
74
+
75
+ self.reject_numbers_followed_by_names = false
76
76
  end
77
77
 
78
78
  # Order matters for these:
@@ -88,6 +88,7 @@ require "graphql/integer_decoding_error"
88
88
  require "graphql/integer_encoding_error"
89
89
  require "graphql/string_encoding_error"
90
90
  require "graphql/date_encoding_error"
91
+ require "graphql/duration_encoding_error"
91
92
  require "graphql/type_kinds"
92
93
  require "graphql/name_validator"
93
94
  require "graphql/language"
@@ -101,9 +102,8 @@ require "graphql/execution"
101
102
  require "graphql/pagination"
102
103
  require "graphql/schema"
103
104
  require "graphql/query"
104
- require "graphql/types"
105
105
  require "graphql/dataloader"
106
- require "graphql/filter"
106
+ require "graphql/types"
107
107
  require "graphql/static_validation"
108
108
  require "graphql/execution"
109
109
  require "graphql/schema/built_in_types"
@@ -120,4 +120,4 @@ require "graphql/backtrace"
120
120
  require "graphql/unauthorized_error"
121
121
  require "graphql/unauthorized_field_error"
122
122
  require "graphql/load_application_object_failed_error"
123
- require "graphql/deprecation"
123
+ require "graphql/testing"
data/readme.md CHANGED
@@ -7,7 +7,7 @@ A Ruby implementation of [GraphQL](https://graphql.org/).
7
7
 
8
8
  - [Website](https://graphql-ruby.org/)
9
9
  - [API Documentation](https://www.rubydoc.info/github/rmosolgo/graphql-ruby)
10
- - [Newsletter](https://tinyletter.com/graphql-ruby)
10
+ - [Newsletter](https://buttondown.email/graphql-ruby)
11
11
 
12
12
  ## Installation
13
13
 
@@ -34,7 +34,17 @@ Or, see ["Getting Started"](https://graphql-ruby.org/getting_started.html).
34
34
 
35
35
  ## Upgrade
36
36
 
37
- I also sell [GraphQL::Pro](https://graphql.pro) which provides several features on top of the GraphQL runtime, including [Pundit authorization](https://graphql-ruby.org/authorization/pundit_integration), [CanCan authorization](https://graphql-ruby.org/authorization/can_can_integration), [Pusher-based subscriptions](https://graphql-ruby.org/subscriptions/pusher_implementation) and [persisted queries](https://graphql-ruby.org/operation_store/overview). Besides that, Pro customers get email support and an opportunity to support graphql-ruby's development!
37
+ I also sell [GraphQL::Pro](https://graphql.pro) which provides several features on top of the GraphQL runtime, including:
38
+
39
+ - [Persisted queries](https://graphql-ruby.org/operation_store/overview)
40
+ - [API versioning](https://graphql-ruby.org/changesets/overview)
41
+ - [Streaming payloads](https://graphql-ruby.org/defer/overview)
42
+ - [Server-side caching](https://graphql-ruby.org/object_cache/overview)
43
+ - [Rate limiters](https://graphql-ruby.org/limiters/overview)
44
+ - Subscriptions backends for [Pusher](https://graphql-ruby.org/subscriptions/pusher_implementation) and [Ably](https://graphql-ruby.org/subscriptions/ably_implementation)
45
+ - Authorization plugins for [Pundit](https://graphql-ruby.org/authorization/pundit_integration) and [CanCan](https://graphql-ruby.org/authorization/can_can_integration)
46
+
47
+ Besides that, Pro customers get email support and an opportunity to support graphql-ruby's development!
38
48
 
39
49
  ## Goals
40
50
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.30
4
+ version: 2.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Mosolgo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-05-09 00:00:00.000000000 Z
11
+ date: 2024-06-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: base64
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: memory_profiler
56
+ name: graphql-batch
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,19 +67,19 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: racc
70
+ name: memory_profiler
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '1.4'
75
+ version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: '1.4'
82
+ version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: minitest
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -284,6 +284,7 @@ files:
284
284
  - lib/generators/graphql/templates/base_input_object.erb
285
285
  - lib/generators/graphql/templates/base_interface.erb
286
286
  - lib/generators/graphql/templates/base_object.erb
287
+ - lib/generators/graphql/templates/base_resolver.erb
287
288
  - lib/generators/graphql/templates/base_scalar.erb
288
289
  - lib/generators/graphql/templates/base_union.erb
289
290
  - lib/generators/graphql/templates/enum.erb
@@ -305,14 +306,13 @@ files:
305
306
  - lib/generators/graphql/union_generator.rb
306
307
  - lib/graphql.rb
307
308
  - lib/graphql/analysis.rb
308
- - lib/graphql/analysis/ast.rb
309
- - lib/graphql/analysis/ast/analyzer.rb
310
- - lib/graphql/analysis/ast/field_usage.rb
311
- - lib/graphql/analysis/ast/max_query_complexity.rb
312
- - lib/graphql/analysis/ast/max_query_depth.rb
313
- - lib/graphql/analysis/ast/query_complexity.rb
314
- - lib/graphql/analysis/ast/query_depth.rb
315
- - lib/graphql/analysis/ast/visitor.rb
309
+ - lib/graphql/analysis/analyzer.rb
310
+ - lib/graphql/analysis/field_usage.rb
311
+ - lib/graphql/analysis/max_query_complexity.rb
312
+ - lib/graphql/analysis/max_query_depth.rb
313
+ - lib/graphql/analysis/query_complexity.rb
314
+ - lib/graphql/analysis/query_depth.rb
315
+ - lib/graphql/analysis/visitor.rb
316
316
  - lib/graphql/analysis_error.rb
317
317
  - lib/graphql/backtrace.rb
318
318
  - lib/graphql/backtrace/inspect_result.rb
@@ -322,13 +322,14 @@ files:
322
322
  - lib/graphql/backtrace/tracer.rb
323
323
  - lib/graphql/coercion_error.rb
324
324
  - lib/graphql/dataloader.rb
325
+ - lib/graphql/dataloader/async_dataloader.rb
325
326
  - lib/graphql/dataloader/null_dataloader.rb
326
327
  - lib/graphql/dataloader/request.rb
327
328
  - lib/graphql/dataloader/request_all.rb
328
329
  - lib/graphql/dataloader/source.rb
329
330
  - lib/graphql/date_encoding_error.rb
330
- - lib/graphql/deprecation.rb
331
331
  - lib/graphql/dig.rb
332
+ - lib/graphql/duration_encoding_error.rb
332
333
  - lib/graphql/execution.rb
333
334
  - lib/graphql/execution/directive_checks.rb
334
335
  - lib/graphql/execution/errors.rb
@@ -340,12 +341,12 @@ files:
340
341
  - lib/graphql/execution/interpreter/handles_raw_value.rb
341
342
  - lib/graphql/execution/interpreter/resolve.rb
342
343
  - lib/graphql/execution/interpreter/runtime.rb
344
+ - lib/graphql/execution/interpreter/runtime/graphql_result.rb
343
345
  - lib/graphql/execution/lazy.rb
344
346
  - lib/graphql/execution/lazy/lazy_method_map.rb
345
347
  - lib/graphql/execution/lookahead.rb
346
348
  - lib/graphql/execution/multiplex.rb
347
349
  - lib/graphql/execution_error.rb
348
- - lib/graphql/filter.rb
349
350
  - lib/graphql/integer_decoding_error.rb
350
351
  - lib/graphql/integer_encoding_error.rb
351
352
  - lib/graphql/introspection.rb
@@ -372,9 +373,9 @@ files:
372
373
  - lib/graphql/language/lexer.rb
373
374
  - lib/graphql/language/nodes.rb
374
375
  - lib/graphql/language/parser.rb
375
- - lib/graphql/language/parser.y
376
376
  - lib/graphql/language/printer.rb
377
377
  - lib/graphql/language/sanitized_printer.rb
378
+ - lib/graphql/language/static_visitor.rb
378
379
  - lib/graphql/language/token.rb
379
380
  - lib/graphql/language/visitor.rb
380
381
  - lib/graphql/load_application_object_failed_error.rb
@@ -390,6 +391,7 @@ files:
390
391
  - lib/graphql/parse_error.rb
391
392
  - lib/graphql/query.rb
392
393
  - lib/graphql/query/context.rb
394
+ - lib/graphql/query/context/scoped_context.rb
393
395
  - lib/graphql/query/fingerprint.rb
394
396
  - lib/graphql/query/input_validation_result.rb
395
397
  - lib/graphql/query/null_context.rb
@@ -411,7 +413,6 @@ files:
411
413
  - lib/graphql/schema/addition.rb
412
414
  - lib/graphql/schema/always_visible.rb
413
415
  - lib/graphql/schema/argument.rb
414
- - lib/graphql/schema/base_64_bp.rb
415
416
  - lib/graphql/schema/base_64_encoder.rb
416
417
  - lib/graphql/schema/build_from_definition.rb
417
418
  - lib/graphql/schema/build_from_definition/resolve_map.rb
@@ -424,6 +425,7 @@ files:
424
425
  - lib/graphql/schema/directive/include.rb
425
426
  - lib/graphql/schema/directive/one_of.rb
426
427
  - lib/graphql/schema/directive/skip.rb
428
+ - lib/graphql/schema/directive/specified_by.rb
427
429
  - lib/graphql/schema/directive/transform.rb
428
430
  - lib/graphql/schema/enum.rb
429
431
  - lib/graphql/schema/enum_value.rb
@@ -433,6 +435,7 @@ files:
433
435
  - lib/graphql/schema/field_extension.rb
434
436
  - lib/graphql/schema/find_inherited_value.rb
435
437
  - lib/graphql/schema/finder.rb
438
+ - lib/graphql/schema/has_single_input_argument.rb
436
439
  - lib/graphql/schema/input_object.rb
437
440
  - lib/graphql/schema/interface.rb
438
441
  - lib/graphql/schema/introspection_system.rb
@@ -550,7 +553,6 @@ files:
550
553
  - lib/graphql/static_validation/rules/variables_are_input_types_error.rb
551
554
  - lib/graphql/static_validation/rules/variables_are_used_and_defined.rb
552
555
  - lib/graphql/static_validation/rules/variables_are_used_and_defined_error.rb
553
- - lib/graphql/static_validation/type_stack.rb
554
556
  - lib/graphql/static_validation/validation_context.rb
555
557
  - lib/graphql/static_validation/validation_timeout_error.rb
556
558
  - lib/graphql/static_validation/validator.rb
@@ -560,8 +562,9 @@ files:
560
562
  - lib/graphql/subscriptions/broadcast_analyzer.rb
561
563
  - lib/graphql/subscriptions/default_subscription_resolve_extension.rb
562
564
  - lib/graphql/subscriptions/event.rb
563
- - lib/graphql/subscriptions/instrumentation.rb
564
565
  - lib/graphql/subscriptions/serialize.rb
566
+ - lib/graphql/testing.rb
567
+ - lib/graphql/testing/helpers.rb
565
568
  - lib/graphql/tracing.rb
566
569
  - lib/graphql/tracing/active_support_notifications_trace.rb
567
570
  - lib/graphql/tracing/active_support_notifications_tracing.rb
@@ -571,6 +574,7 @@ files:
571
574
  - lib/graphql/tracing/appsignal_tracing.rb
572
575
  - lib/graphql/tracing/data_dog_trace.rb
573
576
  - lib/graphql/tracing/data_dog_tracing.rb
577
+ - lib/graphql/tracing/legacy_hooks_trace.rb
574
578
  - lib/graphql/tracing/legacy_trace.rb
575
579
  - lib/graphql/tracing/new_relic_trace.rb
576
580
  - lib/graphql/tracing/new_relic_tracing.rb
@@ -579,10 +583,11 @@ files:
579
583
  - lib/graphql/tracing/platform_trace.rb
580
584
  - lib/graphql/tracing/platform_tracing.rb
581
585
  - lib/graphql/tracing/prometheus_trace.rb
586
+ - lib/graphql/tracing/prometheus_trace/graphql_collector.rb
582
587
  - lib/graphql/tracing/prometheus_tracing.rb
583
- - lib/graphql/tracing/prometheus_tracing/graphql_collector.rb
584
588
  - lib/graphql/tracing/scout_trace.rb
585
589
  - lib/graphql/tracing/scout_tracing.rb
590
+ - lib/graphql/tracing/sentry_trace.rb
586
591
  - lib/graphql/tracing/statsd_trace.rb
587
592
  - lib/graphql/tracing/statsd_tracing.rb
588
593
  - lib/graphql/tracing/trace.rb
@@ -595,6 +600,7 @@ files:
595
600
  - lib/graphql/types/int.rb
596
601
  - lib/graphql/types/iso_8601_date.rb
597
602
  - lib/graphql/types/iso_8601_date_time.rb
603
+ - lib/graphql/types/iso_8601_duration.rb
598
604
  - lib/graphql/types/json.rb
599
605
  - lib/graphql/types/relay.rb
600
606
  - lib/graphql/types/relay/base_connection.rb
@@ -621,7 +627,8 @@ metadata:
621
627
  changelog_uri: https://github.com/rmosolgo/graphql-ruby/blob/master/CHANGELOG.md
622
628
  source_code_uri: https://github.com/rmosolgo/graphql-ruby
623
629
  bug_tracker_uri: https://github.com/rmosolgo/graphql-ruby/issues
624
- mailing_list_uri: https://tinyletter.com/graphql-ruby
630
+ mailing_list_uri: https://buttondown.email/graphql-ruby
631
+ rubygems_mfa_required: 'true'
625
632
  post_install_message:
626
633
  rdoc_options: []
627
634
  require_paths:
@@ -630,14 +637,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
630
637
  requirements:
631
638
  - - ">="
632
639
  - !ruby/object:Gem::Version
633
- version: 2.4.0
640
+ version: 2.7.0
634
641
  required_rubygems_version: !ruby/object:Gem::Requirement
635
642
  requirements:
636
643
  - - ">="
637
644
  - !ruby/object:Gem::Version
638
645
  version: '0'
639
646
  requirements: []
640
- rubygems_version: 3.5.3
647
+ rubygems_version: 3.5.12
641
648
  signing_key:
642
649
  specification_version: 4
643
650
  summary: A GraphQL language and runtime for Ruby