graphql 2.2.5 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/lib/graphql/analysis/ast/field_usage.rb +32 -7
  3. data/lib/graphql/analysis/ast/visitor.rb +8 -0
  4. data/lib/graphql/analysis/ast.rb +10 -1
  5. data/lib/graphql/backtrace/inspect_result.rb +0 -12
  6. data/lib/graphql/coercion_error.rb +1 -9
  7. data/lib/graphql/dataloader/request.rb +5 -0
  8. data/lib/graphql/execution/interpreter/runtime.rb +9 -0
  9. data/lib/graphql/execution/interpreter.rb +90 -150
  10. data/lib/graphql/introspection/entry_points.rb +9 -3
  11. data/lib/graphql/introspection/schema_type.rb +3 -1
  12. data/lib/graphql/language/document_from_schema_definition.rb +2 -3
  13. data/lib/graphql/language/lexer.rb +29 -28
  14. data/lib/graphql/language/nodes.rb +1 -1
  15. data/lib/graphql/language/parser.rb +12 -8
  16. data/lib/graphql/language/printer.rb +4 -0
  17. data/lib/graphql/language.rb +37 -0
  18. data/lib/graphql/pagination/array_connection.rb +6 -6
  19. data/lib/graphql/query/context.rb +30 -33
  20. data/lib/graphql/query/validation_pipeline.rb +2 -2
  21. data/lib/graphql/query/variables.rb +3 -3
  22. data/lib/graphql/query.rb +2 -2
  23. data/lib/graphql/schema/base_64_encoder.rb +3 -5
  24. data/lib/graphql/schema/build_from_definition.rb +3 -1
  25. data/lib/graphql/schema/field.rb +33 -30
  26. data/lib/graphql/schema/interface.rb +5 -1
  27. data/lib/graphql/schema/loader.rb +2 -1
  28. data/lib/graphql/schema/member/has_arguments.rb +2 -2
  29. data/lib/graphql/schema/resolver.rb +9 -5
  30. data/lib/graphql/schema/unique_within_type.rb +1 -1
  31. data/lib/graphql/schema.rb +108 -28
  32. data/lib/graphql/static_validation/literal_validator.rb +1 -2
  33. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +1 -1
  34. data/lib/graphql/static_validation/validator.rb +3 -0
  35. data/lib/graphql/subscriptions/serialize.rb +2 -0
  36. data/lib/graphql/subscriptions.rb +0 -3
  37. data/lib/graphql/testing/helpers.rb +8 -4
  38. data/lib/graphql/tracing/data_dog_trace.rb +21 -34
  39. data/lib/graphql/tracing/data_dog_tracing.rb +7 -21
  40. data/lib/graphql/tracing/legacy_hooks_trace.rb +74 -0
  41. data/lib/graphql/tracing/platform_tracing.rb +3 -1
  42. data/lib/graphql/tracing/{prometheus_tracing → prometheus_trace}/graphql_collector.rb +3 -1
  43. data/lib/graphql/tracing/sentry_trace.rb +112 -0
  44. data/lib/graphql/tracing.rb +3 -1
  45. data/lib/graphql/version.rb +1 -1
  46. data/lib/graphql.rb +3 -2
  47. metadata +38 -23
  48. data/lib/graphql/schema/base_64_bp.rb +0 -26
  49. 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_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_execution("#{platform_key}", "#{trace_method}", data) { super }
