graphql 2.4.8 → 2.4.11

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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/lib/graphql/backtrace/table.rb +95 -55
  3. data/lib/graphql/backtrace.rb +1 -19
  4. data/lib/graphql/current.rb +5 -0
  5. data/lib/graphql/dashboard/statics/bootstrap-5.3.3.min.css +6 -0
  6. data/lib/graphql/dashboard/statics/bootstrap-5.3.3.min.js +7 -0
  7. data/lib/graphql/dashboard/statics/dashboard.css +3 -0
  8. data/lib/graphql/dashboard/statics/dashboard.js +78 -0
  9. data/lib/graphql/dashboard/statics/header-icon.png +0 -0
  10. data/lib/graphql/dashboard/statics/icon.png +0 -0
  11. data/lib/graphql/dashboard/views/graphql/dashboard/landings/show.html.erb +18 -0
  12. data/lib/graphql/dashboard/views/graphql/dashboard/traces/index.html.erb +63 -0
  13. data/lib/graphql/dashboard/views/layouts/graphql/dashboard/application.html.erb +60 -0
  14. data/lib/graphql/dashboard.rb +142 -0
  15. data/lib/graphql/dataloader/active_record_association_source.rb +64 -0
  16. data/lib/graphql/dataloader/active_record_source.rb +26 -0
  17. data/lib/graphql/dataloader/async_dataloader.rb +17 -5
  18. data/lib/graphql/dataloader/null_dataloader.rb +1 -1
  19. data/lib/graphql/dataloader/source.rb +2 -2
  20. data/lib/graphql/dataloader.rb +37 -5
  21. data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +11 -4
  22. data/lib/graphql/execution/interpreter/runtime.rb +60 -33
  23. data/lib/graphql/execution/interpreter.rb +9 -1
  24. data/lib/graphql/execution/multiplex.rb +0 -4
  25. data/lib/graphql/introspection/directive_location_enum.rb +1 -1
  26. data/lib/graphql/invalid_name_error.rb +1 -1
  27. data/lib/graphql/invalid_null_error.rb +6 -12
  28. data/lib/graphql/language/parser.rb +1 -1
  29. data/lib/graphql/query.rb +8 -12
  30. data/lib/graphql/schema/enum.rb +36 -1
  31. data/lib/graphql/schema/input_object.rb +1 -1
  32. data/lib/graphql/schema/interface.rb +1 -0
  33. data/lib/graphql/schema/member/has_dataloader.rb +60 -0
  34. data/lib/graphql/schema/member.rb +1 -0
  35. data/lib/graphql/schema/object.rb +17 -8
  36. data/lib/graphql/schema/resolver.rb +2 -5
  37. data/lib/graphql/schema/validator/required_validator.rb +23 -6
  38. data/lib/graphql/schema/visibility/profile.rb +5 -5
  39. data/lib/graphql/schema/visibility.rb +14 -9
  40. data/lib/graphql/schema.rb +54 -28
  41. data/lib/graphql/static_validation/validator.rb +6 -1
  42. data/lib/graphql/subscriptions/serialize.rb +1 -3
  43. data/lib/graphql/tracing/active_support_notifications_trace.rb +6 -2
  44. data/lib/graphql/tracing/appoptics_trace.rb +3 -1
  45. data/lib/graphql/tracing/appsignal_trace.rb +6 -0
  46. data/lib/graphql/tracing/data_dog_trace.rb +5 -0
  47. data/lib/graphql/tracing/detailed_trace/memory_backend.rb +60 -0
  48. data/lib/graphql/tracing/detailed_trace/redis_backend.rb +72 -0
  49. data/lib/graphql/tracing/detailed_trace.rb +93 -0
  50. data/lib/graphql/tracing/new_relic_trace.rb +147 -41
  51. data/lib/graphql/tracing/perfetto_trace/trace.proto +141 -0
  52. data/lib/graphql/tracing/perfetto_trace/trace_pb.rb +33 -0
  53. data/lib/graphql/tracing/perfetto_trace.rb +737 -0
  54. data/lib/graphql/tracing/prometheus_trace.rb +22 -0
  55. data/lib/graphql/tracing/scout_trace.rb +6 -0
  56. data/lib/graphql/tracing/sentry_trace.rb +5 -0
  57. data/lib/graphql/tracing/statsd_trace.rb +9 -0
  58. data/lib/graphql/tracing/trace.rb +125 -1
  59. data/lib/graphql/tracing.rb +2 -0
  60. data/lib/graphql/version.rb +1 -1
  61. data/lib/graphql.rb +3 -0
  62. metadata +148 -10
  63. data/lib/graphql/backtrace/inspect_result.rb +0 -38
  64. data/lib/graphql/backtrace/trace.rb +0 -93
  65. data/lib/graphql/backtrace/tracer.rb +0 -80
  66. data/lib/graphql/schema/null_mask.rb +0 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 386222d0dc13d35729460ee8f3cd9fa30f90db9cb7dc2b2392489c9e0bc8939b
