graphql 1.12.12 → 2.2.14
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.
- checksums.yaml +4 -4
- data/lib/generators/graphql/core.rb +3 -8
- data/lib/generators/graphql/enum_generator.rb +4 -10
- data/lib/generators/graphql/field_extractor.rb +31 -0
- data/lib/generators/graphql/input_generator.rb +50 -0
- data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
- data/lib/generators/graphql/{templates → install/templates}/base_mutation.erb +2 -0
- data/lib/generators/graphql/{templates → install/templates}/mutation_type.erb +2 -0
- data/lib/generators/graphql/install_generator.rb +14 -4
- data/lib/generators/graphql/interface_generator.rb +7 -7
- data/lib/generators/graphql/mutation_create_generator.rb +22 -0
- data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
- data/lib/generators/graphql/mutation_generator.rb +5 -30
- data/lib/generators/graphql/mutation_update_generator.rb +22 -0
- data/lib/generators/graphql/object_generator.rb +10 -38
- data/lib/generators/graphql/orm_mutations_base.rb +40 -0
- data/lib/generators/graphql/relay.rb +23 -12
- data/lib/generators/graphql/scalar_generator.rb +4 -2
- 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 +6 -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/enum.erb +5 -1
- data/lib/generators/graphql/templates/graphql_controller.erb +2 -0
- data/lib/generators/graphql/templates/input.erb +9 -0
- data/lib/generators/graphql/templates/interface.erb +4 -2
- data/lib/generators/graphql/templates/loader.erb +2 -0
- data/lib/generators/graphql/templates/mutation.erb +3 -1
- data/lib/generators/graphql/templates/mutation_create.erb +20 -0
- data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
- data/lib/generators/graphql/templates/mutation_update.erb +21 -0
- data/lib/generators/graphql/templates/node_type.erb +2 -0
- data/lib/generators/graphql/templates/object.erb +4 -2
- data/lib/generators/graphql/templates/query_type.erb +2 -0
- data/lib/generators/graphql/templates/scalar.erb +3 -1
- data/lib/generators/graphql/templates/schema.erb +19 -2
- data/lib/generators/graphql/templates/union.erb +4 -2
- data/lib/generators/graphql/type_generator.rb +46 -10
- data/lib/generators/graphql/union_generator.rb +5 -5
- data/lib/graphql/analysis/ast/analyzer.rb +7 -0
- data/lib/graphql/analysis/ast/field_usage.rb +55 -1
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
- data/lib/graphql/analysis/ast/query_complexity.rb +88 -140
- data/lib/graphql/analysis/ast/query_depth.rb +7 -3
- data/lib/graphql/analysis/ast/visitor.rb +50 -42
- data/lib/graphql/analysis/ast.rb +26 -23
- data/lib/graphql/analysis.rb +0 -7
- data/lib/graphql/backtrace/table.rb +4 -22
- data/lib/graphql/backtrace/trace.rb +93 -0
- data/lib/graphql/backtrace/tracer.rb +8 -6
- data/lib/graphql/backtrace.rb +3 -8
- data/lib/graphql/coercion_error.rb +1 -9
- data/lib/graphql/dataloader/async_dataloader.rb +85 -0
- data/lib/graphql/dataloader/null_dataloader.rb +3 -1
- data/lib/graphql/dataloader/request.rb +5 -0
- data/lib/graphql/dataloader/source.rb +120 -31
- data/lib/graphql/dataloader.rb +168 -142
- data/lib/graphql/date_encoding_error.rb +16 -0
- data/lib/graphql/dig.rb +1 -1
- data/lib/graphql/duration_encoding_error.rb +16 -0
- data/lib/graphql/execution/errors.rb +12 -81
- data/lib/graphql/execution/interpreter/arguments.rb +2 -2
- data/lib/graphql/execution/interpreter/arguments_cache.rb +36 -34
- data/lib/graphql/execution/interpreter/resolve.rb +32 -2
- data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +170 -0
- data/lib/graphql/execution/interpreter/runtime.rb +414 -341
- data/lib/graphql/execution/interpreter.rb +122 -80
- data/lib/graphql/execution/lazy.rb +11 -21
- data/lib/graphql/execution/lookahead.rb +125 -54
- data/lib/graphql/execution/multiplex.rb +4 -172
- data/lib/graphql/execution.rb +11 -4
- data/lib/graphql/integer_encoding_error.rb +18 -2
- data/lib/graphql/introspection/directive_location_enum.rb +2 -2
- data/lib/graphql/introspection/directive_type.rb +5 -3
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +11 -18
- data/lib/graphql/introspection/enum_value_type.rb +2 -2
- data/lib/graphql/introspection/field_type.rb +3 -3
- data/lib/graphql/introspection/input_value_type.rb +10 -4
- data/lib/graphql/introspection/schema_type.rb +12 -5
- data/lib/graphql/introspection/type_type.rb +25 -12
- data/lib/graphql/introspection.rb +6 -2
- data/lib/graphql/language/block_string.rb +37 -25
- data/lib/graphql/language/definition_slice.rb +1 -1
- data/lib/graphql/language/document_from_schema_definition.rb +78 -65
- data/lib/graphql/language/lexer.rb +345 -1467
- data/lib/graphql/language/nodes.rb +145 -91
- data/lib/graphql/language/parser.rb +701 -1921
- data/lib/graphql/language/printer.rb +351 -155
- data/lib/graphql/language/sanitized_printer.rb +25 -27
- data/lib/graphql/language/static_visitor.rb +167 -0
- data/lib/graphql/language/token.rb +0 -4
- data/lib/graphql/language/visitor.rb +188 -141
- data/lib/graphql/language.rb +1 -0
- data/lib/graphql/load_application_object_failed_error.rb +5 -1
- data/lib/graphql/name_validator.rb +0 -4
- data/lib/graphql/pagination/active_record_relation_connection.rb +37 -8
- data/lib/graphql/pagination/array_connection.rb +8 -6
- data/lib/graphql/pagination/connection.rb +61 -7
- data/lib/graphql/pagination/connections.rb +22 -23
- data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -2
- data/lib/graphql/pagination/relation_connection.rb +60 -28
- data/lib/graphql/query/context/scoped_context.rb +101 -0
- data/lib/graphql/query/context.rb +109 -189
- data/lib/graphql/query/input_validation_result.rb +10 -1
- data/lib/graphql/query/null_context.rb +14 -29
- data/lib/graphql/query/validation_pipeline.rb +15 -39
- data/lib/graphql/query/variable_validation_error.rb +2 -2
- data/lib/graphql/query/variables.rb +35 -17
- data/lib/graphql/query.rb +78 -65
- data/lib/graphql/railtie.rb +8 -109
- data/lib/graphql/rake_task/validate.rb +1 -1
- data/lib/graphql/rake_task.rb +30 -11
- data/lib/graphql/relay/range_add.rb +9 -16
- data/lib/graphql/relay.rb +0 -15
- data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
- data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
- data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
- data/lib/graphql/rubocop.rb +4 -0
- data/lib/graphql/schema/addition.rb +78 -45
- data/lib/graphql/schema/always_visible.rb +10 -0
- data/lib/graphql/schema/argument.rb +134 -80
- data/lib/graphql/schema/base_64_encoder.rb +3 -5
- data/lib/graphql/schema/build_from_definition.rb +60 -38
- data/lib/graphql/schema/directive/feature.rb +1 -1
- data/lib/graphql/schema/directive/flagged.rb +2 -2
- data/lib/graphql/schema/directive/include.rb +1 -1
- data/lib/graphql/schema/directive/one_of.rb +24 -0
- data/lib/graphql/schema/directive/skip.rb +1 -1
- data/lib/graphql/schema/directive/specified_by.rb +14 -0
- data/lib/graphql/schema/directive/transform.rb +2 -2
- data/lib/graphql/schema/directive.rb +33 -21
- data/lib/graphql/schema/enum.rb +93 -46
- data/lib/graphql/schema/enum_value.rb +4 -21
- data/lib/graphql/schema/field/connection_extension.rb +6 -16
- data/lib/graphql/schema/field/scope_extension.rb +8 -1
- data/lib/graphql/schema/field.rb +432 -337
- data/lib/graphql/schema/field_extension.rb +86 -2
- data/lib/graphql/schema/find_inherited_value.rb +3 -7
- data/lib/graphql/schema/finder.rb +5 -5
- data/lib/graphql/schema/has_single_input_argument.rb +156 -0
- data/lib/graphql/schema/input_object.rb +88 -90
- data/lib/graphql/schema/interface.rb +19 -59
- data/lib/graphql/schema/introspection_system.rb +6 -9
- data/lib/graphql/schema/late_bound_type.rb +8 -2
- data/lib/graphql/schema/list.rb +18 -7
- data/lib/graphql/schema/loader.rb +3 -3
- data/lib/graphql/schema/member/base_dsl_methods.rb +18 -19
- data/lib/graphql/schema/member/build_type.rb +16 -13
- data/lib/graphql/schema/member/has_arguments.rb +288 -84
- data/lib/graphql/schema/member/has_ast_node.rb +12 -0
- data/lib/graphql/schema/member/has_deprecation_reason.rb +3 -4
- data/lib/graphql/schema/member/has_directives.rb +81 -61
- data/lib/graphql/schema/member/has_fields.rb +149 -31
- data/lib/graphql/schema/member/has_interfaces.rb +143 -0
- data/lib/graphql/schema/member/has_validators.rb +32 -6
- data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
- data/lib/graphql/schema/member/scoped.rb +19 -0
- data/lib/graphql/schema/member/type_system_helpers.rb +17 -0
- data/lib/graphql/schema/member/validates_input.rb +6 -6
- data/lib/graphql/schema/member.rb +1 -6
- data/lib/graphql/schema/mutation.rb +0 -9
- data/lib/graphql/schema/non_null.rb +7 -7
- data/lib/graphql/schema/object.rb +30 -119
- data/lib/graphql/schema/printer.rb +23 -25
- data/lib/graphql/schema/relay_classic_mutation.rb +13 -90
- data/lib/graphql/schema/resolver/has_payload_type.rb +46 -11
- data/lib/graphql/schema/resolver.rb +101 -102
- data/lib/graphql/schema/scalar.rb +20 -21
- data/lib/graphql/schema/subscription.rb +45 -17
- data/lib/graphql/schema/timeout.rb +25 -29
- data/lib/graphql/schema/type_expression.rb +1 -1
- data/lib/graphql/schema/type_membership.rb +21 -4
- data/lib/graphql/schema/union.rb +15 -15
- data/lib/graphql/schema/unique_within_type.rb +1 -1
- data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
- data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
- data/lib/graphql/schema/validator/exclusion_validator.rb +3 -1
- data/lib/graphql/schema/validator/format_validator.rb +4 -5
- data/lib/graphql/schema/validator/inclusion_validator.rb +3 -1
- data/lib/graphql/schema/validator/length_validator.rb +5 -3
- data/lib/graphql/schema/validator/numericality_validator.rb +13 -2
- data/lib/graphql/schema/validator/required_validator.rb +29 -15
- data/lib/graphql/schema/validator.rb +35 -27
- data/lib/graphql/schema/warden.rb +259 -132
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +658 -989
- data/lib/graphql/static_validation/all_rules.rb +3 -1
- data/lib/graphql/static_validation/base_visitor.rb +14 -28
- data/lib/graphql/static_validation/definition_dependencies.rb +7 -2
- data/lib/graphql/static_validation/error.rb +3 -1
- data/lib/graphql/static_validation/literal_validator.rb +21 -4
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +1 -1
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +1 -1
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +11 -5
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +13 -13
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +12 -4
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +54 -28
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
- data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
- data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
- data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
- data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +5 -3
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +4 -4
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +13 -7
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +1 -1
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +13 -7
- data/lib/graphql/static_validation/validation_context.rb +16 -6
- data/lib/graphql/static_validation/validator.rb +11 -27
- data/lib/graphql/static_validation.rb +0 -3
- data/lib/graphql/string_encoding_error.rb +13 -3
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +46 -9
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +38 -1
- data/lib/graphql/subscriptions/event.rb +75 -37
- data/lib/graphql/subscriptions/serialize.rb +25 -3
- data/lib/graphql/subscriptions.rb +59 -47
- data/lib/graphql/testing/helpers.rb +129 -0
- data/lib/graphql/testing.rb +2 -0
- data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +6 -20
- data/lib/graphql/tracing/appoptics_trace.rb +251 -0
- data/lib/graphql/tracing/appoptics_tracing.rb +2 -2
- data/lib/graphql/tracing/appsignal_trace.rb +77 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +15 -0
- data/lib/graphql/tracing/data_dog_trace.rb +183 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +25 -15
- data/lib/graphql/{execution/instrumentation.rb → tracing/legacy_hooks_trace.rb} +10 -28
- data/lib/graphql/tracing/legacy_trace.rb +69 -0
- data/lib/graphql/tracing/new_relic_trace.rb +75 -0
- data/lib/graphql/tracing/notifications_trace.rb +45 -0
- data/lib/graphql/tracing/notifications_tracing.rb +59 -0
- data/lib/graphql/tracing/platform_trace.rb +118 -0
- data/lib/graphql/tracing/platform_tracing.rb +46 -49
- data/lib/graphql/tracing/{prometheus_tracing → prometheus_trace}/graphql_collector.rb +4 -2
- data/lib/graphql/tracing/prometheus_trace.rb +89 -0
- data/lib/graphql/tracing/prometheus_tracing.rb +3 -3
- data/lib/graphql/tracing/scout_trace.rb +72 -0
- data/lib/graphql/tracing/sentry_trace.rb +112 -0
- data/lib/graphql/tracing/statsd_trace.rb +56 -0
- data/lib/graphql/tracing/trace.rb +76 -0
- data/lib/graphql/tracing.rb +20 -41
- data/lib/graphql/type_kinds.rb +6 -3
- data/lib/graphql/types/big_int.rb +5 -1
- data/lib/graphql/types/int.rb +1 -1
- data/lib/graphql/types/iso_8601_date.rb +17 -6
- data/lib/graphql/types/iso_8601_date_time.rb +12 -1
- data/lib/graphql/types/iso_8601_duration.rb +77 -0
- data/lib/graphql/types/relay/base_connection.rb +16 -6
- data/lib/graphql/types/relay/connection_behaviors.rb +82 -32
- data/lib/graphql/types/relay/edge_behaviors.rb +36 -7
- data/lib/graphql/types/relay/has_node_field.rb +2 -2
- data/lib/graphql/types/relay/has_nodes_field.rb +2 -2
- data/lib/graphql/types/relay/node_behaviors.rb +12 -2
- data/lib/graphql/types/relay/page_info_behaviors.rb +7 -2
- data/lib/graphql/types/relay.rb +0 -3
- data/lib/graphql/types/string.rb +2 -2
- data/lib/graphql/types.rb +1 -0
- data/lib/graphql/unauthorized_error.rb +1 -1
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +33 -95
- data/readme.md +13 -6
- metadata +102 -185
- data/lib/graphql/analysis/analyze_query.rb +0 -98
- data/lib/graphql/analysis/field_usage.rb +0 -45
- data/lib/graphql/analysis/max_query_complexity.rb +0 -26
- data/lib/graphql/analysis/max_query_depth.rb +0 -26
- data/lib/graphql/analysis/query_complexity.rb +0 -88
- data/lib/graphql/analysis/query_depth.rb +0 -43
- data/lib/graphql/analysis/reducer_state.rb +0 -48
- data/lib/graphql/argument.rb +0 -131
- data/lib/graphql/authorization.rb +0 -82
- data/lib/graphql/backtrace/legacy_tracer.rb +0 -56
- data/lib/graphql/backwards_compatibility.rb +0 -61
- data/lib/graphql/base_type.rb +0 -230
- data/lib/graphql/boolean_type.rb +0 -2
- data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
- data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
- data/lib/graphql/compatibility/execution_specification.rb +0 -436
- data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
- data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -215
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -87
- data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
- data/lib/graphql/compatibility/query_parser_specification.rb +0 -266
- data/lib/graphql/compatibility/schema_parser_specification.rb +0 -682
- data/lib/graphql/compatibility.rb +0 -5
- data/lib/graphql/define/assign_argument.rb +0 -12
- data/lib/graphql/define/assign_connection.rb +0 -13
- data/lib/graphql/define/assign_enum_value.rb +0 -18
- data/lib/graphql/define/assign_global_id_field.rb +0 -11
- data/lib/graphql/define/assign_mutation_function.rb +0 -34
- data/lib/graphql/define/assign_object_field.rb +0 -42
- data/lib/graphql/define/defined_object_proxy.rb +0 -53
- data/lib/graphql/define/instance_definable.rb +0 -240
- data/lib/graphql/define/no_definition_error.rb +0 -7
- data/lib/graphql/define/non_null_with_bang.rb +0 -16
- data/lib/graphql/define/type_definer.rb +0 -31
- data/lib/graphql/define.rb +0 -31
- data/lib/graphql/deprecated_dsl.rb +0 -47
- data/lib/graphql/deprecation.rb +0 -13
- data/lib/graphql/directive/deprecated_directive.rb +0 -2
- data/lib/graphql/directive/include_directive.rb +0 -2
- data/lib/graphql/directive/skip_directive.rb +0 -2
- data/lib/graphql/directive.rb +0 -111
- data/lib/graphql/enum_type.rb +0 -129
- data/lib/graphql/execution/execute.rb +0 -333
- data/lib/graphql/execution/flatten.rb +0 -40
- data/lib/graphql/execution/lazy/resolve.rb +0 -91
- data/lib/graphql/execution/typecast.rb +0 -50
- data/lib/graphql/field/resolve.rb +0 -59
- data/lib/graphql/field.rb +0 -226
- data/lib/graphql/filter.rb +0 -53
- data/lib/graphql/float_type.rb +0 -2
- data/lib/graphql/function.rb +0 -128
- data/lib/graphql/id_type.rb +0 -2
- data/lib/graphql/input_object_type.rb +0 -138
- data/lib/graphql/int_type.rb +0 -2
- data/lib/graphql/interface_type.rb +0 -72
- data/lib/graphql/internal_representation/document.rb +0 -27
- data/lib/graphql/internal_representation/node.rb +0 -206
- data/lib/graphql/internal_representation/print.rb +0 -51
- data/lib/graphql/internal_representation/rewrite.rb +0 -184
- data/lib/graphql/internal_representation/scope.rb +0 -88
- data/lib/graphql/internal_representation/visit.rb +0 -36
- data/lib/graphql/internal_representation.rb +0 -7
- data/lib/graphql/language/lexer.rl +0 -262
- data/lib/graphql/language/parser.y +0 -543
- data/lib/graphql/list_type.rb +0 -80
- data/lib/graphql/non_null_type.rb +0 -71
- data/lib/graphql/object_type.rb +0 -130
- data/lib/graphql/query/arguments.rb +0 -189
- data/lib/graphql/query/arguments_cache.rb +0 -24
- data/lib/graphql/query/executor.rb +0 -52
- data/lib/graphql/query/literal_input.rb +0 -136
- data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
- data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
- data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
- data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
- data/lib/graphql/query/serial_execution.rb +0 -40
- data/lib/graphql/relay/array_connection.rb +0 -83
- data/lib/graphql/relay/base_connection.rb +0 -189
- data/lib/graphql/relay/connection_instrumentation.rb +0 -54
- data/lib/graphql/relay/connection_resolve.rb +0 -43
- data/lib/graphql/relay/connection_type.rb +0 -41
- data/lib/graphql/relay/edge.rb +0 -27
- data/lib/graphql/relay/edge_type.rb +0 -19
- data/lib/graphql/relay/edges_instrumentation.rb +0 -40
- data/lib/graphql/relay/global_id_resolve.rb +0 -18
- data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
- data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
- data/lib/graphql/relay/mutation/resolve.rb +0 -56
- data/lib/graphql/relay/mutation/result.rb +0 -38
- data/lib/graphql/relay/mutation.rb +0 -106
- data/lib/graphql/relay/node.rb +0 -39
- data/lib/graphql/relay/page_info.rb +0 -7
- data/lib/graphql/relay/relation_connection.rb +0 -188
- data/lib/graphql/relay/type_extensions.rb +0 -32
- data/lib/graphql/scalar_type.rb +0 -91
- data/lib/graphql/schema/base_64_bp.rb +0 -26
- data/lib/graphql/schema/catchall_middleware.rb +0 -35
- data/lib/graphql/schema/default_parse_error.rb +0 -10
- data/lib/graphql/schema/default_type_error.rb +0 -17
- data/lib/graphql/schema/member/accepts_definition.rb +0 -152
- data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -31
- data/lib/graphql/schema/member/instrumentation.rb +0 -131
- data/lib/graphql/schema/middleware_chain.rb +0 -82
- data/lib/graphql/schema/possible_types.rb +0 -44
- data/lib/graphql/schema/rescue_middleware.rb +0 -60
- data/lib/graphql/schema/timeout_middleware.rb +0 -88
- data/lib/graphql/schema/traversal.rb +0 -228
- data/lib/graphql/schema/validation.rb +0 -313
- data/lib/graphql/static_validation/default_visitor.rb +0 -15
- data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
- data/lib/graphql/static_validation/type_stack.rb +0 -216
- data/lib/graphql/string_type.rb +0 -2
- data/lib/graphql/subscriptions/instrumentation.rb +0 -79
- data/lib/graphql/subscriptions/subscription_root.rb +0 -76
- data/lib/graphql/tracing/skylight_tracing.rb +0 -70
- data/lib/graphql/types/relay/default_relay.rb +0 -27
- data/lib/graphql/types/relay/node_field.rb +0 -25
- data/lib/graphql/types/relay/nodes_field.rb +0 -27
- data/lib/graphql/union_type.rb +0 -115
- data/lib/graphql/upgrader/member.rb +0 -937
- data/lib/graphql/upgrader/schema.rb +0 -38
@@ -9,7 +9,7 @@ module GraphQL
|
|
9
9
|
SYMBOL_KEY = "__sym__"
|
10
10
|
SYMBOL_KEYS_KEY = "__sym_keys__"
|
11
11
|
TIMESTAMP_KEY = "__timestamp__"
|
12
|
-
TIMESTAMP_FORMAT = "%Y-%m-%d %H:%M:%S.%N%
|
12
|
+
TIMESTAMP_FORMAT = "%Y-%m-%d %H:%M:%S.%N%z" # eg '2020-01-01 23:59:59.123456789+05:00'
|
13
13
|
OPEN_STRUCT_KEY = "__ostruct__"
|
14
14
|
|
15
15
|
module_function
|
@@ -71,9 +71,17 @@ module GraphQL
|
|
71
71
|
when SYMBOL_KEY
|
72
72
|
value[SYMBOL_KEY].to_sym
|
73
73
|
when TIMESTAMP_KEY
|
74
|
-
timestamp_class_name,
|
74
|
+
timestamp_class_name, *timestamp_args = value[TIMESTAMP_KEY]
|
75
75
|
timestamp_class = Object.const_get(timestamp_class_name)
|
76
|
-
|
76
|
+
if defined?(ActiveSupport::TimeWithZone) && timestamp_class <= ActiveSupport::TimeWithZone
|
77
|
+
zone_name, timestamp_s = timestamp_args
|
78
|
+
zone = ActiveSupport::TimeZone[zone_name]
|
79
|
+
raise "Zone #{zone_name} not found, unable to deserialize" unless zone
|
80
|
+
zone.strptime(timestamp_s, TIMESTAMP_FORMAT)
|
81
|
+
else
|
82
|
+
timestamp_s = timestamp_args.first
|
83
|
+
timestamp_class.strptime(timestamp_s, TIMESTAMP_FORMAT)
|
84
|
+
end
|
77
85
|
when OPEN_STRUCT_KEY
|
78
86
|
ostruct_values = load_value(value[OPEN_STRUCT_KEY])
|
79
87
|
OpenStruct.new(ostruct_values)
|
@@ -123,11 +131,25 @@ module GraphQL
|
|
123
131
|
{ SYMBOL_KEY => obj.to_s }
|
124
132
|
elsif obj.respond_to?(:to_gid_param)
|
125
133
|
{GLOBALID_KEY => obj.to_gid_param}
|
134
|
+
elsif defined?(ActiveSupport::TimeWithZone) && obj.is_a?(ActiveSupport::TimeWithZone) && obj.class.name != Time.name
|
135
|
+
# This handles a case where Rails prior to 7 would
|
136
|
+
# make the class ActiveSupport::TimeWithZone return "Time" for
|
137
|
+
# its name. In Rails 7, it will now return "ActiveSupport::TimeWithZone",
|
138
|
+
# which happens to be incompatible with expectations we have
|
139
|
+
# with what a Time class supports ( notably, strptime in `load_value` ).
|
140
|
+
#
|
141
|
+
# This now passes along the name of the zone, such that a future deserialization
|
142
|
+
# of this string will use the correct time zone from the ActiveSupport TimeZone
|
143
|
+
# list to produce the time.
|
144
|
+
#
|
145
|
+
{ TIMESTAMP_KEY => [obj.class.name, obj.time_zone.name, obj.strftime(TIMESTAMP_FORMAT)] }
|
126
146
|
elsif obj.is_a?(Date) || obj.is_a?(Time)
|
127
147
|
# DateTime extends Date; for TimeWithZone, call `.utc` first.
|
128
148
|
{ TIMESTAMP_KEY => [obj.class.name, obj.strftime(TIMESTAMP_FORMAT)] }
|
129
149
|
elsif obj.is_a?(OpenStruct)
|
130
150
|
{ OPEN_STRUCT_KEY => dump_value(obj.to_h) }
|
151
|
+
elsif defined?(ActiveRecord::Relation) && obj.is_a?(ActiveRecord::Relation)
|
152
|
+
dump_value(obj.to_a)
|
131
153
|
else
|
132
154
|
obj
|
133
155
|
end
|
@@ -2,10 +2,8 @@
|
|
2
2
|
require "securerandom"
|
3
3
|
require "graphql/subscriptions/broadcast_analyzer"
|
4
4
|
require "graphql/subscriptions/event"
|
5
|
-
require "graphql/subscriptions/instrumentation"
|
6
5
|
require "graphql/subscriptions/serialize"
|
7
6
|
require "graphql/subscriptions/action_cable_subscriptions"
|
8
|
-
require "graphql/subscriptions/subscription_root"
|
9
7
|
require "graphql/subscriptions/default_subscription_resolve_extension"
|
10
8
|
|
11
9
|
module GraphQL
|
@@ -16,19 +14,21 @@ module GraphQL
|
|
16
14
|
class InvalidTriggerError < GraphQL::Error
|
17
15
|
end
|
18
16
|
|
17
|
+
# Raised when either:
|
18
|
+
# - An initial subscription didn't have a value for `context[subscription_scope]`
|
19
|
+
# - Or, an update didn't pass `.trigger(..., scope:)`
|
20
|
+
# When raised, the initial subscription or update fails completely.
|
21
|
+
class SubscriptionScopeMissingError < GraphQL::Error
|
22
|
+
end
|
23
|
+
|
19
24
|
# @see {Subscriptions#initialize} for options, concrete implementations may add options.
|
20
25
|
def self.use(defn, options = {})
|
21
26
|
schema = defn.is_a?(Class) ? defn : defn.target
|
22
27
|
|
23
|
-
if schema.subscriptions
|
28
|
+
if schema.subscriptions(inherited: false)
|
24
29
|
raise ArgumentError, "Can't reinstall subscriptions. #{schema} is using #{schema.subscriptions}, can't also add #{self}"
|
25
30
|
end
|
26
31
|
|
27
|
-
instrumentation = Subscriptions::Instrumentation.new(schema: schema)
|
28
|
-
defn.instrument(:query, instrumentation)
|
29
|
-
if !schema.is_a?(Class)
|
30
|
-
defn.instrument(:field, instrumentation)
|
31
|
-
end
|
32
32
|
options[:schema] = schema
|
33
33
|
schema.subscriptions = self.new(**options)
|
34
34
|
schema.add_subscription_extension_if_necessary
|
@@ -36,15 +36,14 @@ module GraphQL
|
|
36
36
|
end
|
37
37
|
|
38
38
|
# @param schema [Class] the GraphQL schema this manager belongs to
|
39
|
-
|
39
|
+
# @param validate_update [Boolean] If false, then validation is skipped when executing updates
|
40
|
+
def initialize(schema:, validate_update: true, broadcast: false, default_broadcastable: false, **rest)
|
40
41
|
if broadcast
|
41
|
-
if !schema.using_ast_analysis?
|
42
|
-
raise ArgumentError, "`broadcast: true` requires AST analysis, add `using GraphQL::Analysis::AST` to your schema or see https://graphql-ruby.org/queries/ast_analysis.html."
|
43
|
-
end
|
44
42
|
schema.query_analyzer(Subscriptions::BroadcastAnalyzer)
|
45
43
|
end
|
46
44
|
@default_broadcastable = default_broadcastable
|
47
45
|
@schema = schema
|
46
|
+
@validate_update = validate_update
|
48
47
|
end
|
49
48
|
|
50
49
|
# @return [Boolean] Used when fields don't have `broadcastable:` explicitly set
|
@@ -56,17 +55,21 @@ module GraphQL
|
|
56
55
|
# @param args [Hash<String, Symbol => Object]
|
57
56
|
# @param object [Object]
|
58
57
|
# @param scope [Symbol, String]
|
58
|
+
# @param context [Hash]
|
59
59
|
# @return [void]
|
60
|
-
def trigger(event_name, args, object, scope: nil)
|
60
|
+
def trigger(event_name, args, object, scope: nil, context: {})
|
61
|
+
# Make something as context-like as possible, even though there isn't a current query:
|
62
|
+
dummy_query = @schema.query_class.new(@schema, "{ __typename }", validate: false, context: context)
|
63
|
+
context = dummy_query.context
|
61
64
|
event_name = event_name.to_s
|
62
65
|
|
63
66
|
# Try with the verbatim input first:
|
64
|
-
field = @schema.get_field(@schema.subscription, event_name)
|
67
|
+
field = @schema.get_field(@schema.subscription, event_name, context)
|
65
68
|
|
66
69
|
if field.nil?
|
67
70
|
# And if it wasn't found, normalize it:
|
68
71
|
normalized_event_name = normalize_name(event_name)
|
69
|
-
field = @schema.get_field(@schema.subscription, normalized_event_name)
|
72
|
+
field = @schema.get_field(@schema.subscription, normalized_event_name, context)
|
70
73
|
if field.nil?
|
71
74
|
raise InvalidTriggerError, "No subscription matching trigger: #{event_name} (looked for #{@schema.subscription.graphql_name}.#{normalized_event_name})"
|
72
75
|
end
|
@@ -76,13 +79,15 @@ module GraphQL
|
|
76
79
|
end
|
77
80
|
|
78
81
|
# Normalize symbol-keyed args to strings, try camelizing them
|
79
|
-
|
82
|
+
# Should this accept a real context somehow?
|
83
|
+
normalized_args = normalize_arguments(normalized_event_name, field, args, GraphQL::Query::NullContext.instance)
|
80
84
|
|
81
85
|
event = Subscriptions::Event.new(
|
82
86
|
name: normalized_event_name,
|
83
87
|
arguments: normalized_args,
|
84
88
|
field: field,
|
85
89
|
scope: scope,
|
90
|
+
context: context,
|
86
91
|
)
|
87
92
|
execute_all(event, object)
|
88
93
|
end
|
@@ -109,24 +114,28 @@ module GraphQL
|
|
109
114
|
variables = query_data.fetch(:variables)
|
110
115
|
context = query_data.fetch(:context)
|
111
116
|
operation_name = query_data.fetch(:operation_name)
|
112
|
-
|
117
|
+
execute_options = {
|
113
118
|
query: query_string,
|
114
119
|
context: context,
|
115
120
|
subscription_topic: event.topic,
|
116
121
|
operation_name: operation_name,
|
117
122
|
variables: variables,
|
118
123
|
root_value: object,
|
119
|
-
|
124
|
+
}
|
125
|
+
|
126
|
+
# merge event's and query's context together
|
127
|
+
context.merge!(event.context) unless event.context.nil? || context.nil?
|
128
|
+
|
129
|
+
execute_options[:validate] = validate_update?(**execute_options)
|
130
|
+
result = @schema.execute(**execute_options)
|
120
131
|
subscriptions_context = result.context.namespace(:subscriptions)
|
121
132
|
if subscriptions_context[:no_update]
|
122
133
|
result = nil
|
123
134
|
end
|
124
135
|
|
125
|
-
unsubscribed
|
126
|
-
|
127
|
-
if unsubscribed
|
136
|
+
if subscriptions_context[:unsubscribed] && !subscriptions_context[:final_update]
|
128
137
|
# `unsubscribe` was called, clean up on our side
|
129
|
-
#
|
138
|
+
# The transport should also send `{more: false}` to client
|
130
139
|
delete_subscription(subscription_id)
|
131
140
|
result = nil
|
132
141
|
end
|
@@ -134,6 +143,14 @@ module GraphQL
|
|
134
143
|
result
|
135
144
|
end
|
136
145
|
|
146
|
+
# Define this method to customize whether to validate
|
147
|
+
# this subscription when executing an update.
|
148
|
+
#
|
149
|
+
# @return [Boolean] defaults to `true`, or false if `validate: false` is provided.
|
150
|
+
def validate_update?(query:, context:, root_value:, subscription_topic:, operation_name:, variables:)
|
151
|
+
@validate_update
|
152
|
+
end
|
153
|
+
|
137
154
|
# Run the update query for this subscription and deliver it
|
138
155
|
# @see {#execute_update}
|
139
156
|
# @see {#deliver}
|
@@ -142,7 +159,14 @@ module GraphQL
|
|
142
159
|
res = execute_update(subscription_id, event, object)
|
143
160
|
if !res.nil?
|
144
161
|
deliver(subscription_id, res)
|
162
|
+
|
163
|
+
if res.context.namespace(:subscriptions)[:unsubscribed]
|
164
|
+
# `unsubscribe` was called, clean up on our side
|
165
|
+
# The transport should also send `{more: false}` to client
|
166
|
+
delete_subscription(subscription_id)
|
167
|
+
end
|
145
168
|
end
|
169
|
+
|
146
170
|
end
|
147
171
|
|
148
172
|
# Event `event` occurred on `object`,
|
@@ -151,16 +175,6 @@ module GraphQL
|
|
151
175
|
# @param object [Object]
|
152
176
|
# @return [void]
|
153
177
|
def execute_all(event, object)
|
154
|
-
each_subscription_id(event) do |subscription_id|
|
155
|
-
execute(subscription_id, event, object)
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
# Get each `subscription_id` subscribed to `event.topic` and yield them
|
160
|
-
# @param event [GraphQL::Subscriptions::Event]
|
161
|
-
# @yieldparam subscription_id [String]
|
162
|
-
# @return [void]
|
163
|
-
def each_subscription_id(event)
|
164
178
|
raise GraphQL::RequiredImplementationMissingError
|
165
179
|
end
|
166
180
|
|
@@ -217,7 +231,7 @@ module GraphQL
|
|
217
231
|
|
218
232
|
# @return [Boolean] if true, then a query like this one would be broadcasted
|
219
233
|
def broadcastable?(query_str, **query_options)
|
220
|
-
query =
|
234
|
+
query = @schema.query_class.new(@schema, query_str, **query_options)
|
221
235
|
if !query.valid?
|
222
236
|
raise "Invalid query: #{query.validation_errors.map(&:to_h).inspect}"
|
223
237
|
end
|
@@ -233,9 +247,9 @@ module GraphQL
|
|
233
247
|
# @param arg_owner [GraphQL::Field, GraphQL::BaseType]
|
234
248
|
# @param args [Hash, Array, Any] some GraphQL input value to coerce as `arg_owner`
|
235
249
|
# @return [Any] normalized arguments value
|
236
|
-
def normalize_arguments(event_name, arg_owner, args)
|
250
|
+
def normalize_arguments(event_name, arg_owner, args, context)
|
237
251
|
case arg_owner
|
238
|
-
when GraphQL::
|
252
|
+
when GraphQL::Schema::Field, Class
|
239
253
|
if arg_owner.is_a?(Class) && !arg_owner.kind.input_object?
|
240
254
|
# it's a type, but not an input object
|
241
255
|
return args
|
@@ -244,19 +258,19 @@ module GraphQL
|
|
244
258
|
missing_arg_names = []
|
245
259
|
args.each do |k, v|
|
246
260
|
arg_name = k.to_s
|
247
|
-
arg_defn = arg_owner.
|
261
|
+
arg_defn = arg_owner.get_argument(arg_name, context)
|
248
262
|
if arg_defn
|
249
263
|
normalized_arg_name = arg_name
|
250
264
|
else
|
251
265
|
normalized_arg_name = normalize_name(arg_name)
|
252
|
-
arg_defn = arg_owner.
|
266
|
+
arg_defn = arg_owner.get_argument(normalized_arg_name, context)
|
253
267
|
end
|
254
268
|
|
255
269
|
if arg_defn
|
256
270
|
if arg_defn.loads
|
257
271
|
normalized_arg_name = arg_defn.keyword.to_s
|
258
272
|
end
|
259
|
-
normalized = normalize_arguments(event_name, arg_defn.type, v)
|
273
|
+
normalized = normalize_arguments(event_name, arg_defn.type, v, context)
|
260
274
|
normalized_args[normalized_arg_name] = normalized
|
261
275
|
else
|
262
276
|
# Couldn't find a matching argument definition
|
@@ -266,19 +280,17 @@ module GraphQL
|
|
266
280
|
|
267
281
|
# Backfill default values so that trigger arguments
|
268
282
|
# match query arguments.
|
269
|
-
arg_owner.arguments.each do |
|
283
|
+
arg_owner.arguments(context).each do |_name, arg_defn|
|
270
284
|
if arg_defn.default_value? && !normalized_args.key?(arg_defn.name)
|
271
285
|
default_value = arg_defn.default_value
|
272
286
|
# We don't have an underlying "object" here, so it can't call methods.
|
273
287
|
# This is broken.
|
274
|
-
normalized_args[arg_defn.name] = arg_defn.prepare_value(nil, default_value, context:
|
288
|
+
normalized_args[arg_defn.name] = arg_defn.prepare_value(nil, default_value, context: context)
|
275
289
|
end
|
276
290
|
end
|
277
291
|
|
278
292
|
if missing_arg_names.any?
|
279
|
-
arg_owner_name = if arg_owner.is_a?(GraphQL::Field)
|
280
|
-
"Subscription.#{arg_owner.name}"
|
281
|
-
elsif arg_owner.is_a?(GraphQL::Schema::Field)
|
293
|
+
arg_owner_name = if arg_owner.is_a?(GraphQL::Schema::Field)
|
282
294
|
arg_owner.path
|
283
295
|
elsif arg_owner.is_a?(Class)
|
284
296
|
arg_owner.graphql_name
|
@@ -289,10 +301,10 @@ module GraphQL
|
|
289
301
|
end
|
290
302
|
|
291
303
|
normalized_args
|
292
|
-
when GraphQL::
|
293
|
-
args.map { |a| normalize_arguments(event_name, arg_owner.of_type, a) }
|
294
|
-
when GraphQL::
|
295
|
-
normalize_arguments(event_name, arg_owner.of_type, args)
|
304
|
+
when GraphQL::Schema::List
|
305
|
+
args.map { |a| normalize_arguments(event_name, arg_owner.of_type, a, context) }
|
306
|
+
when GraphQL::Schema::NonNull
|
307
|
+
normalize_arguments(event_name, arg_owner.of_type, args, context)
|
296
308
|
else
|
297
309
|
args
|
298
310
|
end
|
@@ -0,0 +1,129 @@
|
|
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: {})
|
43
|
+
type_name, *field_names = field_path.split(".")
|
44
|
+
dummy_query = GraphQL::Query.new(schema, context: context)
|
45
|
+
query_context = dummy_query.context
|
46
|
+
object_type = dummy_query.get_type(type_name) # rubocop:disable Development/ContextIsPassedCop
|
47
|
+
if object_type
|
48
|
+
graphql_result = object
|
49
|
+
field_names.each do |field_name|
|
50
|
+
inner_object = graphql_result
|
51
|
+
graphql_result = object_type.wrap(inner_object, query_context)
|
52
|
+
if graphql_result.nil?
|
53
|
+
return nil
|
54
|
+
end
|
55
|
+
visible_field = dummy_query.get_field(object_type, field_name)
|
56
|
+
if visible_field
|
57
|
+
dummy_query.context.dataloader.run_isolated {
|
58
|
+
field_args = visible_field.coerce_arguments(graphql_result, arguments, query_context)
|
59
|
+
field_args = schema.sync_lazy(field_args)
|
60
|
+
graphql_result = visible_field.resolve(graphql_result, field_args.keyword_arguments, query_context)
|
61
|
+
graphql_result = schema.sync_lazy(graphql_result)
|
62
|
+
}
|
63
|
+
object_type = visible_field.type.unwrap
|
64
|
+
elsif object_type.all_field_definitions.any? { |f| f.graphql_name == field_name }
|
65
|
+
raise FieldNotVisibleError.new(field_name: field_name, type_name: type_name)
|
66
|
+
else
|
67
|
+
raise FieldNotDefinedError.new(type_name: type_name, field_name: field_name)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
graphql_result
|
71
|
+
elsif schema.has_defined_type?(type_name)
|
72
|
+
raise TypeNotVisibleError.new(type_name: type_name)
|
73
|
+
else
|
74
|
+
raise TypeNotDefinedError.new(type_name: type_name)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def with_resolution_context(schema, type:, object:, context:{})
|
79
|
+
resolution_context = ResolutionAssertionContext.new(
|
80
|
+
self,
|
81
|
+
schema: schema,
|
82
|
+
type_name: type,
|
83
|
+
object: object,
|
84
|
+
context: context
|
85
|
+
)
|
86
|
+
yield(resolution_context)
|
87
|
+
end
|
88
|
+
|
89
|
+
class ResolutionAssertionContext
|
90
|
+
def initialize(test, type_name:, object:, schema:, context:)
|
91
|
+
@test = test
|
92
|
+
@type_name = type_name
|
93
|
+
@object = object
|
94
|
+
@schema = schema
|
95
|
+
@context = context
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
def run_graphql_field(field_name, arguments: {})
|
100
|
+
if @schema
|
101
|
+
@test.run_graphql_field(@schema, "#{@type_name}.#{field_name}", @object, arguments: arguments, context: @context)
|
102
|
+
else
|
103
|
+
@test.run_graphql_field("#{@type_name}.#{field_name}", @object, arguments: arguments, context: @context)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
module SchemaHelpers
|
109
|
+
include Helpers
|
110
|
+
|
111
|
+
def run_graphql_field(field_path, object, arguments: {}, context: {})
|
112
|
+
super(@@schema_class_for_helpers, field_path, object, arguments: arguments, context: context)
|
113
|
+
end
|
114
|
+
|
115
|
+
def with_resolution_context(*args, **kwargs, &block)
|
116
|
+
# schema will be added later
|
117
|
+
super(nil, *args, **kwargs, &block)
|
118
|
+
end
|
119
|
+
|
120
|
+
def self.for(schema_class)
|
121
|
+
Module.new do
|
122
|
+
include SchemaHelpers
|
123
|
+
@@schema_class_for_helpers = schema_class
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'graphql/tracing/notifications_trace'
|
4
|
+
|
5
|
+
module GraphQL
|
6
|
+
module Tracing
|
7
|
+
# This implementation forwards events to ActiveSupport::Notifications
|
8
|
+
# with a `graphql` suffix.
|
9
|
+
module ActiveSupportNotificationsTrace
|
10
|
+
include NotificationsTrace
|
11
|
+
def initialize(engine: ActiveSupport::Notifications, **rest)
|
12
|
+
super
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'graphql/tracing/notifications_tracing'
|
4
|
+
|
3
5
|
module GraphQL
|
4
6
|
module Tracing
|
5
7
|
# This implementation forwards events to ActiveSupport::Notifications
|
@@ -8,27 +10,11 @@ module GraphQL
|
|
8
10
|
# @see KEYS for event names
|
9
11
|
module ActiveSupportNotificationsTracing
|
10
12
|
# A cache of frequently-used keys to avoid needless string allocations
|
11
|
-
KEYS =
|
12
|
-
|
13
|
-
"parse" => "parse.graphql",
|
14
|
-
"validate" => "validate.graphql",
|
15
|
-
"analyze_multiplex" => "analyze_multiplex.graphql",
|
16
|
-
"analyze_query" => "analyze_query.graphql",
|
17
|
-
"execute_query" => "execute_query.graphql",
|
18
|
-
"execute_query_lazy" => "execute_query_lazy.graphql",
|
19
|
-
"execute_field" => "execute_field.graphql",
|
20
|
-
"execute_field_lazy" => "execute_field_lazy.graphql",
|
21
|
-
"authorized" => "authorized.graphql",
|
22
|
-
"authorized_lazy" => "authorized_lazy.graphql",
|
23
|
-
"resolve_type" => "resolve_type.graphql",
|
24
|
-
"resolve_type_lazy" => "resolve_type.graphql",
|
25
|
-
}
|
13
|
+
KEYS = NotificationsTracing::KEYS
|
14
|
+
NOTIFICATIONS_ENGINE = NotificationsTracing.new(ActiveSupport::Notifications) if defined?(ActiveSupport::Notifications)
|
26
15
|
|
27
|
-
def self.trace(key, metadata)
|
28
|
-
|
29
|
-
ActiveSupport::Notifications.instrument(prefixed_key, metadata) do
|
30
|
-
yield
|
31
|
-
end
|
16
|
+
def self.trace(key, metadata, &blk)
|
17
|
+
NOTIFICATIONS_ENGINE.trace(key, metadata, &blk)
|
32
18
|
end
|
33
19
|
end
|
34
20
|
end
|