38
+ end
39
+ RUBY
40
+ end
41
+
42
+ def platform_execute_field(platform_key, &block)
43
+ instrument_execution(platform_key, "execute_field", &block)
44
+ end
45
+
46
+ def platform_execute_field_lazy(platform_key, &block)
47
+ instrument_execution(platform_key, "execute_field_lazy", &block)
48
+ end
49
+
50
+ def platform_authorized(platform_key, &block)
51
+ instrument_execution(platform_key, "authorized", &block)
52
+ end
53
+
54
+ def platform_authorized_lazy(platform_key, &block)
55
+ instrument_execution(platform_key, "authorized_lazy", &block)
56
+ end
57
+
58
+ def platform_resolve_type(platform_key, &block)
59
+ instrument_execution(platform_key, "resolve_type", &block)
60
+ end
61
+
62
+ def platform_resolve_type_lazy(platform_key, &block)
63
+ instrument_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_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
@@ -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
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module GraphQL
3
- VERSION = "2.2.5"
3
+ VERSION = "2.3.0"
4
4
  end
data/lib/graphql.rb CHANGED
@@ -42,8 +42,8 @@ This is probably a bug in GraphQL-Ruby, please report this error on GitHub: http
42
42
  # Turn a query string or schema definition into an AST
43
43
  # @param graphql_string [String] a GraphQL query string or schema definition
44
44
  # @return [GraphQL::Language::Nodes::Document]
45
- def self.parse(graphql_string, trace: GraphQL::Tracing::NullTrace)
46
- default_parser.parse(graphql_string, trace: trace)
45
+ def self.parse(graphql_string, trace: GraphQL::Tracing::NullTrace, filename: nil)
46
+ default_parser.parse(graphql_string, trace: trace, filename: filename)
47
47
  end
48
48
 
49
49
  # Read the contents of `filename` and parse them as GraphQL
@@ -60,6 +60,7 @@ This is probably a bug in GraphQL-Ruby, please report this error on GitHub: http
60
60
  end
61
61
 
62
62
  def self.parse_with_racc(string, filename: nil, trace: GraphQL::Tracing::NullTrace)
63
+ 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
64
  GraphQL::Language::Parser.parse(string, filename: filename, trace: trace)
64
65
  end
65
66
 
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.5
4
+ version: 2.3.0
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-01-10 00:00:00.000000000 Z
11
+ date: 2024-03-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: racc
14
+ name: base64
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.4'
19
+ version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.4'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: benchmark-ips
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '1.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: graphql-batch
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: memory_profiler
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -70,44 +84,44 @@ dependencies:
70
84
  name: minitest
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - "~>"
87
+ - - ">="
74
88
  - !ruby/object:Gem::Version
75
- version: 5.9.0
89
+ version: '0'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - "~>"
94
+ - - ">="
81
95
  - !ruby/object:Gem::Version
82
- version: 5.9.0
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: minitest-focus
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - "~>"
101
+ - - ">="
88
102
  - !ruby/object:Gem::Version
89
- version: '1.1'
103
+ version: '0'
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
- - - "~>"
108
+ - - ">="
95
109
  - !ruby/object:Gem::Version
96
- version: '1.1'
110
+ version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: minitest-reporters
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
- - - "~>"
115
+ - - ">="
102
116
  - !ruby/object:Gem::Version
103
- version: '1.0'
117
+ version: '0'
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
- - - "~>"
122
+ - - ">="
109
123
  - !ruby/object:Gem::Version
110
- version: '1.0'
124
+ version: '0'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: rake
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -400,7 +414,6 @@ files:
400
414
  - lib/graphql/schema/addition.rb
401
415
  - lib/graphql/schema/always_visible.rb
402
416
  - lib/graphql/schema/argument.rb
403
- - lib/graphql/schema/base_64_bp.rb
404
417
  - lib/graphql/schema/base_64_encoder.rb
405
418
  - lib/graphql/schema/build_from_definition.rb
406
419
  - lib/graphql/schema/build_from_definition/resolve_map.rb
@@ -550,7 +563,6 @@ files:
550
563
  - lib/graphql/subscriptions/broadcast_analyzer.rb
551
564
  - lib/graphql/subscriptions/default_subscription_resolve_extension.rb
552
565
  - lib/graphql/subscriptions/event.rb
553
- - lib/graphql/subscriptions/instrumentation.rb
554
566
  - lib/graphql/subscriptions/serialize.rb
