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
data/lib/graphql/enum_type.rb
DELETED
@@ -1,127 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
# @api deprecated
|
4
|
-
class EnumType < GraphQL::BaseType
|
5
|
-
accepts_definitions :values, value: GraphQL::Define::AssignEnumValue
|
6
|
-
ensure_defined(:values, :validate_non_null_input, :coerce_non_null_input, :coerce_result)
|
7
|
-
attr_accessor :ast_node
|
8
|
-
|
9
|
-
def initialize
|
10
|
-
super
|
11
|
-
@values_by_name = {}
|
12
|
-
end
|
13
|
-
|
14
|
-
def initialize_copy(other)
|
15
|
-
super
|
16
|
-
self.values = other.values.values
|
17
|
-
end
|
18
|
-
|
19
|
-
# @param new_values [Array<EnumValue>] The set of values contained in this type
|
20
|
-
def values=(new_values)
|
21
|
-
@values_by_name = {}
|
22
|
-
new_values.each { |enum_value| add_value(enum_value) }
|
23
|
-
end
|
24
|
-
|
25
|
-
# @param enum_value [EnumValue] A value to add to this type's set of values
|
26
|
-
def add_value(enum_value)
|
27
|
-
if @values_by_name.key?(enum_value.name)
|
28
|
-
raise "Enum value names must be unique. Value `#{enum_value.name}` already exists on Enum `#{name}`."
|
29
|
-
end
|
30
|
-
|
31
|
-
@values_by_name[enum_value.name] = enum_value
|
32
|
-
end
|
33
|
-
|
34
|
-
# @return [Hash<String => EnumValue>] `{name => value}` pairs contained in this type
|
35
|
-
def values
|
36
|
-
@values_by_name
|
37
|
-
end
|
38
|
-
|
39
|
-
def kind
|
40
|
-
GraphQL::TypeKinds::ENUM
|
41
|
-
end
|
42
|
-
|
43
|
-
def coerce_result(value, ctx = nil)
|
44
|
-
if ctx.nil?
|
45
|
-
warn_deprecated_coerce("coerce_isolated_result")
|
46
|
-
ctx = GraphQL::Query::NullContext
|
47
|
-
end
|
48
|
-
|
49
|
-
warden = ctx.warden
|
50
|
-
all_values = warden ? warden.enum_values(self) : @values_by_name.each_value
|
51
|
-
enum_value = all_values.find { |val| val.value == value }
|
52
|
-
if enum_value
|
53
|
-
enum_value.name
|
54
|
-
else
|
55
|
-
raise(UnresolvedValueError, "Can't resolve enum #{name} for #{value.inspect}")
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def to_s
|
60
|
-
name
|
61
|
-
end
|
62
|
-
|
63
|
-
# A value within an {EnumType}
|
64
|
-
#
|
65
|
-
# Created with the `value` helper
|
66
|
-
class EnumValue
|
67
|
-
include GraphQL::Define::InstanceDefinable
|
68
|
-
ATTRIBUTES = [:name, :description, :deprecation_reason, :value]
|
69
|
-
accepts_definitions(*ATTRIBUTES)
|
70
|
-
attr_accessor(*ATTRIBUTES)
|
71
|
-
attr_accessor :ast_node
|
72
|
-
ensure_defined(*ATTRIBUTES)
|
73
|
-
|
74
|
-
undef name=
|
75
|
-
def name=(new_name)
|
76
|
-
# Validate that the name is correct
|
77
|
-
GraphQL::NameValidator.validate!(new_name)
|
78
|
-
@name = new_name
|
79
|
-
end
|
80
|
-
|
81
|
-
def graphql_name
|
82
|
-
name
|
83
|
-
end
|
84
|
-
|
85
|
-
def type_class
|
86
|
-
metadata[:type_class]
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
class UnresolvedValueError < GraphQL::Error
|
91
|
-
end
|
92
|
-
|
93
|
-
private
|
94
|
-
|
95
|
-
# Get the underlying value for this enum value
|
96
|
-
#
|
97
|
-
# @example get episode value from Enum
|
98
|
-
# episode = EpisodeEnum.coerce("NEWHOPE")
|
99
|
-
# episode # => 6
|
100
|
-
#
|
101
|
-
# @param value_name [String] the string representation of this enum value
|
102
|
-
# @return [Object] the underlying value for this enum value
|
103
|
-
def coerce_non_null_input(value_name, ctx)
|
104
|
-
if @values_by_name.key?(value_name)
|
105
|
-
@values_by_name.fetch(value_name).value
|
106
|
-
elsif match_by_value = @values_by_name.find { |k, v| v.value == value_name }
|
107
|
-
# this is for matching default values, which are "inputs", but they're
|
108
|
-
# the Ruby value, not the GraphQL string.
|
109
|
-
match_by_value[1].value
|
110
|
-
else
|
111
|
-
nil
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
def validate_non_null_input(value_name, ctx)
|
116
|
-
result = GraphQL::Query::InputValidationResult.new
|
117
|
-
allowed_values = ctx.warden.enum_values(self)
|
118
|
-
matching_value = allowed_values.find { |v| v.name == value_name }
|
119
|
-
|
120
|
-
if matching_value.nil?
|
121
|
-
result.add_problem("Expected #{GraphQL::Language.serialize(value_name)} to be one of: #{allowed_values.map(&:name).join(', ')}")
|
122
|
-
end
|
123
|
-
|
124
|
-
result
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
@@ -1,326 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Execution
|
4
|
-
# A valid execution strategy
|
5
|
-
# @api private
|
6
|
-
class Execute
|
7
|
-
|
8
|
-
# @api private
|
9
|
-
class Skip; end
|
10
|
-
|
11
|
-
# Just a singleton for implementing {Query::Context#skip}
|
12
|
-
# @api private
|
13
|
-
SKIP = Skip.new
|
14
|
-
|
15
|
-
# @api private
|
16
|
-
class PropagateNull
|
17
|
-
end
|
18
|
-
# @api private
|
19
|
-
PROPAGATE_NULL = PropagateNull.new
|
20
|
-
|
21
|
-
def execute(ast_operation, root_type, query)
|
22
|
-
result = resolve_root_selection(query)
|
23
|
-
lazy_resolve_root_selection(result, **{query: query})
|
24
|
-
GraphQL::Execution::Flatten.call(query.context)
|
25
|
-
end
|
26
|
-
|
27
|
-
def self.begin_multiplex(_multiplex)
|
28
|
-
end
|
29
|
-
|
30
|
-
def self.begin_query(query, _multiplex)
|
31
|
-
ExecutionFunctions.resolve_root_selection(query)
|
32
|
-
end
|
33
|
-
|
34
|
-
def self.finish_multiplex(results, multiplex)
|
35
|
-
ExecutionFunctions.lazy_resolve_root_selection(results, multiplex: multiplex)
|
36
|
-
end
|
37
|
-
|
38
|
-
def self.finish_query(query, _multiplex)
|
39
|
-
{
|
40
|
-
"data" => Execution::Flatten.call(query.context)
|
41
|
-
}
|
42
|
-
end
|
43
|
-
|
44
|
-
# @api private
|
45
|
-
module ExecutionFunctions
|
46
|
-
module_function
|
47
|
-
|
48
|
-
def resolve_root_selection(query)
|
49
|
-
query.trace("execute_query", query: query) do
|
50
|
-
operation = query.selected_operation
|
51
|
-
op_type = operation.operation_type
|
52
|
-
root_type = query.root_type_for_operation(op_type)
|
53
|
-
if query.context[:__root_unauthorized]
|
54
|
-
# This was set by member/instrumentation.rb so that we wouldn't continue.
|
55
|
-
else
|
56
|
-
resolve_selection(
|
57
|
-
query.root_value,
|
58
|
-
root_type,
|
59
|
-
query.context,
|
60
|
-
mutation: query.mutation?
|
61
|
-
)
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def lazy_resolve_root_selection(result, query: nil, multiplex: nil)
|
67
|
-
if query.nil? && multiplex.queries.length == 1
|
68
|
-
query = multiplex.queries[0]
|
69
|
-
end
|
70
|
-
|
71
|
-
tracer = (query || multiplex)
|
72
|
-
tracer.trace("execute_query_lazy", {multiplex: multiplex, query: query}) do
|
73
|
-
GraphQL::Execution::Lazy.resolve(result)
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def resolve_selection(object, current_type, current_ctx, mutation: false )
|
78
|
-
# Assign this _before_ resolving the children
|
79
|
-
# so that when a child propagates null, the selection result is
|
80
|
-
# ready for it.
|
81
|
-
current_ctx.value = {}
|
82
|
-
|
83
|
-
selections_on_type = current_ctx.irep_node.typed_children[current_type]
|
84
|
-
|
85
|
-
selections_on_type.each do |name, child_irep_node|
|
86
|
-
field_ctx = current_ctx.spawn_child(
|
87
|
-
key: name,
|
88
|
-
object: object,
|
89
|
-
irep_node: child_irep_node,
|
90
|
-
)
|
91
|
-
|
92
|
-
field_result = resolve_field(
|
93
|
-
object,
|
94
|
-
field_ctx
|
95
|
-
)
|
96
|
-
|
97
|
-
if field_result.is_a?(Skip)
|
98
|
-
next
|
99
|
-
end
|
100
|
-
|
101
|
-
if mutation
|
102
|
-
GraphQL::Execution::Lazy.resolve(field_ctx)
|
103
|
-
end
|
104
|
-
|
105
|
-
|
106
|
-
# If the last subselection caused a null to propagate to _this_ selection,
|
107
|
-
# then we may as well quit executing fields because they
|
108
|
-
# won't be in the response
|
109
|
-
if current_ctx.invalid_null?
|
110
|
-
break
|
111
|
-
else
|
112
|
-
current_ctx.value[name] = field_ctx
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
current_ctx.value
|
117
|
-
end
|
118
|
-
|
119
|
-
def resolve_field(object, field_ctx)
|
120
|
-
query = field_ctx.query
|
121
|
-
irep_node = field_ctx.irep_node
|
122
|
-
parent_type = irep_node.owner_type
|
123
|
-
field = field_ctx.field
|
124
|
-
|
125
|
-
raw_value = begin
|
126
|
-
begin
|
127
|
-
arguments = query.arguments_for(irep_node, field)
|
128
|
-
field_ctx.trace("execute_field", { context: field_ctx }) do
|
129
|
-
field_ctx.schema.middleware.invoke([parent_type, object, field, arguments, field_ctx])
|
130
|
-
end
|
131
|
-
rescue GraphQL::UnauthorizedFieldError => err
|
132
|
-
err.field ||= field
|
133
|
-
field_ctx.schema.unauthorized_field(err)
|
134
|
-
rescue GraphQL::UnauthorizedError => err
|
135
|
-
field_ctx.schema.unauthorized_object(err)
|
136
|
-
end
|
137
|
-
rescue GraphQL::ExecutionError => err
|
138
|
-
err
|
139
|
-
end
|
140
|
-
|
141
|
-
if field_ctx.schema.lazy?(raw_value)
|
142
|
-
field_ctx.value = Execution::Lazy.new {
|
143
|
-
inner_value = field_ctx.trace("execute_field_lazy", {context: field_ctx}) {
|
144
|
-
begin
|
145
|
-
begin
|
146
|
-
field_ctx.field.lazy_resolve(raw_value, arguments, field_ctx)
|
147
|
-
rescue GraphQL::UnauthorizedError => err
|
148
|
-
field_ctx.schema.unauthorized_object(err)
|
149
|
-
end
|
150
|
-
rescue GraphQL::ExecutionError => err
|
151
|
-
err
|
152
|
-
end
|
153
|
-
}
|
154
|
-
continue_or_wait(inner_value, field_ctx.type, field_ctx)
|
155
|
-
}
|
156
|
-
else
|
157
|
-
continue_or_wait(raw_value, field_ctx.type, field_ctx)
|
158
|
-
end
|
159
|
-
end
|
160
|
-
|
161
|
-
# If the returned object is lazy (unfinished),
|
162
|
-
# assign the lazy object to `.value=` so we can resolve it later.
|
163
|
-
# When we resolve it later, reassign it to `.value=` so that
|
164
|
-
# the finished value replaces the unfinished one.
|
165
|
-
#
|
166
|
-
# If the returned object is finished, continue to coerce
|
167
|
-
# and resolve child fields
|
168
|
-
def continue_or_wait(raw_value, field_type, field_ctx)
|
169
|
-
if field_ctx.schema.lazy?(raw_value)
|
170
|
-
field_ctx.value = Execution::Lazy.new {
|
171
|
-
inner_value = begin
|
172
|
-
begin
|
173
|
-
field_ctx.schema.sync_lazy(raw_value)
|
174
|
-
rescue GraphQL::UnauthorizedError => err
|
175
|
-
field_ctx.schema.unauthorized_object(err)
|
176
|
-
end
|
177
|
-
rescue GraphQL::ExecutionError => err
|
178
|
-
err
|
179
|
-
end
|
180
|
-
|
181
|
-
field_ctx.value = continue_or_wait(inner_value, field_type, field_ctx)
|
182
|
-
}
|
183
|
-
else
|
184
|
-
field_ctx.value = continue_resolve_field(raw_value, field_type, field_ctx)
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
|
-
def continue_resolve_field(raw_value, field_type, field_ctx)
|
189
|
-
if field_ctx.parent.invalid_null?
|
190
|
-
return nil
|
191
|
-
end
|
192
|
-
query = field_ctx.query
|
193
|
-
|
194
|
-
case raw_value
|
195
|
-
when GraphQL::ExecutionError
|
196
|
-
raw_value.ast_node ||= field_ctx.ast_node
|
197
|
-
raw_value.path = field_ctx.path
|
198
|
-
query.context.errors.push(raw_value)
|
199
|
-
when Array
|
200
|
-
if field_type.non_null?
|
201
|
-
# List type errors are handled above, this is for the case of fields returning an array of errors
|
202
|
-
list_errors = raw_value.each_with_index.select { |value, _| value.is_a?(GraphQL::ExecutionError) }
|
203
|
-
if list_errors.any?
|
204
|
-
list_errors.each do |error, index|
|
205
|
-
error.ast_node = field_ctx.ast_node
|
206
|
-
error.path = field_ctx.path + (field_ctx.type.list? ? [index] : [])
|
207
|
-
query.context.errors.push(error)
|
208
|
-
end
|
209
|
-
end
|
210
|
-
end
|
211
|
-
end
|
212
|
-
|
213
|
-
resolve_value(
|
214
|
-
raw_value,
|
215
|
-
field_type,
|
216
|
-
field_ctx,
|
217
|
-
)
|
218
|
-
end
|
219
|
-
|
220
|
-
def resolve_value(value, field_type, field_ctx)
|
221
|
-
field_defn = field_ctx.field
|
222
|
-
|
223
|
-
if value.nil?
|
224
|
-
if field_type.kind.non_null?
|
225
|
-
parent_type = field_ctx.irep_node.owner_type
|
226
|
-
type_error = GraphQL::InvalidNullError.new(parent_type, field_defn, value)
|
227
|
-
field_ctx.schema.type_error(type_error, field_ctx)
|
228
|
-
PROPAGATE_NULL
|
229
|
-
else
|
230
|
-
nil
|
231
|
-
end
|
232
|
-
elsif value.is_a?(GraphQL::ExecutionError)
|
233
|
-
if field_type.kind.non_null?
|
234
|
-
PROPAGATE_NULL
|
235
|
-
else
|
236
|
-
nil
|
237
|
-
end
|
238
|
-
elsif value.is_a?(Array) && value.any? && value.all? {|v| v.is_a?(GraphQL::ExecutionError)}
|
239
|
-
if field_type.kind.non_null?
|
240
|
-
PROPAGATE_NULL
|
241
|
-
else
|
242
|
-
nil
|
243
|
-
end
|
244
|
-
elsif value.is_a?(Skip)
|
245
|
-
field_ctx.value = value
|
246
|
-
else
|
247
|
-
case field_type.kind
|
248
|
-
when GraphQL::TypeKinds::SCALAR, GraphQL::TypeKinds::ENUM
|
249
|
-
field_type.coerce_result(value, field_ctx)
|
250
|
-
when GraphQL::TypeKinds::LIST
|
251
|
-
inner_type = field_type.of_type
|
252
|
-
i = 0
|
253
|
-
result = []
|
254
|
-
field_ctx.value = result
|
255
|
-
|
256
|
-
value.each do |inner_value|
|
257
|
-
inner_ctx = field_ctx.spawn_child(
|
258
|
-
key: i,
|
259
|
-
object: inner_value,
|
260
|
-
irep_node: field_ctx.irep_node,
|
261
|
-
)
|
262
|
-
|
263
|
-
inner_result = continue_or_wait(
|
264
|
-
inner_value,
|
265
|
-
inner_type,
|
266
|
-
inner_ctx,
|
267
|
-
)
|
268
|
-
|
269
|
-
return PROPAGATE_NULL if inner_result == PROPAGATE_NULL
|
270
|
-
|
271
|
-
result << inner_ctx
|
272
|
-
i += 1
|
273
|
-
end
|
274
|
-
|
275
|
-
result
|
276
|
-
when GraphQL::TypeKinds::NON_NULL
|
277
|
-
inner_type = field_type.of_type
|
278
|
-
resolve_value(
|
279
|
-
value,
|
280
|
-
inner_type,
|
281
|
-
field_ctx,
|
282
|
-
)
|
283
|
-
when GraphQL::TypeKinds::OBJECT
|
284
|
-
resolve_selection(
|
285
|
-
value,
|
286
|
-
field_type,
|
287
|
-
field_ctx
|
288
|
-
)
|
289
|
-
when GraphQL::TypeKinds::UNION, GraphQL::TypeKinds::INTERFACE
|
290
|
-
query = field_ctx.query
|
291
|
-
resolved_type_or_lazy = field_type.resolve_type(value, field_ctx)
|
292
|
-
query.schema.after_lazy(resolved_type_or_lazy) do |resolved_type|
|
293
|
-
possible_types = query.possible_types(field_type)
|
294
|
-
|
295
|
-
if !possible_types.include?(resolved_type)
|
296
|
-
parent_type = field_ctx.irep_node.owner_type
|
297
|
-
type_error = GraphQL::UnresolvedTypeError.new(value, field_defn, parent_type, resolved_type, possible_types)
|
298
|
-
field_ctx.schema.type_error(type_error, field_ctx)
|
299
|
-
PROPAGATE_NULL
|
300
|
-
else
|
301
|
-
resolve_value(
|
302
|
-
value,
|
303
|
-
resolved_type,
|
304
|
-
field_ctx,
|
305
|
-
)
|
306
|
-
end
|
307
|
-
end
|
308
|
-
else
|
309
|
-
raise("Unknown type kind: #{field_type.kind}")
|
310
|
-
end
|
311
|
-
end
|
312
|
-
end
|
313
|
-
end
|
314
|
-
|
315
|
-
include ExecutionFunctions
|
316
|
-
|
317
|
-
# A `.call`-able suitable to be the last step in a middleware chain
|
318
|
-
module FieldResolveStep
|
319
|
-
# Execute the field's resolve method
|
320
|
-
def self.call(_parent_type, parent_object, field_definition, field_args, context, _next = nil)
|
321
|
-
field_definition.resolve(parent_object, field_args, context)
|
322
|
-
end
|
323
|
-
end
|
324
|
-
end
|
325
|
-
end
|
326
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Execution
|
4
|
-
# Starting from a root context,
|
5
|
-
# create a hash out of the context tree.
|
6
|
-
# @api private
|
7
|
-
module Flatten
|
8
|
-
def self.call(ctx)
|
9
|
-
flatten(ctx)
|
10
|
-
end
|
11
|
-
|
12
|
-
class << self
|
13
|
-
private
|
14
|
-
|
15
|
-
def flatten(obj)
|
16
|
-
case obj
|
17
|
-
when Hash
|
18
|
-
flattened = {}
|
19
|
-
obj.each do |key, val|
|
20
|
-
flattened[key] = flatten(val)
|
21
|
-
end
|
22
|
-
flattened
|
23
|
-
when Array
|
24
|
-
obj.map { |v| flatten(v) }
|
25
|
-
when Query::Context::SharedMethods
|
26
|
-
if obj.invalid_null?
|
27
|
-
nil
|
28
|
-
elsif obj.skipped? && obj.value.empty?
|
29
|
-
nil
|
30
|
-
else
|
31
|
-
flatten(obj.value)
|
32
|
-
end
|
33
|
-
else
|
34
|
-
obj
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,92 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Execution
|
4
|
-
module Instrumentation
|
5
|
-
# This function implements the instrumentation policy:
|
6
|
-
#
|
7
|
-
# - Instrumenters are a stack; the first `before_query` will have the last `after_query`
|
8
|
-
# - If a `before_` hook returned without an error, its corresponding `after_` hook will run.
|
9
|
-
# - If the `before_` hook did _not_ run, the `after_` hook will not be called.
|
10
|
-
#
|
11
|
-
# When errors are raised from `after_` hooks:
|
12
|
-
# - Subsequent `after_` hooks _are_ called
|
13
|
-
# - The first raised error is captured; later errors are ignored
|
14
|
-
# - If an error was capture, it's re-raised after all hooks are finished
|
15
|
-
#
|
16
|
-
# Partial runs of instrumentation are possible:
|
17
|
-
# - If a `before_multiplex` hook raises an error, no `before_query` hooks will run
|
18
|
-
# - If a `before_query` hook raises an error, subsequent `before_query` hooks will not run (on any query)
|
19
|
-
def self.apply_instrumenters(multiplex)
|
20
|
-
schema = multiplex.schema
|
21
|
-
queries = multiplex.queries
|
22
|
-
query_instrumenters = schema.instrumenters[:query]
|
23
|
-
multiplex_instrumenters = schema.instrumenters[:multiplex]
|
24
|
-
|
25
|
-
# First, run multiplex instrumentation, then query instrumentation for each query
|
26
|
-
call_hooks(multiplex_instrumenters, multiplex, :before_multiplex, :after_multiplex) do
|
27
|
-
each_query_call_hooks(query_instrumenters, queries) do
|
28
|
-
# Let them be executed
|
29
|
-
yield
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
class << self
|
35
|
-
private
|
36
|
-
# Call the before_ hooks of each query,
|
37
|
-
# Then yield if no errors.
|
38
|
-
# `call_hooks` takes care of appropriate cleanup.
|
39
|
-
def each_query_call_hooks(instrumenters, queries, i = 0)
|
40
|
-
if i >= queries.length
|
41
|
-
yield
|
42
|
-
else
|
43
|
-
query = queries[i]
|
44
|
-
call_hooks(instrumenters, query, :before_query, :after_query) {
|
45
|
-
each_query_call_hooks(instrumenters, queries, i + 1) {
|
46
|
-
yield
|
47
|
-
}
|
48
|
-
}
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
# Call each before hook, and if they all succeed, yield.
|
53
|
-
# If they don't all succeed, call after_ for each one that succeeded.
|
54
|
-
def call_hooks(instrumenters, object, before_hook_name, after_hook_name)
|
55
|
-
begin
|
56
|
-
successful = []
|
57
|
-
instrumenters.each do |instrumenter|
|
58
|
-
instrumenter.public_send(before_hook_name, object)
|
59
|
-
successful << instrumenter
|
60
|
-
end
|
61
|
-
|
62
|
-
# if any before hooks raise an exception, quit calling before hooks,
|
63
|
-
# but call the after hooks on anything that succeeded but also
|
64
|
-
# raise the exception that came from the before hook.
|
65
|
-
rescue GraphQL::ExecutionError => err
|
66
|
-
object.context.errors << err
|
67
|
-
rescue => e
|
68
|
-
raise call_after_hooks(successful, object, after_hook_name, e)
|
69
|
-
end
|
70
|
-
|
71
|
-
begin
|
72
|
-
yield # Call the user code
|
73
|
-
ensure
|
74
|
-
ex = call_after_hooks(successful, object, after_hook_name, nil)
|
75
|
-
raise ex if ex
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def call_after_hooks(instrumenters, object, after_hook_name, ex)
|
80
|
-
instrumenters.reverse.each do |instrumenter|
|
81
|
-
begin
|
82
|
-
instrumenter.public_send(after_hook_name, object)
|
83
|
-
rescue => e
|
84
|
-
ex = e
|
85
|
-
end
|
86
|
-
end
|
87
|
-
ex
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
@@ -1,46 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module GraphQL
|
4
|
-
module Execution
|
5
|
-
class Interpreter
|
6
|
-
# This response class handles `#write` by accumulating
|
7
|
-
# values into a Hash.
|
8
|
-
class HashResponse
|
9
|
-
def initialize
|
10
|
-
@result = {}
|
11
|
-
end
|
12
|
-
|
13
|
-
def final_value
|
14
|
-
@result
|
15
|
-
end
|
16
|
-
|
17
|
-
def inspect
|
18
|
-
"#<#{self.class.name} result=#{@result.inspect}>"
|
19
|
-
end
|
20
|
-
|
21
|
-
# Add `value` at `path`.
|
22
|
-
# @return [void]
|
23
|
-
def write(path, value)
|
24
|
-
if path.empty?
|
25
|
-
@result = value
|
26
|
-
elsif (write_target = @result)
|
27
|
-
i = 0
|
28
|
-
prefinal_steps = path.size - 1
|
29
|
-
# Use `while` to avoid a closure
|
30
|
-
while i < prefinal_steps
|
31
|
-
path_part = path[i]
|
32
|
-
i += 1
|
33
|
-
write_target = write_target[path_part]
|
34
|
-
end
|
35
|
-
path_part = path[i]
|
36
|
-
write_target[path_part] = value
|
37
|
-
else
|
38
|
-
# The response is completely nulled out
|
39
|
-
end
|
40
|
-
|
41
|
-
nil
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|