graphql 1.10.2 → 2.0.21
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 +21 -10
 - 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 +45 -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 +49 -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 +2 -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 +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_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 +16 -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 +24 -33
 - 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/ast/field_usage.rb +30 -1
 - data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
 - data/lib/graphql/analysis/ast/query_complexity.rb +125 -117
 - data/lib/graphql/analysis/ast/query_depth.rb +0 -1
 - data/lib/graphql/analysis/ast/visitor.rb +52 -36
 - data/lib/graphql/analysis/ast.rb +7 -8
 - data/lib/graphql/analysis.rb +0 -7
 - data/lib/graphql/backtrace/inspect_result.rb +0 -1
 - data/lib/graphql/backtrace/table.rb +31 -18
 - data/lib/graphql/backtrace/trace.rb +96 -0
 - data/lib/graphql/backtrace/traced_error.rb +0 -1
 - data/lib/graphql/backtrace/tracer.rb +39 -9
 - data/lib/graphql/backtrace.rb +26 -18
 - data/lib/graphql/dataloader/null_dataloader.rb +24 -0
 - data/lib/graphql/dataloader/request.rb +19 -0
 - data/lib/graphql/dataloader/request_all.rb +19 -0
 - data/lib/graphql/dataloader/source.rb +164 -0
 - data/lib/graphql/dataloader.rb +311 -0
 - data/lib/graphql/date_encoding_error.rb +16 -0
 - data/lib/graphql/deprecation.rb +9 -0
 - data/lib/graphql/dig.rb +1 -1
 - data/lib/graphql/execution/errors.rb +77 -44
 - 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 +104 -0
 - data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
 - data/lib/graphql/execution/interpreter/resolve.rb +62 -24
 - data/lib/graphql/execution/interpreter/runtime.rb +826 -464
 - data/lib/graphql/execution/interpreter.rb +206 -68
 - data/lib/graphql/execution/lazy.rb +11 -21
 - data/lib/graphql/execution/lookahead.rb +55 -136
 - data/lib/graphql/execution/multiplex.rb +6 -162
 - data/lib/graphql/execution.rb +11 -4
 - data/lib/graphql/filter.rb +7 -2
 - data/lib/graphql/integer_decoding_error.rb +17 -0
 - 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 +11 -5
 - data/lib/graphql/introspection/dynamic_fields.rb +3 -8
 - data/lib/graphql/introspection/entry_points.rb +4 -17
 - 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 +15 -3
 - data/lib/graphql/introspection/introspection_query.rb +6 -92
 - data/lib/graphql/introspection/schema_type.rb +11 -6
 - data/lib/graphql/introspection/type_type.rb +31 -14
 - data/lib/graphql/introspection.rb +100 -0
 - data/lib/graphql/invalid_null_error.rb +18 -0
 - data/lib/graphql/language/block_string.rb +20 -5
 - data/lib/graphql/language/cache.rb +37 -0
 - data/lib/graphql/language/document_from_schema_definition.rb +96 -44
 - data/lib/graphql/language/lexer.rb +216 -1462
 - data/lib/graphql/language/nodes.rb +126 -129
 - data/lib/graphql/language/parser.rb +997 -933
 - data/lib/graphql/language/parser.y +148 -118
 - data/lib/graphql/language/printer.rb +48 -23
 - data/lib/graphql/language/sanitized_printer.rb +222 -0
 - data/lib/graphql/language/token.rb +0 -4
 - data/lib/graphql/language/visitor.rb +192 -84
 - data/lib/graphql/language.rb +2 -0
 - data/lib/graphql/name_validator.rb +2 -7
 - data/lib/graphql/pagination/active_record_relation_connection.rb +45 -3
 - data/lib/graphql/pagination/array_connection.rb +6 -4
 - data/lib/graphql/pagination/connection.rb +105 -23
 - data/lib/graphql/pagination/connections.rb +62 -35
 - data/lib/graphql/pagination/relation_connection.rb +88 -36
 - data/lib/graphql/parse_error.rb +0 -1
 - data/lib/graphql/query/context.rb +203 -198
 - data/lib/graphql/query/fingerprint.rb +26 -0
 - data/lib/graphql/query/input_validation_result.rb +33 -7
 - data/lib/graphql/query/null_context.rb +22 -9
 - data/lib/graphql/query/validation_pipeline.rb +16 -38
 - data/lib/graphql/query/variable_validation_error.rb +3 -3
 - data/lib/graphql/query/variables.rb +36 -12
 - data/lib/graphql/query.rb +92 -44
 - data/lib/graphql/railtie.rb +6 -102
 - data/lib/graphql/rake_task/validate.rb +1 -1
 - data/lib/graphql/rake_task.rb +41 -10
 - data/lib/graphql/relay/range_add.rb +17 -10
 - 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 +245 -0
 - data/lib/graphql/schema/argument.rb +250 -46
 - data/lib/graphql/schema/base_64_encoder.rb +2 -0
 - data/lib/graphql/schema/build_from_definition/resolve_map.rb +3 -1
 - data/lib/graphql/schema/build_from_definition.rb +243 -89
 - data/lib/graphql/schema/directive/deprecated.rb +1 -1
 - data/lib/graphql/schema/directive/feature.rb +1 -1
 - data/lib/graphql/schema/directive/flagged.rb +57 -0
 - data/lib/graphql/schema/directive/include.rb +1 -1
 - data/lib/graphql/schema/directive/one_of.rb +12 -0
 - data/lib/graphql/schema/directive/skip.rb +1 -1
 - data/lib/graphql/schema/directive/transform.rb +14 -2
 - data/lib/graphql/schema/directive.rb +108 -20
 - data/lib/graphql/schema/enum.rb +105 -44
 - data/lib/graphql/schema/enum_value.rb +15 -25
 - data/lib/graphql/schema/field/connection_extension.rb +50 -30
 - data/lib/graphql/schema/field/scope_extension.rb +1 -1
 - data/lib/graphql/schema/field.rb +476 -331
 - data/lib/graphql/schema/field_extension.rb +86 -2
 - data/lib/graphql/schema/find_inherited_value.rb +6 -8
 - data/lib/graphql/schema/finder.rb +5 -5
 - data/lib/graphql/schema/input_object.rb +133 -121
 - data/lib/graphql/schema/interface.rb +17 -45
 - data/lib/graphql/schema/introspection_system.rb +3 -8
 - data/lib/graphql/schema/late_bound_type.rb +8 -2
 - data/lib/graphql/schema/list.rb +25 -8
 - data/lib/graphql/schema/loader.rb +139 -103
 - data/lib/graphql/schema/member/base_dsl_methods.rb +29 -35
 - data/lib/graphql/schema/member/build_type.rb +19 -14
 - data/lib/graphql/schema/member/has_arguments.rb +310 -26
 - data/lib/graphql/schema/member/has_ast_node.rb +16 -1
 - data/lib/graphql/schema/member/has_deprecation_reason.rb +24 -0
 - data/lib/graphql/schema/member/has_directives.rb +118 -0
 - data/lib/graphql/schema/member/has_fields.rb +164 -42
 - data/lib/graphql/schema/member/has_interfaces.rb +129 -0
 - data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
 - data/lib/graphql/schema/member/has_validators.rb +57 -0
 - data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
 - data/lib/graphql/schema/member/type_system_helpers.rb +20 -3
 - data/lib/graphql/schema/member/validates_input.rb +3 -3
 - data/lib/graphql/schema/member.rb +6 -6
 - data/lib/graphql/schema/mutation.rb +4 -9
 - data/lib/graphql/schema/non_null.rb +12 -7
 - data/lib/graphql/schema/object.rb +35 -69
 - data/lib/graphql/schema/printer.rb +16 -34
 - data/lib/graphql/schema/relay_classic_mutation.rb +90 -43
 - data/lib/graphql/schema/resolver/has_payload_type.rb +51 -11
 - data/lib/graphql/schema/resolver.rb +144 -79
 - data/lib/graphql/schema/scalar.rb +27 -18
 - data/lib/graphql/schema/subscription.rb +55 -26
 - data/lib/graphql/schema/timeout.rb +45 -35
 - data/lib/graphql/schema/type_expression.rb +1 -1
 - data/lib/graphql/schema/type_membership.rb +21 -4
 - data/lib/graphql/schema/union.rb +48 -13
 - data/lib/graphql/schema/unique_within_type.rb +1 -2
 - 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 +185 -32
 - data/lib/graphql/schema/wrapper.rb +0 -5
 - data/lib/graphql/schema.rb +471 -1116
 - data/lib/graphql/static_validation/all_rules.rb +3 -0
 - data/lib/graphql/static_validation/base_visitor.rb +13 -27
 - 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 +69 -26
 - data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +44 -87
 - data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
 - data/lib/graphql/static_validation/rules/arguments_are_defined.rb +28 -22
 - data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
 - data/lib/graphql/static_validation/rules/directives_are_defined.rb +12 -6
 - 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 +92 -49
 - 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/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/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 +4 -2
 - data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +6 -7
 - 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 +9 -10
 - data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +14 -8
 - data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +4 -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 +32 -20
 - data/lib/graphql/static_validation.rb +1 -2
 - data/lib/graphql/string_encoding_error.rb +13 -3
 - data/lib/graphql/subscriptions/action_cable_subscriptions.rb +126 -19
 - data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
 - data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
 - data/lib/graphql/subscriptions/event.rb +81 -35
 - data/lib/graphql/subscriptions/instrumentation.rb +0 -52
 - data/lib/graphql/subscriptions/serialize.rb +53 -6
 - data/lib/graphql/subscriptions.rb +113 -58
 - data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
 - data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -21
 - data/lib/graphql/tracing/appoptics_trace.rb +231 -0
 - data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
 - 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 +148 -0
 - data/lib/graphql/tracing/data_dog_tracing.rb +26 -2
 - data/lib/graphql/tracing/legacy_trace.rb +65 -0
 - data/lib/graphql/tracing/new_relic_trace.rb +75 -0
 - data/lib/graphql/tracing/new_relic_tracing.rb +1 -12
 - data/lib/graphql/tracing/notifications_trace.rb +42 -0
 - data/lib/graphql/tracing/notifications_tracing.rb +59 -0
 - data/lib/graphql/tracing/platform_trace.rb +109 -0
 - data/lib/graphql/tracing/platform_tracing.rb +64 -43
 - data/lib/graphql/tracing/prometheus_trace.rb +89 -0
 - data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +5 -2
 - data/lib/graphql/tracing/prometheus_tracing.rb +3 -3
 - data/lib/graphql/tracing/scout_trace.rb +72 -0
 - data/lib/graphql/tracing/scout_tracing.rb +11 -0
 - data/lib/graphql/tracing/statsd_trace.rb +56 -0
 - data/lib/graphql/tracing/statsd_tracing.rb +42 -0
 - data/lib/graphql/tracing/trace.rb +75 -0
 - data/lib/graphql/tracing.rb +23 -71
 - data/lib/graphql/type_kinds.rb +6 -3
 - 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 +20 -9
 - data/lib/graphql/types/iso_8601_date_time.rb +36 -10
 - data/lib/graphql/types/relay/base_connection.rb +18 -92
 - data/lib/graphql/types/relay/base_edge.rb +2 -34
 - data/lib/graphql/types/relay/connection_behaviors.rb +176 -0
 - data/lib/graphql/types/relay/edge_behaviors.rb +75 -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 +25 -0
 - data/lib/graphql/types/relay/page_info.rb +2 -14
 - data/lib/graphql/types/relay/page_info_behaviors.rb +30 -0
 - data/lib/graphql/types/relay.rb +10 -5
 - data/lib/graphql/types/string.rb +8 -2
 - data/lib/graphql/unauthorized_error.rb +2 -2
 - data/lib/graphql/version.rb +1 -1
 - data/lib/graphql.rb +54 -65
 - data/readme.md +3 -6
 - metadata +116 -236
 - data/lib/graphql/analysis/analyze_query.rb +0 -91
 - 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/backwards_compatibility.rb +0 -60
 - 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 -435
 - data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
 - data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -213
 - 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 -264
 - data/lib/graphql/compatibility/schema_parser_specification.rb +0 -680
 - 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 -210
 - 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 -42
 - 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 -107
 - data/lib/graphql/enum_type.rb +0 -127
 - data/lib/graphql/execution/execute.rb +0 -326
 - data/lib/graphql/execution/flatten.rb +0 -40
 - data/lib/graphql/execution/instrumentation.rb +0 -92
 - data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
 - 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 -222
 - data/lib/graphql/float_type.rb +0 -2
 - data/lib/graphql/function.rb +0 -124
 - data/lib/graphql/id_type.rb +0 -2
 - data/lib/graphql/input_object_type.rb +0 -132
 - data/lib/graphql/int_type.rb +0 -2
 - data/lib/graphql/interface_type.rb +0 -65
 - 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 -258
 - data/lib/graphql/list_type.rb +0 -80
 - data/lib/graphql/literal_validation_error.rb +0 -6
 - data/lib/graphql/non_null_type.rb +0 -71
 - data/lib/graphql/object_type.rb +0 -121
 - data/lib/graphql/query/arguments.rb +0 -188
 - data/lib/graphql/query/arguments_cache.rb +0 -25
 - data/lib/graphql/query/executor.rb +0 -53
 - 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 -39
 - data/lib/graphql/relay/array_connection.rb +0 -85
 - data/lib/graphql/relay/base_connection.rb +0 -176
 - 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 -105
 - data/lib/graphql/relay/node.rb +0 -36
 - data/lib/graphql/relay/page_info.rb +0 -7
 - data/lib/graphql/relay/relation_connection.rb +0 -190
 - data/lib/graphql/relay/type_extensions.rb +0 -30
 - data/lib/graphql/scalar_type.rb +0 -76
 - 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 -15
 - 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 -132
 - data/lib/graphql/schema/middleware_chain.rb +0 -82
 - data/lib/graphql/schema/possible_types.rb +0 -39
 - data/lib/graphql/schema/rescue_middleware.rb +0 -60
 - data/lib/graphql/schema/timeout_middleware.rb +0 -86
 - data/lib/graphql/schema/traversal.rb +0 -228
 - data/lib/graphql/schema/validation.rb +0 -303
 - data/lib/graphql/static_validation/default_visitor.rb +0 -15
 - data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
 - data/lib/graphql/string_type.rb +0 -2
 - data/lib/graphql/subscriptions/subscription_root.rb +0 -65
 - data/lib/graphql/tracing/skylight_tracing.rb +0 -70
 - 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/lib/graphql/types/relay/node_field.rb +0 -43
 - data/lib/graphql/types/relay/nodes_field.rb +0 -45
 - data/lib/graphql/union_type.rb +0 -113
 - data/lib/graphql/upgrader/member.rb +0 -936
 - data/lib/graphql/upgrader/schema.rb +0 -37
 
