graphql 1.9.5 → 1.13.19
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 +5 -5
- data/lib/generators/graphql/core.rb +21 -9
- 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/install/templates/base_mutation.erb +10 -0
- data/lib/generators/graphql/{templates → install/templates}/mutation_type.erb +2 -0
- data/lib/generators/graphql/install_generator.rb +48 -8
- data/lib/generators/graphql/interface_generator.rb +7 -7
- data/lib/generators/graphql/loader_generator.rb +1 -0
- 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 +6 -30
- data/lib/generators/graphql/mutation_update_generator.rb +22 -0
- data/lib/generators/graphql/object_generator.rb +28 -12
- data/lib/generators/graphql/orm_mutations_base.rb +40 -0
- data/lib/generators/graphql/relay.rb +63 -0
- data/lib/generators/graphql/relay_generator.rb +21 -0
- data/lib/generators/graphql/scalar_generator.rb +4 -2
- data/lib/generators/graphql/templates/base_argument.erb +6 -0
- data/lib/generators/graphql/templates/base_connection.erb +8 -0
- data/lib/generators/graphql/templates/base_edge.erb +8 -0
- data/lib/generators/graphql/templates/base_enum.erb +2 -0
- data/lib/generators/graphql/templates/base_field.erb +7 -0
- data/lib/generators/graphql/templates/base_input_object.erb +3 -0
- data/lib/generators/graphql/templates/base_interface.erb +4 -0
- data/lib/generators/graphql/templates/base_object.erb +3 -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 +7 -1
- data/lib/generators/graphql/templates/graphql_controller.erb +21 -12
- data/lib/generators/graphql/templates/input.erb +9 -0
- data/lib/generators/graphql/templates/interface.erb +6 -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 +9 -0
- data/lib/generators/graphql/templates/object.erb +7 -3
- data/lib/generators/graphql/templates/query_type.erb +3 -3
- data/lib/generators/graphql/templates/scalar.erb +5 -1
- data/lib/generators/graphql/templates/schema.erb +23 -28
- data/lib/generators/graphql/templates/union.erb +6 -2
- data/lib/generators/graphql/type_generator.rb +47 -10
- data/lib/generators/graphql/union_generator.rb +5 -5
- data/lib/graphql/analysis/analyze_query.rb +7 -0
- data/lib/graphql/analysis/ast/analyzer.rb +34 -12
- data/lib/graphql/analysis/ast/field_usage.rb +29 -2
- data/lib/graphql/analysis/ast/max_query_complexity.rb +3 -3
- data/lib/graphql/analysis/ast/max_query_depth.rb +7 -3
- data/lib/graphql/analysis/ast/query_complexity.rb +179 -64
- data/lib/graphql/analysis/ast/query_depth.rb +16 -26
- data/lib/graphql/analysis/ast/visitor.rb +46 -32
- data/lib/graphql/analysis/ast.rb +23 -14
- data/lib/graphql/analysis/query_depth.rb +4 -17
- data/lib/graphql/argument.rb +16 -38
- data/lib/graphql/backtrace/inspect_result.rb +0 -1
- data/lib/graphql/backtrace/legacy_tracer.rb +56 -0
- data/lib/graphql/backtrace/table.rb +44 -5
- data/lib/graphql/backtrace/traced_error.rb +0 -1
- data/lib/graphql/backtrace/tracer.rb +40 -9
- data/lib/graphql/backtrace.rb +28 -19
- data/lib/graphql/backwards_compatibility.rb +2 -1
- data/lib/graphql/base_type.rb +11 -5
- data/lib/graphql/boolean_type.rb +1 -1
- data/lib/graphql/coercion_error.rb +8 -0
- data/lib/graphql/compatibility/execution_specification/specification_schema.rb +2 -2
- data/lib/graphql/compatibility/execution_specification.rb +1 -0
- data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +1 -1
- data/lib/graphql/compatibility/lazy_execution_specification.rb +2 -0
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +5 -9
- data/lib/graphql/compatibility/query_parser_specification.rb +2 -0
- data/lib/graphql/compatibility/schema_parser_specification.rb +2 -0
- data/lib/graphql/dataloader/null_dataloader.rb +22 -0
- data/lib/graphql/dataloader/request.rb +19 -0
- data/lib/graphql/dataloader/request_all.rb +19 -0
- data/lib/graphql/dataloader/source.rb +155 -0
- data/lib/graphql/dataloader.rb +308 -0
- data/lib/graphql/date_encoding_error.rb +16 -0
- data/lib/graphql/define/assign_enum_value.rb +1 -1
- data/lib/graphql/define/assign_global_id_field.rb +2 -2
- data/lib/graphql/define/assign_object_field.rb +3 -3
- data/lib/graphql/define/defined_object_proxy.rb +3 -0
- data/lib/graphql/define/instance_definable.rb +65 -110
- data/lib/graphql/define/type_definer.rb +5 -5
- data/lib/graphql/deprecated_dsl.rb +18 -5
- data/lib/graphql/deprecation.rb +9 -0
- data/lib/graphql/directive/deprecated_directive.rb +1 -12
- data/lib/graphql/directive/include_directive.rb +1 -1
- data/lib/graphql/directive/skip_directive.rb +1 -1
- data/lib/graphql/directive.rb +9 -6
- data/lib/graphql/enum_type.rb +14 -74
- data/lib/graphql/execution/directive_checks.rb +2 -2
- data/lib/graphql/execution/errors.rb +163 -0
- data/lib/graphql/execution/execute.rb +10 -3
- data/lib/graphql/execution/instrumentation.rb +1 -1
- data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
- data/lib/graphql/execution/interpreter/arguments.rb +88 -0
- data/lib/graphql/execution/interpreter/arguments_cache.rb +105 -0
- data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
- data/lib/graphql/execution/interpreter/resolve.rb +37 -25
- data/lib/graphql/execution/interpreter/runtime.rb +737 -376
- data/lib/graphql/execution/interpreter.rb +42 -19
- data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
- data/lib/graphql/execution/lazy.rb +5 -1
- data/lib/graphql/execution/lookahead.rb +39 -114
- data/lib/graphql/execution/multiplex.rb +58 -29
- data/lib/graphql/execution.rb +1 -0
- data/lib/graphql/execution_error.rb +3 -2
- data/lib/graphql/field.rb +15 -119
- data/lib/graphql/filter.rb +1 -1
- data/lib/graphql/float_type.rb +1 -1
- data/lib/graphql/function.rb +6 -31
- data/lib/graphql/id_type.rb +1 -1
- data/lib/graphql/input_object_type.rb +11 -26
- data/lib/graphql/int_type.rb +1 -1
- data/lib/graphql/integer_decoding_error.rb +17 -0
- data/lib/graphql/integer_encoding_error.rb +18 -2
- data/lib/graphql/interface_type.rb +10 -24
- data/lib/graphql/internal_representation/document.rb +2 -2
- data/lib/graphql/internal_representation/rewrite.rb +1 -1
- data/lib/graphql/internal_representation/scope.rb +2 -2
- data/lib/graphql/internal_representation/visit.rb +2 -2
- data/lib/graphql/introspection/base_object.rb +2 -5
- data/lib/graphql/introspection/directive_location_enum.rb +2 -2
- data/lib/graphql/introspection/directive_type.rb +12 -6
- data/lib/graphql/introspection/entry_points.rb +9 -8
- data/lib/graphql/introspection/enum_value_type.rb +2 -2
- data/lib/graphql/introspection/field_type.rb +9 -5
- data/lib/graphql/introspection/input_value_type.rb +41 -11
- data/lib/graphql/introspection/introspection_query.rb +6 -92
- data/lib/graphql/introspection/schema_type.rb +13 -12
- data/lib/graphql/introspection/type_type.rb +27 -17
- data/lib/graphql/introspection.rb +99 -0
- data/lib/graphql/invalid_null_error.rb +18 -0
- data/lib/graphql/language/block_string.rb +22 -7
- data/lib/graphql/language/cache.rb +37 -0
- data/lib/graphql/language/definition_slice.rb +21 -10
- data/lib/graphql/language/document_from_schema_definition.rb +126 -67
- data/lib/graphql/language/lexer.rb +180 -141
- data/lib/graphql/language/lexer.rl +75 -51
- data/lib/graphql/language/nodes.rb +92 -108
- data/lib/graphql/language/parser.rb +933 -897
- data/lib/graphql/language/parser.y +129 -103
- data/lib/graphql/language/printer.rb +11 -2
- data/lib/graphql/language/sanitized_printer.rb +222 -0
- data/lib/graphql/language/token.rb +1 -1
- data/lib/graphql/language/visitor.rb +11 -8
- data/lib/graphql/language.rb +3 -1
- data/lib/graphql/name_validator.rb +2 -7
- data/lib/graphql/non_null_type.rb +0 -10
- data/lib/graphql/object_type.rb +47 -58
- data/lib/graphql/pagination/active_record_relation_connection.rb +85 -0
- data/lib/graphql/pagination/array_connection.rb +77 -0
- data/lib/graphql/pagination/connection.rb +226 -0
- data/lib/graphql/pagination/connections.rb +160 -0
- data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
- data/lib/graphql/pagination/relation_connection.rb +226 -0
- data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
- data/lib/graphql/pagination.rb +6 -0
- data/lib/graphql/parse_error.rb +0 -1
- data/lib/graphql/query/arguments.rb +29 -19
- data/lib/graphql/query/arguments_cache.rb +1 -2
- data/lib/graphql/query/context.rb +81 -14
- data/lib/graphql/query/executor.rb +0 -1
- data/lib/graphql/query/fingerprint.rb +26 -0
- data/lib/graphql/query/input_validation_result.rb +32 -6
- data/lib/graphql/query/literal_input.rb +31 -10
- data/lib/graphql/query/null_context.rb +28 -8
- data/lib/graphql/query/serial_execution/field_resolution.rb +1 -1
- data/lib/graphql/query/serial_execution.rb +1 -0
- data/lib/graphql/query/validation_pipeline.rb +6 -4
- data/lib/graphql/query/variable_validation_error.rb +3 -3
- data/lib/graphql/query/variables.rb +51 -9
- data/lib/graphql/query.rb +97 -23
- data/lib/graphql/railtie.rb +9 -1
- data/lib/graphql/rake_task/validate.rb +3 -0
- data/lib/graphql/rake_task.rb +12 -9
- data/lib/graphql/relay/array_connection.rb +11 -13
- data/lib/graphql/relay/base_connection.rb +33 -16
- data/lib/graphql/relay/connection_instrumentation.rb +4 -4
- data/lib/graphql/relay/connection_type.rb +18 -4
- data/lib/graphql/relay/edge_type.rb +1 -0
- data/lib/graphql/relay/edges_instrumentation.rb +1 -2
- data/lib/graphql/relay/global_id_resolve.rb +1 -2
- data/lib/graphql/relay/mutation.rb +3 -87
- data/lib/graphql/relay/node.rb +5 -2
- data/lib/graphql/relay/page_info.rb +1 -1
- data/lib/graphql/relay/range_add.rb +27 -9
- data/lib/graphql/relay/relation_connection.rb +17 -15
- data/lib/graphql/relay/type_extensions.rb +2 -0
- 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/scalar_type.rb +18 -62
- data/lib/graphql/schema/addition.rb +247 -0
- data/lib/graphql/schema/argument.rb +289 -11
- data/lib/graphql/schema/base_64_bp.rb +3 -2
- data/lib/graphql/schema/base_64_encoder.rb +2 -0
- data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
- data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
- data/lib/graphql/schema/build_from_definition.rb +323 -203
- data/lib/graphql/schema/built_in_types.rb +5 -5
- data/lib/graphql/schema/default_type_error.rb +2 -0
- data/lib/graphql/schema/directive/deprecated.rb +18 -0
- data/lib/graphql/schema/directive/feature.rb +2 -2
- data/lib/graphql/schema/directive/flagged.rb +57 -0
- data/lib/graphql/schema/directive/include.rb +2 -2
- data/lib/graphql/schema/directive/skip.rb +2 -2
- data/lib/graphql/schema/directive/transform.rb +14 -2
- data/lib/graphql/schema/directive.rb +136 -6
- data/lib/graphql/schema/enum.rb +121 -12
- data/lib/graphql/schema/enum_value.rb +23 -6
- data/lib/graphql/schema/field/connection_extension.rb +46 -20
- data/lib/graphql/schema/field/scope_extension.rb +1 -1
- data/lib/graphql/schema/field.rb +515 -191
- data/lib/graphql/schema/field_extension.rb +89 -2
- data/lib/graphql/schema/find_inherited_value.rb +36 -0
- data/lib/graphql/schema/finder.rb +16 -14
- data/lib/graphql/schema/input_object.rb +178 -34
- data/lib/graphql/schema/interface.rb +35 -25
- data/lib/graphql/schema/introspection_system.rb +111 -35
- data/lib/graphql/schema/late_bound_type.rb +3 -2
- data/lib/graphql/schema/list.rb +65 -1
- data/lib/graphql/schema/loader.rb +147 -97
- data/lib/graphql/schema/member/accepts_definition.rb +15 -3
- data/lib/graphql/schema/member/base_dsl_methods.rb +40 -45
- data/lib/graphql/schema/member/build_type.rb +19 -8
- data/lib/graphql/schema/member/cached_graphql_definition.rb +34 -2
- data/lib/graphql/schema/member/has_arguments.rb +212 -22
- data/lib/graphql/schema/member/has_ast_node.rb +20 -0
- data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
- data/lib/graphql/schema/member/has_directives.rb +98 -0
- data/lib/graphql/schema/member/has_fields.rb +113 -28
- data/lib/graphql/schema/member/has_interfaces.rb +100 -0
- data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
- data/lib/graphql/schema/member/has_validators.rb +31 -0
- data/lib/graphql/schema/member/instrumentation.rb +6 -2
- data/lib/graphql/schema/member/relay_shortcuts.rb +2 -2
- data/lib/graphql/schema/member/type_system_helpers.rb +3 -3
- data/lib/graphql/schema/member/validates_input.rb +33 -0
- data/lib/graphql/schema/member.rb +11 -0
- data/lib/graphql/schema/middleware_chain.rb +1 -1
- data/lib/graphql/schema/mutation.rb +5 -1
- data/lib/graphql/schema/non_null.rb +37 -1
- data/lib/graphql/schema/object.rb +52 -37
- data/lib/graphql/schema/possible_types.rb +12 -7
- data/lib/graphql/schema/printer.rb +17 -34
- data/lib/graphql/schema/relay_classic_mutation.rb +51 -7
- data/lib/graphql/schema/resolver/has_payload_type.rb +36 -5
- data/lib/graphql/schema/resolver.rb +159 -59
- data/lib/graphql/schema/scalar.rb +43 -3
- data/lib/graphql/schema/subscription.rb +83 -25
- data/lib/graphql/schema/timeout.rb +123 -0
- data/lib/graphql/schema/timeout_middleware.rb +6 -3
- data/lib/graphql/schema/traversal.rb +2 -2
- data/lib/graphql/schema/type_expression.rb +21 -13
- data/lib/graphql/schema/type_membership.rb +48 -0
- data/lib/graphql/schema/union.rb +67 -6
- data/lib/graphql/schema/unique_within_type.rb +1 -2
- data/lib/graphql/schema/validation.rb +30 -8
- 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 +33 -0
- data/lib/graphql/schema/validator/format_validator.rb +48 -0
- data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
- data/lib/graphql/schema/validator/length_validator.rb +59 -0
- data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
- data/lib/graphql/schema/validator/required_validator.rb +82 -0
- data/lib/graphql/schema/validator.rb +171 -0
- data/lib/graphql/schema/warden.rb +263 -30
- data/lib/graphql/schema/wrapper.rb +1 -1
- data/lib/graphql/schema.rb +1016 -256
- data/lib/graphql/static_validation/all_rules.rb +2 -0
- data/lib/graphql/static_validation/base_visitor.rb +17 -10
- data/lib/graphql/static_validation/definition_dependencies.rb +21 -13
- data/lib/graphql/static_validation/error.rb +3 -1
- data/lib/graphql/static_validation/literal_validator.rb +52 -27
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +46 -79
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +23 -6
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +35 -26
- data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +1 -1
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +2 -2
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -5
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +105 -55
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
- data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
- data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -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 +9 -10
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +1 -1
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +19 -14
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
- data/lib/graphql/static_validation/type_stack.rb +2 -2
- data/lib/graphql/static_validation/validation_context.rb +13 -3
- data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
- data/lib/graphql/static_validation/validator.rb +43 -9
- data/lib/graphql/static_validation.rb +1 -0
- data/lib/graphql/string_encoding_error.rb +13 -3
- data/lib/graphql/string_type.rb +1 -1
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +123 -22
- data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +21 -0
- data/lib/graphql/subscriptions/event.rb +94 -26
- data/lib/graphql/subscriptions/instrumentation.rb +10 -6
- data/lib/graphql/subscriptions/serialize.rb +53 -6
- data/lib/graphql/subscriptions/subscription_root.rb +15 -5
- data/lib/graphql/subscriptions.rb +122 -54
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
- data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +32 -2
- data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
- data/lib/graphql/tracing/notifications_tracing.rb +59 -0
- data/lib/graphql/tracing/platform_tracing.rb +66 -7
- data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +4 -1
- data/lib/graphql/tracing/prometheus_tracing.rb +8 -0
- data/lib/graphql/tracing/scout_tracing.rb +19 -0
- data/lib/graphql/tracing/skylight_tracing.rb +9 -0
- data/lib/graphql/tracing/statsd_tracing.rb +42 -0
- data/lib/graphql/tracing.rb +15 -35
- data/lib/graphql/types/big_int.rb +5 -1
- data/lib/graphql/types/int.rb +10 -3
- data/lib/graphql/types/iso_8601_date.rb +42 -0
- data/lib/graphql/types/iso_8601_date_time.rb +32 -8
- data/lib/graphql/types/relay/base_connection.rb +6 -88
- data/lib/graphql/types/relay/base_edge.rb +2 -37
- data/lib/graphql/types/relay/connection_behaviors.rb +174 -0
- data/lib/graphql/types/relay/default_relay.rb +31 -0
- data/lib/graphql/types/relay/edge_behaviors.rb +64 -0
- data/lib/graphql/types/relay/has_node_field.rb +41 -0
- data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
- data/lib/graphql/types/relay/node.rb +2 -4
- data/lib/graphql/types/relay/node_behaviors.rb +15 -0
- data/lib/graphql/types/relay/node_field.rb +4 -23
- data/lib/graphql/types/relay/nodes_field.rb +16 -18
- data/lib/graphql/types/relay/page_info.rb +2 -14
- data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
- data/lib/graphql/types/relay.rb +11 -3
- data/lib/graphql/types/string.rb +8 -2
- data/lib/graphql/types.rb +1 -0
- data/lib/graphql/unauthorized_error.rb +2 -2
- data/lib/graphql/union_type.rb +61 -46
- data/lib/graphql/unresolved_type_error.rb +2 -2
- data/lib/graphql/upgrader/member.rb +150 -112
- data/lib/graphql/upgrader/schema.rb +1 -0
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +89 -18
- data/readme.md +4 -7
- metadata +115 -703
- data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
- data/lib/graphql/literal_validation_error.rb +0 -6
- data/lib/graphql/types/relay/base_field.rb +0 -22
- data/lib/graphql/types/relay/base_interface.rb +0 -29
- data/lib/graphql/types/relay/base_object.rb +0 -26
- data/spec/dummy/Gemfile +0 -12
- data/spec/dummy/Gemfile.lock +0 -157
- data/spec/dummy/README.md +0 -24
- data/spec/dummy/Rakefile +0 -7
- data/spec/dummy/app/assets/config/manifest.js +0 -1
- data/spec/dummy/app/assets/javascripts/application.js +0 -66
- data/spec/dummy/app/channels/application_cable/channel.rb +0 -5
- data/spec/dummy/app/channels/application_cable/connection.rb +0 -5
- data/spec/dummy/app/channels/graphql_channel.rb +0 -116
- data/spec/dummy/app/controllers/application_controller.rb +0 -4
- data/spec/dummy/app/controllers/pages_controller.rb +0 -5
- data/spec/dummy/app/helpers/application_helper.rb +0 -3
- data/spec/dummy/app/jobs/application_job.rb +0 -3
- data/spec/dummy/app/views/layouts/application.html.erb +0 -12
- data/spec/dummy/app/views/pages/show.html +0 -16
- data/spec/dummy/bin/bundle +0 -4
- data/spec/dummy/bin/rails +0 -5
- data/spec/dummy/bin/rake +0 -5
- data/spec/dummy/bin/setup +0 -31
- data/spec/dummy/bin/update +0 -27
- data/spec/dummy/bin/yarn +0 -12
- data/spec/dummy/config/application.rb +0 -30
- data/spec/dummy/config/boot.rb +0 -4
- data/spec/dummy/config/cable.yml +0 -10
- data/spec/dummy/config/environment.rb +0 -6
- data/spec/dummy/config/environments/development.rb +0 -40
- data/spec/dummy/config/environments/production.rb +0 -76
- data/spec/dummy/config/environments/test.rb +0 -37
- data/spec/dummy/config/initializers/application_controller_renderer.rb +0 -9
- data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -8
- data/spec/dummy/config/initializers/cookies_serializer.rb +0 -6
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +0 -5
- data/spec/dummy/config/initializers/inflections.rb +0 -17
- data/spec/dummy/config/initializers/mime_types.rb +0 -5
- data/spec/dummy/config/initializers/wrap_parameters.rb +0 -10
- data/spec/dummy/config/locales/en.yml +0 -33
- data/spec/dummy/config/puma.rb +0 -57
- data/spec/dummy/config/routes.rb +0 -4
- data/spec/dummy/config/secrets.yml +0 -32
- data/spec/dummy/config.ru +0 -6
- data/spec/dummy/log/test.log +0 -199
- data/spec/dummy/package.json +0 -5
- data/spec/dummy/public/404.html +0 -67
- data/spec/dummy/public/422.html +0 -67
- data/spec/dummy/public/500.html +0 -66
- data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
- data/spec/dummy/public/apple-touch-icon.png +0 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/public/robots.txt +0 -1
- data/spec/dummy/test/application_system_test_case.rb +0 -6
- data/spec/dummy/test/system/action_cable_subscription_test.rb +0 -45
- data/spec/dummy/test/test_helper.rb +0 -4
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4w/4wzXRZrAkwKdgYaSE0pid5eB-fer8vSfSku_NPg4rMA.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7I/7IHVBiJT06QSpgLpLoJIxboQ0B-D_tMTxsvoezBTV3Q.cache +0 -1
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8w/8wY_SKagj8wHuwGNAAf6JnQ8joMbC6cEYpHrTAI8Urc.cache +0 -1
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/AK/AKzz1u6bGb4auXcrObA_g5LL-oV0ejNGa448AgAi_WQ.cache +0 -1
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ET/ETW4uxvaYpruL8y6_ZptUH82ZowMaHIqvg5WexBFdEM.cache +0 -3
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F1/F1TWpjjyA56k9Z90n5B3xRn7DUdGjX73QCkYC6k07JQ.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F8/F8MUNRzORGFgr329fNM0xLaoWCXdv3BIalT7dsvLfjs.cache +0 -2
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/KB/KB07ZaKNC5uXJ7TjLi-WqnY6g7dq8wWp_8N3HNjBNxg.cache +0 -2
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ms/MsKSimH_UCB-H1tLvDABDHuvGciuoW6kVqQWDrXU5FQ.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Mt/Mtci-Kim50aPOmeClD4AIicKn1d1WJ0n454IjSd94sk.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/QH/QHt3Tc1Y6M66Oo_pDuMyWrQNs4Pp3SMeZR5K1wJj2Ts.cache +0 -1
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/XU/XU4k1OXnfMils5SrirorPvDSyDSqiOWLZNtmAH1HH8k.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ZI/ZIof7mZxWWCnraIFOCuV6a8QRWzKJXJnx2Xd7C0ZyX0.cache +0 -1
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cG/cGc_puuPS5pZKgUcy1Y_i1L6jl5UtsiIrMH59rTzR6c.cache +0 -3
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/df/dfro_B6bx3KP1Go-7jEOqqZ2j4hVRseXIc3es9PKQno.cache +0 -1
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jO/jO1DfbqnG0mTULsjJJANc3fefrG2zt7DIMmcptMT628.cache +0 -1
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pE/pE7gO6pQ-z187Swb4hT554wmqsq-cNzgPWLrCz-LQQQ.cache +0 -0
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/r9/r9iU1l58a6rxkZSW5RSC52_tD-_UQuHxoMVnkfJ7Mhs.cache +0 -1
- data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xi/xitPPFfPIyDMpaznV0sBBcw8eSCV8PJcLLWin78sCgE.cache +0 -0
- data/spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png +0 -0
- data/spec/fixtures/upgrader/account.original.rb +0 -19
- data/spec/fixtures/upgrader/account.transformed.rb +0 -20
- data/spec/fixtures/upgrader/blame_range.original.rb +0 -43
- data/spec/fixtures/upgrader/blame_range.transformed.rb +0 -30
- data/spec/fixtures/upgrader/date_time.original.rb +0 -24
- data/spec/fixtures/upgrader/date_time.transformed.rb +0 -23
- data/spec/fixtures/upgrader/delete_project.original.rb +0 -28
- data/spec/fixtures/upgrader/delete_project.transformed.rb +0 -27
- data/spec/fixtures/upgrader/gist_order_field.original.rb +0 -14
- data/spec/fixtures/upgrader/gist_order_field.transformed.rb +0 -13
- data/spec/fixtures/upgrader/increment_count.original.rb +0 -59
- data/spec/fixtures/upgrader/increment_count.transformed.rb +0 -50
- data/spec/fixtures/upgrader/photo.original.rb +0 -10
- data/spec/fixtures/upgrader/photo.transformed.rb +0 -12
- data/spec/fixtures/upgrader/release_order.original.rb +0 -15
- data/spec/fixtures/upgrader/release_order.transformed.rb +0 -14
- data/spec/fixtures/upgrader/starrable.original.rb +0 -49
- data/spec/fixtures/upgrader/starrable.transformed.rb +0 -46
- data/spec/fixtures/upgrader/subscribable.original.rb +0 -55
- data/spec/fixtures/upgrader/subscribable.transformed.rb +0 -51
- data/spec/fixtures/upgrader/type_x.original.rb +0 -65
- data/spec/fixtures/upgrader/type_x.transformed.rb +0 -56
- data/spec/graphql/analysis/analyze_query_spec.rb +0 -272
- data/spec/graphql/analysis/ast/field_usage_spec.rb +0 -51
- data/spec/graphql/analysis/ast/max_query_complexity_spec.rb +0 -120
- data/spec/graphql/analysis/ast/max_query_depth_spec.rb +0 -114
- data/spec/graphql/analysis/ast/query_complexity_spec.rb +0 -299
- data/spec/graphql/analysis/ast/query_depth_spec.rb +0 -108
- data/spec/graphql/analysis/ast_spec.rb +0 -269
- data/spec/graphql/analysis/field_usage_spec.rb +0 -62
- data/spec/graphql/analysis/max_query_complexity_spec.rb +0 -102
- data/spec/graphql/analysis/max_query_depth_spec.rb +0 -101
- data/spec/graphql/analysis/query_complexity_spec.rb +0 -301
- data/spec/graphql/analysis/query_depth_spec.rb +0 -81
- data/spec/graphql/argument_spec.rb +0 -159
- data/spec/graphql/authorization_spec.rb +0 -974
- data/spec/graphql/backtrace_spec.rb +0 -206
- data/spec/graphql/base_type_spec.rb +0 -171
- data/spec/graphql/boolean_type_spec.rb +0 -21
- data/spec/graphql/compatibility/execution_specification_spec.rb +0 -4
- data/spec/graphql/compatibility/lazy_execution_specification_spec.rb +0 -4
- data/spec/graphql/compatibility/query_parser_specification_spec.rb +0 -6
- data/spec/graphql/compatibility/schema_parser_specification_spec.rb +0 -6
- data/spec/graphql/define/assign_argument_spec.rb +0 -61
- data/spec/graphql/define/instance_definable_spec.rb +0 -203
- data/spec/graphql/directive/skip_directive_spec.rb +0 -9
- data/spec/graphql/directive_spec.rb +0 -295
- data/spec/graphql/enum_type_spec.rb +0 -158
- data/spec/graphql/execution/execute_spec.rb +0 -303
- data/spec/graphql/execution/instrumentation_spec.rb +0 -184
- data/spec/graphql/execution/interpreter_spec.rb +0 -485
- data/spec/graphql/execution/lazy/lazy_method_map_spec.rb +0 -57
- data/spec/graphql/execution/lazy_spec.rb +0 -247
- data/spec/graphql/execution/lookahead_spec.rb +0 -390
- data/spec/graphql/execution/multiplex_spec.rb +0 -211
- data/spec/graphql/execution/typecast_spec.rb +0 -47
- data/spec/graphql/execution_error_spec.rb +0 -325
- data/spec/graphql/field_spec.rb +0 -246
- data/spec/graphql/float_type_spec.rb +0 -16
- data/spec/graphql/function_spec.rb +0 -152
- data/spec/graphql/id_type_spec.rb +0 -33
- data/spec/graphql/input_object_type_spec.rb +0 -25
- data/spec/graphql/int_type_spec.rb +0 -35
- data/spec/graphql/interface_type_spec.rb +0 -196
- data/spec/graphql/internal_representation/print_spec.rb +0 -41
- data/spec/graphql/internal_representation/rewrite_spec.rb +0 -376
- data/spec/graphql/introspection/directive_type_spec.rb +0 -61
- data/spec/graphql/introspection/input_value_type_spec.rb +0 -144
- data/spec/graphql/introspection/introspection_query_spec.rb +0 -59
- data/spec/graphql/introspection/schema_type_spec.rb +0 -56
- data/spec/graphql/introspection/type_type_spec.rb +0 -155
- data/spec/graphql/language/block_string_spec.rb +0 -70
- data/spec/graphql/language/definition_slice_spec.rb +0 -226
- data/spec/graphql/language/document_from_schema_definition_spec.rb +0 -770
- data/spec/graphql/language/equality_spec.rb +0 -84
- data/spec/graphql/language/generation_spec.rb +0 -38
- data/spec/graphql/language/lexer_spec.rb +0 -135
- data/spec/graphql/language/nodes_spec.rb +0 -67
- data/spec/graphql/language/parser_spec.rb +0 -183
- data/spec/graphql/language/printer_spec.rb +0 -215
- data/spec/graphql/language/visitor_spec.rb +0 -419
- data/spec/graphql/list_type_spec.rb +0 -57
- data/spec/graphql/non_null_type_spec.rb +0 -48
- data/spec/graphql/object_type_spec.rb +0 -197
- data/spec/graphql/query/arguments_spec.rb +0 -346
- data/spec/graphql/query/context_spec.rb +0 -292
- data/spec/graphql/query/executor_spec.rb +0 -341
- data/spec/graphql/query/literal_input_spec.rb +0 -91
- data/spec/graphql/query/result_spec.rb +0 -29
- data/spec/graphql/query/serial_execution/value_resolution_spec.rb +0 -109
- data/spec/graphql/query_spec.rb +0 -800
- data/spec/graphql/rake_task_spec.rb +0 -59
- data/spec/graphql/scalar_type_spec.rb +0 -66
- data/spec/graphql/schema/argument_spec.rb +0 -152
- data/spec/graphql/schema/build_from_definition_spec.rb +0 -1187
- data/spec/graphql/schema/catchall_middleware_spec.rb +0 -35
- data/spec/graphql/schema/directive/feature_spec.rb +0 -81
- data/spec/graphql/schema/directive/transform_spec.rb +0 -39
- data/spec/graphql/schema/enum_spec.rb +0 -83
- data/spec/graphql/schema/enum_value_spec.rb +0 -24
- data/spec/graphql/schema/field_extension_spec.rb +0 -137
- data/spec/graphql/schema/field_spec.rb +0 -301
- data/spec/graphql/schema/finder_spec.rb +0 -135
- data/spec/graphql/schema/input_object_spec.rb +0 -347
- data/spec/graphql/schema/instrumentation_spec.rb +0 -43
- data/spec/graphql/schema/interface_spec.rb +0 -215
- data/spec/graphql/schema/introspection_system_spec.rb +0 -56
- data/spec/graphql/schema/list_spec.rb +0 -46
- data/spec/graphql/schema/loader_spec.rb +0 -286
- data/spec/graphql/schema/member/accepts_definition_spec.rb +0 -115
- data/spec/graphql/schema/member/build_type_spec.rb +0 -63
- data/spec/graphql/schema/member/scoped_spec.rb +0 -217
- data/spec/graphql/schema/member/type_system_helpers_spec.rb +0 -63
- data/spec/graphql/schema/middleware_chain_spec.rb +0 -57
- data/spec/graphql/schema/mutation_spec.rb +0 -150
- data/spec/graphql/schema/non_null_spec.rb +0 -46
- data/spec/graphql/schema/object_spec.rb +0 -315
- data/spec/graphql/schema/printer_spec.rb +0 -869
- data/spec/graphql/schema/relay_classic_mutation_spec.rb +0 -252
- data/spec/graphql/schema/rescue_middleware_spec.rb +0 -88
- data/spec/graphql/schema/resolver_spec.rb +0 -714
- data/spec/graphql/schema/scalar_spec.rb +0 -101
- data/spec/graphql/schema/subscription_spec.rb +0 -440
- data/spec/graphql/schema/timeout_middleware_spec.rb +0 -188
- data/spec/graphql/schema/traversal_spec.rb +0 -222
- data/spec/graphql/schema/type_expression_spec.rb +0 -39
- data/spec/graphql/schema/union_spec.rb +0 -72
- data/spec/graphql/schema/unique_within_type_spec.rb +0 -44
- data/spec/graphql/schema/validation_spec.rb +0 -355
- data/spec/graphql/schema/warden_spec.rb +0 -926
- data/spec/graphql/static_validation/rules/argument_literals_are_compatible_spec.rb +0 -413
- data/spec/graphql/static_validation/rules/argument_names_are_unique_spec.rb +0 -44
- data/spec/graphql/static_validation/rules/arguments_are_defined_spec.rb +0 -112
- data/spec/graphql/static_validation/rules/directives_are_defined_spec.rb +0 -35
- data/spec/graphql/static_validation/rules/directives_are_in_valid_locations_spec.rb +0 -42
- data/spec/graphql/static_validation/rules/fields_are_defined_on_type_spec.rb +0 -167
- data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +0 -66
- data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +0 -740
- data/spec/graphql/static_validation/rules/fragment_names_are_unique_spec.rb +0 -28
- data/spec/graphql/static_validation/rules/fragment_spreads_are_possible_spec.rb +0 -52
- data/spec/graphql/static_validation/rules/fragment_types_exist_spec.rb +0 -42
- data/spec/graphql/static_validation/rules/fragments_are_finite_spec.rb +0 -123
- data/spec/graphql/static_validation/rules/fragments_are_named_spec.rb +0 -24
- data/spec/graphql/static_validation/rules/fragments_are_on_composite_types_spec.rb +0 -56
- data/spec/graphql/static_validation/rules/fragments_are_used_spec.rb +0 -61
- data/spec/graphql/static_validation/rules/mutation_root_exists_spec.rb +0 -39
- data/spec/graphql/static_validation/rules/no_definitions_are_present_spec.rb +0 -62
- data/spec/graphql/static_validation/rules/operation_names_are_valid_spec.rb +0 -82
- data/spec/graphql/static_validation/rules/required_arguments_are_present_spec.rb +0 -73
- data/spec/graphql/static_validation/rules/required_input_object_attributes_are_present_spec.rb +0 -86
- data/spec/graphql/static_validation/rules/subscription_root_exists_spec.rb +0 -34
- data/spec/graphql/static_validation/rules/unique_directives_per_location_spec.rb +0 -188
- data/spec/graphql/static_validation/rules/variable_default_values_are_correctly_typed_spec.rb +0 -196
- data/spec/graphql/static_validation/rules/variable_names_are_unique_spec.rb +0 -23
- data/spec/graphql/static_validation/rules/variable_usages_are_allowed_spec.rb +0 -236
- data/spec/graphql/static_validation/rules/variables_are_input_types_spec.rb +0 -78
- data/spec/graphql/static_validation/rules/variables_are_used_and_defined_spec.rb +0 -81
- data/spec/graphql/static_validation/type_stack_spec.rb +0 -29
- data/spec/graphql/static_validation/validator_spec.rb +0 -204
- data/spec/graphql/string_type_spec.rb +0 -80
- data/spec/graphql/subscriptions/serialize_spec.rb +0 -49
- data/spec/graphql/subscriptions_spec.rb +0 -540
- data/spec/graphql/tracing/new_relic_tracing_spec.rb +0 -84
- data/spec/graphql/tracing/platform_tracing_spec.rb +0 -141
- data/spec/graphql/tracing/prometheus_tracing_spec.rb +0 -42
- data/spec/graphql/tracing/scout_tracing_spec.rb +0 -17
- data/spec/graphql/tracing/skylight_tracing_spec.rb +0 -63
- data/spec/graphql/tracing_spec.rb +0 -52
- data/spec/graphql/types/big_int_spec.rb +0 -24
- data/spec/graphql/types/iso_8601_date_time_spec.rb +0 -137
- data/spec/graphql/types/relay/base_edge_spec.rb +0 -33
- data/spec/graphql/union_type_spec.rb +0 -211
- data/spec/graphql/upgrader/member_spec.rb +0 -583
- data/spec/graphql/upgrader/schema_spec.rb +0 -82
- data/spec/integration/mongoid/graphql/relay/mongo_relation_connection_spec.rb +0 -528
- data/spec/integration/mongoid/spec_helper.rb +0 -2
- data/spec/integration/mongoid/star_trek/data.rb +0 -126
- data/spec/integration/mongoid/star_trek/schema.rb +0 -425
- data/spec/integration/rails/data.rb +0 -110
- data/spec/integration/rails/generators/base_generator_test.rb +0 -7
- data/spec/integration/rails/generators/graphql/enum_generator_spec.rb +0 -30
- data/spec/integration/rails/generators/graphql/install_generator_spec.rb +0 -218
- data/spec/integration/rails/generators/graphql/interface_generator_spec.rb +0 -34
- data/spec/integration/rails/generators/graphql/loader_generator_spec.rb +0 -59
- data/spec/integration/rails/generators/graphql/mutation_generator_spec.rb +0 -71
- data/spec/integration/rails/generators/graphql/object_generator_spec.rb +0 -54
- data/spec/integration/rails/generators/graphql/scalar_generator_spec.rb +0 -28
- data/spec/integration/rails/generators/graphql/union_generator_spec.rb +0 -67
- data/spec/integration/rails/graphql/input_object_type_spec.rb +0 -364
- data/spec/integration/rails/graphql/query/variables_spec.rb +0 -375
- data/spec/integration/rails/graphql/relay/array_connection_spec.rb +0 -290
- data/spec/integration/rails/graphql/relay/base_connection_spec.rb +0 -101
- data/spec/integration/rails/graphql/relay/connection_instrumentation_spec.rb +0 -80
- data/spec/integration/rails/graphql/relay/connection_resolve_spec.rb +0 -79
- data/spec/integration/rails/graphql/relay/connection_type_spec.rb +0 -106
- data/spec/integration/rails/graphql/relay/edge_spec.rb +0 -10
- data/spec/integration/rails/graphql/relay/mutation_spec.rb +0 -387
- data/spec/integration/rails/graphql/relay/node_spec.rb +0 -263
- data/spec/integration/rails/graphql/relay/page_info_spec.rb +0 -111
- data/spec/integration/rails/graphql/relay/range_add_spec.rb +0 -117
- data/spec/integration/rails/graphql/relay/relation_connection_spec.rb +0 -837
- data/spec/integration/rails/graphql/schema_spec.rb +0 -489
- data/spec/integration/rails/graphql/tracing/active_support_notifications_tracing_spec.rb +0 -62
- data/spec/integration/rails/spec_helper.rb +0 -25
- data/spec/integration/tmp/app/graphql/types/bird_type.rb +0 -7
- data/spec/spec_helper.rb +0 -116
- data/spec/support/dummy/data.rb +0 -45
- data/spec/support/dummy/schema.rb +0 -511
- data/spec/support/error_bubbling_helpers.rb +0 -23
- data/spec/support/global_id.rb +0 -23
- data/spec/support/jazz.rb +0 -772
- data/spec/support/lazy_helpers.rb +0 -192
- data/spec/support/magic_cards/schema.graphql +0 -33
- data/spec/support/minimum_input_object.rb +0 -21
- data/spec/support/new_relic.rb +0 -27
- data/spec/support/parser/filename_example.graphql +0 -5
- data/spec/support/parser/filename_example_error_1.graphql +0 -4
- data/spec/support/parser/filename_example_error_2.graphql +0 -5
- data/spec/support/skylight.rb +0 -39
- data/spec/support/star_wars/schema.rb +0 -465
- data/spec/support/static_validation_helpers.rb +0 -32
@@ -1,12 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
# test_via: ../subscriptions.rb
|
3
2
|
module GraphQL
|
4
3
|
class Subscriptions
|
5
4
|
# This thing can be:
|
6
5
|
# - Subscribed to by `subscription { ... }`
|
7
6
|
# - Triggered by `MySchema.subscriber.trigger(name, arguments, obj)`
|
8
7
|
#
|
9
|
-
# An array of `Event`s are passed to `store.register(query, events)`.
|
10
8
|
class Event
|
11
9
|
# @return [String] Corresponds to the Subscription root field name
|
12
10
|
attr_reader :name
|
@@ -25,51 +23,121 @@ module GraphQL
|
|
25
23
|
@arguments = arguments
|
26
24
|
@context = context
|
27
25
|
field ||= context.field
|
28
|
-
|
26
|
+
scope_key = field.subscription_scope
|
27
|
+
scope_val = scope || (context && scope_key && context[scope_key])
|
28
|
+
if scope_key &&
|
29
|
+
(subscription = field.resolver) &&
|
30
|
+
(subscription.respond_to?(:subscription_scope_optional?)) &&
|
31
|
+
!subscription.subscription_scope_optional? &&
|
32
|
+
scope_val.nil?
|
33
|
+
raise Subscriptions::SubscriptionScopeMissingError, "#{field.path} (#{subscription}) requires a `scope:` value to trigger updates (Set `subscription_scope ..., optional: true` to disable this requirement)"
|
34
|
+
end
|
29
35
|
|
30
|
-
@topic = self.class.serialize(name, arguments, field, scope: scope_val)
|
36
|
+
@topic = self.class.serialize(name, arguments, field, scope: scope_val, context: context)
|
31
37
|
end
|
32
38
|
|
33
39
|
# @return [String] an identifier for this unit of subscription
|
34
|
-
def self.serialize(
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
40
|
+
def self.serialize(_name, arguments, field, scope:, context: GraphQL::Query::NullContext)
|
41
|
+
subscription = field.resolver || GraphQL::Schema::Subscription
|
42
|
+
normalized_args = stringify_args(field, arguments.to_h, context)
|
43
|
+
subscription.topic_for(arguments: normalized_args, field: field, scope: scope)
|
44
|
+
end
|
45
|
+
|
46
|
+
# @return [String] a logical identifier for this event. (Stable when the query is broadcastable.)
|
47
|
+
def fingerprint
|
48
|
+
@fingerprint ||= begin
|
49
|
+
# When this query has been flagged as broadcastable,
|
50
|
+
# use a generalized, stable fingerprint so that
|
51
|
+
# duplicate subscriptions can be evaluated and distributed in bulk.
|
52
|
+
# (`@topic` includes field, args, and subscription scope already.)
|
53
|
+
if @context.namespace(:subscriptions)[:subscription_broadcastable]
|
54
|
+
"#{@topic}/#{@context.query.fingerprint}"
|
41
55
|
else
|
42
|
-
|
43
|
-
|
44
|
-
field,
|
45
|
-
nil,
|
46
|
-
)
|
56
|
+
# not broadcastable, build a unique ID for this event
|
57
|
+
@context.schema.subscriptions.build_id
|
47
58
|
end
|
48
|
-
else
|
49
|
-
raise ArgumentError, "Unexpected arguments: #{arguments}, must be Hash or GraphQL::Arguments"
|
50
59
|
end
|
51
|
-
|
52
|
-
sorted_h = normalized_args.to_h.sort.to_h
|
53
|
-
Serialize.dump_recursive([scope, name, sorted_h])
|
54
60
|
end
|
55
61
|
|
56
62
|
class << self
|
57
63
|
private
|
58
|
-
|
64
|
+
|
65
|
+
# This method does not support cyclic references in the Hash,
|
66
|
+
# nor does it support Hashes whose keys are not sortable
|
67
|
+
# with respect to their peers ( cases where a <=> b might throw an error )
|
68
|
+
def deep_sort_hash_keys(hash_to_sort)
|
69
|
+
raise ArgumentError.new("Argument must be a Hash") unless hash_to_sort.is_a?(Hash)
|
70
|
+
hash_to_sort.keys.sort.map do |k|
|
71
|
+
if hash_to_sort[k].is_a?(Hash)
|
72
|
+
[k, deep_sort_hash_keys(hash_to_sort[k])]
|
73
|
+
elsif hash_to_sort[k].is_a?(Array)
|
74
|
+
[k, deep_sort_array_hashes(hash_to_sort[k])]
|
75
|
+
else
|
76
|
+
[k, hash_to_sort[k]]
|
77
|
+
end
|
78
|
+
end.to_h
|
79
|
+
end
|
80
|
+
|
81
|
+
def deep_sort_array_hashes(array_to_inspect)
|
82
|
+
raise ArgumentError.new("Argument must be an Array") unless array_to_inspect.is_a?(Array)
|
83
|
+
array_to_inspect.map do |v|
|
84
|
+
if v.is_a?(Hash)
|
85
|
+
deep_sort_hash_keys(v)
|
86
|
+
elsif v.is_a?(Array)
|
87
|
+
deep_sort_array_hashes(v)
|
88
|
+
else
|
89
|
+
v
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def stringify_args(arg_owner, args, context)
|
95
|
+
arg_owner = arg_owner.respond_to?(:unwrap) ? arg_owner.unwrap : arg_owner # remove list and non-null wrappers
|
59
96
|
case args
|
60
97
|
when Hash
|
61
98
|
next_args = {}
|
62
99
|
args.each do |k, v|
|
63
|
-
|
64
|
-
|
100
|
+
arg_name = k.to_s
|
101
|
+
camelized_arg_name = GraphQL::Schema::Member::BuildType.camelize(arg_name)
|
102
|
+
arg_defn = get_arg_definition(arg_owner, camelized_arg_name, context)
|
103
|
+
|
104
|
+
if arg_defn
|
105
|
+
normalized_arg_name = camelized_arg_name
|
106
|
+
else
|
107
|
+
normalized_arg_name = arg_name
|
108
|
+
arg_defn = get_arg_definition(arg_owner, normalized_arg_name, context)
|
109
|
+
end
|
110
|
+
arg_base_type = arg_defn.type.unwrap
|
111
|
+
# In the case where the value being emitted is seen as a "JSON"
|
112
|
+
# type, treat the value as one atomic unit of serialization
|
113
|
+
is_json_definition = arg_base_type && arg_base_type <= GraphQL::Types::JSON
|
114
|
+
if is_json_definition
|
115
|
+
sorted_value = if v.is_a?(Hash)
|
116
|
+
deep_sort_hash_keys(v)
|
117
|
+
elsif v.is_a?(Array)
|
118
|
+
deep_sort_array_hashes(v)
|
119
|
+
else
|
120
|
+
v
|
121
|
+
end
|
122
|
+
next_args[normalized_arg_name] = sorted_value.respond_to?(:to_json) ? sorted_value.to_json : sorted_value
|
123
|
+
else
|
124
|
+
next_args[normalized_arg_name] = stringify_args(arg_base_type, v, context)
|
125
|
+
end
|
65
126
|
end
|
66
|
-
|
127
|
+
# Make sure they're deeply sorted
|
128
|
+
next_args.sort.to_h
|
67
129
|
when Array
|
68
|
-
args.map { |a| stringify_args(a) }
|
130
|
+
args.map { |a| stringify_args(arg_owner, a, context) }
|
131
|
+
when GraphQL::Schema::InputObject
|
132
|
+
stringify_args(arg_owner, args.to_h, context)
|
69
133
|
else
|
70
134
|
args
|
71
135
|
end
|
72
136
|
end
|
137
|
+
|
138
|
+
def get_arg_definition(arg_owner, arg_name, context)
|
139
|
+
arg_owner.get_argument(arg_name, context) || arg_owner.arguments(context).each_value.find { |v| v.keyword.to_s == arg_name }
|
140
|
+
end
|
73
141
|
end
|
74
142
|
end
|
75
143
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
# test_via: ../subscriptions.rb
|
3
2
|
module GraphQL
|
4
3
|
class Subscriptions
|
5
4
|
# Wrap the root fields of the subscription type with special logic for:
|
@@ -11,7 +10,7 @@ module GraphQL
|
|
11
10
|
end
|
12
11
|
|
13
12
|
def instrument(type, field)
|
14
|
-
if type == @schema.subscription
|
13
|
+
if type == @schema.subscription.graphql_definition
|
15
14
|
# This is a root field of `subscription`
|
16
15
|
subscribing_resolve_proc = SubscriptionRegistrationResolve.new(field.resolve_proc)
|
17
16
|
field.redefine(resolve: subscribing_resolve_proc)
|
@@ -44,7 +43,10 @@ module GraphQL
|
|
44
43
|
|
45
44
|
# Wrap the proc with subscription registration logic
|
46
45
|
def call(obj, args, ctx)
|
47
|
-
|
46
|
+
result = nil
|
47
|
+
if @inner_proc && !@inner_proc.is_a?(GraphQL::Field::Resolve::BuiltInResolve)
|
48
|
+
result = @inner_proc.call(obj, args, ctx)
|
49
|
+
end
|
48
50
|
|
49
51
|
events = ctx.namespace(:subscriptions)[:events]
|
50
52
|
|
@@ -56,10 +58,12 @@ module GraphQL
|
|
56
58
|
arguments: args,
|
57
59
|
context: ctx,
|
58
60
|
)
|
59
|
-
|
61
|
+
result
|
60
62
|
elsif ctx.irep_node.subscription_topic == ctx.query.subscription_topic
|
61
|
-
|
62
|
-
|
63
|
+
if !result.nil?
|
64
|
+
result
|
65
|
+
elsif obj.is_a?(GraphQL::Schema::Object)
|
66
|
+
# The root object is _already_ the subscription update:
|
63
67
|
obj.object
|
64
68
|
else
|
65
69
|
obj
|
@@ -1,5 +1,4 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
# test_via: ../subscriptions.rb
|
3
2
|
require "set"
|
4
3
|
module GraphQL
|
5
4
|
class Subscriptions
|
@@ -9,6 +8,9 @@ module GraphQL
|
|
9
8
|
GLOBALID_KEY = "__gid__"
|
10
9
|
SYMBOL_KEY = "__sym__"
|
11
10
|
SYMBOL_KEYS_KEY = "__sym_keys__"
|
11
|
+
TIMESTAMP_KEY = "__timestamp__"
|
12
|
+
TIMESTAMP_FORMAT = "%Y-%m-%d %H:%M:%S.%N%z" # eg '2020-01-01 23:59:59.123456789+05:00'
|
13
|
+
OPEN_STRUCT_KEY = "__ostruct__"
|
12
14
|
|
13
15
|
module_function
|
14
16
|
|
@@ -53,12 +55,40 @@ module GraphQL
|
|
53
55
|
# @return [Object] An object that load Global::Identification recursive
|
54
56
|
def load_value(value)
|
55
57
|
if value.is_a?(Array)
|
56
|
-
value.
|
58
|
+
is_gids = (v1 = value[0]).is_a?(Hash) && v1.size == 1 && v1[GLOBALID_KEY]
|
59
|
+
if is_gids
|
60
|
+
# Assume it's an array of global IDs
|
61
|
+
ids = value.map { |v| v[GLOBALID_KEY] }
|
62
|
+
GlobalID::Locator.locate_many(ids)
|
63
|
+
else
|
64
|
+
value.map { |item| load_value(item) }
|
65
|
+
end
|
57
66
|
elsif value.is_a?(Hash)
|
58
|
-
if value.size == 1
|
59
|
-
|
60
|
-
|
61
|
-
|
67
|
+
if value.size == 1
|
68
|
+
case value.keys.first # there's only 1 key
|
69
|
+
when GLOBALID_KEY
|
70
|
+
GlobalID::Locator.locate(value[GLOBALID_KEY])
|
71
|
+
when SYMBOL_KEY
|
72
|
+
value[SYMBOL_KEY].to_sym
|
73
|
+
when TIMESTAMP_KEY
|
74
|
+
timestamp_class_name, *timestamp_args = value[TIMESTAMP_KEY]
|
75
|
+
timestamp_class = Object.const_get(timestamp_class_name)
|
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
|
85
|
+
when OPEN_STRUCT_KEY
|
86
|
+
ostruct_values = load_value(value[OPEN_STRUCT_KEY])
|
87
|
+
OpenStruct.new(ostruct_values)
|
88
|
+
else
|
89
|
+
key = value.keys.first
|
90
|
+
{ key => load_value(value[key]) }
|
91
|
+
end
|
62
92
|
else
|
63
93
|
loaded_h = {}
|
64
94
|
sym_keys = value.fetch(SYMBOL_KEYS_KEY, [])
|
@@ -101,6 +131,23 @@ module GraphQL
|
|
101
131
|
{ SYMBOL_KEY => obj.to_s }
|
102
132
|
elsif obj.respond_to?(:to_gid_param)
|
103
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)] }
|
146
|
+
elsif obj.is_a?(Date) || obj.is_a?(Time)
|
147
|
+
# DateTime extends Date; for TimeWithZone, call `.utc` first.
|
148
|
+
{ TIMESTAMP_KEY => [obj.class.name, obj.strftime(TIMESTAMP_FORMAT)] }
|
149
|
+
elsif obj.is_a?(OpenStruct)
|
150
|
+
{ OPEN_STRUCT_KEY => dump_value(obj.to_h) }
|
104
151
|
else
|
105
152
|
obj
|
106
153
|
end
|
@@ -2,9 +2,11 @@
|
|
2
2
|
|
3
3
|
module GraphQL
|
4
4
|
class Subscriptions
|
5
|
-
#
|
5
|
+
# @api private
|
6
|
+
# @deprecated This module is no longer needed.
|
6
7
|
module SubscriptionRoot
|
7
8
|
def self.extended(child_cls)
|
9
|
+
GraphQL::Deprecation.warn "`extend GraphQL::Subscriptions::SubscriptionRoot` is no longer required; you can remove it from your Subscription type (#{child_cls})"
|
8
10
|
child_cls.include(InstanceMethods)
|
9
11
|
end
|
10
12
|
|
@@ -38,17 +40,17 @@ module GraphQL
|
|
38
40
|
elsif (events = context.namespace(:subscriptions)[:events])
|
39
41
|
# This is the first execution, so gather an Event
|
40
42
|
# for the backend to register:
|
41
|
-
|
43
|
+
event = Subscriptions::Event.new(
|
42
44
|
name: field.name,
|
43
|
-
arguments: arguments,
|
45
|
+
arguments: arguments_without_field_extras(arguments: arguments),
|
44
46
|
context: context,
|
45
47
|
field: field,
|
46
48
|
)
|
47
|
-
|
49
|
+
events << event
|
48
50
|
value
|
49
51
|
elsif context.query.subscription_topic == Subscriptions::Event.serialize(
|
50
52
|
field.name,
|
51
|
-
arguments,
|
53
|
+
arguments_without_field_extras(arguments: arguments),
|
52
54
|
field,
|
53
55
|
scope: (field.subscription_scope ? context[field.subscription_scope] : nil),
|
54
56
|
)
|
@@ -60,6 +62,14 @@ module GraphQL
|
|
60
62
|
context.skip
|
61
63
|
end
|
62
64
|
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def arguments_without_field_extras(arguments:)
|
69
|
+
arguments.dup.tap do |event_args|
|
70
|
+
field.extras.each { |k| event_args.delete(k) }
|
71
|
+
end
|
72
|
+
end
|
63
73
|
end
|
64
74
|
end
|
65
75
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require "securerandom"
|
3
|
+
require "graphql/subscriptions/broadcast_analyzer"
|
3
4
|
require "graphql/subscriptions/event"
|
4
5
|
require "graphql/subscriptions/instrumentation"
|
5
6
|
require "graphql/subscriptions/serialize"
|
6
|
-
|
7
|
-
require "graphql/subscriptions/action_cable_subscriptions"
|
8
|
-
end
|
7
|
+
require "graphql/subscriptions/action_cable_subscriptions"
|
9
8
|
require "graphql/subscriptions/subscription_root"
|
9
|
+
require "graphql/subscriptions/default_subscription_resolve_extension"
|
10
10
|
|
11
11
|
module GraphQL
|
12
12
|
class Subscriptions
|
@@ -16,22 +16,47 @@ module GraphQL
|
|
16
16
|
class InvalidTriggerError < GraphQL::Error
|
17
17
|
end
|
18
18
|
|
19
|
+
# Raised when either:
|
20
|
+
# - An initial subscription didn't have a value for `context[subscription_scope]`
|
21
|
+
# - Or, an update didn't pass `.trigger(..., scope:)`
|
22
|
+
# When raised, the initial subscription or update fails completely.
|
23
|
+
class SubscriptionScopeMissingError < GraphQL::Error
|
24
|
+
end
|
25
|
+
|
19
26
|
# @see {Subscriptions#initialize} for options, concrete implementations may add options.
|
20
27
|
def self.use(defn, options = {})
|
21
|
-
schema = defn.target
|
22
|
-
|
23
|
-
schema.subscriptions
|
28
|
+
schema = defn.is_a?(Class) ? defn : defn.target
|
29
|
+
|
30
|
+
if schema.subscriptions
|
31
|
+
raise ArgumentError, "Can't reinstall subscriptions. #{schema} is using #{schema.subscriptions}, can't also add #{self}"
|
32
|
+
end
|
33
|
+
|
24
34
|
instrumentation = Subscriptions::Instrumentation.new(schema: schema)
|
25
|
-
defn.instrument(:field, instrumentation)
|
26
35
|
defn.instrument(:query, instrumentation)
|
36
|
+
if !schema.is_a?(Class)
|
37
|
+
defn.instrument(:field, instrumentation)
|
38
|
+
end
|
39
|
+
options[:schema] = schema
|
40
|
+
schema.subscriptions = self.new(**options)
|
41
|
+
schema.add_subscription_extension_if_necessary
|
27
42
|
nil
|
28
43
|
end
|
29
44
|
|
30
45
|
# @param schema [Class] the GraphQL schema this manager belongs to
|
31
|
-
def initialize(schema:, **rest)
|
46
|
+
def initialize(schema:, broadcast: false, default_broadcastable: false, **rest)
|
47
|
+
if broadcast
|
48
|
+
if !schema.using_ast_analysis?
|
49
|
+
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."
|
50
|
+
end
|
51
|
+
schema.query_analyzer(Subscriptions::BroadcastAnalyzer)
|
52
|
+
end
|
53
|
+
@default_broadcastable = default_broadcastable
|
32
54
|
@schema = schema
|
33
55
|
end
|
34
56
|
|
57
|
+
# @return [Boolean] Used when fields don't have `broadcastable:` explicitly set
|
58
|
+
attr_reader :default_broadcastable
|
59
|
+
|
35
60
|
# Fetch subscriptions matching this field + arguments pair
|
36
61
|
# And pass them off to the queue.
|
37
62
|
# @param event_name [String]
|
@@ -58,7 +83,8 @@ module GraphQL
|
|
58
83
|
end
|
59
84
|
|
60
85
|
# Normalize symbol-keyed args to strings, try camelizing them
|
61
|
-
|
86
|
+
# Should this accept a real context somehow?
|
87
|
+
normalized_args = normalize_arguments(normalized_event_name, field, args, GraphQL::Query::NullContext)
|
62
88
|
|
63
89
|
event = Subscriptions::Event.new(
|
64
90
|
name: normalized_event_name,
|
@@ -72,40 +98,59 @@ module GraphQL
|
|
72
98
|
# `event` was triggered on `object`, and `subscription_id` was subscribed,
|
73
99
|
# so it should be updated.
|
74
100
|
#
|
75
|
-
# Load `subscription_id`'s GraphQL data, re-evaluate the query
|
76
|
-
#
|
77
|
-
# This is where a queue may be inserted to push updates in the background.
|
101
|
+
# Load `subscription_id`'s GraphQL data, re-evaluate the query and return the result.
|
78
102
|
#
|
79
103
|
# @param subscription_id [String]
|
80
104
|
# @param event [GraphQL::Subscriptions::Event] The event which was triggered
|
81
105
|
# @param object [Object] The value for the subscription field
|
82
|
-
# @return [
|
83
|
-
def
|
106
|
+
# @return [GraphQL::Query::Result]
|
107
|
+
def execute_update(subscription_id, event, object)
|
84
108
|
# Lookup the saved data for this subscription
|
85
109
|
query_data = read_subscription(subscription_id)
|
110
|
+
if query_data.nil?
|
111
|
+
delete_subscription(subscription_id)
|
112
|
+
return nil
|
113
|
+
end
|
114
|
+
|
86
115
|
# Fetch the required keys from the saved data
|
87
116
|
query_string = query_data.fetch(:query_string)
|
88
117
|
variables = query_data.fetch(:variables)
|
89
118
|
context = query_data.fetch(:context)
|
90
119
|
operation_name = query_data.fetch(:operation_name)
|
91
|
-
# Re-evaluate the saved query
|
92
120
|
result = @schema.execute(
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
root_value: object,
|
100
|
-
}
|
121
|
+
query: query_string,
|
122
|
+
context: context,
|
123
|
+
subscription_topic: event.topic,
|
124
|
+
operation_name: operation_name,
|
125
|
+
variables: variables,
|
126
|
+
root_value: object,
|
101
127
|
)
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
128
|
+
subscriptions_context = result.context.namespace(:subscriptions)
|
129
|
+
if subscriptions_context[:no_update]
|
130
|
+
result = nil
|
131
|
+
end
|
132
|
+
|
133
|
+
unsubscribed = subscriptions_context[:unsubscribed]
|
134
|
+
|
135
|
+
if unsubscribed
|
136
|
+
# `unsubscribe` was called, clean up on our side
|
137
|
+
# TODO also send `{more: false}` to client?
|
138
|
+
delete_subscription(subscription_id)
|
139
|
+
result = nil
|
140
|
+
end
|
141
|
+
|
142
|
+
result
|
143
|
+
end
|
144
|
+
|
145
|
+
# Run the update query for this subscription and deliver it
|
146
|
+
# @see {#execute_update}
|
147
|
+
# @see {#deliver}
|
148
|
+
# @return [void]
|
149
|
+
def execute(subscription_id, event, object)
|
150
|
+
res = execute_update(subscription_id, event, object)
|
151
|
+
if !res.nil?
|
152
|
+
deliver(subscription_id, res)
|
153
|
+
end
|
109
154
|
end
|
110
155
|
|
111
156
|
# Event `event` occurred on `object`,
|
@@ -114,17 +159,7 @@ module GraphQL
|
|
114
159
|
# @param object [Object]
|
115
160
|
# @return [void]
|
116
161
|
def execute_all(event, object)
|
117
|
-
|
118
|
-
execute(subscription_id, event, object)
|
119
|
-
end
|
120
|
-
end
|
121
|
-
|
122
|
-
# Get each `subscription_id` subscribed to `event.topic` and yield them
|
123
|
-
# @param event [GraphQL::Subscriptions::Event]
|
124
|
-
# @yieldparam subscription_id [String]
|
125
|
-
# @return [void]
|
126
|
-
def each_subscription_id(event)
|
127
|
-
raise NotImplementedError
|
162
|
+
raise GraphQL::RequiredImplementationMissingError
|
128
163
|
end
|
129
164
|
|
130
165
|
# The system wants to send an update to this subscription.
|
@@ -132,7 +167,7 @@ module GraphQL
|
|
132
167
|
# @param subscription_id [String]
|
133
168
|
# @return [Hash] Containing required keys
|
134
169
|
def read_subscription(subscription_id)
|
135
|
-
raise
|
170
|
+
raise GraphQL::RequiredImplementationMissingError
|
136
171
|
end
|
137
172
|
|
138
173
|
# A subscription query was re-evaluated, returning `result`.
|
@@ -141,7 +176,7 @@ module GraphQL
|
|
141
176
|
# @param result [Hash]
|
142
177
|
# @return [void]
|
143
178
|
def deliver(subscription_id, result)
|
144
|
-
raise
|
179
|
+
raise GraphQL::RequiredImplementationMissingError
|
145
180
|
end
|
146
181
|
|
147
182
|
# `query` was executed and found subscriptions to `events`.
|
@@ -150,7 +185,7 @@ module GraphQL
|
|
150
185
|
# @param events [Array<GraphQL::Subscriptions::Event>]
|
151
186
|
# @return [void]
|
152
187
|
def write_subscription(query, events)
|
153
|
-
raise
|
188
|
+
raise GraphQL::RequiredImplementationMissingError
|
154
189
|
end
|
155
190
|
|
156
191
|
# A subscription was terminated server-side.
|
@@ -158,7 +193,7 @@ module GraphQL
|
|
158
193
|
# @param subscription_id [String]
|
159
194
|
# @return void.
|
160
195
|
def delete_subscription(subscription_id)
|
161
|
-
raise
|
196
|
+
raise GraphQL::RequiredImplementationMissingError
|
162
197
|
end
|
163
198
|
|
164
199
|
# @return [String] A new unique identifier for a subscription
|
@@ -178,6 +213,16 @@ module GraphQL
|
|
178
213
|
Schema::Member::BuildType.camelize(event_or_arg_name.to_s)
|
179
214
|
end
|
180
215
|
|
216
|
+
# @return [Boolean] if true, then a query like this one would be broadcasted
|
217
|
+
def broadcastable?(query_str, **query_options)
|
218
|
+
query = GraphQL::Query.new(@schema, query_str, **query_options)
|
219
|
+
if !query.valid?
|
220
|
+
raise "Invalid query: #{query.validation_errors.map(&:to_h).inspect}"
|
221
|
+
end
|
222
|
+
GraphQL::Analysis::AST.analyze_query(query, @schema.query_analyzers)
|
223
|
+
query.context.namespace(:subscriptions)[:subscription_broadcastable]
|
224
|
+
end
|
225
|
+
|
181
226
|
private
|
182
227
|
|
183
228
|
# Recursively normalize `args` as belonging to `arg_owner`:
|
@@ -186,32 +231,55 @@ module GraphQL
|
|
186
231
|
# @param arg_owner [GraphQL::Field, GraphQL::BaseType]
|
187
232
|
# @param args [Hash, Array, Any] some GraphQL input value to coerce as `arg_owner`
|
188
233
|
# @return [Any] normalized arguments value
|
189
|
-
def normalize_arguments(event_name, arg_owner, args)
|
234
|
+
def normalize_arguments(event_name, arg_owner, args, context)
|
190
235
|
case arg_owner
|
191
|
-
when GraphQL::Field, GraphQL::InputObjectType
|
236
|
+
when GraphQL::Field, GraphQL::InputObjectType, GraphQL::Schema::Field, Class
|
237
|
+
if arg_owner.is_a?(Class) && !arg_owner.kind.input_object?
|
238
|
+
# it's a type, but not an input object
|
239
|
+
return args
|
240
|
+
end
|
192
241
|
normalized_args = {}
|
193
242
|
missing_arg_names = []
|
194
243
|
args.each do |k, v|
|
195
244
|
arg_name = k.to_s
|
196
|
-
arg_defn = arg_owner.
|
245
|
+
arg_defn = arg_owner.get_argument(arg_name, context)
|
197
246
|
if arg_defn
|
198
247
|
normalized_arg_name = arg_name
|
199
248
|
else
|
200
249
|
normalized_arg_name = normalize_name(arg_name)
|
201
|
-
arg_defn = arg_owner.
|
250
|
+
arg_defn = arg_owner.get_argument(normalized_arg_name, context)
|
202
251
|
end
|
203
252
|
|
204
253
|
if arg_defn
|
205
|
-
|
254
|
+
if arg_defn.loads
|
255
|
+
normalized_arg_name = arg_defn.keyword.to_s
|
256
|
+
end
|
257
|
+
normalized = normalize_arguments(event_name, arg_defn.type, v, context)
|
258
|
+
normalized_args[normalized_arg_name] = normalized
|
206
259
|
else
|
207
260
|
# Couldn't find a matching argument definition
|
208
261
|
missing_arg_names << arg_name
|
209
262
|
end
|
210
263
|
end
|
211
264
|
|
265
|
+
# Backfill default values so that trigger arguments
|
266
|
+
# match query arguments.
|
267
|
+
arg_owner.arguments(context).each do |_name, arg_defn|
|
268
|
+
if arg_defn.default_value? && !normalized_args.key?(arg_defn.name)
|
269
|
+
default_value = arg_defn.default_value
|
270
|
+
# We don't have an underlying "object" here, so it can't call methods.
|
271
|
+
# This is broken.
|
272
|
+
normalized_args[arg_defn.name] = arg_defn.prepare_value(nil, default_value, context: context)
|
273
|
+
end
|
274
|
+
end
|
275
|
+
|
212
276
|
if missing_arg_names.any?
|
213
277
|
arg_owner_name = if arg_owner.is_a?(GraphQL::Field)
|
214
278
|
"Subscription.#{arg_owner.name}"
|
279
|
+
elsif arg_owner.is_a?(GraphQL::Schema::Field)
|
280
|
+
arg_owner.path
|
281
|
+
elsif arg_owner.is_a?(Class)
|
282
|
+
arg_owner.graphql_name
|
215
283
|
else
|
216
284
|
arg_owner.to_s
|
217
285
|
end
|
@@ -219,10 +287,10 @@ module GraphQL
|
|
219
287
|
end
|
220
288
|
|
221
289
|
normalized_args
|
222
|
-
when GraphQL::ListType
|
223
|
-
args.map { |a| normalize_arguments(event_name, arg_owner.of_type, a) }
|
224
|
-
when GraphQL::NonNullType
|
225
|
-
normalize_arguments(event_name, arg_owner.of_type, args)
|
290
|
+
when GraphQL::ListType, GraphQL::Schema::List
|
291
|
+
args.map { |a| normalize_arguments(event_name, arg_owner.of_type, a, context) }
|
292
|
+
when GraphQL::NonNullType, GraphQL::Schema::NonNull
|
293
|
+
normalize_arguments(event_name, arg_owner.of_type, args, context)
|
226
294
|
else
|
227
295
|
args
|
228
296
|
end
|
@@ -1,29 +1,20 @@
|
|
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
|
6
|
-
# with a `graphql
|
8
|
+
# with a `graphql` suffix.
|
7
9
|
#
|
10
|
+
# @see KEYS for event names
|
8
11
|
module ActiveSupportNotificationsTracing
|
9
12
|
# A cache of frequently-used keys to avoid needless string allocations
|
10
|
-
KEYS =
|
11
|
-
|
12
|
-
"parse" => "graphql.parse",
|
13
|
-
"validate" => "graphql.validate",
|
14
|
-
"analyze_multiplex" => "graphql.analyze_multiplex",
|
15
|
-
"analyze_query" => "graphql.analyze_query",
|
16
|
-
"execute_query" => "graphql.execute_query",
|
17
|
-
"execute_query_lazy" => "graphql.execute_query_lazy",
|
18
|
-
"execute_field" => "graphql.execute_field",
|
19
|
-
"execute_field_lazy" => "graphql.execute_field_lazy",
|
20
|
-
}
|
13
|
+
KEYS = NotificationsTracing::KEYS
|
14
|
+
NOTIFICATIONS_ENGINE = NotificationsTracing.new(ActiveSupport::Notifications) if defined?(ActiveSupport::Notifications)
|
21
15
|
|
22
|
-
def self.trace(key, metadata)
|
23
|
-
|
24
|
-
ActiveSupport::Notifications.instrument(prefixed_key, metadata) do
|
25
|
-
yield
|
26
|
-
end
|
16
|
+
def self.trace(key, metadata, &blk)
|
17
|
+
NOTIFICATIONS_ENGINE.trace(key, metadata, &blk)
|
27
18
|
end
|
28
19
|
end
|
29
20
|
end
|