graphql 1.12.12 → 2.2.14
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 +14 -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 +6 -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 +19 -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/ast/analyzer.rb +7 -0
- data/lib/graphql/analysis/ast/field_usage.rb +55 -1
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
- data/lib/graphql/analysis/ast/query_complexity.rb +88 -140
- data/lib/graphql/analysis/ast/query_depth.rb +7 -3
- data/lib/graphql/analysis/ast/visitor.rb +50 -42
- data/lib/graphql/analysis/ast.rb +26 -23
- data/lib/graphql/analysis.rb +0 -7
- 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/dataloader/async_dataloader.rb +85 -0
- data/lib/graphql/dataloader/null_dataloader.rb +3 -1
- data/lib/graphql/dataloader/request.rb +5 -0
- data/lib/graphql/dataloader/source.rb +120 -31
- data/lib/graphql/dataloader.rb +168 -142
- 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/arguments.rb +2 -2
- data/lib/graphql/execution/interpreter/arguments_cache.rb +36 -34
- data/lib/graphql/execution/interpreter/resolve.rb +32 -2
- data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +170 -0
- data/lib/graphql/execution/interpreter/runtime.rb +414 -341
- data/lib/graphql/execution/interpreter.rb +122 -80
- data/lib/graphql/execution/lazy.rb +11 -21
- data/lib/graphql/execution/lookahead.rb +125 -54
- 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 +5 -3
- 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 +3 -3
- data/lib/graphql/introspection/input_value_type.rb +10 -4
- data/lib/graphql/introspection/schema_type.rb +12 -5
- data/lib/graphql/introspection/type_type.rb +25 -12
- data/lib/graphql/introspection.rb +6 -2
- data/lib/graphql/language/block_string.rb +37 -25
- data/lib/graphql/language/definition_slice.rb +1 -1
- data/lib/graphql/language/document_from_schema_definition.rb +78 -65
- data/lib/graphql/language/lexer.rb +345 -1467
- data/lib/graphql/language/nodes.rb +145 -91
- data/lib/graphql/language/parser.rb +701 -1921
- data/lib/graphql/language/printer.rb +351 -155
- data/lib/graphql/language/sanitized_printer.rb +25 -27
- data/lib/graphql/language/static_visitor.rb +167 -0
- data/lib/graphql/language/token.rb +0 -4
- data/lib/graphql/language/visitor.rb +188 -141
- data/lib/graphql/language.rb +1 -0
- 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 +109 -189
- data/lib/graphql/query/input_validation_result.rb +10 -1
- data/lib/graphql/query/null_context.rb +14 -29
- data/lib/graphql/query/validation_pipeline.rb +15 -39
- data/lib/graphql/query/variable_validation_error.rb +2 -2
- data/lib/graphql/query/variables.rb +35 -17
- data/lib/graphql/query.rb +78 -65
- data/lib/graphql/railtie.rb +8 -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.rb +4 -0
- data/lib/graphql/schema/addition.rb +78 -45
- data/lib/graphql/schema/always_visible.rb +10 -0
- data/lib/graphql/schema/argument.rb +134 -80
- data/lib/graphql/schema/base_64_encoder.rb +3 -5
- data/lib/graphql/schema/build_from_definition.rb +60 -38
- data/lib/graphql/schema/directive/feature.rb +1 -1
- data/lib/graphql/schema/directive/flagged.rb +2 -2
- 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 +33 -21
- data/lib/graphql/schema/enum.rb +93 -46
- data/lib/graphql/schema/enum_value.rb +4 -21
- data/lib/graphql/schema/field/connection_extension.rb +6 -16
- data/lib/graphql/schema/field/scope_extension.rb +8 -1
- data/lib/graphql/schema/field.rb +432 -337
- 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 +156 -0
- data/lib/graphql/schema/input_object.rb +88 -90
- data/lib/graphql/schema/interface.rb +19 -59
- data/lib/graphql/schema/introspection_system.rb +6 -9
- data/lib/graphql/schema/late_bound_type.rb +8 -2
- data/lib/graphql/schema/list.rb +18 -7
- data/lib/graphql/schema/loader.rb +3 -3
- data/lib/graphql/schema/member/base_dsl_methods.rb +18 -19
- data/lib/graphql/schema/member/build_type.rb +16 -13
- data/lib/graphql/schema/member/has_arguments.rb +288 -84
- 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 +149 -31
- data/lib/graphql/schema/member/has_interfaces.rb +143 -0
- 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 +17 -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 +0 -9
- data/lib/graphql/schema/non_null.rb +7 -7
- data/lib/graphql/schema/object.rb +30 -119
- data/lib/graphql/schema/printer.rb +23 -25
- data/lib/graphql/schema/relay_classic_mutation.rb +13 -90
- data/lib/graphql/schema/resolver/has_payload_type.rb +46 -11
- data/lib/graphql/schema/resolver.rb +101 -102
- data/lib/graphql/schema/scalar.rb +20 -21
- data/lib/graphql/schema/subscription.rb +45 -17
- data/lib/graphql/schema/timeout.rb +25 -29
- data/lib/graphql/schema/type_expression.rb +1 -1
- data/lib/graphql/schema/type_membership.rb +21 -4
- data/lib/graphql/schema/union.rb +15 -15
- data/lib/graphql/schema/unique_within_type.rb +1 -1
- 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 +29 -15
- data/lib/graphql/schema/validator.rb +35 -27
- data/lib/graphql/schema/warden.rb +259 -132
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +658 -989
- data/lib/graphql/static_validation/all_rules.rb +3 -1
- data/lib/graphql/static_validation/base_visitor.rb +14 -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 +21 -4
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +1 -1
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +1 -1
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +11 -5
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +13 -13
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +12 -4
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +54 -28
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
- data/lib/graphql/static_validation/rules/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 +5 -3
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +4 -4
- 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 +1 -1
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +13 -7
- data/lib/graphql/static_validation/validation_context.rb +16 -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 +46 -9
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +38 -1
- data/lib/graphql/subscriptions/event.rb +75 -37
- data/lib/graphql/subscriptions/serialize.rb +25 -3
- data/lib/graphql/subscriptions.rb +59 -47
- data/lib/graphql/testing/helpers.rb +129 -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 +251 -0
- data/lib/graphql/tracing/appoptics_tracing.rb +2 -2
- data/lib/graphql/tracing/appsignal_trace.rb +77 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +15 -0
- data/lib/graphql/tracing/data_dog_trace.rb +183 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +25 -15
- data/lib/graphql/{execution/instrumentation.rb → tracing/legacy_hooks_trace.rb} +10 -28
- data/lib/graphql/tracing/legacy_trace.rb +69 -0
- data/lib/graphql/tracing/new_relic_trace.rb +75 -0
- data/lib/graphql/tracing/notifications_trace.rb +45 -0
- data/lib/graphql/tracing/notifications_tracing.rb +59 -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 +4 -2
- data/lib/graphql/tracing/prometheus_trace.rb +89 -0
- data/lib/graphql/tracing/prometheus_tracing.rb +3 -3
- data/lib/graphql/tracing/scout_trace.rb +72 -0
- data/lib/graphql/tracing/sentry_trace.rb +112 -0
- data/lib/graphql/tracing/statsd_trace.rb +56 -0
- data/lib/graphql/tracing/trace.rb +76 -0
- data/lib/graphql/tracing.rb +20 -41
- data/lib/graphql/type_kinds.rb +6 -3
- 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 +82 -32
- data/lib/graphql/types/relay/edge_behaviors.rb +36 -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 +7 -2
- data/lib/graphql/types/relay.rb +0 -3
- data/lib/graphql/types/string.rb +2 -2
- data/lib/graphql/types.rb +1 -0
- data/lib/graphql/unauthorized_error.rb +1 -1
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +33 -95
- data/readme.md +13 -6
- metadata +102 -185
- data/lib/graphql/analysis/analyze_query.rb +0 -98
- data/lib/graphql/analysis/field_usage.rb +0 -45
- data/lib/graphql/analysis/max_query_complexity.rb +0 -26
- data/lib/graphql/analysis/max_query_depth.rb +0 -26
- data/lib/graphql/analysis/query_complexity.rb +0 -88
- data/lib/graphql/analysis/query_depth.rb +0 -43
- data/lib/graphql/analysis/reducer_state.rb +0 -48
- data/lib/graphql/argument.rb +0 -131
- data/lib/graphql/authorization.rb +0 -82
- data/lib/graphql/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/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/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
| @@ -23,19 +23,17 @@ module GraphQL | |
| 23 23 | 
             
                # @see {Schema#multiplex} for public API
         | 