| 
         @@ -15,8 +15,6 @@ module GraphQL 
     | 
|
| 
       15 
15 
     | 
    
         
             
                #
         
     | 
| 
       16 
16 
     | 
    
         
             
                # A resolver's configuration may be overridden with other keywords in the `field(...)` call.
         
     | 
| 
       17 
17 
     | 
    
         
             
                #
         
     | 
| 
       18 
     | 
    
         
            -
                # See the {.field_options} to see how a Resolver becomes a set of field configuration options.
         
     | 
| 
       19 
     | 
    
         
            -
                #
         
     | 
| 
       20 
18 
     | 
    
         
             
                # @see {GraphQL::Schema::Mutation} for a concrete subclass of `Resolver`.
         
     | 
| 
       21 
19 
     | 
    
         
             
                # @see {GraphQL::Function} `Resolver` is a replacement for `GraphQL::Function`
         
     | 
| 
       22 
20 
     | 
    
         
             
                class Resolver
         
     | 
| 
         @@ -24,10 +22,11 @@ module GraphQL 
     | 
|
| 
       24 
22 
     | 
    
         
             
                  # Really we only need description from here, but:
         
     | 
| 
       25 
23 
     | 
    
         
             
                  extend Schema::Member::BaseDSLMethods
         
     | 
| 
       26 
24 
     | 
    
         
             
                  extend GraphQL::Schema::Member::HasArguments
         
     | 
| 
      
 25 
     | 
    
         
            +
                  extend GraphQL::Schema::Member::HasValidators
         
     | 
| 
       27 
26 
     | 
    
         
             
                  include Schema::Member::HasPath
         
     | 
| 
       28 
27 
     | 
    
         
             
                  extend Schema::Member::HasPath
         
     | 
| 
       29 
28 
     | 
    
         | 
| 
       30 
     | 
    
         
            -
                  # @param object [Object]  
     | 
| 
      
 29 
     | 
    
         
            +
                  # @param object [Object] The application object that this field is being resolved on
         
     | 
| 
       31 
30 
     | 
    
         
             
                  # @param context [GraphQL::Query::Context]
         
     | 
| 
       32 
31 
     | 
    
         
             
                  # @param field [GraphQL::Schema::Field]
         
     | 
| 
       33 
32 
     | 
    
         
             
                  def initialize(object:, context:, field:)
         
     | 
| 
         @@ -36,10 +35,10 @@ module GraphQL 
     | 
|
| 
       36 