4
- data.tar.gz: 5229e7ee84d4c4e0a0c8afd10ef2b0185b0eedfc611a8db38047171d9c04a6e2
3
+ metadata.gz: ba5296cae016dea52b006bebe1515d6eef54876ec9f6437f5414bfccd7d8cf40
4
+ data.tar.gz: 75bf06fbb277d4e9c400f57998e0de5d2a6e4a41d562c71b0969fc30fe2bbb64
5
5
  SHA512:
6
- metadata.gz: 4cb91383b995e8714915d2c99d8c2d4fa15eaad91f0069766d7e8d379cae15c2aae6eb7a3961e440d62a961837a044aed604802960f199e8670ecf973c991fb2
7
- data.tar.gz: 8cd21fd942892100a0647bf9897e6e7d8651d184aee76a2988633fa3e9dc505163f330bb1f0ca3f4819cbb3248cd88e9ac252f516449ae169c1a3f47a982e11c
6
+ metadata.gz: e05120bb3377cbda64651ef2128b97daedf1b58e5e4a36b90d01d8ba4435a26e0dce6e270dfbc22ae75d29abcbe4d6f50c853ad6e13225a71eafeadbaad05519
7
+ data.tar.gz: 2caa24da0288b0efab47b94a441351f8bbd0d1d3cb8bac1c834102fedb2ea350787fb74e2fe1d502971b181308f2b17b1e5b5273a2bf2a868d4917b29fc27f9b
@@ -36,7 +36,70 @@ module GraphQL
36
36
  private
37
37
 
38
38
  def rows
39
- @rows ||= build_rows(@context, rows: [HEADERS], top: true)
39
+ @rows ||= begin
40
+ query = @context.query
41
+ query_ctx = @context
42
+ runtime_inst = query_ctx.namespace(:interpreter_runtime)[:runtime]
43
+ result = runtime_inst.instance_variable_get(:@response)
44
+ rows = []
45
+ result_path = []
46
+ last_part = nil
47
+ path = @context.current_path
48
+ path.each do |path_part|
49
+ value = value_at(runtime_inst, result_path)
50
+
51
+ if result_path.empty?
52
+ name = query.selected_operation.operation_type || "query"
53
+ if (n = query.selected_operation_name)
54
+ name += " #{n}"
55
+ end
56
+ args = query.variables
57
+ else
58
+ name = result.graphql_field.path
59
+ args = result.graphql_arguments
60
+ end
61
+
62
+ object = result.graphql_parent ? result.graphql_parent.graphql_application_value : result.graphql_application_value
63
+ object = object.object.inspect
64
+
65
+ rows << [
66
+ result.ast_node.position.join(":"),
67
+ name,
68
+ "#{object}",
69
+ args.to_h.inspect,
70
+ inspect_result(value),
71
+ ]
72
+
73
+ result_path << path_part
74
+ if path_part == path.last
75
+ last_part = path_part
76
+ else
77
+ result = result[path_part]
78
+ end
79
+ end
80
+
81
+
82
+ object = result.graphql_application_value.object.inspect
83
+ ast_node = result.graphql_selections.find { |s| s.alias == last_part || s.name == last_part }
84
+ field_defn = query.get_field(result.graphql_result_type, ast_node.name)
85
+ args = query.arguments_for(ast_node, field_defn).to_h
86
+ field_path = field_defn.path
87
+ if ast_node.alias
88
+ field_path += " as #{ast_node.alias}"
89
+ end
90
+
91
+ rows << [
92
+ ast_node.position.join(":"),
93
+ field_path,
94
+ "#{object}",
95
+ args.inspect,
96
+ inspect_result(@override_value)
97
+ ]
98
+
99
+ rows << HEADERS
100
+ rows.reverse!
101
+ rows
102
+ end
40
103
  end
41
104
 
42
105
  # @return [String]
@@ -75,67 +138,44 @@ module GraphQL
75
138
  table
76
139
  end
77
140
 