| 24 24 | 
             
                # @api private
         | 
| 25 25 | 
             
                class Multiplex
         | 
| 26 | 
            -
                  # Used internally to signal that the query shouldn't be executed
         | 
| 27 | 
            -
                  # @api private
         | 
| 28 | 
            -
                  NO_OPERATION = {}.freeze
         | 
| 29 | 
            -
             | 
| 30 26 | 
             
                  include Tracing::Traceable
         | 
| 31 27 |  | 
| 32 | 
            -
                  attr_reader :context, :queries, :schema, :max_complexity, :dataloader
         | 
| 28 | 
            +
                  attr_reader :context, :queries, :schema, :max_complexity, :dataloader, :current_trace
         | 
| 29 | 
            +
             | 
| 33 30 | 
             
                  def initialize(schema:, queries:, context:, max_complexity:)
         | 
| 34 31 | 
             
                    @schema = schema
         | 
| 35 32 | 
             
                    @queries = queries
         | 
| 36 33 | 
             
                    @queries.each { |q| q.multiplex = self }
         | 
| 37 34 | 
             
                    @context = context
         | 
| 38 | 
            -
                    @context[: | 
| 35 | 
            +
                    @current_trace = @context[:trace] || schema.new_trace(multiplex: self)
         | 
| 36 | 
            +
                    @dataloader = @context[:dataloader] ||= @schema.dataloader_class.new
         | 
| 39 37 | 
             
                    @tracers = schema.tracers + (context[:tracers] || [])
         | 
| 40 38 | 
             
                    # Support `context: {backtrace: true}`
         | 
| 41 39 | 
             
                    if context[:backtrace] && !@tracers.include?(GraphQL::Backtrace::Tracer)
         | 
| @@ -43,172 +41,6 @@ module GraphQL | |
| 43 41 | 
             
                    end
         | 
| 44 42 | 
             
                    @max_complexity = max_complexity
         | 
| 45 43 | 
             
                  end
         | 
| 46 | 
            -
             | 
| 47 | 
            -
                  class << self
         | 
| 48 | 
            -
                    def run_all(schema, query_options, **kwargs)
         | 
| 49 | 
            -
                      queries = query_options.map { |opts| GraphQL::Query.new(schema, nil, **opts) }
         | 
| 50 | 
            -
                      run_queries(schema, queries, **kwargs)
         | 
| 51 | 
            -
                    end
         | 
| 52 | 
            -
             | 
| 53 | 
            -
                    # @param schema [GraphQL::Schema]
         | 
| 54 | 
            -
                    # @param queries [Array<GraphQL::Query>]
         | 
| 55 | 
            -
                    # @param context [Hash]
         | 
| 56 | 
            -
                    # @param max_complexity [Integer, nil]
         | 
| 57 | 
            -
                    # @return [Array<Hash>] One result per query
         | 
| 58 | 
            -
                    def run_queries(schema, queries, context: {}, max_complexity: schema.max_complexity)
         | 
| 59 | 
            -
                      multiplex = self.new(schema: schema, queries: queries, context: context, max_complexity: max_complexity)
         | 
| 60 | 
            -
                      multiplex.trace("execute_multiplex", { multiplex: multiplex }) do
         | 
| 61 | 
            -
                        if supports_multiplexing?(schema)
         | 
| 62 | 
            -
                          instrument_and_analyze(multiplex) do
         | 
| 63 | 
            -
                            run_as_multiplex(multiplex)
         | 
| 64 | 
            -
                          end
         | 
| 65 | 
            -
                        else
         | 
| 66 | 
            -
                          if queries.length != 1
         | 
| 67 | 
            -
                            raise ArgumentError, "Multiplexing doesn't support custom execution strategies, run one query at a time instead"
         | 
| 68 | 
            -
                          else
         | 
| 69 | 
            -
                            instrument_and_analyze(multiplex) do
         | 
| 70 | 
            -
                              [run_one_legacy(schema, queries.first)]
         | 
| 71 | 
            -
                            end
         | 
| 72 | 
            -
                          end
         | 
| 73 | 
            -
                        end
         | 
| 74 | 
            -
                      end
         | 
| 75 | 
            -
                    end
         | 
| 76 | 
            -
             | 
| 77 | 
            -
                    # @param query [GraphQL::Query]
         | 
| 78 | 
            -
                    def begin_query(results, idx, query, multiplex)
         | 
| 79 | 
            -
                      operation = query.selected_operation
         | 
| 80 | 
            -
                      result = if operation.nil? || !query.valid? || query.context.errors.any?
         | 
| 81 | 
            -
                        NO_OPERATION
         | 
| 82 | 
            -
                      else
         | 
| 83 | 
            -
                        begin
         | 
| 84 | 
            -
                          # These were checked to be the same in `#supports_multiplexing?`
         | 
| 85 | 
            -
                          query.schema.query_execution_strategy.begin_query(query, multiplex)
         | 
| 86 | 
            -
                        rescue GraphQL::ExecutionError => err
         | 
| 87 | 
            -
                          query.context.errors << err
         | 
| 88 | 
            -
                          NO_OPERATION
         | 
| 89 | 
            -
                        end
         | 
| 90 | 
            -
                      end
         | 
| 91 | 
            -
                      results[idx] = result
         | 
| 92 | 
            -
                      nil
         | 
| 93 | 
            -
                    end
         | 
| 94 | 
            -
             | 
| 95 | 
            -
                    private
         | 
| 96 | 
            -
             | 
| 97 | 
            -
                    def run_as_multiplex(multiplex)
         | 
| 98 | 
            -
             | 
| 99 | 
            -
                      multiplex.schema.query_execution_strategy.begin_multiplex(multiplex)
         | 
| 100 | 
            -
                      queries = multiplex.queries
         | 
| 101 | 
            -
                      # Do as much eager evaluation of the query as possible
         | 
| 102 | 
            -
                      results = []
         | 
| 103 | 
            -
                      queries.each_with_index do |query, idx|
         | 
| 104 | 
            -
                        multiplex.dataloader.append_job { begin_query(results, idx, query, multiplex) }
         | 
| 105 | 
            -
                      end
         | 
| 106 | 
            -
             | 
| 107 | 
            -
                      multiplex.dataloader.run
         | 
| 108 | 
            -
             | 
| 109 | 
            -
                      # Then, work through lazy results in a breadth-first way
         | 
| 110 | 
            -
                      multiplex.dataloader.append_job {
         | 
| 111 | 
            -
                        multiplex.schema.query_execution_strategy.finish_multiplex(results, multiplex)
         | 
| 112 | 
            -
                      }
         | 
| 113 | 
            -
                      multiplex.dataloader.run
         | 
| 114 | 
            -
             | 
| 115 | 
            -
                      # Then, find all errors and assign the result to the query object
         | 
| 116 | 
            -
                      results.each_with_index do |data_result, idx|
         | 
| 117 | 
            -
                        query = queries[idx]
         | 
| 118 | 
            -
                        finish_query(data_result, query, multiplex)
         | 
| 119 | 
            -
                        # Get the Query::Result, not the Hash
         | 
| 120 | 
            -
                        results[idx] = query.result
         | 
| 121 | 
            -
                      end
         | 
| 122 | 
            -
             | 
| 123 | 
            -
                      results
         | 
| 124 | 
            -
                    rescue Exception
         | 
| 125 | 
            -
                      # TODO rescue at a higher level so it will catch errors in analysis, too
         | 
| 126 | 
            -
                      # Assign values here so that the query's `@executed` becomes true
         | 
| 127 | 
            -
                      queries.map { |q| q.result_values ||= {} }
         | 
| 128 | 
            -
                      raise
         | 
| 129 | 
            -
                    end
         | 
| 130 | 
            -
             | 
| 131 | 
            -
                    # @param data_result [Hash] The result for the "data" key, if any
         | 
| 132 | 
            -
                    # @param query [GraphQL::Query] The query which was run
         | 
| 133 | 
            -
                    # @return [Hash] final result of this query, including all values and errors
         | 
| 134 | 
            -
                    def finish_query(data_result, query, multiplex)
         | 
| 135 | 
            -
                      # Assign the result so that it can be accessed in instrumentation
         | 
| 136 | 
            -
                      query.result_values = if data_result.equal?(NO_OPERATION)
         | 
| 137 | 
            -
                        if !query.valid? || query.context.errors.any?
         | 
| 138 | 
            -
                          # A bit weird, but `Query#static_errors` _includes_ `query.context.errors`
         | 
| 139 | 
            -
                          { "errors" => query.static_errors.map(&:to_h) }
         | 
| 140 | 
            -
                        else
         | 
| 141 | 
            -
                          data_result
         | 
| 142 | 
            -
                        end
         | 
| 143 | 
            -
                      else
         | 
| 144 | 
            -
                        # Use `context.value` which was assigned during execution
         | 
| 145 | 
            -
                        result = query.schema.query_execution_strategy.finish_query(query, multiplex)
         | 
| 146 | 
            -
             | 
| 147 | 
            -
                        if query.context.errors.any?
         | 
| 148 | 
            -
                          error_result = query.context.errors.map(&:to_h)
         | 
| 149 | 
            -
                          result["errors"] = error_result
         | 
| 150 | 
            -
                        end
         | 
| 151 | 
            -
             | 
| 152 | 
            -
                        result
         | 
| 153 | 
            -
                      end
         | 
| 154 | 
            -
                    end
         | 
| 155 | 
            -
             | 
| 156 | 
            -
                    # use the old `query_execution_strategy` etc to run this query
         | 
| 157 | 
            -
                    def run_one_legacy(schema, query)
         | 
| 158 | 
            -
                      GraphQL::Deprecation.warn "Multiplex.run_one_legacy will be removed from GraphQL-Ruby 2.0, upgrade to the Interpreter to avoid this deprecated codepath: https://graphql-ruby.org/queries/interpreter.html"
         | 
| 159 | 
            -
             | 
| 160 | 
            -
                      query.result_values = if !query.valid?
         | 
| 161 | 
            -
                        all_errors = query.validation_errors + query.analysis_errors + query.context.errors
         | 
| 162 | 
            -
                        if all_errors.any?
         | 
| 163 | 
            -
                          { "errors" => all_errors.map(&:to_h) }
         | 
| 164 | 
            -
                        else
         | 
| 165 | 
            -
                          nil
         | 
| 166 | 
            -
                        end
         | 
| 167 | 
            -
                      else
         | 
| 168 | 
            -
                        GraphQL::Query::Executor.new(query).result
         | 
| 169 | 
            -
                      end
         | 
| 170 | 
            -
                    end
         | 
| 171 | 
            -
             | 
| 172 | 
            -
                    DEFAULT_STRATEGIES = [
         | 
| 173 | 
            -
                      GraphQL::Execution::Execute,
         | 
| 174 | 
            -
                      GraphQL::Execution::Interpreter
         | 
| 175 | 
            -
                    ]
         | 
| 176 | 
            -
                    # @return [Boolean] True if the schema is only using one strategy, and it's one that supports multiplexing.
         | 
| 177 | 
            -
                    def supports_multiplexing?(schema)
         | 
| 178 | 
            -
                      schema_strategies = [schema.query_execution_strategy, schema.mutation_execution_strategy, schema.subscription_execution_strategy]
         | 
| 179 | 
            -
                      schema_strategies.uniq!
         | 
| 180 | 
            -
                      schema_strategies.size == 1 && DEFAULT_STRATEGIES.include?(schema_strategies.first)
         | 
| 181 | 
            -
                    end
         | 
| 182 | 
            -
             | 
| 183 | 
            -
                    # Apply multiplex & query instrumentation to `queries`.
         | 
| 184 | 
            -
                    #
         | 
| 185 | 
            -
                    # It yields when the queries should be executed, then runs teardown.
         | 
| 186 | 
            -
                    def instrument_and_analyze(multiplex)
         | 
| 187 | 
            -
                      GraphQL::Execution::Instrumentation.apply_instrumenters(multiplex) do
         | 
| 188 | 
            -
                        schema = multiplex.schema
         | 
| 189 | 
            -
                        if schema.interpreter? && schema.analysis_engine != GraphQL::Analysis::AST
         | 
| 190 | 
            -
                          raise <<-ERR
         | 
| 191 | 
            -
            Can't use `GraphQL::Execution::Interpreter` without `GraphQL::Analysis::AST`, please add this plugin to your schema:
         | 
| 192 | 
            -
             | 
| 193 | 
            -
                use GraphQL::Analysis::AST
         | 
| 194 | 
            -
             | 
| 195 | 
            -
            For information about the new analysis engine: https://graphql-ruby.org/queries/ast_analysis.html
         | 
| 196 | 
            -
            ERR
         | 
| 197 | 
            -
                        end
         | 
| 198 | 
            -
                        multiplex_analyzers = schema.multiplex_analyzers
         | 
| 199 | 
            -
                        if multiplex.max_complexity
         | 
| 200 | 
            -
                          multiplex_analyzers += if schema.using_ast_analysis?
         | 
| 201 | 
            -
                            [GraphQL::Analysis::AST::MaxQueryComplexity]
         | 
| 202 | 
            -
                          else
         | 
| 203 | 
            -
                            [GraphQL::Analysis::MaxQueryComplexity.new(multiplex.max_complexity)]
         | 
| 204 | 
            -
                          end
         | 
| 205 | 
            -
                        end
         | 
| 206 | 
            -
             | 
| 207 | 
            -
                        schema.analysis_engine.analyze_multiplex(multiplex, multiplex_analyzers)
         | 
| 208 | 
            -
                        yield
         | 
| 209 | 
            -
                      end
         | 
| 210 | 
            -
                    end
         | 
| 211 | 
            -
                  end
         | 
| 212 44 | 
             
                end
         | 
| 213 45 | 
             
              end
         | 
| 214 46 | 
             
            end
         | 
    
        data/lib/graphql/execution.rb
    CHANGED
    
    | @@ -1,11 +1,18 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 | 
             
            require "graphql/execution/directive_checks"
         | 
| 3 | 
            -
            require "graphql/execution/execute"
         | 
| 4 | 
            -
            require "graphql/execution/flatten"
         | 
| 5 | 
            -
            require "graphql/execution/instrumentation"
         | 
| 6 3 | 
             
            require "graphql/execution/interpreter"
         | 
| 7 4 | 
             
            require "graphql/execution/lazy"
         | 
| 8 5 | 
             
            require "graphql/execution/lookahead"
         | 
| 9 6 | 
             
            require "graphql/execution/multiplex"
         | 
| 10 | 
            -
            require "graphql/execution/typecast"
         | 
| 11 7 | 
             
            require "graphql/execution/errors"
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            module GraphQL
         | 
| 10 | 
            +
              module Execution
         | 
| 11 | 
            +
                # @api private
         | 
| 12 | 
            +
                class Skip < GraphQL::Error; end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                # Just a singleton for implementing {Query::Context#skip}
         | 
| 15 | 
            +
                # @api private
         | 
| 16 | 
            +
                SKIP = Skip.new
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
            end
         | 
| @@ -12,9 +12,25 @@ module GraphQL | |
| 12 12 | 
             
                # The value which couldn't be encoded
         | 
| 13 13 | 
             
                attr_reader :integer_value
         | 
| 14 14 |  | 
| 15 | 
            -
                 | 
| 15 | 
            +
                # @return [GraphQL::Schema::Field] The field that returned a too-big integer
         | 
| 16 | 
            +
                attr_reader :field
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                # @return [Array<String, Integer>] Where the field appeared in the GraphQL response
         | 
| 19 | 
            +
                attr_reader :path
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                def initialize(value, context:)
         | 
| 16 22 | 
             
                  @integer_value = value
         | 
| 17 | 
            -
                   | 
| 23 | 
            +
                  @field = context[:current_field]
         | 
| 24 | 
            +
                  @path = context[:current_path]
         | 
| 25 | 
            +
                  message = "Integer out of bounds: #{value}".dup
         | 
| 26 | 
            +
                  if @path
         | 
| 27 | 
            +
                    message << " @ #{@path.join(".")}"
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
                  if @field
         | 
| 30 | 
            +
                    message << " (#{@field.path})"
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                  message << ". Consider using ID or GraphQL::Types::BigInt instead."
         | 
| 33 | 
            +
                  super(message)
         | 
| 18 34 | 
             
                end
         | 
| 19 35 | 
             
              end
         | 
| 20 36 | 
             
            end
         | 
| @@ -6,8 +6,8 @@ module GraphQL | |
| 6 6 | 
             
                  description "A Directive can be adjacent to many parts of the GraphQL language, "\
         | 
| 7 7 | 
             
                              "a __DirectiveLocation describes one such possible adjacencies."
         | 
| 8 8 |  | 
| 9 | 
            -
                  GraphQL::Directive::LOCATIONS.each do |location|
         | 
| 10 | 
            -
                    value(location.to_s, GraphQL::Directive::LOCATION_DESCRIPTIONS[location], value: location)
         | 
| 9 | 
            +
                  GraphQL::Schema::Directive::LOCATIONS.each do |location|
         | 
| 10 | 
            +
                    value(location.to_s, GraphQL::Schema::Directive::LOCATION_DESCRIPTIONS[location], value: location)
         | 
| 11 11 | 
             
                  end
         | 
| 12 12 | 
             
                  introspection true
         | 
| 13 13 | 
             
                end
         | 
| @@ -10,15 +10,17 @@ module GraphQL | |
| 10 10 | 
             
                              "skipping a field. Directives provide this by describing additional information "\
         | 
| 11 11 | 
             
                                "to the executor."
         | 
| 12 12 | 
             
                  field :name, String, null: false, method: :graphql_name
         | 
| 13 | 
            -
                  field :description, String | 
| 14 | 
            -
                  field :locations, [GraphQL::Schema::LateBoundType.new("__DirectiveLocation")], null: false
         | 
| 15 | 
            -
                  field :args, [GraphQL::Schema::LateBoundType.new("__InputValue")], null: false do
         | 
| 13 | 
            +
                  field :description, String
         | 
| 14 | 
            +
                  field :locations, [GraphQL::Schema::LateBoundType.new("__DirectiveLocation")], null: false, scope: false
         | 
| 15 | 
            +
                  field :args, [GraphQL::Schema::LateBoundType.new("__InputValue")], null: false, scope: false do
         | 
| 16 16 | 
             
                    argument :include_deprecated, Boolean, required: false, default_value: false
         | 
| 17 17 | 
             
                  end
         | 
| 18 18 | 
             
                  field :on_operation, Boolean, null: false, deprecation_reason: "Use `locations`.", method: :on_operation?
         | 
| 19 19 | 
             
                  field :on_fragment, Boolean, null: false, deprecation_reason: "Use `locations`.", method: :on_fragment?
         | 
| 20 20 | 
             
                  field :on_field, Boolean, null: false, deprecation_reason: "Use `locations`.", method: :on_field?
         | 
| 21 21 |  | 
| 22 | 
            +
                  field :is_repeatable, Boolean, method: :repeatable?
         | 
| 23 | 
            +
             | 
| 22 24 | 
             
                  def args(include_deprecated:)
         | 
| 23 25 | 
             
                    args = @context.warden.arguments(@object)
         | 
| 24 26 | 
             
                    args = args.reject(&:deprecation_reason) unless include_deprecated
         | 
| @@ -2,15 +2,10 @@ | |
| 2 2 | 
             
            module GraphQL
         | 
| 3 3 | 
             
              module Introspection
         | 
| 4 4 | 
             
                class DynamicFields < Introspection::BaseObject
         | 
| 5 | 
            -
                  field :__typename, String, "The name of this type", null: false,  | 
| 5 | 
            +
                  field :__typename, String, "The name of this type", null: false, dynamic_introspection: true
         | 
| 6 6 |  | 
| 7 | 
            -
                   | 
| 8 | 
            -
             | 
| 9 | 
            -
                    if context.interpreter?
         | 
| 10 | 
            -
                      object.class.graphql_name
         | 
| 11 | 
            -
                    else
         | 
| 12 | 
            -
                      irep_node.owner_type.name
         | 
| 13 | 
            -
                    end
         | 
| 7 | 
            +
                  def __typename
         | 
| 8 | 
            +
                    object.class.graphql_name
         | 
| 14 9 | 
             
                  end
         | 
| 15 10 | 
             
                end
         | 
| 16 11 | 
             
              end
         | 
| @@ -2,33 +2,26 @@ | |
| 2 2 | 
             
            module GraphQL
         | 
| 3 3 | 
             
              module Introspection
         | 
| 4 4 | 
             
                class EntryPoints < Introspection::BaseObject
         | 
| 5 | 
            -
                  field :__schema, GraphQL::Schema::LateBoundType.new("__Schema"), "This GraphQL schema", null: false
         | 
| 6 | 
            -
                  field :__type, GraphQL::Schema::LateBoundType.new("__Type"), "A type in the GraphQL system",  | 
| 7 | 
            -
                    argument :name, String | 
| 5 | 
            +
                  field :__schema, GraphQL::Schema::LateBoundType.new("__Schema"), "This GraphQL schema", null: false, dynamic_introspection: true
         | 
| 6 | 
            +
                  field :__type, GraphQL::Schema::LateBoundType.new("__Type"), "A type in the GraphQL system", dynamic_introspection: true do
         | 
| 7 | 
            +
                    argument :name, String
         | 
| 8 8 | 
             
                  end
         | 
| 9 9 |  | 
| 10 10 | 
             
                  def __schema
         | 
| 11 11 | 
             
                    # Apply wrapping manually since this field isn't wrapped by instrumentation
         | 
| 12 | 
            -
                    schema =  | 
| 12 | 
            +
                    schema = context.schema
         | 
| 13 13 | 
             
                    schema_type = schema.introspection_system.types["__Schema"]
         | 
| 14 | 
            -
                    schema_type. | 
| 14 | 
            +
                    schema_type.wrap(schema, context)
         | 
| 15 15 | 
             
                  end
         | 
| 16 16 |  | 
| 17 17 | 
             
                  def __type(name:)
         | 
| 18 | 
            -
                     | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
                    # The interpreter provides this wrapping, other execution doesnt, so support both.
         | 
| 26 | 
            -
                    if type && !context.interpreter?
         | 
| 27 | 
            -
                      # Apply wrapping manually since this field isn't wrapped by instrumentation
         | 
| 28 | 
            -
                      type_type = context.schema.introspection_system.types["__Type"]
         | 
| 29 | 
            -
                      type = type_type.type_class.authorized_new(type, context)
         | 
| 18 | 
            +
                    if context.warden.reachable_type?(name)
         | 
| 19 | 
            +
                      context.warden.get_type(name)
         | 
| 20 | 
            +
                    elsif (type = context.schema.extra_types.find { |t| t.graphql_name == name })
         | 
| 21 | 
            +
                      type
         | 
| 22 | 
            +
                    else
         | 
| 23 | 
            +
                      nil
         | 
| 30 24 | 
             
                    end
         | 
| 31 | 
            -
                    type
         | 
| 32 25 | 
             
                  end
         | 
| 33 26 | 
             
                end
         | 
| 34 27 | 
             
              end
         | 
| @@ -7,9 +7,9 @@ module GraphQL | |
| 7 7 | 
             
                              "placeholder for a string or numeric value. However an Enum value is returned in "\
         | 
| 8 8 | 
             
                              "a JSON response as a string."
         | 
| 9 9 | 
             
                  field :name, String, null: false
         | 
| 10 | 
            -
                  field :description, String | 
| 10 | 
            +
                  field :description, String
         | 
| 11 11 | 
             
                  field :is_deprecated, Boolean, null: false
         | 
| 12 | 
            -
                  field :deprecation_reason, String | 
| 12 | 
            +
                  field :deprecation_reason, String
         | 
| 13 13 |  | 
| 14 14 | 
             
                  def name
         | 
| 15 15 | 
             
                    object.graphql_name
         | 
| @@ -6,13 +6,13 @@ module GraphQL | |
| 6 6 | 
             
                  description "Object and Interface types are described by a list of Fields, each of which has "\
         | 
| 7 7 | 
             
                              "a name, potentially a list of arguments, and a return type."
         | 
| 8 8 | 
             
                  field :name, String, null: false
         | 
| 9 | 
            -
                  field :description, String | 
| 10 | 
            -
                  field :args, [GraphQL::Schema::LateBoundType.new("__InputValue")], null: false do
         | 
| 9 | 
            +
                  field :description, String
         | 
| 10 | 
            +
                  field :args, [GraphQL::Schema::LateBoundType.new("__InputValue")], null: false, scope: false do
         | 
| 11 11 | 
             
                    argument :include_deprecated, Boolean, required: false, default_value: false
         | 
| 12 12 | 
             
                  end
         | 
| 13 13 | 
             
                  field :type, GraphQL::Schema::LateBoundType.new("__Type"), null: false
         | 
| 14 14 | 
             
                  field :is_deprecated, Boolean, null: false
         | 
| 15 | 
            -
                  field :deprecation_reason, String | 
| 15 | 
            +
                  field :deprecation_reason, String
         | 
| 16 16 |  | 
| 17 17 | 
             
                  def is_deprecated
         | 
| 18 18 | 
             
                    !!@object.deprecation_reason
         | 
| @@ -7,11 +7,11 @@ module GraphQL | |
| 7 7 | 
             
                              "InputObject are represented as Input Values which describe their type and "\
         | 
| 8 8 | 
             
                              "optionally a default value."
         | 
| 9 9 | 
             
                  field :name, String, null: false
         | 
| 10 | 
            -
                  field :description, String | 
| 10 | 
            +
                  field :description, String
         | 
| 11 11 | 
             
                  field :type, GraphQL::Schema::LateBoundType.new("__Type"), null: false
         | 
| 12 | 
            -
                  field :default_value, String, "A GraphQL-formatted string representing the default value for this input value." | 
| 12 | 
            +
                  field :default_value, String, "A GraphQL-formatted string representing the default value for this input value."
         | 
| 13 13 | 
             
                  field :is_deprecated, Boolean, null: false
         | 
| 14 | 
            -
                  field :deprecation_reason, String | 
| 14 | 
            +
                  field :deprecation_reason, String
         | 
| 15 15 |  | 
| 16 16 | 
             
                  def is_deprecated
         | 
| 17 17 | 
             
                    !!@object.deprecation_reason
         | 
| @@ -23,6 +23,12 @@ module GraphQL | |
| 23 23 | 
             
                      if value.nil?
         | 
| 24 24 | 
             
                        'null'
         | 
| 25 25 | 
             
                      else
         | 
| 26 | 
            +
                        if (@object.type.kind.list? || (@object.type.kind.non_null? && @object.type.of_type.kind.list?)) && !value.respond_to?(:map)
         | 
| 27 | 
            +
                          # This is a bit odd -- we expect the default value to be an application-style value, so we use coerce result below.
         | 
| 28 | 
            +
                          # But coerce_result doesn't wrap single-item lists, which are valid inputs to list types.
         | 
| 29 | 
            +
                          # So, apply that wrapper here if needed.
         | 
| 30 | 
            +
                          value = [value]
         | 
| 31 | 
            +
                        end
         | 
| 26 32 | 
             
                        coerced_default_value = @object.type.coerce_result(value, @context)
         | 
| 27 33 | 
             
                        serialize_default_value(coerced_default_value, @object.type)
         | 
| 28 34 | 
             
                      end
         | 
| @@ -48,7 +54,7 @@ module GraphQL | |
| 48 54 | 
             
                    elsif type.kind.input_object?
         | 
| 49 55 | 
             
                      "{" +
         | 
| 50 56 | 
             
                        value.map do |k, v|
         | 
| 51 | 
            -
                          arg_defn = type. | 
| 57 | 
            +
                          arg_defn = type.get_argument(k, context)
         | 
| 52 58 | 
             
                          "#{k}: #{serialize_default_value(v, arg_defn.type)}"
         | 
| 53 59 | 
             
                        end.join(", ") +
         | 
| 54 60 | 
             
                        "}"
         | 
| @@ -8,14 +8,21 @@ module GraphQL | |
| 8 8 | 
             
                              "available types and directives on the server, as well as the entry points for "\
         | 
| 9 9 | 
             
                              "query, mutation, and subscription operations."
         | 
| 10 10 |  | 
| 11 | 
            -
                  field :types, [GraphQL::Schema::LateBoundType.new("__Type")], "A list of all types supported by this server.", null: false
         | 
| 11 | 
            +
                  field :types, [GraphQL::Schema::LateBoundType.new("__Type")], "A list of all types supported by this server.", null: false, scope: false
         | 
| 12 12 | 
             
                  field :query_type, GraphQL::Schema::LateBoundType.new("__Type"), "The type that query operations will be rooted at.", null: false
         | 
| 13 | 
            -
                  field :mutation_type, GraphQL::Schema::LateBoundType.new("__Type"), "If this server supports mutation, the type that mutation operations will be rooted at." | 
| 14 | 
            -
                  field :subscription_type, GraphQL::Schema::LateBoundType.new("__Type"), "If this server support subscription, the type that subscription operations will be rooted at." | 
| 15 | 
            -
                  field :directives, [GraphQL::Schema::LateBoundType.new("__Directive")], "A list of all directives supported by this server.", null: false
         | 
| 13 | 
            +
                  field :mutation_type, GraphQL::Schema::LateBoundType.new("__Type"), "If this server supports mutation, the type that mutation operations will be rooted at."
         | 
| 14 | 
            +
                  field :subscription_type, GraphQL::Schema::LateBoundType.new("__Type"), "If this server support subscription, the type that subscription operations will be rooted at."
         | 
| 15 | 
            +
                  field :directives, [GraphQL::Schema::LateBoundType.new("__Directive")], "A list of all directives supported by this server.", null: false, scope: false
         | 
| 16 | 
            +
                  field :description, String, resolver_method: :schema_description
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  def schema_description
         | 
| 19 | 
            +
                    context.schema.description
         | 
| 20 | 
            +
                  end
         | 
| 16 21 |  | 
| 17 22 | 
             
                  def types
         | 
| 18 | 
            -
                     | 
| 23 | 
            +
                    types = context.warden.reachable_types + context.schema.extra_types
         | 
| 24 | 
            +
                    types.sort_by!(&:graphql_name)
         | 
| 25 | 
            +
                    types
         | 
| 19 26 | 
             
                  end
         | 
| 20 27 |  | 
| 21 28 | 
             
                  def query_type
         | 
| @@ -12,23 +12,36 @@ module GraphQL | |
| 12 12 | 
             
                              "possible at runtime. List and NonNull types compose other types."
         | 
| 13 13 |  | 
| 14 14 | 
             
                  field :kind, GraphQL::Schema::LateBoundType.new("__TypeKind"), null: false
         | 
| 15 | 
            -
                  field :name, String,  | 
| 16 | 
            -
                  field :description, String | 
| 17 | 
            -
                  field :fields, [GraphQL::Schema::LateBoundType.new("__Field")],  | 
| 15 | 
            +
                  field :name, String, method: :graphql_name
         | 
| 16 | 
            +
                  field :description, String
         | 
| 17 | 
            +
                  field :fields, [GraphQL::Schema::LateBoundType.new("__Field")], scope: false do
         | 
| 18 18 | 
             
                    argument :include_deprecated, Boolean, required: false, default_value: false
         | 
| 19 19 | 
             
                  end
         | 
| 20 | 
            -
                  field :interfaces, [GraphQL::Schema::LateBoundType.new("__Type")],  | 
| 21 | 
            -
                  field :possible_types, [GraphQL::Schema::LateBoundType.new("__Type")],  | 
| 22 | 
            -
                  field :enum_values, [GraphQL::Schema::LateBoundType.new("__EnumValue")],  | 
| 20 | 
            +
                  field :interfaces, [GraphQL::Schema::LateBoundType.new("__Type")], scope: false
         | 
| 21 | 
            +
                  field :possible_types, [GraphQL::Schema::LateBoundType.new("__Type")], scope: false
         | 
| 22 | 
            +
                  field :enum_values, [GraphQL::Schema::LateBoundType.new("__EnumValue")], scope: false do
         | 
| 23 23 | 
             
                    argument :include_deprecated, Boolean, required: false, default_value: false
         | 
| 24 24 | 
             
                  end
         | 
| 25 | 
            -
                  field :input_fields, [GraphQL::Schema::LateBoundType.new("__InputValue")],  | 
| 25 | 
            +
                  field :input_fields, [GraphQL::Schema::LateBoundType.new("__InputValue")], scope: false  do
         | 
| 26 26 | 
             
                    argument :include_deprecated, Boolean, required: false, default_value: false
         | 
| 27 27 | 
             
                  end
         | 
| 28 | 
            -
                  field :of_type, GraphQL::Schema::LateBoundType.new("__Type") | 
| 28 | 
            +
                  field :of_type, GraphQL::Schema::LateBoundType.new("__Type")
         | 
| 29 29 |  | 
| 30 | 
            -
                   | 
| 31 | 
            -
             | 
| 30 | 
            +
                  field :specifiedByURL, String, resolver_method: :specified_by_url
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  field :is_one_of, Boolean, null: false
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                  def is_one_of
         | 
| 35 | 
            +
                    object.kind.input_object? &&
         | 
| 36 | 
            +
                      object.directives.any? { |d| d.graphql_name == "oneOf" }
         | 
| 37 | 
            +
                  end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  def specified_by_url
         | 
| 40 | 
            +
                    if object.kind.scalar?
         | 
| 41 | 
            +
                      object.specified_by_url
         | 
| 42 | 
            +
                    else
         | 
| 43 | 
            +
                      nil
         | 
| 44 | 
            +
                    end
         | 
| 32 45 | 
             
                  end
         | 
| 33 46 |  | 
| 34 47 | 
             
                  def kind
         | 
| @@ -50,8 +63,8 @@ module GraphQL | |
| 50 63 | 
             
                  end
         | 
| 51 64 |  | 
| 52 65 | 
             
                  def interfaces
         | 
| 53 | 
            -
                    if @object.kind  | 
| 54 | 
            -
                      @context.warden.interfaces(@object)
         | 
| 66 | 
            +
                    if @object.kind.object? || @object.kind.interface?
         | 
| 67 | 
            +
                      @context.warden.interfaces(@object).sort_by(&:graphql_name)
         | 
| 55 68 | 
             
                    else
         | 
| 56 69 | 
             
                      nil
         | 
| 57 70 | 
             
                    end
         | 
| @@ -1,12 +1,13 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 | 
             
            module GraphQL
         | 
| 3 3 | 
             
              module Introspection
         | 
| 4 | 
            -
                def self.query(include_deprecated_args: false)
         | 
| 4 | 
            +
                def self.query(include_deprecated_args: false, include_schema_description: false, include_is_repeatable: false, include_specified_by_url: false, include_is_one_of: false)
         | 
| 5 5 | 
             
                  # The introspection query to end all introspection queries, copied from
         | 
| 6 6 | 
             
                  # https://github.com/graphql/graphql-js/blob/master/src/utilities/introspectionQuery.js
         | 
| 7 | 
            -
                  <<-QUERY
         | 
| 7 | 
            +
                  <<-QUERY.gsub(/\n{2,}/, "\n")
         | 
| 8 8 | 
             
            query IntrospectionQuery {
         | 
| 9 9 | 
             
              __schema {
         | 
| 10 | 
            +
                #{include_schema_description ? "description" : ""}
         | 
| 10 11 | 
             
                queryType { name }
         | 
| 11 12 | 
             
                mutationType { name }
         | 
| 12 13 | 
             
                subscriptionType { name }
         | 
| @@ -17,6 +18,7 @@ query IntrospectionQuery { | |
| 17 18 | 
             
                  name
         | 
| 18 19 | 
             
                  description
         | 
| 19 20 | 
             
                  locations
         | 
| 21 | 
            +
                  #{include_is_repeatable ? "isRepeatable" : ""}
         | 
| 20 22 | 
             
                  args#{include_deprecated_args ? '(includeDeprecated: true)' : ''} {
         | 
| 21 23 | 
             
                    ...InputValue
         | 
| 22 24 | 
             
                  }
         | 
| @@ -27,6 +29,8 @@ fragment FullType on __Type { | |
| 27 29 | 
             
              kind
         | 
| 28 30 | 
             
              name
         | 
| 29 31 | 
             
              description
         | 
| 32 | 
            +
              #{include_specified_by_url ? "specifiedByURL" : ""}
         | 
| 33 | 
            +
              #{include_is_one_of ? "isOneOf" : ""}
         | 
| 30 34 | 
             
              fields(includeDeprecated: true) {
         | 
| 31 35 | 
             
                name
         | 
| 32 36 | 
             
                description
         | 
| @@ -2,16 +2,12 @@ | |
| 2 2 | 
             
            module GraphQL
         | 
| 3 3 | 
             
              module Language
         | 
| 4 4 | 
             
                module BlockString
         | 
| 5 | 
            -
                  if !String.method_defined?(:match?)
         | 
| 6 | 
            -
                    using GraphQL::StringMatchBackport
         | 
| 7 | 
            -
                  end
         | 
| 8 | 
            -
             | 
| 9 5 | 
             
                  # Remove leading and trailing whitespace from a block string.
         | 
| 10 6 | 
             
                  # See "Block Strings" in https://github.com/facebook/graphql/blob/master/spec/Section%202%20--%20Language.md
         | 
| 11 7 | 
             
                  def self.trim_whitespace(str)
         | 
| 12 8 | 
             
                    # Early return for the most common cases:
         | 
| 13 9 | 
             
                    if str == ""
         | 
| 14 | 
            -
                      return ""
         | 
| 10 | 
            +
                      return "".dup
         | 
| 15 11 | 
             
                    elsif !(has_newline = str.include?("\n")) && !(str.start_with?(" "))
         | 
| 16 12 | 
             
                      return str
         | 
| 17 13 | 
             
                    end
         | 
| @@ -51,52 +47,68 @@ module GraphQL | |
| 51 47 | 
             
                    end
         | 
| 52 48 |  | 
| 53 49 | 
             
                    # Remove leading & trailing blank lines
         | 
| 54 | 
            -
                    while lines.size > 0 && lines | 
| 50 | 
            +
                    while lines.size > 0 && contains_only_whitespace?(lines.first)
         | 
| 55 51 | 
             
                      lines.shift
         | 
| 56 52 | 
             
                    end
         | 
| 57 | 
            -
                    while lines.size > 0 && lines | 
| 53 | 
            +
                    while lines.size > 0 && contains_only_whitespace?(lines.last)
         | 
| 58 54 | 
             
                      lines.pop
         | 
| 59 55 | 
             
                    end
         | 
| 60 56 |  | 
| 61 57 | 
             
                    # Rebuild the string
         | 
| 62 | 
            -
                    lines.size > 1 ? lines.join("\n") : (lines.first || "")
         | 
| 58 | 
            +
                    lines.size > 1 ? lines.join("\n") : (lines.first || "".dup)
         | 
| 63 59 | 
             
                  end
         | 
| 64 60 |  | 
| 65 61 | 
             
                  def self.print(str, indent: '')
         | 
| 66 | 
            -
                     | 
| 67 | 
            -
             | 
| 68 | 
            -
                     | 
| 69 | 
            -
             | 
| 70 | 
            -
                     | 
| 71 | 
            -
             | 
| 72 | 
            -
             | 
| 73 | 
            -
                       | 
| 74 | 
            -
                         | 
| 75 | 
            -
             | 
| 76 | 
            -
             | 
| 62 | 
            +
                    line_length = 120 - indent.length
         | 
| 63 | 
            +
                    block_str = "".dup
         | 
| 64 | 
            +
                    triple_quotes = "\"\"\"\n"
         | 
| 65 | 
            +
                    block_str << indent
         | 
| 66 | 
            +
                    block_str << triple_quotes
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                    if str.include?("\n")
         | 
| 69 | 
            +
                      str.split("\n") do |line|
         | 
| 70 | 
            +
                        if line == ''
         | 
| 71 | 
            +
                          block_str << "\n"
         | 
| 72 | 
            +
                        else
         | 
| 73 | 
            +
                          break_line(line, line_length) do |subline|
         | 
| 74 | 
            +
                            block_str << indent
         | 
| 75 | 
            +
                            block_str << subline
         | 
| 76 | 
            +
                            block_str << "\n"
         | 
| 77 | 
            +
                          end
         | 
| 77 78 | 
             
                        end
         | 
| 78 79 | 
             
                      end
         | 
| 80 | 
            +
                    else
         | 
| 81 | 
            +
                      break_line(str, line_length) do |subline|
         | 
| 82 | 
            +
                        block_str << indent
         | 
| 83 | 
            +
                        block_str << subline
         | 
| 84 | 
            +
                        block_str << "\n"
         | 
| 85 | 
            +
                      end
         | 
| 79 86 | 
             
                    end
         | 
| 80 87 |  | 
| 81 | 
            -
                    block_str <<  | 
| 88 | 
            +
                    block_str << indent
         | 
| 89 | 
            +
                    block_str << triple_quotes
         | 
| 82 90 | 
             
                  end
         | 
| 83 91 |  | 
| 84 92 | 
             
                  private
         | 
| 85 93 |  | 
| 86 94 | 
             
                  def self.break_line(line, length)
         | 
| 87 | 
            -
                    return  | 
| 95 | 
            +
                    return yield(line) if line.length < length + 5
         | 
| 88 96 |  | 
| 89 97 | 
             
                    parts = line.split(Regexp.new("((?: |^).{15,#{length - 40}}(?= |$))"))
         | 
| 90 | 
            -
                    return  | 
| 98 | 
            +
                    return yield(line) if parts.length < 4
         | 
| 91 99 |  | 
| 92 | 
            -
                     | 
| 100 | 
            +
                    yield(parts.slice!(0, 3).join)
         | 
| 93 101 |  | 
| 94 102 | 
             
                    parts.each_with_index do |part, i|
         | 
| 95 103 | 
             
                      next if i % 2 == 1
         | 
| 96 | 
            -
                       | 
| 104 | 
            +
                      yield "#{part[1..-1]}#{parts[i + 1]}"
         | 
| 97 105 | 
             
                    end
         | 
| 98 106 |  | 
| 99 | 
            -
                     | 
| 107 | 
            +
                    nil
         | 
| 108 | 
            +
                  end
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                  def self.contains_only_whitespace?(line)
         | 
| 111 | 
            +
                    line.match?(/^\s*$/)
         | 
| 100 112 | 
             
                  end
         | 
| 101 113 | 
             
                end
         | 
| 102 114 | 
             
              end
         |