35 
     | 
    
         
             
                    @field = field
         
     | 
| 
       37 
36 
     | 
    
         
             
                    # Since this hash is constantly rebuilt, cache it for this call
         
     | 
| 
       38 
37 
     | 
    
         
             
                    @arguments_by_keyword = {}
         
     | 
| 
       39 
     | 
    
         
            -
                    self.class.arguments.each do |name, arg|
         
     | 
| 
      
 38 
     | 
    
         
            +
                    self.class.arguments(context).each do |name, arg|
         
     | 
| 
       40 
39 
     | 
    
         
             
                      @arguments_by_keyword[arg.keyword] = arg
         
     | 
| 
       41 
40 
     | 
    
         
             
                    end
         
     | 
| 
       42 
     | 
    
         
            -
                    @ 
     | 
| 
      
 41 
     | 
    
         
            +
                    @prepared_arguments = nil
         
     | 
| 
       43 
42 
     | 
    
         
             
                  end
         
     | 
| 
       44 
43 
     | 
    
         | 
| 
       45 
44 
     | 
    
         
             
                  # @return [Object] The application object this field is being resolved on
         
     | 
| 
         @@ -48,9 +47,18 @@ module GraphQL 
     | 
|
| 
       48 
47 
     | 
    
         
             
                  # @return [GraphQL::Query::Context]
         
     | 
| 
       49 
48 
     | 
    
         
             
                  attr_reader :context
         
     | 
| 
       50 
49 
     | 
    
         | 
| 
      
 50 
     | 
    
         
            +
                  # @return [GraphQL::Dataloader]
         
     | 
| 
      
 51 
     | 
    
         
            +
                  def dataloader
         
     | 
| 
      
 52 
     | 
    
         
            +
                    context.dataloader
         
     | 
| 
      
 53 
     | 
    
         
            +
                  end
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
       51 
55 
     | 
    
         
             
                  # @return [GraphQL::Schema::Field]
         
     | 
| 
       52 
56 
     | 
    
         
             
                  attr_reader :field
         
     | 
| 
       53 
57 
     | 
    
         | 
| 
      
 58 
     | 
    
         
            +
                  def arguments
         
     | 
| 
      
 59 
     | 
    
         
            +
                    @prepared_arguments || raise("Arguments have not been prepared yet, still waiting for #load_arguments to resolve. (Call `.arguments` later in the code.)")
         
     | 
| 
      
 60 
     | 
    
         
            +
                  end
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
       54 
62 
     | 
    
         
             
                  # This method is _actually_ called by the runtime,
         
     | 
| 
       55 
63 
     | 
    
         
             
                  # it does some preparation and then eventually calls
         
     | 
| 
       56 
64 
     | 
    
         
             
                  # the user-defined `#resolve` method.
         
     | 
| 
         @@ -65,7 +73,7 @@ module GraphQL 
     | 
|
| 
       65 
73 
     | 
    
         
             
                    context.schema.after_lazy(ready_val) do |is_ready, ready_early_return|
         
     | 
| 
       66 
74 
     | 
    
         
             
                      if ready_early_return
         
     | 
| 
       67 
75 
     | 
    
         
             
                        if is_ready != false
         
     | 
| 
       68 
     | 
    
         
            -
                          raise "Unexpected result from #ready? (expected `true`, `false` or `[false, {...}]`): [#{ 
     | 
| 
      
 76 
     | 
    
         
            +
                          raise "Unexpected result from #ready? (expected `true`, `false` or `[false, {...}]`): [#{is_ready.inspect}, #{ready_early_return.inspect}]"
         
     | 
| 
       69 
77 
     | 
    
         
             
                        else
         
     | 
| 
       70 
78 
     | 
    
         
             
                          ready_early_return
         
     | 
| 
       71 
79 
     | 
    
         
             
                        end
         
     | 
| 
         @@ -74,6 +82,8 @@ module GraphQL 
     | 
|
| 
       74 
82 
     | 
    
         
             
                        # for that argument, or may return a lazy object
         
     | 
| 
       75 
83 
     | 
    
         
             
                        load_arguments_val = load_arguments(args)
         
     | 
| 
       76 
84 
     | 
    
         
             
                        context.schema.after_lazy(load_arguments_val) do |loaded_args|
         
     | 
| 
      
 85 
     | 
    
         
            +
                          @prepared_arguments = loaded_args
         
     | 
| 
      
 86 
     | 
    
         
            +
                          Schema::Validator.validate!(self.class.validators, object, context, loaded_args, as: @field)
         
     | 
| 
       77 
87 
     | 
    
         
             
                          # Then call `authorized?`, which may raise or may return a lazy object
         
     | 
| 
       78 
88 
     | 
    
         
             
                          authorized_val = if loaded_args.any?
         
     | 
| 
       79 
89 
     | 
    
         
             
                            authorized?(**loaded_args)
         
     | 
| 
         @@ -97,7 +107,7 @@ module GraphQL 
     | 
|
| 
       97 
107 
     | 
    
         
             
                                public_send(self.class.resolve_method)
         
     | 
| 
       98 
108 
     | 
    
         
             
                              end
         
     | 
| 
       99 
109 
     | 
    
         
             
                            else
         
     | 
| 
       100 
     | 
    
         
            -
                               
     | 
| 
      
 110 
     | 
    
         
            +
                              raise GraphQL::UnauthorizedFieldError.new(context: context, object: object, type: field.owner, field: field)
         
     | 
| 
       101 
111 
     | 
    
         
             
                            end
         
     | 
| 
       102 
112 
     | 
    
         
             
                          end
         
     | 
| 
       103 
113 
     | 
    
         
             
                        end
         
     | 
| 
         @@ -133,7 +143,25 @@ module GraphQL 
     | 
|
| 
       133 
143 
     | 
    
         
             
                  # @raise [GraphQL::UnauthorizedError] To signal an authorization failure
         
     | 
| 
       134 
144 
     | 
    
         
             
                  # @return [Boolean, early_return_data] If `false`, execution will stop (and `early_return_data` will be returned instead, if present.)
         
     | 
| 
       135 
145 
     | 
    
         
             
                  def authorized?(**inputs)
         
     | 
| 
       136 
     | 
    
         
            -
                    self.class 
     | 
| 
      
 146 
     | 
    
         
            +
                    arg_owner = @field # || self.class
         
     | 
| 
      
 147 
     | 
    
         
            +
                    args = arg_owner.arguments(context)
         
     | 
| 
      
 148 
     | 
    
         
            +
                    authorize_arguments(args, inputs)
         
     | 
| 
      
 149 
     | 
    
         
            +
                  end
         
     | 
| 
      
 150 
     | 
    
         
            +
             
     | 
| 
      
 151 
     | 
    
         
            +
                  # Called when an object loaded by `loads:` fails the `.authorized?` check for its resolved GraphQL object type.
         
     | 
| 
      
 152 
     | 
    
         
            +
                  #
         
     | 
| 
      
 153 
     | 
    
         
            +
                  # By default, the error is re-raised and passed along to {{Schema.unauthorized_object}}.
         
     | 
| 
      
 154 
     | 
    
         
            +
                  #
         
     | 
| 
      
 155 
     | 
    
         
            +
                  # Any value returned here will be used _instead of_ of the loaded object.
         
     | 
| 
      
 156 
     | 
    
         
            +
                  # @param err [GraphQL::UnauthorizedError]
         
     | 
| 
      
 157 
     | 
    
         
            +
                  def unauthorized_object(err)
         
     | 
| 
      
 158 
     | 
    
         
            +
                    raise err
         
     | 
| 
      
 159 
     | 
    
         
            +
                  end
         
     | 
| 
      
 160 
     | 
    
         
            +
             
     | 
| 
      
 161 
     | 
    
         
            +
                  private
         
     | 
| 
      
 162 
     | 
    
         
            +
             
     | 
| 
      
 163 
     | 
    
         
            +
                  def authorize_arguments(args, inputs)
         
     | 
| 
      
 164 
     | 
    
         
            +
                    args.each_value do |argument|
         
     | 
| 
       137 
165 
     | 
    
         
             
                      arg_keyword = argument.keyword
         
     | 
| 
       138 
166 
     | 
    
         
             
                      if inputs.key?(arg_keyword) && !(arg_value = inputs[arg_keyword]).nil? && (arg_value != argument.default_value)
         
     | 
| 
       139 
167 
     | 
    
         
             
                        arg_auth, err = argument.authorized?(self, arg_value, context)
         
     | 
| 
         @@ -148,8 +176,6 @@ module GraphQL 
     | 
|
| 
       148 
176 
     | 
    
         
             
                    end
         
     | 
| 
       149 
177 
     | 
    
         
             
                  end
         
     | 
