graphql 1.12.12 → 2.4.8
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 +3 -8
- 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 +60 -4
- data/lib/generators/graphql/interface_generator.rb +7 -7
- 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 +5 -30
- data/lib/generators/graphql/mutation_update_generator.rb +22 -0
- data/lib/generators/graphql/object_generator.rb +10 -38
- data/lib/generators/graphql/orm_mutations_base.rb +40 -0
- data/lib/generators/graphql/relay.rb +23 -12
- 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 +2 -0
- data/lib/generators/graphql/templates/base_edge.erb +2 -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_resolver.erb +8 -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 +5 -1
- data/lib/generators/graphql/templates/graphql_controller.erb +2 -0
- data/lib/generators/graphql/templates/input.erb +9 -0
- data/lib/generators/graphql/templates/interface.erb +4 -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 +2 -0
- data/lib/generators/graphql/templates/object.erb +4 -2
- data/lib/generators/graphql/templates/query_type.erb +2 -0
- data/lib/generators/graphql/templates/scalar.erb +3 -1
- data/lib/generators/graphql/templates/schema.erb +22 -2
- data/lib/generators/graphql/templates/union.erb +4 -2
- data/lib/generators/graphql/type_generator.rb +46 -10
- data/lib/generators/graphql/union_generator.rb +5 -5
- data/lib/graphql/analysis/analyzer.rb +89 -0
- data/lib/graphql/analysis/field_usage.rb +65 -28
- data/lib/graphql/analysis/max_query_complexity.rb +11 -17
- data/lib/graphql/analysis/max_query_depth.rb +13 -19
- data/lib/graphql/analysis/query_complexity.rb +156 -61
- data/lib/graphql/analysis/query_depth.rb +38 -23
- data/lib/graphql/analysis/visitor.rb +283 -0
- data/lib/graphql/analysis.rb +90 -6
- data/lib/graphql/autoload.rb +38 -0
- data/lib/graphql/backtrace/inspect_result.rb +0 -12
- data/lib/graphql/backtrace/table.rb +4 -22
- data/lib/graphql/backtrace/trace.rb +93 -0
- data/lib/graphql/backtrace/tracer.rb +8 -6
- data/lib/graphql/backtrace.rb +3 -8
- data/lib/graphql/coercion_error.rb +1 -9
- data/lib/graphql/current.rb +52 -0
- data/lib/graphql/dataloader/async_dataloader.rb +89 -0
- data/lib/graphql/dataloader/null_dataloader.rb +4 -2
- data/lib/graphql/dataloader/request.rb +5 -0
- data/lib/graphql/dataloader/source.rb +125 -33
- data/lib/graphql/dataloader.rb +193 -143
- data/lib/graphql/date_encoding_error.rb +16 -0
- data/lib/graphql/dig.rb +1 -1
- data/lib/graphql/duration_encoding_error.rb +16 -0
- data/lib/graphql/execution/errors.rb +12 -81
- data/lib/graphql/execution/interpreter/argument_value.rb +5 -1
- data/lib/graphql/execution/interpreter/arguments.rb +2 -2
- data/lib/graphql/execution/interpreter/arguments_cache.rb +33 -36
- data/lib/graphql/execution/interpreter/resolve.rb +38 -4
- data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +175 -0
- data/lib/graphql/execution/interpreter/runtime.rb +447 -403
- data/lib/graphql/execution/interpreter.rb +126 -80
- data/lib/graphql/execution/lazy.rb +11 -21
- data/lib/graphql/execution/lookahead.rb +133 -55
- data/lib/graphql/execution/multiplex.rb +4 -172
- data/lib/graphql/execution.rb +11 -4
- data/lib/graphql/integer_encoding_error.rb +18 -2
- data/lib/graphql/introspection/directive_location_enum.rb +2 -2
- data/lib/graphql/introspection/directive_type.rb +6 -4
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +11 -18
- data/lib/graphql/introspection/enum_value_type.rb +2 -2
- data/lib/graphql/introspection/field_type.rb +4 -4
- data/lib/graphql/introspection/input_value_type.rb +10 -4
- data/lib/graphql/introspection/schema_type.rb +17 -15
- data/lib/graphql/introspection/type_type.rb +29 -16
- data/lib/graphql/introspection.rb +6 -2
- data/lib/graphql/invalid_null_error.rb +1 -1
- data/lib/graphql/language/block_string.rb +37 -25
- data/lib/graphql/language/cache.rb +13 -0
- data/lib/graphql/language/comment.rb +18 -0
- data/lib/graphql/language/definition_slice.rb +1 -1
- data/lib/graphql/language/document_from_schema_definition.rb +122 -81
- data/lib/graphql/language/lexer.rb +364 -1467
- data/lib/graphql/language/nodes.rb +197 -106
- data/lib/graphql/language/parser.rb +799 -1920
- data/lib/graphql/language/printer.rb +372 -160
- data/lib/graphql/language/sanitized_printer.rb +25 -27
- data/lib/graphql/language/static_visitor.rb +167 -0
- data/lib/graphql/language/visitor.rb +188 -141
- data/lib/graphql/language.rb +62 -1
- data/lib/graphql/load_application_object_failed_error.rb +5 -1
- data/lib/graphql/name_validator.rb +0 -4
- data/lib/graphql/pagination/active_record_relation_connection.rb +37 -8
- data/lib/graphql/pagination/array_connection.rb +8 -6
- data/lib/graphql/pagination/connection.rb +61 -7
- data/lib/graphql/pagination/connections.rb +22 -23
- data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -2
- data/lib/graphql/pagination/relation_connection.rb +60 -28
- data/lib/graphql/query/context/scoped_context.rb +101 -0
- data/lib/graphql/query/context.rb +146 -222
- data/lib/graphql/query/input_validation_result.rb +10 -1
- data/lib/graphql/query/null_context.rb +15 -32
- data/lib/graphql/query/validation_pipeline.rb +15 -39
- data/lib/graphql/query/variable_validation_error.rb +3 -3
- data/lib/graphql/query/variables.rb +35 -17
- data/lib/graphql/query.rb +149 -82
- data/lib/graphql/railtie.rb +15 -109
- data/lib/graphql/rake_task/validate.rb +1 -1
- data/lib/graphql/rake_task.rb +30 -11
- data/lib/graphql/relay/range_add.rb +9 -16
- 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/graphql/field_type_in_block.rb +144 -0
- data/lib/graphql/rubocop/graphql/root_types_in_block.rb +38 -0
- data/lib/graphql/rubocop.rb +6 -0
- data/lib/graphql/schema/addition.rb +98 -54
- data/lib/graphql/schema/always_visible.rb +14 -0
- data/lib/graphql/schema/argument.rb +179 -82
- data/lib/graphql/schema/base_64_encoder.rb +3 -5
- data/lib/graphql/schema/build_from_definition.rb +77 -39
- data/lib/graphql/schema/directive/feature.rb +1 -1
- data/lib/graphql/schema/directive/flagged.rb +4 -4
- data/lib/graphql/schema/directive/include.rb +1 -1
- data/lib/graphql/schema/directive/one_of.rb +24 -0
- data/lib/graphql/schema/directive/skip.rb +1 -1
- data/lib/graphql/schema/directive/specified_by.rb +14 -0
- data/lib/graphql/schema/directive/transform.rb +2 -2
- data/lib/graphql/schema/directive.rb +36 -22
- data/lib/graphql/schema/enum.rb +158 -63
- data/lib/graphql/schema/enum_value.rb +12 -21
- data/lib/graphql/schema/field/connection_extension.rb +7 -17
- data/lib/graphql/schema/field/scope_extension.rb +8 -1
- data/lib/graphql/schema/field.rb +521 -359
- data/lib/graphql/schema/field_extension.rb +86 -2
- data/lib/graphql/schema/find_inherited_value.rb +3 -7
- data/lib/graphql/schema/finder.rb +5 -5
- data/lib/graphql/schema/has_single_input_argument.rb +160 -0
- data/lib/graphql/schema/input_object.rb +148 -99
- data/lib/graphql/schema/interface.rb +41 -64
- data/lib/graphql/schema/introspection_system.rb +12 -26
- data/lib/graphql/schema/late_bound_type.rb +12 -2
- data/lib/graphql/schema/list.rb +18 -7
- data/lib/graphql/schema/loader.rb +6 -5
- data/lib/graphql/schema/member/base_dsl_methods.rb +32 -18
- data/lib/graphql/schema/member/build_type.rb +16 -13
- data/lib/graphql/schema/member/has_arguments.rb +270 -86
- data/lib/graphql/schema/member/has_ast_node.rb +12 -0
- data/lib/graphql/schema/member/has_deprecation_reason.rb +3 -4
- data/lib/graphql/schema/member/has_directives.rb +81 -61
- data/lib/graphql/schema/member/has_fields.rb +169 -31
- data/lib/graphql/schema/member/has_interfaces.rb +143 -0
- data/lib/graphql/schema/member/has_unresolved_type_error.rb +5 -1
- data/lib/graphql/schema/member/has_validators.rb +32 -6
- data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
- data/lib/graphql/schema/member/scoped.rb +19 -0
- data/lib/graphql/schema/member/type_system_helpers.rb +16 -0
- data/lib/graphql/schema/member/validates_input.rb +6 -6
- data/lib/graphql/schema/member.rb +1 -6
- data/lib/graphql/schema/mutation.rb +7 -9
- data/lib/graphql/schema/non_null.rb +7 -7
- data/lib/graphql/schema/object.rb +38 -119
- data/lib/graphql/schema/printer.rb +24 -25
- data/lib/graphql/schema/relay_classic_mutation.rb +13 -91
- data/lib/graphql/schema/resolver/has_payload_type.rb +46 -11
- data/lib/graphql/schema/resolver.rb +118 -115
- data/lib/graphql/schema/scalar.rb +20 -21
- data/lib/graphql/schema/subscription.rb +95 -21
- data/lib/graphql/schema/timeout.rb +25 -29
- data/lib/graphql/schema/type_expression.rb +2 -2
- data/lib/graphql/schema/type_membership.rb +21 -4
- data/lib/graphql/schema/union.rb +16 -16
- data/lib/graphql/schema/unique_within_type.rb +1 -1
- data/lib/graphql/schema/validator/all_validator.rb +62 -0
- 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 +3 -1
- data/lib/graphql/schema/validator/format_validator.rb +4 -5
- data/lib/graphql/schema/validator/inclusion_validator.rb +3 -1
- data/lib/graphql/schema/validator/length_validator.rb +5 -3
- data/lib/graphql/schema/validator/numericality_validator.rb +13 -2
- data/lib/graphql/schema/validator/required_validator.rb +56 -18
- data/lib/graphql/schema/validator.rb +38 -28
- data/lib/graphql/schema/visibility/migration.rb +188 -0
- data/lib/graphql/schema/visibility/profile.rb +359 -0
- data/lib/graphql/schema/visibility/visit.rb +190 -0
- data/lib/graphql/schema/visibility.rb +294 -0
- data/lib/graphql/schema/warden.rb +423 -134
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +1015 -1057
- data/lib/graphql/static_validation/all_rules.rb +3 -1
- data/lib/graphql/static_validation/base_visitor.rb +15 -28
- 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 +24 -7
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +1 -1
- data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +1 -1
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +4 -3
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +13 -7
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +15 -13
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +12 -2
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +13 -5
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +62 -35
- 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/fragment_types_exist.rb +12 -2
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
- data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +1 -1
- data/lib/graphql/static_validation/rules/mutation_root_exists.rb +1 -1
- data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +1 -1
- 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 +7 -5
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +5 -5
- data/lib/graphql/static_validation/rules/subscription_root_exists.rb +1 -1
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +14 -8
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +18 -27
- data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +1 -1
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +14 -8
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +11 -2
- data/lib/graphql/static_validation/validation_context.rb +32 -6
- data/lib/graphql/static_validation/validator.rb +11 -27
- data/lib/graphql/static_validation.rb +0 -3
- data/lib/graphql/string_encoding_error.rb +13 -3
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +49 -11
- data/lib/graphql/subscriptions/broadcast_analyzer.rb +11 -5
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +40 -1
- data/lib/graphql/subscriptions/event.rb +87 -38
- data/lib/graphql/subscriptions/serialize.rb +27 -3
- data/lib/graphql/subscriptions.rb +63 -49
- data/lib/graphql/testing/helpers.rb +155 -0
- data/lib/graphql/testing.rb +2 -0
- data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +6 -20
- data/lib/graphql/tracing/appoptics_trace.rb +253 -0
- data/lib/graphql/tracing/appoptics_tracing.rb +4 -2
- data/lib/graphql/tracing/appsignal_trace.rb +79 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +17 -0
- data/lib/graphql/tracing/call_legacy_tracers.rb +66 -0
- data/lib/graphql/tracing/data_dog_trace.rb +185 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +27 -15
- data/lib/graphql/{execution/instrumentation.rb → tracing/legacy_hooks_trace.rb} +11 -28
- data/lib/graphql/tracing/legacy_trace.rb +12 -0
- data/lib/graphql/tracing/new_relic_trace.rb +77 -0
- data/lib/graphql/tracing/new_relic_tracing.rb +2 -0
- data/lib/graphql/tracing/notifications_trace.rb +45 -0
- data/lib/graphql/tracing/notifications_tracing.rb +61 -0
- data/lib/graphql/tracing/null_trace.rb +9 -0
- data/lib/graphql/tracing/platform_trace.rb +118 -0
- data/lib/graphql/tracing/platform_tracing.rb +46 -49
- data/lib/graphql/tracing/{prometheus_tracing → prometheus_trace}/graphql_collector.rb +6 -2
- data/lib/graphql/tracing/prometheus_trace.rb +94 -0
- data/lib/graphql/tracing/prometheus_tracing.rb +5 -3
- data/lib/graphql/tracing/scout_trace.rb +74 -0
- data/lib/graphql/tracing/scout_tracing.rb +2 -0
- data/lib/graphql/tracing/sentry_trace.rb +114 -0
- data/lib/graphql/tracing/statsd_trace.rb +58 -0
- data/lib/graphql/tracing/statsd_tracing.rb +2 -0
- data/lib/graphql/tracing/trace.rb +79 -0
- data/lib/graphql/tracing.rb +29 -52
- data/lib/graphql/type_kinds.rb +7 -4
- data/lib/graphql/types/big_int.rb +5 -1
- data/lib/graphql/types/int.rb +1 -1
- data/lib/graphql/types/iso_8601_date.rb +17 -6
- data/lib/graphql/types/iso_8601_date_time.rb +12 -1
- data/lib/graphql/types/iso_8601_duration.rb +77 -0
- data/lib/graphql/types/relay/base_connection.rb +16 -6
- data/lib/graphql/types/relay/connection_behaviors.rb +92 -32
- data/lib/graphql/types/relay/edge_behaviors.rb +46 -7
- data/lib/graphql/types/relay/has_node_field.rb +2 -2
- data/lib/graphql/types/relay/has_nodes_field.rb +2 -2
- data/lib/graphql/types/relay/node_behaviors.rb +12 -2
- data/lib/graphql/types/relay/page_info_behaviors.rb +11 -2
- data/lib/graphql/types/relay.rb +0 -3
- data/lib/graphql/types/string.rb +2 -2
- data/lib/graphql/types.rb +18 -10
- data/lib/graphql/unauthorized_enum_value_error.rb +13 -0
- data/lib/graphql/unauthorized_error.rb +1 -1
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +82 -137
- data/readme.md +13 -6
- metadata +127 -186
- data/lib/graphql/analysis/analyze_query.rb +0 -98
- data/lib/graphql/analysis/ast/analyzer.rb +0 -84
- data/lib/graphql/analysis/ast/field_usage.rb +0 -28
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -23
- data/lib/graphql/analysis/ast/max_query_depth.rb +0 -22
- data/lib/graphql/analysis/ast/query_complexity.rb +0 -234
- data/lib/graphql/analysis/ast/query_depth.rb +0 -56
- data/lib/graphql/analysis/ast/visitor.rb +0 -268
- data/lib/graphql/analysis/ast.rb +0 -91
- data/lib/graphql/analysis/reducer_state.rb +0 -48
- data/lib/graphql/argument.rb +0 -131
- data/lib/graphql/authorization.rb +0 -82
- data/lib/graphql/backtrace/legacy_tracer.rb +0 -56
- data/lib/graphql/backwards_compatibility.rb +0 -61
- data/lib/graphql/base_type.rb +0 -230
- data/lib/graphql/boolean_type.rb +0 -2
- data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
- data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
- data/lib/graphql/compatibility/execution_specification.rb +0 -436
- data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
- data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -215
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -87
- data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
- data/lib/graphql/compatibility/query_parser_specification.rb +0 -266
- data/lib/graphql/compatibility/schema_parser_specification.rb +0 -682
- data/lib/graphql/compatibility.rb +0 -5
- data/lib/graphql/define/assign_argument.rb +0 -12
- data/lib/graphql/define/assign_connection.rb +0 -13
- data/lib/graphql/define/assign_enum_value.rb +0 -18
- data/lib/graphql/define/assign_global_id_field.rb +0 -11
- data/lib/graphql/define/assign_mutation_function.rb +0 -34
- data/lib/graphql/define/assign_object_field.rb +0 -42
- data/lib/graphql/define/defined_object_proxy.rb +0 -53
- data/lib/graphql/define/instance_definable.rb +0 -240
- 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 -47
- data/lib/graphql/deprecation.rb +0 -13
- data/lib/graphql/directive/deprecated_directive.rb +0 -2
- data/lib/graphql/directive/include_directive.rb +0 -2
- data/lib/graphql/directive/skip_directive.rb +0 -2
- data/lib/graphql/directive.rb +0 -111
- data/lib/graphql/enum_type.rb +0 -129
- data/lib/graphql/execution/execute.rb +0 -333
- data/lib/graphql/execution/flatten.rb +0 -40
- 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 -226
- data/lib/graphql/filter.rb +0 -53
- data/lib/graphql/float_type.rb +0 -2
- data/lib/graphql/function.rb +0 -128
- data/lib/graphql/id_type.rb +0 -2
- data/lib/graphql/input_object_type.rb +0 -138
- data/lib/graphql/int_type.rb +0 -2
- data/lib/graphql/interface_type.rb +0 -72
- 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 -262
- data/lib/graphql/language/parser.y +0 -543
- data/lib/graphql/language/token.rb +0 -38
- data/lib/graphql/list_type.rb +0 -80
- data/lib/graphql/non_null_type.rb +0 -71
- data/lib/graphql/object_type.rb +0 -130
- data/lib/graphql/query/arguments.rb +0 -189
- data/lib/graphql/query/arguments_cache.rb +0 -24
- data/lib/graphql/query/executor.rb +0 -52
- data/lib/graphql/query/literal_input.rb +0 -136
- data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
- data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
- data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
- data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
- data/lib/graphql/query/serial_execution.rb +0 -40
- data/lib/graphql/relay/array_connection.rb +0 -83
- data/lib/graphql/relay/base_connection.rb +0 -189
- data/lib/graphql/relay/connection_instrumentation.rb +0 -54
- data/lib/graphql/relay/connection_resolve.rb +0 -43
- data/lib/graphql/relay/connection_type.rb +0 -41
- data/lib/graphql/relay/edge.rb +0 -27
- data/lib/graphql/relay/edge_type.rb +0 -19
- data/lib/graphql/relay/edges_instrumentation.rb +0 -40
- data/lib/graphql/relay/global_id_resolve.rb +0 -18
- data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
- data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
- data/lib/graphql/relay/mutation/resolve.rb +0 -56
- data/lib/graphql/relay/mutation/result.rb +0 -38
- data/lib/graphql/relay/mutation.rb +0 -106
- data/lib/graphql/relay/node.rb +0 -39
- data/lib/graphql/relay/page_info.rb +0 -7
- data/lib/graphql/relay/relation_connection.rb +0 -188
- data/lib/graphql/relay/type_extensions.rb +0 -32
- data/lib/graphql/scalar_type.rb +0 -91
- data/lib/graphql/schema/base_64_bp.rb +0 -26
- 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 -17
- data/lib/graphql/schema/invalid_type_error.rb +0 -7
- data/lib/graphql/schema/member/accepts_definition.rb +0 -152
- data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -31
- data/lib/graphql/schema/member/instrumentation.rb +0 -131
- data/lib/graphql/schema/middleware_chain.rb +0 -82
- data/lib/graphql/schema/possible_types.rb +0 -44
- data/lib/graphql/schema/rescue_middleware.rb +0 -60
- data/lib/graphql/schema/timeout_middleware.rb +0 -88
- data/lib/graphql/schema/traversal.rb +0 -228
- data/lib/graphql/schema/validation.rb +0 -313
- data/lib/graphql/static_validation/default_visitor.rb +0 -15
- data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
- data/lib/graphql/static_validation/type_stack.rb +0 -216
- data/lib/graphql/string_type.rb +0 -2
- data/lib/graphql/subscriptions/instrumentation.rb +0 -79
- data/lib/graphql/subscriptions/subscription_root.rb +0 -76
- data/lib/graphql/tracing/skylight_tracing.rb +0 -70
- data/lib/graphql/types/relay/default_relay.rb +0 -27
- data/lib/graphql/types/relay/node_field.rb +0 -25
- data/lib/graphql/types/relay/nodes_field.rb +0 -27
- data/lib/graphql/union_type.rb +0 -115
- data/lib/graphql/upgrader/member.rb +0 -937
- data/lib/graphql/upgrader/schema.rb +0 -38
@@ -14,41 +14,37 @@ 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
28
|
variable_type = schema.type_from_ast(ast_variable.type, context: ctx)
|
25
|
-
if variable_type.nil?
|
29
|
+
if variable_type.nil? || !variable_type.unwrap.kind.input?
|
26
30
|
# Pass -- it will get handled by a validator
|
27
31
|
else
|
28
32
|
variable_name = ast_variable.name
|
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)
|
36
|
+
max_errors = schema.validate_max_errors - @errors.count if schema.validate_max_errors
|
32
37
|
begin
|
33
|
-
validation_result = variable_type.validate_input(provided_value, ctx)
|
38
|
+
validation_result = variable_type.validate_input(provided_value, ctx, max_errors: max_errors)
|
34
39
|
if validation_result.valid?
|
35
40
|
if value_was_provided
|
36
41
|
# Add the variable if a value was provided
|
37
|
-
memo[variable_name] =
|
38
|
-
|
39
|
-
|
42
|
+
memo[variable_name] = provided_value
|
43
|
+
elsif default_value != nil
|
44
|
+
memo[variable_name] = if default_value.is_a?(Language::Nodes::NullValue)
|
40
45
|
nil
|
41
46
|
else
|
42
|
-
schema.error_handler.with_error_handling(context) do
|
43
|
-
variable_type.coerce_input(provided_value, ctx)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
elsif default_value != nil
|
47
|
-
memo[variable_name] = if ctx.interpreter?
|
48
47
|
default_value
|
49
|
-
else
|
50
|
-
# Add the variable if it wasn't provided but it has a default value (including `null`)
|
51
|
-
GraphQL::Query::LiteralInput.coerce(variable_type, default_value, self)
|
52
48
|
end
|
53
49
|
end
|
54
50
|
end
|
@@ -57,8 +53,7 @@ module GraphQL
|
|
57
53
|
# like InputValidationResults generated by validate_non_null_input but unfortunately we don't
|
58
54
|
# have this information available in the coerce_input call chain. Note this path is the path
|
59
55
|
# that appears under errors.extensions.problems.path and NOT the result path under errors.path.
|
60
|
-
validation_result = GraphQL::Query::InputValidationResult.
|
61
|
-
validation_result.add_problem(ex.message)
|
56
|
+
validation_result = GraphQL::Query::InputValidationResult.from_problem(ex.message)
|
62
57
|
end
|
63
58
|
|
64
59
|
if !validation_result.valid?
|
@@ -69,6 +64,29 @@ module GraphQL
|
|
69
64
|
end
|
70
65
|
|
71
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
|
72
90
|
end
|
73
91
|
end
|
74
92
|
end
|
data/lib/graphql/query.rb
CHANGED
@@ -1,24 +1,21 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require "graphql/query/arguments"
|
3
|
-
require "graphql/query/arguments_cache"
|
4
|
-
require "graphql/query/context"
|
5
|
-
require "graphql/query/executor"
|
6
|
-
require "graphql/query/fingerprint"
|
7
|
-
require "graphql/query/literal_input"
|
8
|
-
require "graphql/query/null_context"
|
9
|
-
require "graphql/query/result"
|
10
|
-
require "graphql/query/serial_execution"
|
11
|
-
require "graphql/query/variables"
|
12
|
-
require "graphql/query/input_validation_result"
|
13
|
-
require "graphql/query/variable_validation_error"
|
14
|
-
require "graphql/query/validation_pipeline"
|
15
2
|
|
16
3
|
module GraphQL
|
17
4
|
# A combination of query string and {Schema} instance which can be reduced to a {#result}.
|
18
5
|
class Query
|
6
|
+
extend Autoload
|
19
7
|
include Tracing::Traceable
|
20
8
|
extend Forwardable
|
21
9
|
|
10
|
+
autoload :Context, "graphql/query/context"
|
11
|
+
autoload :Fingerprint, "graphql/query/fingerprint"
|
12
|
+
autoload :NullContext, "graphql/query/null_context"
|
13
|
+
autoload :Result, "graphql/query/result"
|
14
|
+
autoload :Variables, "graphql/query/variables"
|
15
|
+
autoload :InputValidationResult, "graphql/query/input_validation_result"
|
16
|
+
autoload :VariableValidationError, "graphql/query/variable_validation_error"
|
17
|
+
autoload :ValidationPipeline, "graphql/query/validation_pipeline"
|
18
|
+
|
22
19
|
class OperationNameMissingError < GraphQL::ExecutionError
|
23
20
|
def initialize(name)
|
24
21
|
msg = if name.nil?
|
@@ -39,7 +36,30 @@ module GraphQL
|
|
39
36
|
attr_accessor :operation_name
|
40
37
|
|
41
38
|
# @return [Boolean] if false, static validation is skipped (execution behavior for invalid queries is undefined)
|
42
|
-
|
39
|
+
attr_reader :validate
|
40
|
+
|
41
|
+
# @param new_validate [Boolean] if false, static validation is skipped. This can't be reasssigned after validation.
|
42
|
+
def validate=(new_validate)
|
43
|
+
if defined?(@validation_pipeline) && @validation_pipeline && @validation_pipeline.has_validated?
|
44
|
+
raise ArgumentError, "Can't reassign Query#validate= after validation has run, remove this assignment."
|
45
|
+
else
|
46
|
+
@validate = new_validate
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# @return [GraphQL::StaticValidation::Validator] if present, the query will validate with these rules.
|
51
|
+
attr_reader :static_validator
|
52
|
+
|
53
|
+
# @param new_validate [GraphQL::StaticValidation::Validator] if present, the query will validate with these rules. This can't be reasssigned after validation.
|
54
|
+
def static_validator=(new_validator)
|
55
|
+
if defined?(@validation_pipeline) && @validation_pipeline && @validation_pipeline.has_validated?
|
56
|
+
raise ArgumentError, "Can't reassign Query#static_validator= after validation has run, remove this assignment."
|
57
|
+
elsif !new_validator.is_a?(GraphQL::StaticValidation::Validator)
|
58
|
+
raise ArgumentError, "Expected a `GraphQL::StaticValidation::Validator` instance."
|
59
|
+
else
|
60
|
+
@static_validator = new_validator
|
61
|
+
end
|
62
|
+
end
|
43
63
|
|
44
64
|
attr_writer :query_string
|
45
65
|
|
@@ -77,30 +97,46 @@ module GraphQL
|
|
77
97
|
# @param root_value [Object] the object used to resolve fields on the root type
|
78
98
|
# @param max_depth [Numeric] the maximum number of nested selections allowed for this query (falls back to schema-level value)
|
79
99
|
# @param max_complexity [Numeric] the maximum field complexity for this query (falls back to schema-level value)
|
80
|
-
# @param
|
81
|
-
|
82
|
-
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)
|
100
|
+
# @param visibility_profile [Symbol]
|
101
|
+
def initialize(schema, query_string = nil, query: nil, document: nil, context: nil, variables: nil, validate: true, static_validator: nil, visibility_profile: nil, subscription_topic: nil, operation_name: nil, root_value: nil, max_depth: schema.max_depth, max_complexity: schema.max_complexity, warden: nil, use_visibility_profile: nil)
|
83
102
|
# Even if `variables: nil` is passed, use an empty hash for simpler logic
|
84
103
|
variables ||= {}
|
104
|
+
@schema = schema
|
105
|
+
@context = schema.context_class.new(query: self, values: context)
|
85
106
|
|
86
|
-
|
87
|
-
|
88
|
-
schema = schema.graphql_definition
|
107
|
+
if use_visibility_profile.nil?
|
108
|
+
use_visibility_profile = warden ? false : schema.use_visibility_profile?
|
89
109
|
end
|
90
|
-
|
91
|
-
@
|
92
|
-
|
93
|
-
|
94
|
-
|
110
|
+
|
111
|
+
@visibility_profile = visibility_profile
|
112
|
+
|
113
|
+
if use_visibility_profile
|
114
|
+
@visibility_profile = @schema.visibility.profile_for(@context, visibility_profile)
|
115
|
+
@warden = Schema::Warden::NullWarden.new(context: @context, schema: @schema)
|
116
|
+
else
|
117
|
+
@visibility_profile = nil
|
118
|
+
@warden = warden
|
119
|
+
end
|
120
|
+
|
95
121
|
@subscription_topic = subscription_topic
|
96
122
|
@root_value = root_value
|
97
123
|
@fragments = nil
|
98
124
|
@operations = nil
|
99
125
|
@validate = validate
|
100
|
-
|
126
|
+
self.static_validator = static_validator if static_validator
|
127
|
+
context_tracers = (context ? context.fetch(:tracers, []) : [])
|
128
|
+
@tracers = schema.tracers + context_tracers
|
129
|
+
|
101
130
|
# Support `ctx[:backtrace] = true` for wrapping backtraces
|
102
131
|
if context && context[:backtrace] && !@tracers.include?(GraphQL::Backtrace::Tracer)
|
103
|
-
|
132
|
+
if schema.trace_class <= GraphQL::Tracing::CallLegacyTracers
|
133
|
+
context_tracers += [GraphQL::Backtrace::Tracer]
|
134
|
+
@tracers << GraphQL::Backtrace::Tracer
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
if !context_tracers.empty? && !(schema.trace_class <= GraphQL::Tracing::CallLegacyTracers)
|
139
|
+
raise ArgumentError, "context[:tracers] are not supported without `trace_with(GraphQL::Tracing::CallLegacyTracers)` in the schema configuration, please add it."
|
104
140
|
end
|
105
141
|
|
106
142
|
@analysis_errors = []
|
@@ -117,6 +153,10 @@ module GraphQL
|
|
117
153
|
raise ArgumentError, "Query should only be provided a query string or a document, not both."
|
118
154
|
end
|
119
155
|
|
156
|
+
if @query_string && !@query_string.is_a?(String)
|
157
|
+
raise ArgumentError, "Query string argument should be a String, got #{@query_string.class.name} instead."
|
158
|
+
end
|
159
|
+
|
120
160
|
# A two-layer cache of type resolution:
|
121
161
|
# { abstract_type => { value => resolved_type } }
|
122
162
|
@resolved_types_cache = Hash.new do |h1, k1|
|
@@ -138,9 +178,12 @@ module GraphQL
|
|
138
178
|
@result_values = nil
|
139
179
|
@executed = false
|
140
180
|
|
141
|
-
|
142
|
-
|
143
|
-
|
181
|
+
@logger = if context && context[:logger] == false
|
182
|
+
Logger.new(IO::NULL)
|
183
|
+
elsif context && (l = context[:logger])
|
184
|
+
l
|
185
|
+
else
|
186
|
+
schema.default_logger
|
144
187
|
end
|
145
188
|
end
|
146
189
|
|
@@ -149,12 +192,16 @@ module GraphQL
|
|
149
192
|
@query_string ||= (document ? document.to_query_string : nil)
|
150
193
|
end
|
151
194
|
|
152
|
-
|
153
|
-
|
154
|
-
end
|
195
|
+
# @return [Symbol, nil]
|
196
|
+
attr_reader :visibility_profile
|
155
197
|
|
156
198
|
attr_accessor :multiplex
|
157
199
|
|
200
|
+
# @return [GraphQL::Tracing::Trace]
|
201
|
+
def current_trace
|
202
|
+
@current_trace ||= context[:trace] || (multiplex ? multiplex.current_trace : schema.new_trace(multiplex: multiplex, query: self))
|
203
|
+
end
|
204
|
+
|
158
205
|
def subscription_update?
|
159
206
|
@subscription_topic && subscription?
|
160
207
|
end
|
@@ -164,9 +211,19 @@ module GraphQL
|
|
164
211
|
def lookahead
|
165
212
|
@lookahead ||= begin
|
166
213
|
ast_node = selected_operation
|
167
|
-
|
168
|
-
|
169
|
-
|
214
|
+
if ast_node.nil?
|
215
|
+
GraphQL::Execution::Lookahead::NULL_LOOKAHEAD
|
216
|
+
else
|
217
|
+
root_type = case ast_node.operation_type
|
218
|
+
when nil, "query"
|
219
|
+
types.query_root # rubocop:disable Development/ContextIsPassedCop
|
220
|
+
when "mutation"
|
221
|
+
types.mutation_root # rubocop:disable Development/ContextIsPassedCop
|
222
|
+
when "subscription"
|
223
|
+
types.subscription_root # rubocop:disable Development/ContextIsPassedCop
|
224
|
+
end
|
225
|
+
GraphQL::Execution::Lookahead.new(query: self, root_type: root_type, ast_nodes: [ast_node])
|
226
|
+
end
|
170
227
|
end
|
171
228
|
end
|
172
229
|
|
@@ -192,10 +249,10 @@ module GraphQL
|
|
192
249
|
end
|
193
250
|
|
194
251
|
# Get the result for this query, executing it once
|
195
|
-
# @return [
|
252
|
+
# @return [GraphQL::Query::Result] A Hash-like GraphQL response, with `"data"` and/or `"errors"` keys
|
196
253
|
def result
|
197
254
|
if !@executed
|
198
|
-
Execution::
|
255
|
+
Execution::Interpreter.run_all(@schema, [self], context: @context)
|
199
256
|
end
|
200
257
|
@result ||= Query::Result.new(query: self, values: @result_values)
|
201
258
|
end
|
@@ -233,35 +290,17 @@ module GraphQL
|
|
233
290
|
end
|
234
291
|
end
|
235
292
|
|
236
|
-
def irep_selection
|
237
|
-
@selection ||= begin
|
238
|
-
if selected_operation && internal_representation
|
239
|
-
internal_representation.operation_definitions[selected_operation.name]
|
240
|
-
else
|
241
|
-
nil
|
242
|
-
end
|
243
|
-
end
|
244
|
-
end
|
245
|
-
|
246
293
|
# Node-level cache for calculating arguments. Used during execution and query analysis.
|
247
294
|
# @param ast_node [GraphQL::Language::Nodes::AbstractNode]
|
248
295
|
# @param definition [GraphQL::Schema::Field]
|
249
296
|
# @param parent_object [GraphQL::Schema::Object]
|
250
297
|
# @return Hash{Symbol => Object}
|
251
298
|
def arguments_for(ast_node, definition, parent_object: nil)
|
252
|
-
|
253
|
-
arguments_cache.fetch(ast_node, definition, parent_object)
|
254
|
-
else
|
255
|
-
arguments_cache[ast_node][definition]
|
256
|
-
end
|
299
|
+
arguments_cache.fetch(ast_node, definition, parent_object)
|
257
300
|
end
|
258
301
|
|
259
302
|
def arguments_cache
|
260
|
-
|
261
|
-
@arguments_cache ||= Execution::Interpreter::ArgumentsCache.new(self)
|
262
|
-
else
|
263
|
-
@arguments_cache ||= ArgumentsCache.build(self)
|
264
|
-
end
|
303
|
+
@arguments_cache ||= Execution::Interpreter::ArgumentsCache.new(self)
|
265
304
|
end
|
266
305
|
|
267
306
|
# A version of the given query string, with:
|
@@ -270,7 +309,7 @@ module GraphQL
|
|
270
309
|
# @return [String, nil] Returns nil if the query is invalid.
|
271
310
|
def sanitized_query_string(inline_variables: true)
|
272
311
|
with_prepared_ast {
|
273
|
-
|
312
|
+
schema.sanitized_printer.new(self, inline_variables: inline_variables).sanitized_query_string
|
274
313
|
}
|
275
314
|
end
|
276
315
|
|
@@ -292,7 +331,7 @@ module GraphQL
|
|
292
331
|
|
293
332
|
# @return [String] An opaque hash for identifying this query's given query string and selected operation
|
294
333
|
def operation_fingerprint
|
295
|
-
@operation_fingerprint ||= "#{selected_operation_name || "anonymous"}/#{Fingerprint.generate(query_string)}"
|
334
|
+
@operation_fingerprint ||= "#{selected_operation_name || "anonymous"}/#{Fingerprint.generate(query_string || "")}"
|
296
335
|
end
|
297
336
|
|
298
337
|
# @return [String] An opaque hash for identifying this query's given a variable values (not including defaults)
|
@@ -304,8 +343,8 @@ module GraphQL
|
|
304
343
|
with_prepared_ast { @validation_pipeline }
|
305
344
|
end
|
306
345
|
|
307
|
-
def_delegators :validation_pipeline, :validation_errors,
|
308
|
-
:analyzers, :ast_analyzers, :max_depth, :max_complexity
|
346
|
+
def_delegators :validation_pipeline, :validation_errors,
|
347
|
+
:analyzers, :ast_analyzers, :max_depth, :max_complexity, :validate_timeout_remaining
|
309
348
|
|
310
349
|
attr_accessor :analysis_errors
|
311
350
|
def valid?
|
@@ -316,14 +355,41 @@ module GraphQL
|
|
316
355
|
with_prepared_ast { @warden }
|
317
356
|
end
|
318
357
|
|
319
|
-
|
358
|
+
def get_type(type_name)
|
359
|
+
types.type(type_name) # rubocop:disable Development/ContextIsPassedCop
|
360
|
+
end
|
361
|
+
|
362
|
+
def get_field(owner, field_name)
|
363
|
+
types.field(owner, field_name) # rubocop:disable Development/ContextIsPassedCop
|
364
|
+
end
|
365
|
+
|
366
|
+
def possible_types(type)
|
367
|
+
types.possible_types(type) # rubocop:disable Development/ContextIsPassedCop
|
368
|
+
end
|
369
|
+
|
370
|
+
def root_type_for_operation(op_type)
|
371
|
+
case op_type
|
372
|
+
when "query"
|
373
|
+
types.query_root # rubocop:disable Development/ContextIsPassedCop
|
374
|
+
when "mutation"
|
375
|
+
types.mutation_root # rubocop:disable Development/ContextIsPassedCop
|
376
|
+
when "subscription"
|
377
|
+
types.subscription_root # rubocop:disable Development/ContextIsPassedCop
|
378
|
+
else
|
379
|
+
raise ArgumentError, "unexpected root type name: #{op_type.inspect}; expected 'query', 'mutation', or 'subscription'"
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
383
|
+
def types
|
384
|
+
@visibility_profile || warden.visibility_profile
|
385
|
+
end
|
320
386
|
|
321
387
|
# @param abstract_type [GraphQL::UnionType, GraphQL::InterfaceType]
|
322
388
|
# @param value [Object] Any runtime value
|
323
389
|
# @return [GraphQL::ObjectType, nil] The runtime type of `value` from {Schema#resolve_type}
|
324
390
|
# @see {#possible_types} to apply filtering from `only` / `except`
|
325
|
-
def resolve_type(abstract_type, value =
|
326
|
-
if value.is_a?(Symbol) && value ==
|
391
|
+
def resolve_type(abstract_type, value = NOT_CONFIGURED)
|
392
|
+
if value.is_a?(Symbol) && value == NOT_CONFIGURED
|
327
393
|
# Old method signature
|
328
394
|
value = abstract_type
|
329
395
|
abstract_type = nil
|
@@ -342,27 +408,29 @@ module GraphQL
|
|
342
408
|
with_prepared_ast { @query }
|
343
409
|
end
|
344
410
|
|
345
|
-
# @return [void]
|
346
|
-
def merge_filters(only: nil, except: nil)
|
347
|
-
if @prepared_ast
|
348
|
-
raise "Can't add filters after preparing the query"
|
349
|
-
else
|
350
|
-
@filter = @filter.merge(only: only, except: except)
|
351
|
-
end
|
352
|
-
nil
|
353
|
-
end
|
354
|
-
|
355
411
|
def subscription?
|
356
412
|
with_prepared_ast { @subscription }
|
357
413
|
end
|
358
414
|
|
359
415
|
# @api private
|
360
|
-
def
|
361
|
-
schema.
|
362
|
-
|
416
|
+
def handle_or_reraise(err)
|
417
|
+
schema.handle_or_reraise(context, err)
|
418
|
+
end
|
419
|
+
|
420
|
+
def after_lazy(value, &block)
|
421
|
+
if !defined?(@runtime_instance)
|
422
|
+
@runtime_instance = context.namespace(:interpreter_runtime)[:runtime]
|
423
|
+
end
|
424
|
+
|
425
|
+
if @runtime_instance
|
426
|
+
@runtime_instance.minimal_after_lazy(value, &block)
|
427
|
+
else
|
428
|
+
@schema.after_lazy(value, &block)
|
363
429
|
end
|
364
430
|
end
|
365
431
|
|
432
|
+
attr_reader :logger
|
433
|
+
|
366
434
|
private
|
367
435
|
|
368
436
|
def find_operation(operations, operation_name)
|
@@ -377,11 +445,11 @@ module GraphQL
|
|
377
445
|
|
378
446
|
def prepare_ast
|
379
447
|
@prepared_ast = true
|
380
|
-
@warden ||=
|
448
|
+
@warden ||= @schema.warden_class.new(schema: @schema, context: @context)
|
381
449
|
parse_error = nil
|
382
450
|
@document ||= begin
|
383
451
|
if query_string
|
384
|
-
GraphQL.parse(query_string,
|
452
|
+
GraphQL.parse(query_string, trace: self.current_trace, max_tokens: @schema.max_query_string_tokens)
|
385
453
|
end
|
386
454
|
rescue GraphQL::ParseError => err
|
387
455
|
parse_error = err
|
@@ -413,7 +481,7 @@ module GraphQL
|
|
413
481
|
@mutation = false
|
414
482
|
@subscription = false
|
415
483
|
operation_name_error = nil
|
416
|
-
if
|
484
|
+
if !@operations.empty?
|
417
485
|
@selected_operation = find_operation(@operations, @operation_name)
|
418
486
|
if @selected_operation.nil?
|
419
487
|
operation_name_error = GraphQL::Query::OperationNameMissingError.new(@operation_name)
|
@@ -430,7 +498,6 @@ module GraphQL
|
|
430
498
|
|
431
499
|
@validation_pipeline = GraphQL::Query::ValidationPipeline.new(
|
432
500
|
query: self,
|
433
|
-
validate: @validate,
|
434
501
|
parse_error: parse_error,
|
435
502
|
operation_name_error: operation_name_error,
|
436
503
|
max_depth: @max_depth,
|
data/lib/graphql/railtie.rb
CHANGED
@@ -1,116 +1,22 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module GraphQL
|
4
|
+
# Support {GraphQL::Parser::Cache} and {GraphQL.eager_load!}
|
5
|
+
#
|
6
|
+
# @example Enable the parser cache with default directory
|
7
|
+
#
|
8
|
+
# config.graphql.parser_cache = true
|
9
|
+
#
|
4
10
|
class Railtie < Rails::Railtie
|
5
|
-
config.
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
rake_tasks do
|
15
|
-
# Defer this so that you only need the `parser` gem when you _run_ the upgrader
|
16
|
-
def load_upgraders
|
17
|
-
require_relative './upgrader/member'
|
18
|
-
require_relative './upgrader/schema'
|
19
|
-
end
|
20
|
-
|
21
|
-
namespace :graphql do
|
22
|
-
task :upgrade, [:dir] do |t, args|
|
23
|
-
unless (dir = args[:dir])
|
24
|
-
fail 'You have to give me a directory where your GraphQL schema and types live. ' \
|
25
|
-
'For example: `bin/rake graphql:upgrade[app/graphql/**/*]`'
|
26
|
-
end
|
27
|
-
|
28
|
-
Dir[dir].each do |file|
|
29
|
-
# Members (types, interfaces, etc.)
|
30
|
-
if file =~ /.*_(type|interface|enum|union|)\.rb$/
|
31
|
-
Rake::Task["graphql:upgrade:member"].execute(Struct.new(:member_file).new(file))
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
puts "Upgrade complete! Note that this is a best-effort approach, and may very well contain some bugs."
|
36
|
-
puts "Don't forget to create the base objects. For example, you could run:"
|
37
|
-
puts "\tbin/rake graphql:upgrade:create_base_objects[app/graphql]"
|
38
|
-
end
|
39
|
-
|
40
|
-
namespace :upgrade do
|
41
|
-
task :create_base_objects, [:base_dir] do |t, args|
|
42
|
-
unless (base_dir = args[:base_dir])
|
43
|
-
fail 'You have to give me a directory where your GraphQL types live. ' \
|
44
|
-
'For example: `bin/rake graphql:upgrade:create_base_objects[app/graphql]`'
|
45
|
-
end
|
46
|
-
|
47
|
-
destination_file = File.join(base_dir, "types", "base_scalar.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::BaseScalar < GraphQL::Schema::Scalar\nend"
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
destination_file = File.join(base_dir, "types", "base_input_object.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::BaseInputObject < GraphQL::Schema::InputObject\nend"
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
destination_file = File.join(base_dir, "types", "base_enum.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::BaseEnum < GraphQL::Schema::Enum\nend"
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
destination_file = File.join(base_dir, "types", "base_union.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 "class Types::BaseUnion < GraphQL::Schema::Union\nend"
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
destination_file = File.join(base_dir, "types", "base_interface.rb")
|
80
|
-
unless File.exists?(destination_file)
|
81
|
-
FileUtils.mkdir_p(File.dirname(destination_file))
|
82
|
-
File.open(destination_file, 'w') do |f|
|
83
|
-
f.puts "module Types::BaseInterface\n include GraphQL::Schema::Interface\nend"
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
destination_file = File.join(base_dir, "types", "base_object.rb")
|
88
|
-
unless File.exists?(destination_file)
|
89
|
-
File.open(destination_file, 'w') do |f|
|
90
|
-
f.puts "class Types::BaseObject < GraphQL::Schema::Object\nend"
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
task :schema, [:schema_file] do |t, args|
|
96
|
-
schema_file = args.schema_file
|
97
|
-
load_upgraders
|
98
|
-
upgrader = GraphQL::Upgrader::Schema.new File.read(schema_file)
|
99
|
-
|
100
|
-
puts "- Transforming schema #{schema_file}"
|
101
|
-
File.open(schema_file, 'w') { |f| f.write upgrader.upgrade }
|
102
|
-
end
|
103
|
-
|
104
|
-
task :member, [:member_file] do |t, args|
|
105
|
-
member_file = args.member_file
|
106
|
-
load_upgraders
|
107
|
-
upgrader = GraphQL::Upgrader::Member.new File.read(member_file)
|
108
|
-
next unless upgrader.upgradeable?
|
109
|
-
|
110
|
-
puts "- Transforming member #{member_file}"
|
111
|
-
File.open(member_file, 'w') { |f| f.write upgrader.upgrade }
|
112
|
-
end
|
113
|
-
end
|
11
|
+
config.graphql = ActiveSupport::OrderedOptions.new
|
12
|
+
config.graphql.parser_cache = false
|
13
|
+
config.eager_load_namespaces << GraphQL
|
14
|
+
|
15
|
+
initializer("graphql.cache") do |app|
|
16
|
+
if config.graphql.parser_cache
|
17
|
+
Language::Parser.cache ||= Language::Cache.new(
|
18
|
+
app.root.join("tmp/cache/graphql")
|
19
|
+
)
|
114
20
|
end
|
115
21
|
end
|
116
22
|
end
|
@@ -15,7 +15,7 @@ module GraphQL
|
|
15
15
|
puts "Validating graphql-pro v#{version}"
|
16
16
|
puts " - Checking for graphql-pro credentials..."
|
17
17
|
|
18
|
-
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}/]
|
19
19
|
if creds.nil?
|
20
20
|
puts " #{ex} failed, please set with `bundle config gems.graphql.pro $MY_CREDENTIALS`"
|
21
21
|
exit(1)
|