graphql 2.0.32 → 2.5.22
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.
- checksums.yaml +4 -4
- data/lib/generators/graphql/detailed_trace_generator.rb +77 -0
- data/lib/generators/graphql/install/mutation_root_generator.rb +2 -2
- data/lib/generators/graphql/install/templates/base_mutation.erb +2 -0
- data/lib/generators/graphql/install/templates/mutation_type.erb +2 -0
- data/lib/generators/graphql/install_generator.rb +49 -0
- data/lib/generators/graphql/orm_mutations_base.rb +1 -1
- data/lib/generators/graphql/templates/base_argument.erb +2 -0
- data/lib/generators/graphql/templates/base_connection.erb +2 -0
- data/lib/generators/graphql/templates/base_edge.erb +2 -0
- data/lib/generators/graphql/templates/base_enum.erb +2 -0
- data/lib/generators/graphql/templates/base_field.erb +2 -0
- data/lib/generators/graphql/templates/base_input_object.erb +2 -0
- data/lib/generators/graphql/templates/base_interface.erb +2 -0
- data/lib/generators/graphql/templates/base_object.erb +2 -0
- data/lib/generators/graphql/templates/base_resolver.erb +8 -0
- data/lib/generators/graphql/templates/base_scalar.erb +2 -0
- data/lib/generators/graphql/templates/base_union.erb +2 -0
- data/lib/generators/graphql/templates/create_graphql_detailed_traces.erb +10 -0
- data/lib/generators/graphql/templates/graphql_controller.erb +2 -0
- data/lib/generators/graphql/templates/loader.erb +2 -0
- data/lib/generators/graphql/templates/mutation.erb +2 -0
- data/lib/generators/graphql/templates/node_type.erb +2 -0
- data/lib/generators/graphql/templates/query_type.erb +2 -0
- data/lib/generators/graphql/templates/schema.erb +5 -0
- data/lib/generators/graphql/type_generator.rb +1 -1
- data/lib/graphql/analysis/analyzer.rb +90 -0
- data/lib/graphql/analysis/field_usage.rb +82 -0
- data/lib/graphql/analysis/max_query_complexity.rb +20 -0
- data/lib/graphql/analysis/max_query_depth.rb +20 -0
- data/lib/graphql/analysis/query_complexity.rb +263 -0
- data/lib/graphql/analysis/query_depth.rb +58 -0
- data/lib/graphql/analysis/visitor.rb +280 -0
- data/lib/graphql/analysis.rb +95 -1
- data/lib/graphql/autoload.rb +38 -0
- data/lib/graphql/backtrace/table.rb +118 -55
- data/lib/graphql/backtrace.rb +1 -19
- data/lib/graphql/coercion_error.rb +1 -9
- data/lib/graphql/current.rb +57 -0
- data/lib/graphql/dashboard/application_controller.rb +41 -0
- data/lib/graphql/dashboard/detailed_traces.rb +47 -0
- data/lib/graphql/dashboard/installable.rb +22 -0
- data/lib/graphql/dashboard/landings_controller.rb +9 -0
- data/lib/graphql/dashboard/limiters.rb +93 -0
- data/lib/graphql/dashboard/operation_store.rb +199 -0
- data/lib/graphql/dashboard/statics/bootstrap-5.3.3.min.css +6 -0
- data/lib/graphql/dashboard/statics/bootstrap-5.3.3.min.js +7 -0
- data/lib/graphql/dashboard/statics/charts.min.css +1 -0
- data/lib/graphql/dashboard/statics/dashboard.css +30 -0
- data/lib/graphql/dashboard/statics/dashboard.js +143 -0
- data/lib/graphql/dashboard/statics/header-icon.png +0 -0
- data/lib/graphql/dashboard/statics/icon.png +0 -0
- data/lib/graphql/dashboard/statics_controller.rb +31 -0
- data/lib/graphql/dashboard/subscriptions.rb +97 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/detailed_traces/traces/index.html.erb +45 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/landings/show.html.erb +18 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/limiters/limiters/show.html.erb +62 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/not_installed.html.erb +18 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/_form.html.erb +24 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/edit.html.erb +21 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/index.html.erb +69 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/new.html.erb +7 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/index_entries/index.html.erb +39 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/index_entries/show.html.erb +32 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/operations/index.html.erb +81 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/operations/show.html.erb +71 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/subscriptions/subscriptions/show.html.erb +41 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/subscriptions/topics/index.html.erb +55 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/subscriptions/topics/show.html.erb +40 -0
- data/lib/graphql/dashboard/views/layouts/graphql/dashboard/application.html.erb +108 -0
- data/lib/graphql/dashboard.rb +96 -0
- data/lib/graphql/dataloader/active_record_association_source.rb +84 -0
- data/lib/graphql/dataloader/active_record_source.rb +47 -0
- data/lib/graphql/dataloader/async_dataloader.rb +112 -0
- data/lib/graphql/dataloader/null_dataloader.rb +55 -10
- data/lib/graphql/dataloader/request.rb +5 -0
- data/lib/graphql/dataloader/source.rb +35 -12
- data/lib/graphql/dataloader.rb +224 -149
- data/lib/graphql/date_encoding_error.rb +1 -1
- data/lib/graphql/dig.rb +2 -1
- data/lib/graphql/duration_encoding_error.rb +16 -0
- data/lib/graphql/execution/interpreter/argument_value.rb +5 -1
- data/lib/graphql/execution/interpreter/arguments_cache.rb +5 -10
- data/lib/graphql/execution/interpreter/resolve.rb +23 -25
- data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +228 -0
- data/lib/graphql/execution/interpreter/runtime.rb +363 -434
- data/lib/graphql/execution/interpreter.rb +91 -164
- data/lib/graphql/execution/lookahead.rb +105 -31
- data/lib/graphql/execution/multiplex.rb +7 -6
- data/lib/graphql/execution/next/field_resolve_step.rb +711 -0
- data/lib/graphql/execution/next/load_argument_step.rb +60 -0
- data/lib/graphql/execution/next/prepare_object_step.rb +129 -0
- data/lib/graphql/execution/next/runner.rb +389 -0
- data/lib/graphql/execution/next/selections_step.rb +37 -0
- data/lib/graphql/execution/next.rb +70 -0
- data/lib/graphql/execution.rb +1 -0
- data/lib/graphql/execution_error.rb +13 -10
- data/lib/graphql/introspection/directive_location_enum.rb +1 -1
- data/lib/graphql/introspection/directive_type.rb +7 -3
- data/lib/graphql/introspection/dynamic_fields.rb +5 -1
- data/lib/graphql/introspection/entry_points.rb +20 -6
- data/lib/graphql/introspection/enum_value_type.rb +5 -5
- data/lib/graphql/introspection/field_type.rb +13 -5
- data/lib/graphql/introspection/input_value_type.rb +21 -13
- data/lib/graphql/introspection/schema_type.rb +8 -11
- data/lib/graphql/introspection/type_type.rb +64 -28
- data/lib/graphql/invalid_name_error.rb +1 -1
- data/lib/graphql/invalid_null_error.rb +26 -17
- data/lib/graphql/language/block_string.rb +34 -18
- data/lib/graphql/language/cache.rb +13 -0
- data/lib/graphql/language/comment.rb +18 -0
- data/lib/graphql/language/definition_slice.rb +1 -1
- data/lib/graphql/language/document_from_schema_definition.rb +90 -61
- data/lib/graphql/language/lexer.rb +319 -193
- data/lib/graphql/language/nodes.rb +136 -77
- data/lib/graphql/language/parser.rb +807 -1985
- data/lib/graphql/language/printer.rb +324 -151
- data/lib/graphql/language/sanitized_printer.rb +21 -23
- data/lib/graphql/language/static_visitor.rb +171 -0
- data/lib/graphql/language/visitor.rb +23 -83
- data/lib/graphql/language.rb +71 -1
- data/lib/graphql/load_application_object_failed_error.rb +5 -1
- data/lib/graphql/pagination/array_connection.rb +6 -6
- data/lib/graphql/pagination/connection.rb +30 -1
- data/lib/graphql/pagination/connections.rb +32 -0
- data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -2
- data/lib/graphql/query/context/scoped_context.rb +101 -0
- data/lib/graphql/query/context.rb +82 -144
- data/lib/graphql/query/null_context.rb +15 -18
- data/lib/graphql/query/partial.rb +179 -0
- data/lib/graphql/query/validation_pipeline.rb +4 -4
- data/lib/graphql/query/variable_validation_error.rb +1 -1
- data/lib/graphql/query/variables.rb +3 -3
- data/lib/graphql/query.rb +126 -81
- data/lib/graphql/railtie.rb +16 -6
- data/lib/graphql/rake_task.rb +3 -12
- data/lib/graphql/rubocop/graphql/base_cop.rb +1 -1
- data/lib/graphql/rubocop/graphql/field_type_in_block.rb +144 -0
- data/lib/graphql/rubocop/graphql/root_types_in_block.rb +38 -0
- data/lib/graphql/rubocop.rb +2 -0
- data/lib/graphql/schema/addition.rb +26 -13
- data/lib/graphql/schema/always_visible.rb +7 -2
- data/lib/graphql/schema/argument.rb +75 -9
- data/lib/graphql/schema/base_64_encoder.rb +3 -5
- data/lib/graphql/schema/build_from_definition.rb +123 -60
- data/lib/graphql/schema/directive/flagged.rb +4 -2
- data/lib/graphql/schema/directive/one_of.rb +12 -0
- data/lib/graphql/schema/directive/specified_by.rb +14 -0
- data/lib/graphql/schema/directive.rb +54 -2
- data/lib/graphql/schema/enum.rb +110 -27
- data/lib/graphql/schema/enum_value.rb +10 -2
- data/lib/graphql/schema/field/connection_extension.rb +15 -49
- data/lib/graphql/schema/field/scope_extension.rb +23 -7
- data/lib/graphql/schema/field.rb +245 -118
- data/lib/graphql/schema/field_extension.rb +34 -1
- data/lib/graphql/schema/has_single_input_argument.rb +160 -0
- data/lib/graphql/schema/input_object.rb +116 -60
- data/lib/graphql/schema/interface.rb +34 -16
- data/lib/graphql/schema/introspection_system.rb +8 -17
- data/lib/graphql/schema/late_bound_type.rb +4 -0
- data/lib/graphql/schema/list.rb +3 -3
- data/lib/graphql/schema/loader.rb +3 -4
- data/lib/graphql/schema/member/base_dsl_methods.rb +18 -2
- data/lib/graphql/schema/member/has_arguments.rb +132 -100
- data/lib/graphql/schema/member/has_authorization.rb +35 -0
- data/lib/graphql/schema/member/has_dataloader.rb +99 -0
- data/lib/graphql/schema/member/has_deprecation_reason.rb +15 -0
- data/lib/graphql/schema/member/has_directives.rb +4 -4
- data/lib/graphql/schema/member/has_fields.rb +115 -15
- data/lib/graphql/schema/member/has_interfaces.rb +26 -12
- data/lib/graphql/schema/member/has_unresolved_type_error.rb +5 -1
- data/lib/graphql/schema/member/has_validators.rb +1 -1
- data/lib/graphql/schema/member/relay_shortcuts.rb +1 -1
- data/lib/graphql/schema/member/scoped.rb +19 -0
- data/lib/graphql/schema/member/type_system_helpers.rb +17 -4
- data/lib/graphql/schema/member/validates_input.rb +3 -3
- data/lib/graphql/schema/member.rb +6 -0
- data/lib/graphql/schema/mutation.rb +7 -0
- data/lib/graphql/schema/object.rb +34 -8
- data/lib/graphql/schema/printer.rb +9 -7
- data/lib/graphql/schema/ractor_shareable.rb +79 -0
- data/lib/graphql/schema/relay_classic_mutation.rb +6 -129
- data/lib/graphql/schema/resolver.rb +90 -32
- data/lib/graphql/schema/scalar.rb +4 -9
- data/lib/graphql/schema/subscription.rb +63 -10
- data/lib/graphql/schema/timeout.rb +19 -2
- data/lib/graphql/schema/type_expression.rb +2 -2
- data/lib/graphql/schema/union.rb +2 -2
- data/lib/graphql/schema/unique_within_type.rb +1 -1
- data/lib/graphql/schema/validator/all_validator.rb +62 -0
- data/lib/graphql/schema/validator/required_validator.rb +92 -11
- data/lib/graphql/schema/validator.rb +3 -1
- data/lib/graphql/schema/visibility/migration.rb +188 -0
- data/lib/graphql/schema/visibility/profile.rb +445 -0
- data/lib/graphql/schema/visibility/visit.rb +190 -0
- data/lib/graphql/schema/visibility.rb +311 -0
- data/lib/graphql/schema/warden.rb +275 -103
- data/lib/graphql/schema.rb +950 -210
- data/lib/graphql/static_validation/all_rules.rb +3 -3
- data/lib/graphql/static_validation/base_visitor.rb +7 -6
- data/lib/graphql/static_validation/literal_validator.rb +6 -7
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +1 -1
- data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +1 -1
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +3 -2
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +3 -3
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +2 -0
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +12 -2
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +47 -13
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +88 -25
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +10 -2
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
- data/lib/graphql/static_validation/rules/fragment_types_exist.rb +12 -2
- data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +1 -1
- data/lib/graphql/static_validation/rules/mutation_root_exists.rb +1 -1
- data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +1 -1
- data/lib/graphql/static_validation/rules/not_single_subscription_error.rb +25 -0
- data/lib/graphql/static_validation/rules/query_root_exists.rb +1 -1
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +5 -5
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +5 -5
- data/lib/graphql/static_validation/rules/subscription_root_exists_and_single_subscription_selection.rb +26 -0
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +7 -3
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +18 -27
- data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +1 -1
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +2 -2
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +11 -2
- data/lib/graphql/static_validation/validation_context.rb +21 -5
- data/lib/graphql/static_validation/validator.rb +9 -1
- data/lib/graphql/static_validation.rb +0 -1
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +8 -5
- data/lib/graphql/subscriptions/broadcast_analyzer.rb +11 -5
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +12 -10
- data/lib/graphql/subscriptions/event.rb +21 -4
- data/lib/graphql/subscriptions/serialize.rb +3 -1
- data/lib/graphql/subscriptions.rb +21 -17
- data/lib/graphql/testing/helpers.rb +161 -0
- data/lib/graphql/testing/mock_action_cable.rb +111 -0
- data/lib/graphql/testing.rb +3 -0
- data/lib/graphql/tracing/active_support_notifications_trace.rb +14 -3
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +1 -1
- data/lib/graphql/tracing/appoptics_trace.rb +7 -3
- data/lib/graphql/tracing/appoptics_tracing.rb +9 -2
- data/lib/graphql/tracing/appsignal_trace.rb +32 -59
- data/lib/graphql/tracing/appsignal_tracing.rb +2 -0
- data/lib/graphql/tracing/call_legacy_tracers.rb +66 -0
- data/lib/graphql/tracing/data_dog_trace.rb +46 -162
- data/lib/graphql/tracing/data_dog_tracing.rb +2 -0
- data/lib/graphql/tracing/detailed_trace/active_record_backend.rb +74 -0
- data/lib/graphql/tracing/detailed_trace/memory_backend.rb +60 -0
- data/lib/graphql/tracing/detailed_trace/redis_backend.rb +72 -0
- data/lib/graphql/tracing/detailed_trace.rb +156 -0
- data/lib/graphql/tracing/legacy_hooks_trace.rb +75 -0
- data/lib/graphql/tracing/legacy_trace.rb +4 -61
- data/lib/graphql/tracing/monitor_trace.rb +283 -0
- data/lib/graphql/tracing/new_relic_trace.rb +47 -54
- data/lib/graphql/tracing/new_relic_tracing.rb +2 -0
- data/lib/graphql/tracing/notifications_trace.rb +183 -37
- data/lib/graphql/tracing/notifications_tracing.rb +2 -0
- data/lib/graphql/tracing/null_trace.rb +9 -0
- data/lib/graphql/tracing/perfetto_trace/trace.proto +141 -0
- data/lib/graphql/tracing/perfetto_trace/trace_pb.rb +33 -0
- data/lib/graphql/tracing/perfetto_trace.rb +864 -0
- data/lib/graphql/tracing/platform_tracing.rb +3 -1
- data/lib/graphql/tracing/{prometheus_tracing → prometheus_trace}/graphql_collector.rb +5 -1
- data/lib/graphql/tracing/prometheus_trace.rb +73 -73
- data/lib/graphql/tracing/prometheus_tracing.rb +2 -0
- data/lib/graphql/tracing/scout_trace.rb +32 -58
- data/lib/graphql/tracing/scout_tracing.rb +2 -0
- data/lib/graphql/tracing/sentry_trace.rb +82 -0
- data/lib/graphql/tracing/statsd_trace.rb +33 -45
- data/lib/graphql/tracing/statsd_tracing.rb +2 -0
- data/lib/graphql/tracing/trace.rb +112 -1
- data/lib/graphql/tracing.rb +31 -28
- data/lib/graphql/type_kinds.rb +2 -1
- data/lib/graphql/types/iso_8601_duration.rb +77 -0
- data/lib/graphql/types/relay/connection_behaviors.rb +44 -2
- data/lib/graphql/types/relay/edge_behaviors.rb +18 -0
- data/lib/graphql/types/relay/has_node_field.rb +13 -8
- data/lib/graphql/types/relay/has_nodes_field.rb +13 -8
- data/lib/graphql/types/relay/node_behaviors.rb +13 -2
- data/lib/graphql/types/relay/page_info_behaviors.rb +4 -0
- data/lib/graphql/types.rb +18 -10
- data/lib/graphql/unauthorized_enum_value_error.rb +13 -0
- data/lib/graphql/unauthorized_error.rb +5 -1
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +71 -54
- data/readme.md +12 -2
- metadata +233 -37
- data/lib/graphql/analysis/ast/analyzer.rb +0 -84
- data/lib/graphql/analysis/ast/field_usage.rb +0 -57
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -22
- data/lib/graphql/analysis/ast/max_query_depth.rb +0 -22
- data/lib/graphql/analysis/ast/query_complexity.rb +0 -230
- data/lib/graphql/analysis/ast/query_depth.rb +0 -55
- data/lib/graphql/analysis/ast/visitor.rb +0 -276
- data/lib/graphql/analysis/ast.rb +0 -81
- data/lib/graphql/backtrace/inspect_result.rb +0 -50
- data/lib/graphql/backtrace/trace.rb +0 -96
- data/lib/graphql/backtrace/tracer.rb +0 -80
- data/lib/graphql/deprecation.rb +0 -9
- data/lib/graphql/filter.rb +0 -59
- data/lib/graphql/language/parser.y +0 -560
- data/lib/graphql/language/token.rb +0 -34
- data/lib/graphql/schema/base_64_bp.rb +0 -26
- data/lib/graphql/schema/invalid_type_error.rb +0 -7
- data/lib/graphql/schema/null_mask.rb +0 -11
- data/lib/graphql/static_validation/rules/subscription_root_exists.rb +0 -17
- data/lib/graphql/static_validation/type_stack.rb +0 -216
- data/lib/graphql/subscriptions/instrumentation.rb +0 -28
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module GraphQL
|
|
3
|
+
module Testing
|
|
4
|
+
module Helpers
|
|
5
|
+
# @param schema_class [Class<GraphQL::Schema>]
|
|
6
|
+
# @return [Module] A helpers module which always uses the given schema
|
|
7
|
+
def self.for(schema_class)
|
|
8
|
+
SchemaHelpers.for(schema_class)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
class Error < GraphQL::Error
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
class TypeNotVisibleError < Error
|
|
15
|
+
def initialize(type_name:)
|
|
16
|
+
message = "`#{type_name}` should be `visible?` this field resolution and `context`, but it was not"
|
|
17
|
+
super(message)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
class FieldNotVisibleError < Error
|
|
22
|
+
def initialize(type_name:, field_name:)
|
|
23
|
+
message = "`#{type_name}.#{field_name}` should be `visible?` for this resolution, but it was not"
|
|
24
|
+
super(message)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
class TypeNotDefinedError < Error
|
|
29
|
+
def initialize(type_name:)
|
|
30
|
+
message = "No type named `#{type_name}` is defined; choose another type name or define this type."
|
|
31
|
+
super(message)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
class FieldNotDefinedError < Error
|
|
36
|
+
def initialize(type_name:, field_name:)
|
|
37
|
+
message = "`#{type_name}` has no field named `#{field_name}`; pick another name or define this field."
|
|
38
|
+
super(message)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def run_graphql_field(schema, field_path, object, arguments: {}, context: {}, ast_node: nil, lookahead: nil, visibility_profile: nil)
|
|
43
|
+
type_name, *field_names = field_path.split(".")
|
|
44
|
+
dummy_query = GraphQL::Query.new(schema, "{ __typename }", context: context, visibility_profile: visibility_profile)
|
|
45
|
+
query_context = dummy_query.context
|
|
46
|
+
dataloader = query_context.dataloader
|
|
47
|
+
object_type = dummy_query.types.type(type_name) # rubocop:disable Development/ContextIsPassedCop
|
|
48
|
+
if object_type
|
|
49
|
+
graphql_result = object
|
|
50
|
+
field_names.each do |field_name|
|
|
51
|
+
inner_object = graphql_result
|
|
52
|
+
dataloader.run_isolated {
|
|
53
|
+
graphql_result = object_type.wrap(inner_object, query_context)
|
|
54
|
+
}
|
|
55
|
+
if graphql_result.nil?
|
|
56
|
+
return nil
|
|
57
|
+
end
|
|
58
|
+
visible_field = dummy_query.types.field(object_type, field_name) # rubocop:disable Development/ContextIsPassedCop
|
|
59
|
+
if visible_field
|
|
60
|
+
dataloader.run_isolated {
|
|
61
|
+
query_context[:current_field] = visible_field
|
|
62
|
+
field_args = visible_field.coerce_arguments(graphql_result, arguments, query_context)
|
|
63
|
+
field_args = schema.sync_lazy(field_args)
|
|
64
|
+
if !visible_field.extras.empty?
|
|
65
|
+
extra_args = {}
|
|
66
|
+
visible_field.extras.each do |extra|
|
|
67
|
+
extra_args[extra] = case extra
|
|
68
|
+
when :ast_node
|
|
69
|
+
ast_node ||= GraphQL::Language::Nodes::Field.new(name: visible_field.graphql_name)
|
|
70
|
+
when :lookahead
|
|
71
|
+
lookahead ||= begin
|
|
72
|
+
ast_node ||= GraphQL::Language::Nodes::Field.new(name: visible_field.graphql_name)
|
|
73
|
+
Execution::Lookahead.new(
|
|
74
|
+
query: dummy_query,
|
|
75
|
+
ast_nodes: [ast_node],
|
|
76
|
+
field: visible_field,
|
|
77
|
+
)
|
|
78
|
+
end
|
|
79
|
+
else
|
|
80
|
+
raise ArgumentError, "This extra isn't supported in `run_graphql_field` yet: `#{extra.inspect}`. Open an issue on GitHub to request it: https://github.com/rmosolgo/graphql-ruby/issues/new"
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
field_args = field_args.merge_extras(extra_args)
|
|
85
|
+
end
|
|
86
|
+
graphql_result = visible_field.resolve(graphql_result, field_args.keyword_arguments, query_context)
|
|
87
|
+
graphql_result = schema.sync_lazy(graphql_result)
|
|
88
|
+
}
|
|
89
|
+
object_type = visible_field.type.unwrap
|
|
90
|
+
elsif object_type.all_field_definitions.any? { |f| f.graphql_name == field_name }
|
|
91
|
+
raise FieldNotVisibleError.new(field_name: field_name, type_name: type_name)
|
|
92
|
+
else
|
|
93
|
+
raise FieldNotDefinedError.new(type_name: type_name, field_name: field_name)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
graphql_result
|
|
97
|
+
else
|
|
98
|
+
unfiltered_type = schema.use_visibility_profile? ? schema.visibility.get_type(type_name) : schema.get_type(type_name) # rubocop:disable Development/ContextIsPassedCop
|
|
99
|
+
if unfiltered_type
|
|
100
|
+
raise TypeNotVisibleError.new(type_name: type_name)
|
|
101
|
+
else
|
|
102
|
+
raise TypeNotDefinedError.new(type_name: type_name)
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def with_resolution_context(schema, type:, object:, context:{}, visibility_profile: nil)
|
|
108
|
+
resolution_context = ResolutionAssertionContext.new(
|
|
109
|
+
self,
|
|
110
|
+
schema: schema,
|
|
111
|
+
type_name: type,
|
|
112
|
+
object: object,
|
|
113
|
+
context: context,
|
|
114
|
+
visibility_profile: visibility_profile,
|
|
115
|
+
)
|
|
116
|
+
yield(resolution_context)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
class ResolutionAssertionContext
|
|
120
|
+
def initialize(test, type_name:, object:, schema:, context:, visibility_profile:)
|
|
121
|
+
@test = test
|
|
122
|
+
@type_name = type_name
|
|
123
|
+
@object = object
|
|
124
|
+
@schema = schema
|
|
125
|
+
@context = context
|
|
126
|
+
@visibility_profile = visibility_profile
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
attr_reader :visibility_profile
|
|
130
|
+
|
|
131
|
+
def run_graphql_field(field_name, arguments: {})
|
|
132
|
+
if @schema
|
|
133
|
+
@test.run_graphql_field(@schema, "#{@type_name}.#{field_name}", @object, arguments: arguments, context: @context, visibility_profile: @visibility_profile)
|
|
134
|
+
else
|
|
135
|
+
@test.run_graphql_field("#{@type_name}.#{field_name}", @object, arguments: arguments, context: @context, visibility_profile: @visibility_profile)
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
module SchemaHelpers
|
|
141
|
+
include Helpers
|
|
142
|
+
|
|
143
|
+
def run_graphql_field(field_path, object, arguments: {}, context: {}, visibility_profile: nil)
|
|
144
|
+
super(@@schema_class_for_helpers, field_path, object, arguments: arguments, context: context, visibility_profile: visibility_profile)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def with_resolution_context(*args, **kwargs, &block)
|
|
148
|
+
# schema will be added later
|
|
149
|
+
super(nil, *args, **kwargs, &block)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def self.for(schema_class)
|
|
153
|
+
Module.new do
|
|
154
|
+
include SchemaHelpers
|
|
155
|
+
@@schema_class_for_helpers = schema_class
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
end
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module GraphQL
|
|
3
|
+
module Testing
|
|
4
|
+
# A stub implementation of ActionCable.
|
|
5
|
+
# Any methods to support the mock backend have `mock` in the name.
|
|
6
|
+
#
|
|
7
|
+
# @example Configuring your schema to use MockActionCable in the test environment
|
|
8
|
+
# class MySchema < GraphQL::Schema
|
|
9
|
+
# # Use MockActionCable in test:
|
|
10
|
+
# use GraphQL::Subscriptions::ActionCableSubscriptions,
|
|
11
|
+
# action_cable: Rails.env.test? ? GraphQL::Testing::MockActionCable : ActionCable
|
|
12
|
+
# end
|
|
13
|
+
#
|
|
14
|
+
# @example Clearing old data before each test
|
|
15
|
+
# setup do
|
|
16
|
+
# GraphQL::Testing::MockActionCable.clear_mocks
|
|
17
|
+
# end
|
|
18
|
+
#
|
|
19
|
+
# @example Using MockActionCable in a test case
|
|
20
|
+
# # Create a channel to use in the test, pass it to GraphQL
|
|
21
|
+
# mock_channel = GraphQL::Testing::MockActionCable.get_mock_channel
|
|
22
|
+
# ActionCableTestSchema.execute("subscription { newsFlash { text } }", context: { channel: mock_channel })
|
|
23
|
+
#
|
|
24
|
+
# # Trigger a subscription update
|
|
25
|
+
# ActionCableTestSchema.subscriptions.trigger(:news_flash, {}, {text: "After yesterday's rain, someone stopped on Rio Road to help a box turtle across five lanes of traffic"})
|
|
26
|
+
#
|
|
27
|
+
# # Check messages on the channel
|
|
28
|
+
# expected_msg = {
|
|
29
|
+
# result: {
|
|
30
|
+
# "data" => {
|
|
31
|
+
# "newsFlash" => {
|
|
32
|
+
# "text" => "After yesterday's rain, someone stopped on Rio Road to help a box turtle across five lanes of traffic"
|
|
33
|
+
# }
|
|
34
|
+
# }
|
|
35
|
+
# },
|
|
36
|
+
# more: true,
|
|
37
|
+
# }
|
|
38
|
+
# assert_equal [expected_msg], mock_channel.mock_broadcasted_messages
|
|
39
|
+
#
|
|
40
|
+
class MockActionCable
|
|
41
|
+
class MockChannel
|
|
42
|
+
def initialize
|
|
43
|
+
@mock_broadcasted_messages = []
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# @return [Array<Hash>] Payloads "sent" to this channel by GraphQL-Ruby
|
|
47
|
+
attr_reader :mock_broadcasted_messages
|
|
48
|
+
|
|
49
|
+
# Called by ActionCableSubscriptions. Implements a Rails API.
|
|
50
|
+
def stream_from(stream_name, coder: nil, &block)
|
|
51
|
+
# Rails uses `coder`, we don't
|
|
52
|
+
block ||= ->(msg) { @mock_broadcasted_messages << msg }
|
|
53
|
+
MockActionCable.mock_stream_for(stream_name).add_mock_channel(self, block)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Used by mock code
|
|
58
|
+
# @api private
|
|
59
|
+
class MockStream
|
|
60
|
+
def initialize
|
|
61
|
+
@mock_channels = {}
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def add_mock_channel(channel, handler)
|
|
65
|
+
@mock_channels[channel] = handler
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def mock_broadcast(message)
|
|
69
|
+
@mock_channels.each do |channel, handler|
|
|
70
|
+
handler && handler.call(message)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
class << self
|
|
76
|
+
# Call this before each test run to make sure that MockActionCable's data is empty
|
|
77
|
+
def clear_mocks
|
|
78
|
+
@mock_streams = {}
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Implements Rails API
|
|
82
|
+
def server
|
|
83
|
+
self
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Implements Rails API
|
|
87
|
+
def broadcast(stream_name, message)
|
|
88
|
+
stream = @mock_streams[stream_name]
|
|
89
|
+
stream && stream.mock_broadcast(message)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Used by mock code
|
|
93
|
+
def mock_stream_for(stream_name)
|
|
94
|
+
@mock_streams[stream_name] ||= MockStream.new
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Use this as `context[:channel]` to simulate an ActionCable channel
|
|
98
|
+
#
|
|
99
|
+
# @return [GraphQL::Testing::MockActionCable::MockChannel]
|
|
100
|
+
def get_mock_channel
|
|
101
|
+
MockChannel.new
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# @return [Array<String>] Streams that currently have subscribers
|
|
105
|
+
def mock_stream_names
|
|
106
|
+
@mock_streams.keys
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
@@ -1,11 +1,22 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
3
|
+
require "graphql/tracing/notifications_trace"
|
|
4
4
|
|
|
5
5
|
module GraphQL
|
|
6
6
|
module Tracing
|
|
7
|
-
# This implementation forwards events to ActiveSupport::Notifications
|
|
8
|
-
#
|
|
7
|
+
# This implementation forwards events to ActiveSupport::Notifications with a `graphql` suffix.
|
|
8
|
+
#
|
|
9
|
+
# @example Sending execution events to ActiveSupport::Notifications
|
|
10
|
+
# class MySchema < GraphQL::Schema
|
|
11
|
+
# trace_with(GraphQL::Tracing::ActiveSupportNotificationsTrace)
|
|
12
|
+
# end
|
|
13
|
+
#
|
|
14
|
+
# @example Subscribing to GraphQL events with ActiveSupport::Notifications
|
|
15
|
+
# ActiveSupport::Notifications.subscribe(/graphql/) do |event|
|
|
16
|
+
# pp event.name
|
|
17
|
+
# pp event.payload
|
|
18
|
+
# end
|
|
19
|
+
#
|
|
9
20
|
module ActiveSupportNotificationsTrace
|
|
10
21
|
include NotificationsTrace
|
|
11
22
|
def initialize(engine: ActiveSupport::Notifications, **rest)
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "graphql/tracing/platform_trace"
|
|
4
|
+
|
|
3
5
|
module GraphQL
|
|
4
6
|
module Tracing
|
|
5
7
|
|
|
@@ -20,10 +22,12 @@ module GraphQL
|
|
|
20
22
|
# These GraphQL events will show up as 'graphql.execute' spans
|
|
21
23
|
EXEC_KEYS = ['execute_multiplex', 'execute_query', 'execute_query_lazy'].freeze
|
|
22
24
|
|
|
25
|
+
|
|
23
26
|
# During auto-instrumentation this version of AppOpticsTracing is compared
|
|
24
27
|
# with the version provided in the appoptics_apm gem, so that the newer
|
|
25
28
|
# version of the class can be used
|
|
26
29
|
|
|
30
|
+
|
|
27
31
|
def self.version
|
|
28
32
|
Gem::Version.new('1.0.0')
|
|
29
33
|
end
|
|
@@ -85,7 +89,7 @@ module GraphQL
|
|
|
85
89
|
end
|
|
86
90
|
end
|
|
87
91
|
|
|
88
|
-
def execute_field_lazy(query:, field:, ast_node:, arguments:, object:)
|
|
92
|
+
def execute_field_lazy(query:, field:, ast_node:, arguments:, object:) # rubocop:disable Development/TraceCallsSuperCop
|
|
89
93
|
execute_field(query: query, field: field, ast_node: ast_node, arguments: arguments, object: object)
|
|
90
94
|
end
|
|
91
95
|
|
|
@@ -199,7 +203,7 @@ module GraphQL
|
|
|
199
203
|
else
|
|
200
204
|
[key, data[key]]
|
|
201
205
|
end
|
|
202
|
-
end.flatten(2).each_slice(2).to_h.merge(Spec: 'graphql')
|
|
206
|
+
end.tap { _1.flatten!(2) }.each_slice(2).to_h.merge(Spec: 'graphql')
|
|
203
207
|
end
|
|
204
208
|
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
|
205
209
|
|
|
@@ -230,7 +234,7 @@ module GraphQL
|
|
|
230
234
|
end
|
|
231
235
|
|
|
232
236
|
def graphql_multiplex(data)
|
|
233
|
-
names = data.queries.map(&:operations).map(&:keys).flatten.compact
|
|
237
|
+
names = data.queries.map(&:operations).map!(&:keys).tap(&:flatten!).tap(&:compact!)
|
|
234
238
|
multiplex_transaction_name(names) if names.size > 1
|
|
235
239
|
|
|
236
240
|
[:Operations, names.join(', ')]
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "graphql/tracing/platform_tracing"
|
|
4
|
+
|
|
3
5
|
module GraphQL
|
|
4
6
|
module Tracing
|
|
5
7
|
|
|
@@ -20,6 +22,11 @@ module GraphQL
|
|
|
20
22
|
# These GraphQL events will show up as 'graphql.execute' spans
|
|
21
23
|
EXEC_KEYS = ['execute_multiplex', 'execute_query', 'execute_query_lazy'].freeze
|
|
22
24
|
|
|
25
|
+
def initialize(...)
|
|
26
|
+
warn "GraphQL::Tracing::AppOptics tracing is deprecated; update to SolarWindsAPM instead, which uses OpenTelemetry."
|
|
27
|
+
super
|
|
28
|
+
end
|
|
29
|
+
|
|
23
30
|
# During auto-instrumentation this version of AppOpticsTracing is compared
|
|
24
31
|
# with the version provided in the appoptics_apm gem, so that the newer
|
|
25
32
|
# version of the class can be used
|
|
@@ -117,7 +124,7 @@ module GraphQL
|
|
|
117
124
|
else
|
|
118
125
|
[key, data[key]]
|
|
119
126
|
end
|
|
120
|
-
end.flatten(2).each_slice(2).to_h.merge(Spec: 'graphql')
|
|
127
|
+
end.tap { _1.flatten!(2) }.each_slice(2).to_h.merge(Spec: 'graphql')
|
|
121
128
|
end
|
|
122
129
|
# rubocop:enable Metrics/AbcSize, Metrics/MethodLength
|
|
123
130
|
|
|
@@ -148,7 +155,7 @@ module GraphQL
|
|
|
148
155
|
end
|
|
149
156
|
|
|
150
157
|
def graphql_multiplex(data)
|
|
151
|
-
names = data.queries.map(&:operations).map(&:keys).flatten.compact
|
|
158
|
+
names = data.queries.map(&:operations).map!(&:keys).tap(&:flatten!).tap(&:compact!)
|
|
152
159
|
multiplex_transaction_name(names) if names.size > 1
|
|
153
160
|
|
|
154
161
|
[:Operations, names.join(', ')]
|
|
@@ -1,81 +1,54 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
require "graphql/tracing/monitor_trace"
|
|
2
3
|
|
|
3
4
|
module GraphQL
|
|
4
5
|
module Tracing
|
|
6
|
+
# Instrumentation for reporting GraphQL-Ruby times to Appsignal.
|
|
7
|
+
#
|
|
8
|
+
# @example Installing the tracer
|
|
9
|
+
# class MySchema < GraphQL::Schema
|
|
10
|
+
# trace_with GraphQL::Tracing::AppsignalTrace
|
|
11
|
+
# end
|
|
12
|
+
AppsignalTrace = MonitorTrace.create_module("appsignal")
|
|
5
13
|
module AppsignalTrace
|
|
6
|
-
include PlatformTrace
|
|
7
|
-
|
|
8
14
|
# @param set_action_name [Boolean] If true, the GraphQL operation name will be used as the transaction name.
|
|
9
15
|
# This is not advised if you run more than one query per HTTP request, for example, with `graphql-client` or multiplexing.
|
|
10
16
|
# It can also be specified per-query with `context[:set_appsignal_action_name]`.
|
|
11
17
|
def initialize(set_action_name: false, **rest)
|
|
12
|
-
|
|
18
|
+
rest[:set_transaction_name] ||= set_action_name
|
|
19
|
+
setup_appsignal_monitor(**rest)
|
|
13
20
|
super
|
|
14
21
|
end
|
|
15
22
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
"analyze_multiplex" => "analyze.graphql",
|
|
24
|
-
"execute_multiplex" => "execute.graphql",
|
|
25
|
-
"execute_query" => "execute.graphql",
|
|
26
|
-
"execute_query_lazy" => "execute.graphql",
|
|
27
|
-
}.each do |trace_method, platform_key|
|
|
28
|
-
module_eval <<-RUBY, __FILE__, __LINE__
|
|
29
|
-
def #{trace_method}(**data)
|
|
30
|
-
#{
|
|
31
|
-
if trace_method == "execute_query"
|
|
32
|
-
<<-RUBY
|
|
33
|
-
set_this_txn_name = data[:query].context[:set_appsignal_action_name]
|
|
34
|
-
if set_this_txn_name == true || (set_this_txn_name.nil? && @set_action_name)
|
|
35
|
-
Appsignal::Transaction.current.set_action(transaction_name(data[:query]))
|
|
36
|
-
end
|
|
37
|
-
RUBY
|
|
38
|
-
end
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
Appsignal.instrument("#{platform_key}") do
|
|
42
|
-
super
|
|
23
|
+
class AppsignalMonitor < MonitorTrace::Monitor
|
|
24
|
+
def instrument(keyword, object)
|
|
25
|
+
if keyword == :execute
|
|
26
|
+
query = object.queries.first
|
|
27
|
+
set_this_txn_name = query.context[:set_appsignal_action_name]
|
|
28
|
+
if set_this_txn_name == true || (set_this_txn_name.nil? && @set_transaction_name)
|
|
29
|
+
Appsignal::Transaction.current.set_action(transaction_name(query))
|
|
43
30
|
end
|
|
44
31
|
end
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
# rubocop:enable Development/NoEvalCop
|
|
49
|
-
|
|
50
|
-
def platform_execute_field(platform_key)
|
|
51
|
-
Appsignal.instrument(platform_key) do
|
|
52
|
-
yield
|
|
32
|
+
Appsignal.instrument(name_for(keyword, object)) do
|
|
33
|
+
yield
|
|
34
|
+
end
|
|
53
35
|
end
|
|
54
|
-
end
|
|
55
36
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
37
|
+
include MonitorTrace::Monitor::GraphQLSuffixNames
|
|
38
|
+
class Event < GraphQL::Tracing::MonitorTrace::Monitor::Event
|
|
39
|
+
def start
|
|
40
|
+
Appsignal::Transaction.current.start_event
|
|
41
|
+
end
|
|
61
42
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
43
|
+
def finish
|
|
44
|
+
Appsignal::Transaction.current.finish_event(
|
|
45
|
+
@monitor.name_for(@keyword, @object),
|
|
46
|
+
"",
|
|
47
|
+
""
|
|
48
|
+
)
|
|
49
|
+
end
|
|
65
50
|
end
|
|
66
51
|
end
|
|
67
|
-
|
|
68
|
-
def platform_field_key(field)
|
|
69
|
-
"#{field.owner.graphql_name}.#{field.graphql_name}.graphql"
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def platform_authorized_key(type)
|
|
73
|
-
"#{type.graphql_name}.authorized.graphql"
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
def platform_resolve_type_key(type)
|
|
77
|
-
"#{type.graphql_name}.resolve_type.graphql"
|
|
78
|
-
end
|
|
79
52
|
end
|
|
80
53
|
end
|
|
81
54
|
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module GraphQL
|
|
4
|
+
module Tracing
|
|
5
|
+
# This trace class calls legacy-style tracer with payload hashes.
|
|
6
|
+
# New-style `trace_with` modules significantly reduce the overhead of tracing,
|
|
7
|
+
# but that advantage is lost when legacy-style tracers are also used (since the payload hashes are still constructed).
|
|
8
|
+
module CallLegacyTracers
|
|
9
|
+
def lex(query_string:)
|
|
10
|
+
(@multiplex || @query).trace("lex", { query_string: query_string }) { super }
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def parse(query_string:)
|
|
14
|
+
(@multiplex || @query).trace("parse", { query_string: query_string }) { super }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def validate(query:, validate:)
|
|
18
|
+
query.trace("validate", { validate: validate, query: query }) { super }
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def analyze_multiplex(multiplex:)
|
|
22
|
+
multiplex.trace("analyze_multiplex", { multiplex: multiplex }) { super }
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def analyze_query(query:)
|
|
26
|
+
query.trace("analyze_query", { query: query }) { super }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def execute_multiplex(multiplex:)
|
|
30
|
+
multiplex.trace("execute_multiplex", { multiplex: multiplex }) { super }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def execute_query(query:)
|
|
34
|
+
query.trace("execute_query", { query: query }) { super }
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def execute_query_lazy(query:, multiplex:)
|
|
38
|
+
multiplex.trace("execute_query_lazy", { multiplex: multiplex, query: query }) { super }
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def execute_field(field:, query:, ast_node:, arguments:, object:)
|
|
42
|
+
query.trace("execute_field", { field: field, query: query, ast_node: ast_node, arguments: arguments, object: object, owner: field.owner, path: query.context[:current_path] }) { super }
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def execute_field_lazy(field:, query:, ast_node:, arguments:, object:)
|
|
46
|
+
query.trace("execute_field_lazy", { field: field, query: query, ast_node: ast_node, arguments: arguments, object: object, owner: field.owner, path: query.context[:current_path] }) { super }
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def authorized(query:, type:, object:)
|
|
50
|
+
query.trace("authorized", { context: query.context, type: type, object: object, path: query.context[:current_path] }) { super }
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def authorized_lazy(query:, type:, object:)
|
|
54
|
+
query.trace("authorized_lazy", { context: query.context, type: type, object: object, path: query.context[:current_path] }) { super }
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def resolve_type(query:, type:, object:)
|
|
58
|
+
query.trace("resolve_type", { context: query.context, type: type, object: object, path: query.context[:current_path] }) { super }
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def resolve_type_lazy(query:, type:, object:)
|
|
62
|
+
query.trace("resolve_type_lazy", { context: query.context, type: type, object: object, path: query.context[:current_path] }) { super }
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|