| 
       150 
178 
     | 
    
         | 
| 
       151 
     | 
    
         
            -
                  private
         
     | 
| 
       152 
     | 
    
         
            -
             
     | 
| 
       153 
179 
     | 
    
         
             
                  def load_arguments(args)
         
     | 
| 
       154 
180 
     | 
    
         
             
                    prepared_args = {}
         
     | 
| 
       155 
181 
     | 
    
         
             
                    prepare_lazies = []
         
     | 
| 
         @@ -157,18 +183,14 @@ module GraphQL 
     | 
|
| 
       157 
183 
     | 
    
         
             
                    args.each do |key, value|
         
     | 
| 
       158 
184 
     | 
    
         
             
                      arg_defn = @arguments_by_keyword[key]
         
     | 
| 
       159 
185 
     | 
    
         
             
                      if arg_defn
         
     | 
| 
       160 
     | 
    
         
            -
                         
     | 
| 
       161 
     | 
    
         
            -
             
     | 
| 
       162 
     | 
    
         
            -
             
     | 
| 
       163 
     | 
    
         
            -
             
     | 
| 
       164 
     | 
    
         
            -
                          if context.schema.lazy?(prepped_value)
         
     | 
| 
       165 
     | 
    
         
            -
                            prepare_lazies << context.schema.after_lazy(prepped_value) do |finished_prepped_value|
         
     | 
| 
       166 
     | 
    
         
            -
                              prepared_args[key] = finished_prepped_value
         
     | 
| 
       167 
     | 
    
         
            -
                            end
         
     | 
| 
      
 186 
     | 
    
         
            +
                        prepped_value = prepared_args[key] = arg_defn.load_and_authorize_value(self, value, context)
         
     | 
| 
      
 187 
     | 
    
         
            +
                        if context.schema.lazy?(prepped_value)
         
     | 
| 
      
 188 
     | 
    
         
            +
                          prepare_lazies << context.schema.after_lazy(prepped_value) do |finished_prepped_value|
         
     | 
| 
      
 189 
     | 
    
         
            +
                            prepared_args[key] = finished_prepped_value
         
     | 
| 
       168 
190 
     | 
    
         
             
                          end
         
     | 
| 
       169 
191 
     | 
    
         
             
                        end
         
     | 
| 
       170 
192 
     | 
    
         
             
                      else
         
     | 
| 
       171 
     | 
    
         
            -
                        #  
     | 
| 
      
 193 
     | 
    
         
            +
                        # these are `extras:`
         
     | 
| 
       172 
194 
     | 
    
         
             
                        prepared_args[key] = value
         
     | 
| 
       173 
195 
     | 
    
         
             
                      end
         
     | 
| 
       174 
196 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -181,11 +203,23 @@ module GraphQL 
     | 
|
| 
       181 
203 
     | 
    
         
             
                    end
         
     | 
| 
       182 
204 
     | 
    
         
             
                  end
         
     | 
| 
       183 
205 
     | 
    
         | 
| 
       184 
     | 
    
         
            -
                  def  
     | 
| 
       185 
     | 
    
         
            -
                     
     | 
| 
      
 206 
     | 
    
         
            +
                  def get_argument(name, context = GraphQL::Query::NullContext)
         
     | 
| 
      
 207 
     | 
    
         
            +
                    self.class.get_argument(name, context)
         
     | 
| 
       186 
208 
     | 
    
         
             
                  end
         
     | 
| 
       187 
209 
     | 
    
         | 
| 
       188 
210 
     | 
    
         
             
                  class << self
         
     | 
| 
      
 211 
     | 
    
         
            +
                    def field_arguments(context = GraphQL::Query::NullContext)
         
     | 
| 
      
 212 
     | 
    
         
            +
                      arguments(context)
         
     | 
| 
      
 213 
     | 
    
         
            +
                    end
         
     | 
| 
      
 214 
     | 
    
         
            +
             
     | 
| 
      
 215 
     | 
    
         
            +
                    def get_field_argument(name, context = GraphQL::Query::NullContext)
         
     | 
| 
      
 216 
     | 
    
         
            +
                      get_argument(name, context)
         
     | 
| 
      
 217 
     | 
    
         
            +
                    end
         
     | 
| 
      
 218 
     | 
    
         
            +
             
     | 
| 
      
 219 
     | 
    
         
            +
                    def all_field_argument_definitions
         
     | 
| 
      
 220 
     | 
    
         
            +
                      all_argument_definitions
         
     | 
| 
      
 221 
     | 
    
         
            +
                    end
         
     | 
| 
      
 222 
     | 
    
         
            +
             
     | 
| 
       189 
223 
     | 
    
         
             
                    # Default `:resolve` set below.
         
     | 
| 
       190 
224 
     | 
    
         
             
                    # @return [Symbol] The method to call on instances of this object to resolve the field
         
     | 
| 
       191 
225 
     | 
    
         
             
                    def resolve_method(new_method = nil)
         
     | 
| 
         @@ -205,8 +239,10 @@ module GraphQL 
     | 
|
| 
       205 
239 
     | 
    
         
             
                      own_extras + (superclass.respond_to?(:extras) ? superclass.extras : [])
         
     | 
| 
       206 
240 
     | 
    
         
             
                    end
         
     | 
| 
       207 
241 
     | 
    
         | 
| 
       208 
     | 
    
         
            -
                    #  
     | 
| 
       209 
     | 
    
         
            -
                    #  
     | 
| 
      
 242 
     | 
    
         
            +
                    # If `true` (default), then the return type for this resolver will be nullable.
         
     | 
| 
      
 243 
     | 
    
         
            +
                    # If `false`, then the return type is non-null.
         
     | 
| 
      
 244 
     | 
    
         
            +
                    #
         
     | 
| 
      
 245 
     | 
    
         
            +
                    # @see #type which sets the return type of this field and accepts a `null:` option
         
     | 
| 
       210 
246 
     | 
    
         
             
                    # @param allow_null [Boolean] Whether or not the response can be null
         
     | 
| 
       211 
247 
     | 
    
         
             
                    def null(allow_null = nil)
         
     | 
| 
       212 
248 
     | 
    
         
             
                      if !allow_null.nil?
         
     | 
| 
         @@ -216,11 +252,19 @@ module GraphQL 
     | 
|
| 
       216 
252 
     | 
    
         
             
                      @null.nil? ? (superclass.respond_to?(:null) ? superclass.null : true) : @null
         
     | 
| 
       217 
253 
     | 
    
         
             
                    end
         
     | 
| 
       218 
254 
     | 
    
         | 
| 
      
 255 
     | 
    
         
            +
                    def resolver_method(new_method_name = nil)
         
     | 
| 
      
 256 
     | 
    
         
            +
                      if new_method_name
         
     | 
| 
      
 257 
     | 
    
         
            +
                        @resolver_method = new_method_name
         
     | 
| 
      
 258 
     | 
    
         
            +
                      else
         
     | 
| 
      
 259 
     | 
    
         
            +
                        @resolver_method || :resolve_with_support
         
     | 
| 
      
 260 
     | 
    
         
            +
                      end
         
     | 
| 
      
 261 
     | 
    
         
            +
                    end
         
     | 
| 
      
 262 
     | 
    
         
            +
             
     | 
| 
       219 
263 
     | 
    
         
             
                    # Call this method to get the return type of the field,
         
     | 
| 
       220 
264 
     | 
    
         
             
                    # or use it as a configuration method to assign a return type
         
     | 
| 
       221 
265 
     | 
    
         
             
                    # instead of generating one.
         
     | 
| 
       222 
266 
     | 
    
         
             
                    # TODO unify with {#null}
         
     | 
| 
       223 
     | 
    
         
            -
                    # @param new_type [Class, nil] If a type definition class is provided, it will be used as the return type of the field
         
     | 
| 
      
 267 
     | 
    
         
            +
                    # @param new_type [Class, Array<Class>, nil] If a type definition class is provided, it will be used as the return type of the field
         
     | 
| 
       224 
268 
     | 
    
         
             
                    # @param null [true, false] Whether or not the field may return `nil`
         
     | 
| 
       225 
269 
     | 
    
         
             
                    # @return [Class] The type which this field returns.
         
     | 
| 
       226 
270 
     | 
    
         
             
                    def type(new_type = nil, null: nil)
         
     | 
| 
         @@ -231,8 +275,8 @@ module GraphQL 
     | 
|
| 
       231 
275 
     | 
    
         
             
                        @type_expr = new_type
         
     | 
| 
       232 
276 
     | 
    
         
             
                        @null = null
         
     | 
| 
       233 
277 
     | 
    
         
             
                      else
         
     | 
| 
       234 
     | 
    
         
            -
                        if  
     | 
