graphql 1.9.17 → 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 +25 -27
- 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 +31 -2
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
- data/lib/graphql/analysis/ast/query_complexity.rb +175 -68
- data/lib/graphql/analysis/ast/query_depth.rb +0 -1
- data/lib/graphql/analysis/ast/visitor.rb +54 -38
- data/lib/graphql/analysis/ast.rb +16 -16
- data/lib/graphql/analysis.rb +0 -7
- data/lib/graphql/backtrace/inspect_result.rb +0 -1
- data/lib/graphql/backtrace/table.rb +37 -16
- 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/directive_checks.rb +2 -2
- data/lib/graphql/execution/errors.rb +77 -45
- 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 +830 -417
- data/lib/graphql/execution/interpreter.rb +206 -74
- data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
- data/lib/graphql/execution/lazy.rb +11 -21
- data/lib/graphql/execution/lookahead.rb +65 -136
- data/lib/graphql/execution/multiplex.rb +6 -152
- data/lib/graphql/execution.rb +11 -4
- data/lib/graphql/filter.rb +8 -3
- data/lib/graphql/integer_decoding_error.rb +17 -0
- data/lib/graphql/integer_encoding_error.rb +18 -2
- data/lib/graphql/introspection/base_object.rb +2 -5
- data/lib/graphql/introspection/directive_location_enum.rb +2 -2
- data/lib/graphql/introspection/directive_type.rb +12 -6
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +5 -18
- data/lib/graphql/introspection/enum_value_type.rb +2 -2
- data/lib/graphql/introspection/field_type.rb +9 -5
- data/lib/graphql/introspection/input_value_type.rb +41 -11
- data/lib/graphql/introspection/introspection_query.rb +6 -92
- data/lib/graphql/introspection/schema_type.rb +12 -12
- data/lib/graphql/introspection/type_type.rb +34 -17
- 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/definition_slice.rb +21 -10
- data/lib/graphql/language/document_from_schema_definition.rb +136 -78
- data/lib/graphql/language/lexer.rb +216 -1462
- data/lib/graphql/language/nodes.rb +129 -132
- data/lib/graphql/language/parser.rb +994 -932
- data/lib/graphql/language/parser.y +152 -120
- 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 +3 -1
- data/lib/graphql/name_validator.rb +2 -7
- data/lib/graphql/pagination/active_record_relation_connection.rb +77 -0
- data/lib/graphql/pagination/array_connection.rb +79 -0
- data/lib/graphql/pagination/connection.rb +253 -0
- data/lib/graphql/pagination/connections.rb +135 -0
- data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
- data/lib/graphql/pagination/relation_connection.rb +228 -0
- data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
- data/lib/graphql/pagination.rb +6 -0
- data/lib/graphql/parse_error.rb +0 -1
- data/lib/graphql/query/context.rb +205 -203
- 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 +39 -12
- data/lib/graphql/query.rb +95 -43
- data/lib/graphql/railtie.rb +6 -102
- data/lib/graphql/rake_task/validate.rb +4 -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 +285 -36
- data/lib/graphql/schema/base_64_encoder.rb +2 -0
- data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
- data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
- data/lib/graphql/schema/build_from_definition.rb +348 -205
- data/lib/graphql/schema/built_in_types.rb +5 -5
- data/lib/graphql/schema/directive/deprecated.rb +18 -0
- 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 +2 -2
- data/lib/graphql/schema/directive/one_of.rb +12 -0
- data/lib/graphql/schema/directive/skip.rb +2 -2
- data/lib/graphql/schema/directive/transform.rb +14 -2
- data/lib/graphql/schema/directive.rb +134 -15
- data/lib/graphql/schema/enum.rb +137 -39
- data/lib/graphql/schema/enum_value.rb +17 -23
- data/lib/graphql/schema/field/connection_extension.rb +50 -20
- data/lib/graphql/schema/field/scope_extension.rb +1 -1
- data/lib/graphql/schema/field.rb +504 -331
- data/lib/graphql/schema/field_extension.rb +86 -2
- data/lib/graphql/schema/find_inherited_value.rb +12 -1
- data/lib/graphql/schema/finder.rb +16 -14
- data/lib/graphql/schema/input_object.rb +182 -60
- data/lib/graphql/schema/interface.rb +24 -49
- data/lib/graphql/schema/introspection_system.rb +103 -37
- data/lib/graphql/schema/late_bound_type.rb +9 -2
- data/lib/graphql/schema/list.rb +61 -3
- data/lib/graphql/schema/loader.rb +144 -96
- data/lib/graphql/schema/member/base_dsl_methods.rb +41 -37
- data/lib/graphql/schema/member/build_type.rb +24 -15
- data/lib/graphql/schema/member/has_arguments.rb +310 -26
- data/lib/graphql/schema/member/has_ast_node.rb +32 -0
- 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 +166 -44
- 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 +33 -0
- data/lib/graphql/schema/member.rb +11 -6
- data/lib/graphql/schema/mutation.rb +4 -9
- data/lib/graphql/schema/non_null.rb +34 -4
- data/lib/graphql/schema/object.rb +36 -60
- data/lib/graphql/schema/printer.rb +16 -35
- data/lib/graphql/schema/relay_classic_mutation.rb +91 -44
- data/lib/graphql/schema/resolver/has_payload_type.rb +51 -11
- data/lib/graphql/schema/resolver.rb +147 -94
- data/lib/graphql/schema/scalar.rb +40 -15
- data/lib/graphql/schema/subscription.rb +60 -31
- data/lib/graphql/schema/timeout.rb +45 -35
- data/lib/graphql/schema/type_expression.rb +21 -13
- data/lib/graphql/schema/type_membership.rb +23 -6
- data/lib/graphql/schema/union.rb +49 -15
- 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 +213 -35
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +857 -884
- data/lib/graphql/static_validation/all_rules.rb +3 -0
- data/lib/graphql/static_validation/base_visitor.rb +21 -31
- 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 +45 -83
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +35 -26
- data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +12 -6
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +14 -14
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +15 -7
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +96 -53
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
- data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
- data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
- data/lib/graphql/static_validation/rules/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 +9 -10
- 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 +12 -13
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +19 -14
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
- data/lib/graphql/static_validation/type_stack.rb +2 -2
- data/lib/graphql/static_validation/validation_context.rb +13 -3
- data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
- data/lib/graphql/static_validation/validator.rb +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 +129 -22
- 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 +84 -35
- data/lib/graphql/subscriptions/instrumentation.rb +0 -47
- data/lib/graphql/subscriptions/serialize.rb +53 -6
- data/lib/graphql/subscriptions.rb +137 -57
- data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
- 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 +23 -0
- data/lib/graphql/tracing/data_dog_trace.rb +148 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +34 -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 +9 -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 +76 -35
- 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 +11 -3
- data/lib/graphql/tracing/scout_trace.rb +72 -0
- data/lib/graphql/tracing/scout_tracing.rb +19 -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 -67
- 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 -90
- 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/unresolved_type_error.rb +2 -2
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +63 -65
- data/readme.md +3 -6
- metadata +127 -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 -159
- data/lib/graphql/authorization.rb +0 -82
- data/lib/graphql/backwards_compatibility.rb +0 -60
- data/lib/graphql/base_type.rb +0 -226
- 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 -91
- 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 -50
- data/lib/graphql/define/instance_definable.rb +0 -300
- 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 -13
- data/lib/graphql/directive/include_directive.rb +0 -2
- data/lib/graphql/directive/skip_directive.rb +0 -2
- data/lib/graphql/directive.rb +0 -104
- data/lib/graphql/enum_type.rb +0 -193
- 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 -330
- data/lib/graphql/float_type.rb +0 -2
- data/lib/graphql/function.rb +0 -153
- data/lib/graphql/id_type.rb +0 -2
- data/lib/graphql/input_object_type.rb +0 -154
- data/lib/graphql/int_type.rb +0 -2
- data/lib/graphql/interface_type.rb +0 -86
- 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 -81
- data/lib/graphql/object_type.rb +0 -141
- data/lib/graphql/query/arguments.rb +0 -187
- 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 -116
- 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 -172
- 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 -40
- data/lib/graphql/relay/edge.rb +0 -27
- data/lib/graphql/relay/edge_type.rb +0 -18
- 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 -190
- 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 -133
- 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 -26
- 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 -66
- data/lib/graphql/tracing/skylight_tracing.rb +0 -62
- 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 -128
- data/lib/graphql/upgrader/member.rb +0 -936
- data/lib/graphql/upgrader/schema.rb +0 -37
@@ -16,10 +16,8 @@ module GraphQL
|
|
16
16
|
class ValidationPipeline
|
17
17
|
attr_reader :max_depth, :max_complexity
|
18
18
|
|
19
|
-
def initialize(query:,
|
19
|
+
def initialize(query:, parse_error:, operation_name_error:, max_depth:, max_complexity:)
|
20
20
|
@validation_errors = []
|
21
|
-
@internal_representation = nil
|
22
|
-
@validate = validate
|
23
21
|
@parse_error = parse_error
|
24
22
|
@operation_name_error = operation_name_error
|
25
23
|
@query = query
|
@@ -36,23 +34,21 @@ module GraphQL
|
|
36
34
|
@valid
|
37
35
|
end
|
38
36
|
|
39
|
-
# @return [Array<GraphQL::StaticValidation::Error >] Static validation errors for the query string
|
37
|
+
# @return [Array<GraphQL::StaticValidation::Error, GraphQL::Query::VariableValidationError>] Static validation errors for the query string
|
40
38
|
def validation_errors
|
41
39
|
ensure_has_validated
|
42
40
|
@validation_errors
|
43
41
|
end
|
44
42
|
|
45
|
-
# @return [Hash<String, nil => GraphQL::InternalRepresentation::Node] Operation name -> Irep node pairs
|
46
|
-
def internal_representation
|
47
|
-
ensure_has_validated
|
48
|
-
@internal_representation
|
49
|
-
end
|
50
|
-
|
51
43
|
def analyzers
|
52
44
|
ensure_has_validated
|
53
45
|
@query_analyzers
|
54
46
|
end
|
55
47
|
|
48
|
+
def has_validated?
|
49
|
+
@has_validated == true
|
50
|
+
end
|
51
|
+
|
56
52
|
private
|
57
53
|
|
58
54
|
# If the pipeline wasn't run yet, run it.
|
@@ -63,7 +59,7 @@ module GraphQL
|
|
63
59
|
|
64
60
|
if @parse_error
|
65
61
|
# This is kind of crazy: we push the parse error into `ctx`
|
66
|
-
# in
|
62
|
+
# in `def self.parse_error` by default so that users can _opt out_ by redefining that hook.
|
67
63
|
# That means we can't _re-add_ the error here (otherwise we'd either
|
68
64
|
# add it twice _or_ override the user's choice to not add it).
|
69
65
|
# So we just have to know that it was invalid and go from there.
|
@@ -72,9 +68,8 @@ module GraphQL
|
|
72
68
|
elsif @operation_name_error
|
73
69
|
@validation_errors << @operation_name_error
|
74
70
|
else
|
75
|
-
validation_result = @schema.static_validator.validate(@query, validate: @validate)
|
71
|
+
validation_result = @schema.static_validator.validate(@query, validate: @query.validate, timeout: @schema.validate_timeout, max_errors: @schema.validate_max_errors)
|
76
72
|
@validation_errors.concat(validation_result[:errors])
|
77
|
-
@internal_representation = validation_result[:irep]
|
78
73
|
|
79
74
|
if @validation_errors.empty?
|
80
75
|
@validation_errors.concat(@query.variables.errors)
|
@@ -90,6 +85,9 @@ module GraphQL
|
|
90
85
|
end
|
91
86
|
|
92
87
|
@valid = @validation_errors.empty?
|
88
|
+
rescue SystemStackError => err
|
89
|
+
@valid = false
|
90
|
+
@schema.query_stack_error(@query, err)
|
93
91
|
end
|
94
92
|
|
95
93
|
# If there are max_* values, add them,
|
@@ -97,35 +95,15 @@ module GraphQL
|
|
97
95
|
def build_analyzers(schema, max_depth, max_complexity)
|
98
96
|
qa = schema.query_analyzers.dup
|
99
97
|
|
100
|
-
# Filter out the built in authorization analyzer.
|
101
|
-
# It is deprecated and does not have an AST analyzer alternative.
|
102
|
-
qa = qa.select do |analyzer|
|
103
|
-
if analyzer == GraphQL::Authorization::Analyzer && schema.using_ast_analysis?
|
104
|
-
raise "The Authorization analyzer is not supported with AST Analyzers"
|
105
|
-
else
|
106
|
-
true
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
98
|
if max_depth || max_complexity
|
111
99
|
# Depending on the analysis engine, we must use different analyzers
|
112
100
|
# remove this once everything has switched over to AST analyzers
|
113
|
-
if
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
qa << GraphQL::Analysis::AST::MaxQueryComplexity
|
119
|
-
end
|
120
|
-
else
|
121
|
-
if max_depth
|
122
|
-
qa << GraphQL::Analysis::MaxQueryDepth.new(max_depth)
|
123
|
-
end
|
124
|
-
if max_complexity
|
125
|
-
qa << GraphQL::Analysis::MaxQueryComplexity.new(max_complexity)
|
126
|
-
end
|
101
|
+
if max_depth
|
102
|
+
qa << GraphQL::Analysis::AST::MaxQueryDepth
|
103
|
+
end
|
104
|
+
if max_complexity
|
105
|
+
qa << GraphQL::Analysis::AST::MaxQueryComplexity
|
127
106
|
end
|
128
|
-
|
129
107
|
qa
|
130
108
|
else
|
131
109
|
qa
|
@@ -4,11 +4,11 @@ module GraphQL
|
|
4
4
|
class VariableValidationError < GraphQL::ExecutionError
|
5
5
|
attr_accessor :value, :validation_result
|
6
6
|
|
7
|
-
def initialize(variable_ast, type, value, validation_result)
|
7
|
+
def initialize(variable_ast, type, value, validation_result, msg: nil)
|
8
8
|
@value = value
|
9
9
|
@validation_result = validation_result
|
10
10
|
|
11
|
-
msg
|
11
|
+
msg ||= "Variable $#{variable_ast.name} of type #{type.to_type_signature} was provided invalid value"
|
12
12
|
|
13
13
|
if problem_fields.any?
|
14
14
|
msg += " for #{problem_fields.join(", ")}"
|
@@ -23,7 +23,7 @@ module GraphQL
|
|
23
23
|
# a one level deep merge explicitly. However beyond that only show the
|
24
24
|
# latest value and problems.
|
25
25
|
super.merge({ "extensions" => { "value" => value, "problems" => validation_result.problems }}) do |key, oldValue, newValue|
|
26
|
-
if oldValue.respond_to?
|
26
|
+
if oldValue.respond_to?(:merge)
|
27
27
|
oldValue.merge(newValue)
|
28
28
|
else
|
29
29
|
newValue
|
@@ -14,14 +14,18 @@ module GraphQL
|
|
14
14
|
schema = ctx.schema
|
15
15
|
@context = ctx
|
16
16
|
|
17
|
-
@provided_variables =
|
17
|
+
@provided_variables = deep_stringify(provided_variables)
|
18
18
|
@errors = []
|
19
19
|
@storage = ast_variables.each_with_object({}) do |ast_variable, memo|
|
20
|
+
if schema.validate_max_errors && schema.validate_max_errors <= @errors.count
|
21
|
+
add_max_errors_reached_message
|
22
|
+
break
|
23
|
+
end
|
20
24
|
# Find the right value for this variable:
|
21
25
|
# - First, use the value provided at runtime
|
22
26
|
# - Then, fall back to the default value from the query string
|
23
27
|
# If it's still nil, raise an error if it's required.
|
24
|
-
variable_type = schema.type_from_ast(ast_variable.type)
|
28
|
+
variable_type = schema.type_from_ast(ast_variable.type, context: ctx)
|
25
29
|
if variable_type.nil?
|
26
30
|
# Pass -- it will get handled by a validator
|
27
31
|
else
|
@@ -29,27 +33,27 @@ module GraphQL
|
|
29
33
|
default_value = ast_variable.default_value
|
30
34
|
provided_value = @provided_variables[variable_name]
|
31
35
|
value_was_provided = @provided_variables.key?(variable_name)
|
32
|
-
|
36
|
+
max_errors = schema.validate_max_errors - @errors.count if schema.validate_max_errors
|
33
37
|
begin
|
34
|
-
validation_result = variable_type.validate_input(provided_value, ctx)
|
38
|
+
validation_result = variable_type.validate_input(provided_value, ctx, max_errors: max_errors)
|
35
39
|
if validation_result.valid?
|
36
40
|
if value_was_provided
|
37
41
|
# Add the variable if a value was provided
|
38
|
-
memo[variable_name] =
|
39
|
-
variable_type.coerce_input(provided_value, ctx)
|
40
|
-
end
|
42
|
+
memo[variable_name] = provided_value
|
41
43
|
elsif default_value != nil
|
42
|
-
|
43
|
-
|
44
|
+
memo[variable_name] = if default_value.is_a?(Language::Nodes::NullValue)
|
45
|
+
nil
|
46
|
+
else
|
47
|
+
default_value
|
48
|
+
end
|
44
49
|
end
|
45
50
|
end
|
46
|
-
rescue GraphQL::
|
51
|
+
rescue GraphQL::ExecutionError => ex
|
47
52
|
# TODO: This should really include the path to the problematic node in the variable value
|
48
53
|
# like InputValidationResults generated by validate_non_null_input but unfortunately we don't
|
49
54
|
# have this information available in the coerce_input call chain. Note this path is the path
|
50
55
|
# that appears under errors.extensions.problems.path and NOT the result path under errors.path.
|
51
|
-
validation_result = GraphQL::Query::InputValidationResult.
|
52
|
-
validation_result.add_problem(ex.message)
|
56
|
+
validation_result = GraphQL::Query::InputValidationResult.from_problem(ex.message)
|
53
57
|
end
|
54
58
|
|
55
59
|
if !validation_result.valid?
|
@@ -60,6 +64,29 @@ module GraphQL
|
|
60
64
|
end
|
61
65
|
|
62
66
|
def_delegators :@storage, :length, :key?, :[], :fetch, :to_h
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def deep_stringify(val)
|
71
|
+
case val
|
72
|
+
when Array
|
73
|
+
val.map { |v| deep_stringify(v) }
|
74
|
+
when Hash
|
75
|
+
new_val = {}
|
76
|
+
val.each do |k, v|
|
77
|
+
new_val[k.to_s] = deep_stringify(v)
|
78
|
+
end
|
79
|
+
new_val
|
80
|
+
else
|
81
|
+
val
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def add_max_errors_reached_message
|
86
|
+
message = "Too many errors processing variables, max validation error limit reached. Execution aborted"
|
87
|
+
validation_result = GraphQL::Query::InputValidationResult.from_problem(message)
|
88
|
+
errors << GraphQL::Query::VariableValidationError.new(nil, nil, nil, validation_result, msg: message)
|
89
|
+
end
|
63
90
|
end
|
64
91
|
end
|
65
92
|
end
|
data/lib/graphql/query.rb
CHANGED
@@ -1,12 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require "graphql/query/arguments"
|
3
|
-
require "graphql/query/arguments_cache"
|
4
2
|
require "graphql/query/context"
|
5
|
-
require "graphql/query/
|
6
|
-
require "graphql/query/literal_input"
|
3
|
+
require "graphql/query/fingerprint"
|
7
4
|
require "graphql/query/null_context"
|
8
5
|
require "graphql/query/result"
|
9
|
-
require "graphql/query/serial_execution"
|
10
6
|
require "graphql/query/variables"
|
11
7
|
require "graphql/query/input_validation_result"
|
12
8
|
require "graphql/query/variable_validation_error"
|
@@ -38,7 +34,16 @@ module GraphQL
|
|
38
34
|
attr_accessor :operation_name
|
39
35
|
|
40
36
|
# @return [Boolean] if false, static validation is skipped (execution behavior for invalid queries is undefined)
|
41
|
-
|
37
|
+
attr_reader :validate
|
38
|
+
|
39
|
+
# @param new_validate [Boolean] if false, static validation is skipped. This can't be reasssigned after validation.
|
40
|
+
def validate=(new_validate)
|
41
|
+
if defined?(@validation_pipeline) && @validation_pipeline && @validation_pipeline.has_validated?
|
42
|
+
raise ArgumentError, "Can't reassign Query#validate= after validation has run, remove this assignment."
|
43
|
+
else
|
44
|
+
@validate = new_validate
|
45
|
+
end
|
46
|
+
end
|
42
47
|
|
43
48
|
attr_writer :query_string
|
44
49
|
|
@@ -78,29 +83,41 @@ module GraphQL
|
|
78
83
|
# @param max_complexity [Numeric] the maximum field complexity for this query (falls back to schema-level value)
|
79
84
|
# @param except [<#call(schema_member, context)>] If provided, objects will be hidden from the schema when `.call(schema_member, context)` returns truthy
|
80
85
|
# @param only [<#call(schema_member, context)>] If provided, objects will be hidden from the schema when `.call(schema_member, context)` returns false
|
81
|
-
def initialize(schema, query_string = nil, query: nil, document: nil, context: nil, variables: nil, validate: true, subscription_topic: nil, operation_name: nil, root_value: nil, max_depth: schema.max_depth, max_complexity: schema.max_complexity, except: nil, only: nil)
|
86
|
+
def initialize(schema, query_string = nil, query: nil, document: nil, context: nil, variables: nil, validate: true, subscription_topic: nil, operation_name: nil, root_value: nil, max_depth: schema.max_depth, max_complexity: schema.max_complexity, except: nil, only: nil, warden: nil)
|
82
87
|
# Even if `variables: nil` is passed, use an empty hash for simpler logic
|
83
88
|
variables ||= {}
|
84
89
|
@schema = schema
|
85
90
|
@filter = schema.default_filter.merge(except: except, only: only)
|
86
91
|
@context = schema.context_class.new(query: self, object: root_value, values: context)
|
92
|
+
@warden = warden
|
87
93
|
@subscription_topic = subscription_topic
|
88
94
|
@root_value = root_value
|
89
95
|
@fragments = nil
|
90
96
|
@operations = nil
|
91
97
|
@validate = validate
|
92
|
-
|
93
|
-
@tracers = schema.tracers +
|
98
|
+
context_tracers = (context ? context.fetch(:tracers, []) : [])
|
99
|
+
@tracers = schema.tracers + context_tracers
|
100
|
+
|
94
101
|
# Support `ctx[:backtrace] = true` for wrapping backtraces
|
95
102
|
if context && context[:backtrace] && !@tracers.include?(GraphQL::Backtrace::Tracer)
|
96
|
-
|
103
|
+
if schema.trace_class <= GraphQL::Tracing::LegacyTrace
|
104
|
+
context_tracers += [GraphQL::Backtrace::Tracer]
|
105
|
+
@tracers << GraphQL::Backtrace::Tracer
|
106
|
+
elsif !(current_trace.class <= GraphQL::Backtrace::Trace)
|
107
|
+
raise "Invariant: `backtrace: true` should have provided a trace class with Backtrace mixed in, but it didnt. (Found: #{current_trace.class.ancestors}). This is a bug in GraphQL-Ruby, please report it on GitHub."
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
if context_tracers.any? && !(schema.trace_class <= GraphQL::Tracing::LegacyTrace)
|
112
|
+
raise ArgumentError, "context[:tracers] are not supported without `trace_class(GraphQL::Tracing::LegacyTrace)` in the schema configuration, please add it."
|
97
113
|
end
|
98
114
|
|
115
|
+
|
99
116
|
@analysis_errors = []
|
100
117
|
if variables.is_a?(String)
|
101
118
|
raise ArgumentError, "Query variables should be a Hash, not a String. Try JSON.parse to prepare variables."
|
102
119
|
else
|
103
|
-
@provided_variables = variables
|
120
|
+
@provided_variables = variables || {}
|
104
121
|
end
|
105
122
|
|
106
123
|
@query_string = query_string || query
|
@@ -110,6 +127,10 @@ module GraphQL
|
|
110
127
|
raise ArgumentError, "Query should only be provided a query string or a document, not both."
|
111
128
|
end
|
112
129
|
|
130
|
+
if @query_string && !@query_string.is_a?(String)
|
131
|
+
raise ArgumentError, "Query string argument should be a String, got #{@query_string.class.name} instead."
|
132
|
+
end
|
133
|
+
|
113
134
|
# A two-layer cache of type resolution:
|
114
135
|
# { abstract_type => { value => resolved_type } }
|
115
136
|
@resolved_types_cache = Hash.new do |h1, k1|
|
@@ -118,8 +139,6 @@ module GraphQL
|
|
118
139
|
end
|
119
140
|
end
|
120
141
|
|
121
|
-
@arguments_cache = ArgumentsCache.build(self)
|
122
|
-
|
123
142
|
# Trying to execute a document
|
124
143
|
# with no operations returns an empty hash
|
125
144
|
@ast_variables = []
|
@@ -134,7 +153,6 @@ module GraphQL
|
|
134
153
|
@executed = false
|
135
154
|
|
136
155
|
# TODO add a general way to define schema-level filters
|
137
|
-
# TODO also add this to schema dumps
|
138
156
|
if @schema.respond_to?(:visible?)
|
139
157
|
merge_filters(only: @schema.method(:visible?))
|
140
158
|
end
|
@@ -145,7 +163,16 @@ module GraphQL
|
|
145
163
|
@query_string ||= (document ? document.to_query_string : nil)
|
146
164
|
end
|
147
165
|
|
148
|
-
|
166
|
+
def interpreter?
|
167
|
+
true
|
168
|
+
end
|
169
|
+
|
170
|
+
attr_accessor :multiplex
|
171
|
+
|
172
|
+
# @return [GraphQL::Tracing::Trace]
|
173
|
+
def current_trace
|
174
|
+
@current_trace ||= multiplex ? multiplex.current_trace : schema.new_trace(multiplex: multiplex, query: self)
|
175
|
+
end
|
149
176
|
|
150
177
|
def subscription_update?
|
151
178
|
@subscription_topic && subscription?
|
@@ -157,7 +184,6 @@ module GraphQL
|
|
157
184
|
@lookahead ||= begin
|
158
185
|
ast_node = selected_operation
|
159
186
|
root_type = warden.root_type_for_operation(ast_node.operation_type || "query")
|
160
|
-
root_type = root_type.metadata[:type_class] || raise("Invariant: `lookahead` only works with class-based types")
|
161
187
|
GraphQL::Execution::Lookahead.new(query: self, root_type: root_type, ast_nodes: [ast_node])
|
162
188
|
end
|
163
189
|
end
|
@@ -187,9 +213,7 @@ module GraphQL
|
|
187
213
|
# @return [Hash] A GraphQL response, with `"data"` and/or `"errors"` keys
|
188
214
|
def result
|
189
215
|
if !@executed
|
190
|
-
|
191
|
-
Execution::Multiplex.run_queries(@schema, [self], context: @context)
|
192
|
-
}
|
216
|
+
Execution::Interpreter.run_all(@schema, [self], context: @context)
|
193
217
|
end
|
194
218
|
@result ||= Query::Result.new(query: self, values: @result_values)
|
195
219
|
end
|
@@ -227,28 +251,60 @@ module GraphQL
|
|
227
251
|
end
|
228
252
|
end
|
229
253
|
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
end
|
254
|
+
# Node-level cache for calculating arguments. Used during execution and query analysis.
|
255
|
+
# @param ast_node [GraphQL::Language::Nodes::AbstractNode]
|
256
|
+
# @param definition [GraphQL::Schema::Field]
|
257
|
+
# @param parent_object [GraphQL::Schema::Object]
|
258
|
+
# @return Hash{Symbol => Object}
|
259
|
+
def arguments_for(ast_node, definition, parent_object: nil)
|
260
|
+
arguments_cache.fetch(ast_node, definition, parent_object)
|
238
261
|
end
|
239
262
|
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
263
|
+
def arguments_cache
|
264
|
+
@arguments_cache ||= Execution::Interpreter::ArgumentsCache.new(self)
|
265
|
+
end
|
266
|
+
|
267
|
+
# A version of the given query string, with:
|
268
|
+
# - Variables inlined to the query
|
269
|
+
# - Strings replaced with `<REDACTED>`
|
270
|
+
# @return [String, nil] Returns nil if the query is invalid.
|
271
|
+
def sanitized_query_string(inline_variables: true)
|
272
|
+
with_prepared_ast {
|
273
|
+
schema.sanitized_printer.new(self, inline_variables: inline_variables).sanitized_query_string
|
274
|
+
}
|
275
|
+
end
|
276
|
+
|
277
|
+
# This contains a few components:
|
278
|
+
#
|
279
|
+
# - The selected operation name (or `anonymous`)
|
280
|
+
# - The fingerprint of the query string
|
281
|
+
# - The number of given variables (for readability)
|
282
|
+
# - The fingerprint of the given variables
|
283
|
+
#
|
284
|
+
# This fingerprint can be used to track runs of the same operation-variables combination over time.
|
285
|
+
#
|
286
|
+
# @see operation_fingerprint
|
287
|
+
# @see variables_fingerprint
|
288
|
+
# @return [String] An opaque hash identifying this operation-variables combination
|
289
|
+
def fingerprint
|
290
|
+
@fingerprint ||= "#{operation_fingerprint}/#{variables_fingerprint}"
|
291
|
+
end
|
292
|
+
|
293
|
+
# @return [String] An opaque hash for identifying this query's given query string and selected operation
|
294
|
+
def operation_fingerprint
|
295
|
+
@operation_fingerprint ||= "#{selected_operation_name || "anonymous"}/#{Fingerprint.generate(query_string)}"
|
296
|
+
end
|
297
|
+
|
298
|
+
# @return [String] An opaque hash for identifying this query's given a variable values (not including defaults)
|
299
|
+
def variables_fingerprint
|
300
|
+
@variables_fingerprint ||= "#{provided_variables.size}/#{Fingerprint.generate(provided_variables.to_json)}"
|
245
301
|
end
|
246
302
|
|
247
303
|
def validation_pipeline
|
248
304
|
with_prepared_ast { @validation_pipeline }
|
249
305
|
end
|
250
306
|
|
251
|
-
def_delegators :validation_pipeline, :validation_errors,
|
307
|
+
def_delegators :validation_pipeline, :validation_errors,
|
252
308
|
:analyzers, :ast_analyzers, :max_depth, :max_complexity
|
253
309
|
|
254
310
|
attr_accessor :analysis_errors
|
@@ -266,8 +322,8 @@ module GraphQL
|
|
266
322
|
# @param value [Object] Any runtime value
|
267
323
|
# @return [GraphQL::ObjectType, nil] The runtime type of `value` from {Schema#resolve_type}
|
268
324
|
# @see {#possible_types} to apply filtering from `only` / `except`
|
269
|
-
def resolve_type(abstract_type, value =
|
270
|
-
if value.is_a?(Symbol) && value ==
|
325
|
+
def resolve_type(abstract_type, value = NOT_CONFIGURED)
|
326
|
+
if value.is_a?(Symbol) && value == NOT_CONFIGURED
|
271
327
|
# Old method signature
|
272
328
|
value = abstract_type
|
273
329
|
abstract_type = nil
|
@@ -301,10 +357,8 @@ module GraphQL
|
|
301
357
|
end
|
302
358
|
|
303
359
|
# @api private
|
304
|
-
def
|
305
|
-
schema.
|
306
|
-
yield
|
307
|
-
end
|
360
|
+
def handle_or_reraise(err)
|
361
|
+
schema.handle_or_reraise(context, err)
|
308
362
|
end
|
309
363
|
|
310
364
|
private
|
@@ -321,12 +375,11 @@ module GraphQL
|
|
321
375
|
|
322
376
|
def prepare_ast
|
323
377
|
@prepared_ast = true
|
324
|
-
@warden
|
325
|
-
|
378
|
+
@warden ||= GraphQL::Schema::Warden.new(@filter, schema: @schema, context: @context)
|
326
379
|
parse_error = nil
|
327
380
|
@document ||= begin
|
328
381
|
if query_string
|
329
|
-
GraphQL.parse(query_string,
|
382
|
+
GraphQL.parse(query_string, trace: self.current_trace)
|
330
383
|
end
|
331
384
|
rescue GraphQL::ParseError => err
|
332
385
|
parse_error = err
|
@@ -375,7 +428,6 @@ module GraphQL
|
|
375
428
|
|
376
429
|
@validation_pipeline = GraphQL::Query::ValidationPipeline.new(
|
377
430
|
query: self,
|
378
|
-
validate: @validate,
|
379
431
|
parse_error: parse_error,
|
380
432
|
operation_name_error: operation_name_error,
|
381
433
|
max_depth: @max_depth,
|
data/lib/graphql/railtie.rb
CHANGED
@@ -1,108 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
3
|
-
|
4
2
|
module GraphQL
|
5
3
|
class Railtie < Rails::Railtie
|
6
|
-
|
7
|
-
#
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
namespace :graphql do
|
14
|
-
task :upgrade, [:dir] do |t, args|
|
15
|
-
unless (dir = args[:dir])
|
16
|
-
fail 'You have to give me a directory where your GraphQL schema and types live. ' \
|
17
|
-
'For example: `bin/rake graphql:upgrade[app/graphql/**/*]`'
|
18
|
-
end
|
19
|
-
|
20
|
-
Dir[dir].each do |file|
|
21
|
-
# Members (types, interfaces, etc.)
|
22
|
-
if file =~ /.*_(type|interface|enum|union|)\.rb$/
|
23
|
-
Rake::Task["graphql:upgrade:member"].execute(Struct.new(:member_file).new(file))
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
puts "Upgrade complete! Note that this is a best-effort approach, and may very well contain some bugs."
|
28
|
-
puts "Don't forget to create the base objects. For example, you could run:"
|
29
|
-
puts "\tbin/rake graphql:upgrade:create_base_objects[app/graphql]"
|
30
|
-
end
|
31
|
-
|
32
|
-
namespace :upgrade do
|
33
|
-
task :create_base_objects, [:base_dir] do |t, args|
|
34
|
-
unless (base_dir = args[:base_dir])
|
35
|
-
fail 'You have to give me a directory where your GraphQL types live. ' \
|
36
|
-
'For example: `bin/rake graphql:upgrade:create_base_objects[app/graphql]`'
|
37
|
-
end
|
38
|
-
|
39
|
-
destination_file = File.join(base_dir, "types", "base_scalar.rb")
|
40
|
-
unless File.exists?(destination_file)
|
41
|
-
FileUtils.mkdir_p(File.dirname(destination_file))
|
42
|
-
File.open(destination_file, 'w') do |f|
|
43
|
-
f.puts "class Types::BaseScalar < GraphQL::Schema::Scalar\nend"
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
destination_file = File.join(base_dir, "types", "base_input_object.rb")
|
48
|
-
unless File.exists?(destination_file)
|
49
|
-
FileUtils.mkdir_p(File.dirname(destination_file))
|
50
|
-
File.open(destination_file, 'w') do |f|
|
51
|
-
f.puts "class Types::BaseInputObject < GraphQL::Schema::InputObject\nend"
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
destination_file = File.join(base_dir, "types", "base_enum.rb")
|
56
|
-
unless File.exists?(destination_file)
|
57
|
-
FileUtils.mkdir_p(File.dirname(destination_file))
|
58
|
-
File.open(destination_file, 'w') do |f|
|
59
|
-
f.puts "class Types::BaseEnum < GraphQL::Schema::Enum\nend"
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
destination_file = File.join(base_dir, "types", "base_union.rb")
|
64
|
-
unless File.exists?(destination_file)
|
65
|
-
FileUtils.mkdir_p(File.dirname(destination_file))
|
66
|
-
File.open(destination_file, 'w') do |f|
|
67
|
-
f.puts "class Types::BaseUnion < GraphQL::Schema::Union\nend"
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
destination_file = File.join(base_dir, "types", "base_interface.rb")
|
72
|
-
unless File.exists?(destination_file)
|
73
|
-
FileUtils.mkdir_p(File.dirname(destination_file))
|
74
|
-
File.open(destination_file, 'w') do |f|
|
75
|
-
f.puts "module Types::BaseInterface\n include GraphQL::Schema::Interface\nend"
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
destination_file = File.join(base_dir, "types", "base_object.rb")
|
80
|
-
unless File.exists?(destination_file)
|
81
|
-
File.open(destination_file, 'w') do |f|
|
82
|
-
f.puts "class Types::BaseObject < GraphQL::Schema::Object\nend"
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
task :schema, [:schema_file] do |t, args|
|
88
|
-
schema_file = args.schema_file
|
89
|
-
load_upgraders
|
90
|
-
upgrader = GraphQL::Upgrader::Schema.new File.read(schema_file)
|
91
|
-
|
92
|
-
puts "- Transforming schema #{schema_file}"
|
93
|
-
File.open(schema_file, 'w') { |f| f.write upgrader.upgrade }
|
94
|
-
end
|
95
|
-
|
96
|
-
task :member, [:member_file] do |t, args|
|
97
|
-
member_file = args.member_file
|
98
|
-
load_upgraders
|
99
|
-
upgrader = GraphQL::Upgrader::Member.new File.read(member_file)
|
100
|
-
next unless upgrader.upgradeable?
|
101
|
-
|
102
|
-
puts "- Transforming member #{member_file}"
|
103
|
-
File.open(member_file, 'w') { |f| f.write upgrader.upgrade }
|
104
|
-
end
|
105
|
-
end
|
4
|
+
config.before_configuration do
|
5
|
+
# Bootsnap compile cache has similar expiration properties,
|
6
|
+
# so we assume that if the user has bootsnap setup it's ok
|
7
|
+
# to piggy back on it.
|
8
|
+
if ::Object.const_defined?("Bootsnap::CompileCache::ISeq") && Bootsnap::CompileCache::ISeq.cache_dir
|
9
|
+
Language::Parser.cache ||= Language::Cache.new(Pathname.new(Bootsnap::CompileCache::ISeq.cache_dir).join('graphql'))
|
106
10
|
end
|
107
11
|
end
|
108
12
|
end
|
@@ -7,12 +7,15 @@ module GraphQL
|
|
7
7
|
desc "Get the checksum of a graphql-pro version and compare it to published versions on GitHub and graphql-ruby.org"
|
8
8
|
task "graphql:pro:validate", [:gem_version] do |t, args|
|
9
9
|
version = args[:gem_version]
|
10
|
+
if version.nil?
|
11
|
+
raise ArgumentError, "A specific version is required, eg `rake graphql:pro:validate[1.12.0]`"
|
12
|
+
end
|
10
13
|
check = "\e[32m✓\e[0m"
|
11
14
|
ex = "\e[31m✘\e[0m"
|
12
15
|
puts "Validating graphql-pro v#{version}"
|
13
16
|
puts " - Checking for graphql-pro credentials..."
|
14
17
|
|
15
|
-
creds = `bundle config gems.graphql.pro`[/[a-z0-9]{11}:[a-z0-9]{11}/]
|
18
|
+
creds = `bundle config gems.graphql.pro --parseable`[/[a-z0-9]{11}:[a-z0-9]{11}/]
|
16
19
|
if creds.nil?
|
17
20
|
puts " #{ex} failed, please set with `bundle config gems.graphql.pro $MY_CREDENTIALS`"
|
18
21
|
exit(1)
|