graphql 1.9.17 → 2.0.20
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/traced_error.rb +0 -1
- data/lib/graphql/backtrace/tracer.rb +39 -9
- data/lib/graphql/backtrace.rb +20 -17
- 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 +105 -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 +773 -399
- 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 +1 -1
- 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 +113 -71
- data/lib/graphql/language/lexer.rb +216 -1462
- data/lib/graphql/language/nodes.rb +128 -131
- data/lib/graphql/language/parser.rb +957 -912
- data/lib/graphql/language/parser.y +148 -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 +204 -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 +21 -8
- 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 +88 -40
- 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 +284 -33
- 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 +336 -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 +20 -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 +503 -331
- data/lib/graphql/schema/field_extension.rb +89 -2
- data/lib/graphql/schema/find_inherited_value.rb +17 -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 +120 -0
- data/lib/graphql/schema/member/has_fields.rb +112 -34
- 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 +211 -35
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +833 -889
- 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 +5 -5
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +94 -51
- 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 +71 -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/new_relic_trace.rb +75 -0
- data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
- data/lib/graphql/tracing/notifications_trace.rb +41 -0
- data/lib/graphql/tracing/notifications_tracing.rb +59 -0
- data/lib/graphql/tracing/platform_trace.rb +107 -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 +4 -1
- 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.rb +143 -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 +60 -66
- data/readme.md +3 -6
- metadata +124 -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,37 @@ 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)
|
103
|
+
context_tracers += [GraphQL::Backtrace::Tracer]
|
96
104
|
@tracers << GraphQL::Backtrace::Tracer
|
97
105
|
end
|
98
106
|
|
107
|
+
if context_tracers.any? && !(schema.trace_class <= GraphQL::Tracing::LegacyTrace)
|
108
|
+
raise ArgumentError, "context[:tracers] and context[:backtrace] are not supported without `tracer_class(GraphQL::Tracing::LegacyTrace)` in the schema configuration, please add it."
|
109
|
+
end
|
110
|
+
|
111
|
+
|
99
112
|
@analysis_errors = []
|
100
113
|
if variables.is_a?(String)
|
101
114
|
raise ArgumentError, "Query variables should be a Hash, not a String. Try JSON.parse to prepare variables."
|
102
115
|
else
|
103
|
-
@provided_variables = variables
|
116
|
+
@provided_variables = variables || {}
|
104
117
|
end
|
105
118
|
|
106
119
|
@query_string = query_string || query
|
@@ -110,6 +123,10 @@ module GraphQL
|
|
110
123
|
raise ArgumentError, "Query should only be provided a query string or a document, not both."
|
111
124
|
end
|
112
125
|
|
126
|
+
if @query_string && !@query_string.is_a?(String)
|
127
|
+
raise ArgumentError, "Query string argument should be a String, got #{@query_string.class.name} instead."
|
128
|
+
end
|
129
|
+
|
113
130
|
# A two-layer cache of type resolution:
|
114
131
|
# { abstract_type => { value => resolved_type } }
|
115
132
|
@resolved_types_cache = Hash.new do |h1, k1|
|
@@ -118,8 +135,6 @@ module GraphQL
|
|
118
135
|
end
|
119
136
|
end
|
120
137
|
|
121
|
-
@arguments_cache = ArgumentsCache.build(self)
|
122
|
-
|
123
138
|
# Trying to execute a document
|
124
139
|
# with no operations returns an empty hash
|
125
140
|
@ast_variables = []
|
@@ -134,7 +149,6 @@ module GraphQL
|
|
134
149
|
@executed = false
|
135
150
|
|
136
151
|
# TODO add a general way to define schema-level filters
|
137
|
-
# TODO also add this to schema dumps
|
138
152
|
if @schema.respond_to?(:visible?)
|
139
153
|
merge_filters(only: @schema.method(:visible?))
|
140
154
|
end
|
@@ -145,7 +159,16 @@ module GraphQL
|
|
145
159
|
@query_string ||= (document ? document.to_query_string : nil)
|
146
160
|
end
|
147
161
|
|
148
|
-
|
162
|
+
def interpreter?
|
163
|
+
true
|
164
|
+
end
|
165
|
+
|
166
|
+
attr_accessor :multiplex
|
167
|
+
|
168
|
+
# @return [GraphQL::Tracing::Trace]
|
169
|
+
def current_trace
|
170
|
+
@current_trace ||= multiplex ? multiplex.current_trace : schema.new_trace(multiplex: multiplex, query: self)
|
171
|
+
end
|
149
172
|
|
150
173
|
def subscription_update?
|
151
174
|
@subscription_topic && subscription?
|
@@ -157,7 +180,6 @@ module GraphQL
|
|
157
180
|
@lookahead ||= begin
|
158
181
|
ast_node = selected_operation
|
159
182
|
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
183
|
GraphQL::Execution::Lookahead.new(query: self, root_type: root_type, ast_nodes: [ast_node])
|
162
184
|
end
|
163
185
|
end
|
@@ -187,9 +209,7 @@ module GraphQL
|
|
187
209
|
# @return [Hash] A GraphQL response, with `"data"` and/or `"errors"` keys
|
188
210
|
def result
|
189
211
|
if !@executed
|
190
|
-
|
191
|
-
Execution::Multiplex.run_queries(@schema, [self], context: @context)
|
192
|
-
}
|
212
|
+
Execution::Interpreter.run_all(@schema, [self], context: @context)
|
193
213
|
end
|
194
214
|
@result ||= Query::Result.new(query: self, values: @result_values)
|
195
215
|
end
|
@@ -227,28 +247,60 @@ module GraphQL
|
|
227
247
|
end
|
228
248
|
end
|
229
249
|
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
end
|
250
|
+
# Node-level cache for calculating arguments. Used during execution and query analysis.
|
251
|
+
# @param ast_node [GraphQL::Language::Nodes::AbstractNode]
|
252
|
+
# @param definition [GraphQL::Schema::Field]
|
253
|
+
# @param parent_object [GraphQL::Schema::Object]
|
254
|
+
# @return Hash{Symbol => Object}
|
255
|
+
def arguments_for(ast_node, definition, parent_object: nil)
|
256
|
+
arguments_cache.fetch(ast_node, definition, parent_object)
|
238
257
|
end
|
239
258
|
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
259
|
+
def arguments_cache
|
260
|
+
@arguments_cache ||= Execution::Interpreter::ArgumentsCache.new(self)
|
261
|
+
end
|
262
|
+
|
263
|
+
# A version of the given query string, with:
|
264
|
+
# - Variables inlined to the query
|
265
|
+
# - Strings replaced with `<REDACTED>`
|
266
|
+
# @return [String, nil] Returns nil if the query is invalid.
|
267
|
+
def sanitized_query_string(inline_variables: true)
|
268
|
+
with_prepared_ast {
|
269
|
+
schema.sanitized_printer.new(self, inline_variables: inline_variables).sanitized_query_string
|
270
|
+
}
|
271
|
+
end
|
272
|
+
|
273
|
+
# This contains a few components:
|
274
|
+
#
|
275
|
+
# - The selected operation name (or `anonymous`)
|
276
|
+
# - The fingerprint of the query string
|
277
|
+
# - The number of given variables (for readability)
|
278
|
+
# - The fingerprint of the given variables
|
279
|
+
#
|
280
|
+
# This fingerprint can be used to track runs of the same operation-variables combination over time.
|
281
|
+
#
|
282
|
+
# @see operation_fingerprint
|
283
|
+
# @see variables_fingerprint
|
284
|
+
# @return [String] An opaque hash identifying this operation-variables combination
|
285
|
+
def fingerprint
|
286
|
+
@fingerprint ||= "#{operation_fingerprint}/#{variables_fingerprint}"
|
287
|
+
end
|
288
|
+
|
289
|
+
# @return [String] An opaque hash for identifying this query's given query string and selected operation
|
290
|
+
def operation_fingerprint
|
291
|
+
@operation_fingerprint ||= "#{selected_operation_name || "anonymous"}/#{Fingerprint.generate(query_string)}"
|
292
|
+
end
|
293
|
+
|
294
|
+
# @return [String] An opaque hash for identifying this query's given a variable values (not including defaults)
|
295
|
+
def variables_fingerprint
|
296
|
+
@variables_fingerprint ||= "#{provided_variables.size}/#{Fingerprint.generate(provided_variables.to_json)}"
|
245
297
|
end
|
246
298
|
|
247
299
|
def validation_pipeline
|
248
300
|
with_prepared_ast { @validation_pipeline }
|
249
301
|
end
|
250
302
|
|
251
|
-
def_delegators :validation_pipeline, :validation_errors,
|
303
|
+
def_delegators :validation_pipeline, :validation_errors,
|
252
304
|
:analyzers, :ast_analyzers, :max_depth, :max_complexity
|
253
305
|
|
254
306
|
attr_accessor :analysis_errors
|
@@ -301,10 +353,8 @@ module GraphQL
|
|
301
353
|
end
|
302
354
|
|
303
355
|
# @api private
|
304
|
-
def
|
305
|
-
schema.
|
306
|
-
yield
|
307
|
-
end
|
356
|
+
def handle_or_reraise(err)
|
357
|
+
schema.handle_or_reraise(context, err)
|
308
358
|
end
|
309
359
|
|
310
360
|
private
|
@@ -321,12 +371,11 @@ module GraphQL
|
|
321
371
|
|
322
372
|
def prepare_ast
|
323
373
|
@prepared_ast = true
|
324
|
-
@warden
|
325
|
-
|
374
|
+
@warden ||= GraphQL::Schema::Warden.new(@filter, schema: @schema, context: @context)
|
326
375
|
parse_error = nil
|
327
376
|
@document ||= begin
|
328
377
|
if query_string
|
329
|
-
GraphQL.parse(query_string,
|
378
|
+
GraphQL.parse(query_string, trace: self.current_trace)
|
330
379
|
end
|
331
380
|
rescue GraphQL::ParseError => err
|
332
381
|
parse_error = err
|
@@ -375,7 +424,6 @@ module GraphQL
|
|
375
424
|
|
376
425
|
@validation_pipeline = GraphQL::Query::ValidationPipeline.new(
|
377
426
|
query: self,
|
378
|
-
validate: @validate,
|
379
427
|
parse_error: parse_error,
|
380
428
|
operation_name_error: operation_name_error,
|
381
429
|
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)
|