555
567
  - lib/graphql/testing.rb
556
568
  - lib/graphql/testing/helpers.rb
@@ -563,6 +575,7 @@ files:
563
575
  - lib/graphql/tracing/appsignal_tracing.rb
564
576
  - lib/graphql/tracing/data_dog_trace.rb
565
577
  - lib/graphql/tracing/data_dog_tracing.rb
578
+ - lib/graphql/tracing/legacy_hooks_trace.rb
566
579
  - lib/graphql/tracing/legacy_trace.rb
567
580
  - lib/graphql/tracing/new_relic_trace.rb
568
581
  - lib/graphql/tracing/new_relic_tracing.rb
@@ -571,10 +584,11 @@ files:
571
584
  - lib/graphql/tracing/platform_trace.rb
572
585
  - lib/graphql/tracing/platform_tracing.rb
573
586
  - lib/graphql/tracing/prometheus_trace.rb
587
+ - lib/graphql/tracing/prometheus_trace/graphql_collector.rb
574
588
  - lib/graphql/tracing/prometheus_tracing.rb
575
- - lib/graphql/tracing/prometheus_tracing/graphql_collector.rb
576
589
  - lib/graphql/tracing/scout_trace.rb
577
590
  - lib/graphql/tracing/scout_tracing.rb
591
+ - lib/graphql/tracing/sentry_trace.rb
578
592
  - lib/graphql/tracing/statsd_trace.rb
579
593
  - lib/graphql/tracing/statsd_tracing.rb
580
594
  - lib/graphql/tracing/trace.rb
@@ -615,6 +629,7 @@ metadata:
615
629
  source_code_uri: https://github.com/rmosolgo/graphql-ruby
616
630
  bug_tracker_uri: https://github.com/rmosolgo/graphql-ruby/issues
617
631
  mailing_list_uri: https://buttondown.email/graphql-ruby
632
+ rubygems_mfa_required: 'true'
618
633
  post_install_message:
619
634
  rdoc_options: []
620
635
  require_paths:
@@ -630,7 +645,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
630
645
  - !ruby/object:Gem::Version
631
646
  version: '0'
632
647
  requirements: []
633
- rubygems_version: 3.4.10
648
+ rubygems_version: 3.5.3
634
649
  signing_key:
635
650
  specification_version: 4
636
651
  summary: A GraphQL language and runtime for Ruby
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'base64'
4
-
5
- # backport from ruby v2.5 to v2.2 that has no `padding` things
6
- # @api private
7
- module Base64Bp
8
- extend Base64
9
-
10
- module_function
11
-
12
- def urlsafe_encode64(bin, padding:)
13
- str = strict_encode64(bin)
14
- str.tr!("+/", "-_")
15
- str.delete!("=") unless padding
16
- str
17
- end
18
-
19
- def urlsafe_decode64(str)
20
- str = str.tr("-_", "+/")
21
- if !str.end_with?("=") && str.length % 4 != 0
22
- str = str.ljust((str.length + 3) & ~3, "=")
23
- end
24
- strict_decode64(str)
25
- end
26
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- class Subscriptions
4
- # Wrap the root fields of the subscription type with special logic for:
5
- # - Registering the subscription during the first execution
6
- # - Evaluating the triggered portion(s) of the subscription during later execution
7
- class Instrumentation
8
- def initialize(schema:)
9
- @schema = schema
10
- end
11
-
12
- # If needed, prepare to gather events which this query subscribes to
13
- def before_query(query)
14
- if query.subscription? && !query.subscription_update?
15
- query.context.namespace(:subscriptions)[:events] = []
16
- end
17
- end
18
-
19
- # After checking the root fields, pass the gathered events to the store
20
- def after_query(query)
21
- events = query.context.namespace(:subscriptions)[:events]
22
- if events && events.any?
23
- @schema.subscriptions.write_subscription(query, events)
24
- end
25
- end
26
- end
27
- end
28
- end