| 
       235 
     | 
    
         
            -
                          GraphQL::Schema::Member::BuildType.parse_type( 
     | 
| 
      
 278 
     | 
    
         
            +
                        if type_expr
         
     | 
| 
      
 279 
     | 
    
         
            +
                          GraphQL::Schema::Member::BuildType.parse_type(type_expr, null: self.null)
         
     | 
| 
       236 
280 
     | 
    
         
             
                        elsif superclass.respond_to?(:type)
         
     | 
| 
       237 
281 
     | 
    
         
             
                          superclass.type
         
     | 
| 
       238 
282 
     | 
    
         
             
                        else
         
     | 
| 
         @@ -250,18 +294,59 @@ module GraphQL 
     | 
|
| 
       250 
294 
     | 
    
         
             
                      @complexity || (superclass.respond_to?(:complexity) ? superclass.complexity : 1)
         
     | 
| 
       251 
295 
     | 
    
         
             
                    end
         
     | 
| 
       252 
296 
     | 
    
         | 
| 
       253 
     | 
    
         
            -
                    def  
     | 
| 
       254 
     | 
    
         
            -
                       
     | 
| 
       255 
     | 
    
         
            -
             
     | 
| 
       256 
     | 
    
         
            -
             
     | 
| 
       257 
     | 
    
         
            -
             
     | 
| 
       258 
     | 
    
         
            -
             
     | 
| 
       259 
     | 
    
         
            -
             
     | 
| 
       260 
     | 
    
         
            -
                         
     | 
| 
       261 
     | 
    
         
            -
             
     | 
| 
       262 
     | 
    
         
            -
                         
     | 
| 
       263 
     | 
    
         
            -
             
     | 
| 
       264 
     | 
    
         
            -
             
     | 
| 
      
 297 
     | 
    
         
            +
                    def broadcastable(new_broadcastable)
         
     | 
| 
      
 298 
     | 
    
         
            +
                      @broadcastable = new_broadcastable
         
     | 
| 
      
 299 
     | 
    
         
            +
                    end
         
     | 
| 
      
 300 
     | 
    
         
            +
             
     | 
| 
      
 301 
     | 
    
         
            +
                    # @return [Boolean, nil]
         
     | 
| 
      
 302 
     | 
    
         
            +
                    def broadcastable?
         
     | 
| 
      
 303 
     | 
    
         
            +
                      if defined?(@broadcastable)
         
     | 
| 
      
 304 
     | 
    
         
            +
                        @broadcastable
         
     | 
| 
      
 305 
     | 
    
         
            +
                      else
         
     | 
| 
      
 306 
     | 
    
         
            +
                        (superclass.respond_to?(:broadcastable?) ? superclass.broadcastable? : nil)
         
     | 
| 
      
 307 
     | 
    
         
            +
                      end
         
     | 
| 
      
 308 
     | 
    
         
            +
                    end
         
     | 
| 
      
 309 
     | 
    
         
            +
             
     | 
| 
      
 310 
     | 
    
         
            +
                    # Get or set the `max_page_size:` which will be configured for fields using this resolver
         
     | 
| 
      
 311 
     | 
    
         
            +
                    # (`nil` means "unlimited max page size".)
         
     | 
| 
      
 312 
     | 
    
         
            +
                    # @param max_page_size [Integer, nil] Set a new value
         
     | 
| 
      
 313 
     | 
    
         
            +
                    # @return [Integer, nil] The `max_page_size` assigned to fields that use this resolver
         
     | 
| 
      
 314 
     | 
    
         
            +
                    def max_page_size(new_max_page_size = NOT_CONFIGURED)
         
     | 
| 
      
 315 
     | 
    
         
            +
                      if new_max_page_size != NOT_CONFIGURED
         
     | 
| 
      
 316 
     | 
    
         
            +
                        @max_page_size = new_max_page_size
         
     | 
| 
      
 317 
     | 
    
         
            +
                      elsif defined?(@max_page_size)
         
     | 
| 
      
 318 
     | 
    
         
            +
                        @max_page_size
         
     | 
| 
      
 319 
     | 
    
         
            +
                      elsif superclass.respond_to?(:max_page_size)
         
     | 
| 
      
 320 
     | 
    
         
            +
                        superclass.max_page_size
         
     | 
| 
      
 321 
     | 
    
         
            +
                      else
         
     | 
| 
      
 322 
     | 
    
         
            +
                        nil
         
     | 
| 
      
 323 
     | 
    
         
            +
                      end
         
     | 
| 
      
 324 
     | 
    
         
            +
                    end
         
     | 
| 
      
 325 
     | 
    
         
            +
             
     | 
| 
      
 326 
     | 
    
         
            +
                    # @return [Boolean] `true` if this resolver or a superclass has an assigned `max_page_size`
         
     | 
| 
      
 327 
     | 
    
         
            +
                    def has_max_page_size?
         
     | 
| 
      
 328 
     | 
    
         
            +
                      (!!defined?(@max_page_size)) || (superclass.respond_to?(:has_max_page_size?) && superclass.has_max_page_size?)
         
     | 
| 
      
 329 
     | 
    
         
            +
                    end
         
     | 
| 
      
 330 
     | 
    
         
            +
             
     | 
| 
      
 331 
     | 
    
         
            +
                    # Get or set the `default_page_size:` which will be configured for fields using this resolver
         
     | 
| 
      
 332 
     | 
    
         
            +
                    # (`nil` means "unlimited default page size".)
         
     | 
| 
      
 333 
     | 
    
         
            +
                    # @param default_page_size [Integer, nil] Set a new value
         
     | 
| 
      
 334 
     | 
    
         
            +
                    # @return [Integer, nil] The `default_page_size` assigned to fields that use this resolver
         
     | 
| 
      
 335 
     | 
    
         
            +
                    def default_page_size(new_default_page_size = NOT_CONFIGURED)
         
     | 
| 
      
 336 
     | 
    
         
            +
                      if new_default_page_size != NOT_CONFIGURED
         
     | 
| 
      
 337 
     | 
    
         
            +
                        @default_page_size = new_default_page_size
         
     | 
| 
      
 338 
     | 
    
         
            +
                      elsif defined?(@default_page_size)
         
     | 
| 
      
 339 
     | 
    
         
            +
                        @default_page_size
         
     | 
| 
      
 340 
     | 
    
         
            +
                      elsif superclass.respond_to?(:default_page_size)
         
     | 
| 
      
 341 
     | 
    
         
            +
                        superclass.default_page_size
         
     | 
| 
      
 342 
     | 
    
         
            +
                      else
         
     | 
| 
      
 343 
     | 
    
         
            +
                        nil
         
     | 
| 
      
 344 
     | 
    
         
            +
                      end
         
     | 
| 
      
 345 
     | 
    
         
            +
                    end
         
     | 
| 
      
 346 
     | 
    
         
            +
             
     | 
| 
      
 347 
     | 
    
         
            +
                    # @return [Boolean] `true` if this resolver or a superclass has an assigned `default_page_size`
         
     | 
| 
      
 348 
     | 
    
         
            +
                    def has_default_page_size?
         
     | 
| 
      
 349 
     | 
    
         
            +
                      (!!defined?(@default_page_size)) || (superclass.respond_to?(:has_default_page_size?) && superclass.has_default_page_size?)
         
     | 
| 
       265 
350 
     | 
    
         
             
                    end
         
     | 
| 
       266 
351 
     | 
    
         | 
| 
       267 
352 
     | 
    
         
             
                    # A non-normalized type configuration, without `null` applied
         
     | 
| 
         @@ -273,63 +358,43 @@ module GraphQL 
     | 
|
| 
       273 
358 
     | 
    
         
             
                    # also add some preparation hook methods which will be used for this argument
         
     | 
| 
       274 
359 
     | 
    
         
             
                    # @see {GraphQL::Schema::Argument#initialize} for the signature
         
     | 
| 
       275 
360 
     | 
    
         
             
                    def argument(*args, **kwargs, &block)
         
     | 
| 
       276 
     | 
    
         
            -
                      loads = kwargs[:loads]
         
     | 
| 
       277 
361 
     | 
    
         
             
                      # Use `from_resolver: true` to short-circuit the InputObject's own `loads:` implementation
         
     | 
| 
       278 
362 
     | 
    
         
             
                      # so that we can support `#load_{x}` methods below.
         
     | 
| 
       279 
     | 
    
         
            -
                       
     | 
| 
       280 
     | 
    
         
            -
                      own_arguments_loads_as_type[arg_defn.keyword] = loads if loads
         
     | 
| 
       281 
     | 
    
         
            -
             
     | 
| 
       282 
     | 
    
         
            -
                      if loads && arg_defn.type.list?
         
     | 
| 
       283 
     | 
    
         
            -
                        class_eval <<-RUBY, __FILE__, __LINE__ + 1
         
     | 
| 
       284 
     | 
    
         
            -
                        def load_#{arg_defn.keyword}(values)
         
     | 
| 
       285 
     | 
    
         
            -
                          argument = @arguments_by_keyword[:#{arg_defn.keyword}]
         
     | 
| 
       286 
     | 
    
         
            -
                          lookup_as_type = @arguments_loads_as_type[:#{arg_defn.keyword}]
         
     | 
| 
       287 
     | 
    
         
            -
                          context.schema.after_lazy(values) do |values2|
         
     | 
| 
       288 
     | 
    
         
            -
                            GraphQL::Execution::Lazy.all(values2.map { |value| load_application_object(argument, lookup_as_type, value) })
         
     | 
| 
       289 
     | 
    
         
            -
                          end
         
     | 
| 
       290 
     | 
    
         
            -
                        end
         
     | 
| 
       291 
     | 
    
         
            -
                        RUBY
         
     | 
| 
       292 
     | 
    
         
            -
                      elsif loads
         
     | 
| 
       293 
     | 
    
         
            -
                        class_eval <<-RUBY, __FILE__, __LINE__ + 1
         
     | 
| 
       294 
     | 
    
         
            -
                        def load_#{arg_defn.keyword}(value)
         
     | 
| 
       295 
     | 
    
         
            -
                          argument = @arguments_by_keyword[:#{arg_defn.keyword}]
         
     | 
| 
       296 
     | 
    
         
            -
                          lookup_as_type = @arguments_loads_as_type[:#{arg_defn.keyword}]
         
     | 
| 
       297 
     | 
    
         
            -
                          load_application_object(argument, lookup_as_type, value)
         
     | 
| 
       298 
     | 
    
         
            -
                        end
         
     | 
| 
       299 
     | 
    
         
            -
                        RUBY
         
     | 
| 
       300 
     | 
    
         
            -
                      else
         
     | 
| 
       301 
     | 
    
         
            -
                        class_eval <<-RUBY, __FILE__, __LINE__ + 1
         
     | 
| 
       302 
     | 
    
         
            -
                        def load_#{arg_defn.keyword}(value)
         
     | 
| 
       303 
     | 
    
         
            -
                          value
         
     | 
| 
       304 
     | 
    
         
            -
                        end
         
     | 
| 
       305 
     | 
    
         
            -
                        RUBY
         
     | 
| 
       306 
     | 
    
         
            -
                      end
         
     | 
| 
       307 
     | 
    
         
            -
             
     | 
| 
       308 
     | 
    
         
            -
                      arg_defn
         
     | 
| 
       309 
     | 
    
         
            -
                    end
         
     | 
| 
       310 
     | 
    
         
            -
             
     | 
| 
       311 
     | 
    
         
            -
                    # @api private
         
     | 
| 
       312 
     | 
    
         
            -
                    def arguments_loads_as_type
         
     | 
| 
       313 
     | 
    
         
            -
                      inherited_lookups = superclass.respond_to?(:arguments_loads_as_type) ? superclass.arguments_loads_as_type : {}
         
     | 
| 
       314 
     | 
    
         
            -
                      inherited_lookups.merge(own_arguments_loads_as_type)
         
     | 
| 
      
 363 
     | 
    
         
            +
                      super(*args, from_resolver: true, **kwargs)
         
     | 
| 
       315 
364 
     | 
    
         
             
                    end
         
     | 
| 
       316 
365 
     | 
    
         | 
| 
       317 
366 
     | 
    
         
             
                    # Registers new extension
         
     | 
| 
       318 
367 
     | 
    
         
             
                    # @param extension [Class] Extension class
         
     | 
| 
       319 
368 
     | 
    
         
             
                    # @param options [Hash] Optional extension options
         
     | 
| 
       320 
369 
     | 
    
         
             
                    def extension(extension, **options)
         
     | 
| 
       321 
     | 
    
         
            -
                       
     | 
| 
      
 370 
     | 
    
         
            +
                      @own_extensions ||= []
         
     | 
| 
      
 371 
     | 
    
         
            +
                      @own_extensions << {extension => options}
         
     | 
| 
       322 
372 
     | 
    
         
             
                    end
         
     | 
| 
       323 
373 
     | 
    
         | 
| 
       324 
374 
     | 
    
         
             
                    # @api private
         
     | 
| 
       325 
375 
     | 
    
         
             
                    def extensions
         
     | 
| 
       326 
     | 
    
         
            -
                       
     | 
| 
      
 376 
     | 
    
         
            +
                      own_exts = @own_extensions
         
     | 
| 
      
 377 
     | 
    
         
            +
                      # Jump through some hoops to avoid creating arrays when we don't actually need them
         
     | 
| 
      
 378 
     | 
    
         
            +
                      if superclass.respond_to?(:extensions)
         
     | 
| 
      
 379 
     | 
    
         
            +
                        s_exts = superclass.extensions
         
     | 
| 
      
 380 
     | 
    
         
            +
                        if own_exts
         
     | 
| 
      
 381 
     | 
    
         
            +
                          if s_exts.any?
         
     | 
| 
      
 382 
     | 
    
         
            +
                            own_exts + s_exts
         
     | 
| 
      
 383 
     | 
    
         
            +
                          else
         
     | 
| 
      
 384 
     | 
    
         
            +
                            own_exts
         
     | 
| 
      
 385 
     | 
    
         
            +
                          end
         
     | 
| 
      
 386 
     | 
    
         
            +
                        else
         
     | 
| 
      
 387 
     | 
    
         
            +
                          s_exts
         
     | 
| 
      
 388 
     | 
    
         
            +
                        end
         
     | 
| 
      
 389 
     | 
    
         
            +
                      else
         
     | 
| 
      
 390 
     | 
    
         
            +
                        own_exts || EMPTY_ARRAY
         
     | 
| 
      
 391 
     | 
    
         
            +
                      end
         
     | 
| 
       327 
392 
     | 
    
         
             
                    end
         
     | 
| 
       328 
393 
     | 
    
         | 
| 
       329 
394 
     | 
    
         
             
                    private
         
     | 
| 
       330 
395 
     | 
    
         | 
| 
       331 
     | 
    
         
            -
                    def  
     | 
| 
       332 
     | 
    
         
            -
                      @ 
     | 
| 
      
 396 
     | 
    
         
            +
                    def own_extensions
         
     | 
| 
      
 397 
     | 
    
         
            +
                      @own_extensions
         
     | 
| 
       333 
398 
     | 
    
         
             
                    end
         
     | 
| 
       334 
399 
     | 
    
         
             
                  end
         
     | 
| 
       335 
400 
     | 
    
         
             
                end
         
     | 
| 
         @@ -2,7 +2,6 @@ 
     | 
|
| 
       2 
2 
     | 
    
         
             
            module GraphQL
         
     | 
| 
       3 
3 
     | 
    
         
             
              class Schema
         
     | 
| 
       4 
4 
     | 
    
         
             
                class Scalar < GraphQL::Schema::Member
         
     | 
| 
       5 
     | 
    
         
            -
                  extend GraphQL::Schema::Member::AcceptsDefinition
         
     | 
| 
       6 
5 
     | 
    
         
             
                  extend GraphQL::Schema::Member::ValidatesInput
         
     | 
| 
       7 
6 
     | 
    
         | 
| 
       8 
7 
     | 
    
         
             
                  class << self
         
     | 
| 
         @@ -14,22 +13,22 @@ module GraphQL 
     | 
|
| 
       14 
13 
     | 
    
         
             
                      val
         
     | 
| 
       15 
14 
     | 
    
         
             
                    end
         
     | 
| 
       16 
15 
     | 
    
         | 
| 
       17 
     | 
    
         
            -
                    def to_graphql
         
     | 
| 
       18 
     | 
    
         
            -
                      type_defn = GraphQL::ScalarType.new
         
     | 
| 
       19 
     | 
    
         
            -
                      type_defn.name = graphql_name
         
     | 
| 
       20 
     | 
    
         
            -
                      type_defn.description = description
         
     | 
| 
       21 
     | 
    
         
            -
                      type_defn.coerce_result = method(:coerce_result)
         
     | 
| 
       22 
     | 
    
         
            -
                      type_defn.coerce_input = method(:coerce_input)
         
     | 
| 
       23 
     | 
    
         
            -
                      type_defn.metadata[:type_class] = self
         
     | 
| 
       24 
     | 
    
         
            -
                      type_defn.default_scalar = default_scalar
         
     | 
| 
       25 
     | 
    
         
            -
                      type_defn.ast_node = ast_node
         
     | 
| 
       26 
     | 
    
         
            -
                      type_defn
         
     | 
| 
       27 
     | 
    
         
            -
                    end
         
     | 
| 
       28 
     | 
    
         
            -
             
     | 
| 
       29 
16 
     | 
    
         
             
                    def kind
         
     | 
| 
       30 
17 
     | 
    
         
             
                      GraphQL::TypeKinds::SCALAR
         
     | 
| 
       31 
18 
     | 
    
         
             
                    end
         
     | 
| 
       32 
19 
     | 
    
         | 
| 
      
 20 
     | 
    
         
            +
                    def specified_by_url(new_url = nil)
         
     | 
| 
      
 21 
     | 
    
         
            +
                      if new_url
         
     | 
| 
      
 22 
     | 
    
         
            +
                        @specified_by_url = new_url
         
     | 
| 
      
 23 
     | 
    
         
            +
                      elsif defined?(@specified_by_url)
         
     | 
| 
      
 24 
     | 
    
         
            +
                        @specified_by_url
         
     | 
| 
      
 25 
     | 
    
         
            +
                      elsif superclass.respond_to?(:specified_by_url)
         
     | 
| 
      
 26 
     | 
    
         
            +
                        superclass.specified_by_url
         
     | 
| 
      
 27 
     | 
    
         
            +
                      else
         
     | 
| 
      
 28 
     | 
    
         
            +
                        nil
         
     | 
| 
      
 29 
     | 
    
         
            +
                      end
         
     | 
| 
      
 30 
     | 
    
         
            +
                    end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
       33 
32 
     | 
    
         
             
                    def default_scalar(is_default = nil)
         
     | 
| 
       34 
33 
     | 
    
         
             
                      if !is_default.nil?
         
     | 
| 
       35 
34 
     | 
    
         
             
                        @default_scalar = is_default
         
     | 
| 
         @@ -41,17 +40,27 @@ module GraphQL 
     | 
|
| 
       41 
40 
     | 
    
         
             
                      @default_scalar ||= false
         
     | 
| 
       42 
41 
     | 
    
         
             
                    end
         
     | 
| 
       43 
42 
     | 
    
         | 
| 
       44 
     | 
    
         
            -
                    def validate_non_null_input(value, ctx)
         
     | 
| 
       45 
     | 
    
         
            -
                       
     | 
| 
       46 
     | 
    
         
            -
             
     | 
| 
      
 43 
     | 
    
         
            +
                    def validate_non_null_input(value, ctx, max_errors: nil)
         
     | 
| 
      
 44 
     | 
    
         
            +
                      coerced_result = begin
         
     | 
| 
      
 45 
     | 
    
         
            +
                        coerce_input(value, ctx)
         
     | 
| 
      
 46 
     | 
    
         
            +
                      rescue GraphQL::CoercionError => err
         
     | 
| 
      
 47 
     | 
    
         
            +
                        err
         
     | 
| 
      
 48 
     | 
    
         
            +
                      rescue StandardError => err
         
     | 
| 
      
 49 
     | 
    
         
            +
                        ctx.query.handle_or_reraise(err)
         
     | 
| 
      
 50 
     | 
    
         
            +
                      end
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
                      if coerced_result.nil?
         
     | 
| 
       47 
53 
     | 
    
         
             
                        str_value = if value == Float::INFINITY
         
     | 
| 
       48 
54 
     | 
    
         
             
                          ""
         
     | 
| 
       49 
55 
     | 
    
         
             
                        else
         
     | 
| 
       50 
56 
     | 
    
         
             
                          " #{GraphQL::Language.serialize(value)}"
         
     | 
| 
       51 
57 
     | 
    
         
             
                        end
         
     | 
| 
       52 
     | 
    
         
            -
                         
     | 
| 
      
 58 
     | 
    
         
            +
                        Query::InputValidationResult.from_problem("Could not coerce value#{str_value} to #{graphql_name}")
         
     | 
| 
      
 59 
     | 
    
         
            +
                      elsif coerced_result.is_a?(GraphQL::CoercionError)
         
     | 
| 
      
 60 
     | 
    
         
            +
                        Query::InputValidationResult.from_problem(coerced_result.message, message: coerced_result.message, extensions: coerced_result.extensions)
         
     | 
| 
      
 61 
     | 
    
         
            +
                      else
         
     | 
| 
      
 62 
     | 
    
         
            +
                        nil
         
     | 
| 
       53 
63 
     | 
    
         
             
                      end
         
     | 
| 
       54 
     | 
    
         
            -
                      result
         
     | 
| 
       55 
64 
     | 
    
         
             
                    end
         
     | 
| 
       56 
65 
     | 
    
         
             
                  end
         
     | 
| 
       57 
66 
     | 
    
         
             
                end
         
     | 
| 
         @@ -12,19 +12,9 @@ module GraphQL 
     | 
|
| 
       12 
12 
     | 
    
         
             
                #
         
     | 
| 
       13 
13 
     | 
    
         
             
                # Also, `#unsubscribe` terminates the subscription.
         
     | 
| 
       14 
14 
     | 
    
         
             
                class Subscription < GraphQL::Schema::Resolver
         
     | 
| 
       15 
     | 
    
         
            -
                  class EarlyTerminationError < StandardError
         
     | 
| 
       16 
     | 
    
         
            -
                  end
         
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
                  # Raised when `unsubscribe` is called; caught by `subscriptions.rb`
         
     | 
| 
       19 
     | 
    
         
            -
                  class UnsubscribedError < EarlyTerminationError
         
     | 
| 
       20 
     | 
    
         
            -
                  end
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
                  # Raised when `no_update` is returned; caught by `subscriptions.rb`
         
     | 
| 
       23 
     | 
    
         
            -
                  class NoUpdateError < EarlyTerminationError
         
     | 
| 
       24 
     | 
    
         
            -
                  end
         
     | 
| 
       25 
15 
     | 
    
         
             
                  extend GraphQL::Schema::Resolver::HasPayloadType
         
     | 
| 
       26 
16 
     | 
    
         
             
                  extend GraphQL::Schema::Member::HasFields
         
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
      
 17 
     | 
    
         
            +
                  NO_UPDATE = :no_update
         
     | 
| 
       28 
18 
     | 
    
         
             
                  # The generated payload type is required; If there's no payload,
         
     | 
| 
       29 
19 
     | 
    
         
             
                  # propagate null.
         
     | 
| 
       30 
20 
     | 
    
         
             
                  null false
         
     | 
| 
         @@ -35,6 +25,22 @@ module GraphQL 
     | 
|
| 
       35 
25 
     | 
    
         
             
                    @mode = context.query.subscription_update? ? :update : :subscribe
         
     | 
| 
       36 
26 
     | 
    
         
             
                  end
         
     | 
| 
       37 
27 
     | 
    
         | 
| 
      
 28 
     | 
    
         
            +
                  def resolve_with_support(**args)
         
     | 
| 
      
 29 
     | 
    
         
            +
                    result = nil
         
     | 
| 
      
 30 
     | 
    
         
            +
                    unsubscribed = true
         
     | 
| 
      
 31 
     | 
    
         
            +
                    catch :graphql_subscription_unsubscribed do
         
     | 
| 
      
 32 
     | 
    
         
            +
                      result = super
         
     | 
| 
      
 33 
     | 
    
         
            +
                      unsubscribed = false
         
     | 
| 
      
 34 
     | 
    
         
            +
                    end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                    if unsubscribed
         
     | 
| 
      
 38 
     | 
    
         
            +
                      context.skip
         
     | 
| 
      
 39 
     | 
    
         
            +
                    else
         
     | 
| 
      
 40 
     | 
    
         
            +
                      result
         
     | 
| 
      
 41 
     | 
    
         
            +
                    end
         
     | 
| 
      
 42 
     | 
    
         
            +
                  end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
       38 
44 
     | 
    
         
             
                  # Implement the {Resolve} API
         
     | 
| 
       39 
45 
     | 
    
         
             
                  def resolve(**args)
         
     | 
| 
       40 
46 
     | 
    
         
             
                    # Dispatch based on `@mode`, which will raise a `NoMethodError` if we ever
         
     | 
| 
         @@ -52,11 +58,9 @@ module GraphQL 
     | 
|
| 
       52 
58 
     | 
    
         
             
                    end
         
     | 
| 
       53 
59 
     | 
    
         
             
                  end
         
     | 
| 
       54 
60 
     | 
    
         | 
| 
       55 
     | 
    
         
            -
                  #  
     | 
| 
      
 61 
     | 
    
         
            +
                  # The default implementation returns nothing on subscribe.
         
     | 
| 
       56 
62 
     | 
    
         
             
                  # Override it to return an object or
         
     | 
| 
       57 
     | 
    
         
            -
                  # `:no_response` to return nothing.
         
     | 
| 
       58 
     | 
    
         
            -
                  #
         
     | 
| 
       59 
     | 
    
         
            -
                  # The default is `:no_response`.
         
     | 
| 
      
 63 
     | 
    
         
            +
                  # `:no_response` to (explicitly) return nothing.
         
     | 
| 
       60 
64 
     | 
    
         
             
                  def subscribe(args = {})
         
     | 
| 
       61 
65 
     | 
    
         
             
                    :no_response
         
     | 
| 
       62 
66 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -64,15 +68,16 @@ module GraphQL 
     | 
|
| 
       64 
68 
     | 
    
         
             
                  # Wrap the user-provided `#update` hook
         
     | 
| 
       65 
69 
     | 
    
         
             
                  def resolve_update(**args)
         
     | 
| 
       66 
70 
     | 
    
         
             
                    ret_val = args.any? ? update(**args) : update
         
     | 
| 
       67 
     | 
    
         
            -
                    if ret_val ==  
     | 
| 
       68 
     | 
    
         
            -
                       
     | 
| 
      
 71 
     | 
    
         
            +
                    if ret_val == NO_UPDATE
         
     | 
| 
      
 72 
     | 
    
         
            +
                      context.namespace(:subscriptions)[:no_update] = true
         
     | 
| 
      
 73 
     | 
    
         
            +
                      context.skip
         
     | 
| 
       69 
74 
     | 
    
         
             
                    else
         
     | 
| 
       70 
75 
     | 
    
         
             
                      ret_val
         
     | 
| 
       71 
76 
     | 
    
         
             
                    end
         
     | 
| 
       72 
77 
     | 
    
         
             
                  end
         
     | 
| 
       73 
78 
     | 
    
         | 
| 
       74 
79 
     | 
    
         
             
                  # The default implementation returns the root object.
         
     | 
| 
       75 
     | 
    
         
            -
                  # Override it to return  
     | 
| 
      
 80 
     | 
    
         
            +
                  # Override it to return {NO_UPDATE} if you want to
         
     | 
| 
       76 
81 
     | 
    
         
             
                  # skip updates sometimes. Or override it to return a different object.
         
     | 
| 
       77 
82 
     | 
    
         
             
                  def update(args = {})
         
     | 
| 
       78 
83 
     | 
    
         
             
                    object
         
     | 
| 
         @@ -90,17 +95,20 @@ module GraphQL 
     | 
|
| 
       90 
95 
     | 
    
         | 
| 
       91 
96 
     | 
    
         
             
                  # Call this to halt execution and remove this subscription from the system
         
     | 
| 
       92 
97 
     | 
    
         
             
                  def unsubscribe
         
     | 
| 
       93 
     | 
    
         
            -
                     
     | 
| 
      
 98 
     | 
    
         
            +
                    context.namespace(:subscriptions)[:unsubscribed] = true
         
     | 
| 
      
 99 
     | 
    
         
            +
                    throw :graphql_subscription_unsubscribed
         
     | 
| 
       94 
100 
     | 
    
         
             
                  end
         
     | 
| 
       95 
101 
     | 
    
         | 
| 
      
 102 
     | 
    
         
            +
                  READING_SCOPE = ::Object.new
         
     | 
| 
       96 
103 
     | 
    
         
             
                  # Call this method to provide a new subscription_scope; OR
         
     | 
| 
       97 
104 
     | 
    
         
             
                  # call it without an argument to get the subscription_scope
         
     | 
| 
       98 
105 
     | 
    
         
             
                  # @param new_scope [Symbol]
         
     | 
| 
      
 106 
     | 
    
         
            +
                  # @param optional [Boolean] If true, then don't require `scope:` to be provided to updates to this subscription.
         
     | 
| 
       99 
107 
     | 
    
         
             
                  # @return [Symbol]
         
     | 
| 
       100 
     | 
    
         
            -
                   
     | 
| 
       101 
     | 
    
         
            -
                  def self.subscription_scope(new_scope = READING_SCOPE)
         
     | 
| 
      
 108 
     | 
    
         
            +
                  def self.subscription_scope(new_scope = READING_SCOPE, optional: false)
         
     | 
| 
       102 
109 
     | 
    
         
             
                    if new_scope != READING_SCOPE
         
     | 
| 
       103 
110 
     | 
    
         
             
                      @subscription_scope = new_scope
         
     | 
| 
      
 111 
     | 
    
         
            +
                      @subscription_scope_optional = optional
         
     | 
| 
       104 
112 
     | 
    
         
             
                    elsif defined?(@subscription_scope)
         
     | 
| 
       105 
113 
     | 
    
         
             
                      @subscription_scope
         
     | 
| 
       106 
114 
     | 
    
         
             
                    else
         
     | 
| 
         @@ -108,11 +116,32 @@ module GraphQL 
     | 
|
| 
       108 
116 
     | 
    
         
             
                    end
         
     | 
| 
       109 
117 
     | 
    
         
             
                  end
         
     | 
| 
       110 
118 
     | 
    
         | 
| 
       111 
     | 
    
         
            -
                   
     | 
| 
       112 
     | 
    
         
            -
             
     | 
| 
       113 
     | 
    
         
            -
             
     | 
| 
       114 
     | 
    
         
            -
             
     | 
| 
       115 
     | 
    
         
            -
             
     | 
| 
      
 119 
     | 
    
         
            +
                  def self.subscription_scope_optional?
         
     | 
| 
      
 120 
     | 
    
         
            +
                    if defined?(@subscription_scope_optional)
         
     | 
| 
      
 121 
     | 
    
         
            +
                      @subscription_scope_optional
         
     | 
| 
      
 122 
     | 
    
         
            +
                    else
         
     | 
| 
      
 123 
     | 
    
         
            +
                      find_inherited_value(:subscription_scope_optional, false)
         
     | 
| 
      
 124 
     | 
    
         
            +
                    end
         
     | 
| 
      
 125 
     | 
    
         
            +
                  end
         
     | 
| 
      
 126 
     | 
    
         
            +
             
     | 
| 
      
 127 
     | 
    
         
            +
                  # This is called during initial subscription to get a "name" for this subscription.
         
     | 
| 
      
 128 
     | 
    
         
            +
                  # Later, when `.trigger` is called, this will be called again to build another "name".
         
     | 
| 
      
 129 
     | 
    
         
            +
                  # Any subscribers with matching topic will begin the update flow.
         
     | 
| 
      
 130 
     | 
    
         
            +
                  #
         
     | 
| 
      
 131 
     | 
    
         
            +
                  # The default implementation creates a string using the field name, subscription scope, and argument keys and values.
         
     | 
| 
      
 132 
     | 
    
         
            +
                  # In that implementation, only `.trigger` calls with _exact matches_ result in updates to subscribers.
         
     | 
| 
      
 133 
     | 
    
         
            +
                  #
         
     | 
| 
      
 134 
     | 
    
         
            +
                  # To implement a filtered stream-type subscription flow, override this method to return a string with field name and subscription scope.
         
     | 
| 
      
 135 
     | 
    
         
            +
                  # Then, implement {#update} to compare its arguments to the current `object` and return {NO_UPDATE} when an
         
     | 
| 
      
 136 
     | 
    
         
            +
                  # update should be filtered out.
         
     | 
| 
      
 137 
     | 
    
         
            +
                  #
         
     | 
| 
      
 138 
     | 
    
         
            +
                  # @see {#update} for how to skip updates when an event comes with a matching topic.
         
     | 
| 
      
 139 
     | 
    
         
            +
                  # @param arguments [Hash<String => Object>] The arguments for this topic, in GraphQL-style (camelized strings)
         
     | 
| 
      
 140 
     | 
    
         
            +
                  # @param field [GraphQL::Schema::Field]
         
     | 
| 
      
 141 
     | 
    
         
            +
                  # @param scope [Object, nil] A value corresponding to `.trigger(... scope:)` (for updates) or the `subscription_scope` found in `context` (for initial subscriptions).
         
     | 
| 
      
 142 
     | 
    
         
            +
                  # @return [String] An identifier corresponding to a stream of updates
         
     | 
| 
      
 143 
     | 
    
         
            +
                  def self.topic_for(arguments:, field:, scope:)
         
     | 
| 
      
 144 
     | 
    
         
            +
                    Subscriptions::Serialize.dump_recursive([scope, field.graphql_name, arguments])
         
     | 
| 
       116 
145 
     | 
    
         
             
                  end
         
     | 
| 
       117 
146 
     | 
    
         
             
                end
         
     | 
| 
       118 
147 
     | 
    
         
             
              end
         
     |