78
- # @return [Array] 5 items for a backtrace table (not `key`)
79
- def build_rows(context_entry, rows:, top: false)
80
- case context_entry
81
- when Backtrace::Frame
82
- field_alias = context_entry.ast_node.respond_to?(:alias) && context_entry.ast_node.alias
83
- value = if top && @override_value
84
- @override_value
85
- else
86
- value_at(@context.query.context.namespace(:interpreter_runtime)[:runtime], context_entry.path)
87
- end
88
- rows << [
89
- "#{context_entry.ast_node ? context_entry.ast_node.position.join(":") : ""}",
90
- "#{context_entry.field.path}#{field_alias ? " as #{field_alias}" : ""}",
91
- "#{context_entry.object.object.inspect}",
92
- context_entry.arguments.to_h.inspect, # rubocop:disable Development/ContextIsPassedCop -- unrelated method
93
- Backtrace::InspectResult.inspect_result(value),
94
- ]
95
- if (parent = context_entry.parent_frame)
96
- build_rows(parent, rows: rows)
97
- else
98
- rows
99
- end
100
- when GraphQL::Query::Context
101
- query = context_entry.query
102
- op = query.selected_operation
103
- if op
104
- op_type = op.operation_type
105
- position = "#{op.line}:#{op.col}"
106
- else
107
- op_type = "query"
108
- position = "?:?"
109
- end
110
- op_name = query.selected_operation_name
111
- object = query.root_value
112
- if object.is_a?(GraphQL::Schema::Object)
113
- object = object.object
114
- end
115
- value = value_at(context_entry.namespace(:interpreter_runtime)[:runtime], [])
116
- rows << [
117
- "#{position}",
118
- "#{op_type}#{op_name ? " #{op_name}" : ""}",
119
- "#{object.inspect}",
120
- query.variables.to_h.inspect,
121
- Backtrace::InspectResult.inspect_result(value),
122
- ]
123
- else
124
- raise "Unexpected get_rows subject #{context_entry.class} (#{context_entry.inspect})"
125
- end
126
- end
127
141
 
128
142
  def value_at(runtime, path)
129
143
  response = runtime.final_result
130
144
  path.each do |key|
131
- if response && (response = response[key])
132
- next
133
- else
134
- break
135
- end
145
+ response && (response = response[key])
136
146
  end
137
147
  response
138
148
  end
149
+
150
+ def inspect_result(obj)
151
+ case obj
152
+ when Hash
153
+ "{" +
154
+ obj.map do |key, val|
155
+ "#{key}: #{inspect_truncated(val)}"
156
+ end.join(", ") +
157
+ "}"
158
+ when Array
159
+ "[" +
160
+ obj.map { |v| inspect_truncated(v) }.join(", ") +
161
+ "]"
162
+ else
163
+ inspect_truncated(obj)
164
+ end
165
+ end
166
+
167
+ def inspect_truncated(obj)
168
+ case obj
169
+ when Hash
170
+ "{...}"
171
+ when Array
172
+ "[...]"
173
+ when GraphQL::Execution::Lazy
174
+ "(unresolved)"
175
+ else
176
+ "#{obj.inspect}"
177
+ end
178
+ end
139
179
  end
140
180
  end
141
181
  end
@@ -1,9 +1,6 @@
1
1
  # frozen_string_literal: true
2
- require "graphql/backtrace/inspect_result"
3
2
  require "graphql/backtrace/table"
4
3
  require "graphql/backtrace/traced_error"
5
- require "graphql/backtrace/tracer"
6
- require "graphql/backtrace/trace"
7
4
  module GraphQL
8
5
  # Wrap unhandled errors with {TracedError}.
9
6
  #
@@ -24,7 +21,7 @@ module GraphQL
24
21
  def_delegators :to_a, :each, :[]
25
22
 
26
23
  def self.use(schema_defn)
27
- schema_defn.trace_with(self::Trace)
24
+ schema_defn.using_backtrace = true
28
25
  end
29
26
 
30
27
  def initialize(context, value: nil)
@@ -40,20 +37,5 @@ module GraphQL
40
37
  def to_a
41
38
  @table.to_backtrace
42
39
  end
43
-
44
- # Used for internal bookkeeping
45
- # @api private
46
- class Frame
47
- attr_reader :path, :query, :ast_node, :object, :field, :arguments, :parent_frame
48
- def initialize(path:, query:, ast_node:, object:, field:, arguments:, parent_frame:)
49
- @path = path
50
- @query = query
51
- @ast_node = ast_node
52
- @field = field
53
- @object = object
54
- @arguments = arguments
55
- @parent_frame = parent_frame
56
- end
57
- end
58
40
  end
59
41
  end
@@ -48,5 +48,10 @@ module GraphQL
48
48
  def self.dataloader_source_class
49
49
  Fiber[:__graphql_current_dataloader_source]&.class
50
50
  end
51
+
52
+ # @return [GraphQL::Dataloader::Source, nil] The currently-running source, if there is one
53
+ def self.dataloader_source
54
+ Fiber[:__graphql_current_dataloader_source]
55
+ end
51
56
  end
52
57
  end