graphql 1.13.24 → 2.5.11
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.
- checksums.yaml +4 -4
- data/lib/generators/graphql/install/mutation_root_generator.rb +2 -2
- data/lib/generators/graphql/install/templates/base_mutation.erb +2 -0
- data/lib/generators/graphql/install/templates/mutation_type.erb +2 -0
- data/lib/generators/graphql/install_generator.rb +50 -1
- data/lib/generators/graphql/mutation_delete_generator.rb +1 -1
- data/lib/generators/graphql/mutation_update_generator.rb +1 -1
- data/lib/generators/graphql/orm_mutations_base.rb +1 -1
- data/lib/generators/graphql/relay.rb +21 -18
- 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/graphql_controller.erb +2 -0
- data/lib/generators/graphql/templates/loader.erb +2 -0
- data/lib/generators/graphql/templates/mutation.erb +2 -0
- data/lib/generators/graphql/templates/node_type.erb +2 -0
- data/lib/generators/graphql/templates/query_type.erb +2 -0
- data/lib/generators/graphql/templates/schema.erb +8 -0
- data/lib/generators/graphql/type_generator.rb +1 -1
- data/lib/graphql/analysis/analyzer.rb +90 -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 +236 -61
- data/lib/graphql/analysis/query_depth.rb +38 -23
- data/lib/graphql/analysis/visitor.rb +280 -0
- data/lib/graphql/analysis.rb +93 -6
- data/lib/graphql/autoload.rb +38 -0
- data/lib/graphql/backtrace/table.rb +118 -73
- data/lib/graphql/backtrace.rb +2 -25
- data/lib/graphql/coercion_error.rb +1 -9
- data/lib/graphql/current.rb +57 -0
- data/lib/graphql/dashboard/detailed_traces.rb +47 -0
- data/lib/graphql/dashboard/installable.rb +22 -0
- data/lib/graphql/dashboard/limiters.rb +93 -0
- data/lib/graphql/dashboard/operation_store.rb +199 -0
- data/lib/graphql/dashboard/statics/bootstrap-5.3.3.min.css +6 -0
- data/lib/graphql/dashboard/statics/bootstrap-5.3.3.min.js +7 -0
- data/lib/graphql/dashboard/statics/charts.min.css +1 -0
- data/lib/graphql/dashboard/statics/dashboard.css +30 -0
- data/lib/graphql/dashboard/statics/dashboard.js +143 -0
- data/lib/graphql/dashboard/statics/header-icon.png +0 -0
- data/lib/graphql/dashboard/statics/icon.png +0 -0
- data/lib/graphql/dashboard/subscriptions.rb +96 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/detailed_traces/traces/index.html.erb +45 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/landings/show.html.erb +18 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/limiters/limiters/show.html.erb +62 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/not_installed.html.erb +18 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/_form.html.erb +23 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/edit.html.erb +21 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/index.html.erb +69 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/new.html.erb +7 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/index_entries/index.html.erb +39 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/index_entries/show.html.erb +32 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/operations/index.html.erb +81 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/operations/show.html.erb +71 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/subscriptions/subscriptions/show.html.erb +41 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/subscriptions/topics/index.html.erb +55 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/subscriptions/topics/show.html.erb +40 -0
- data/lib/graphql/dashboard/views/layouts/graphql/dashboard/application.html.erb +108 -0
- data/lib/graphql/dashboard.rb +158 -0
- data/lib/graphql/dataloader/active_record_association_source.rb +84 -0
- data/lib/graphql/dataloader/active_record_source.rb +47 -0
- data/lib/graphql/dataloader/async_dataloader.rb +101 -0
- data/lib/graphql/dataloader/null_dataloader.rb +11 -2
- data/lib/graphql/dataloader/request.rb +5 -0
- data/lib/graphql/dataloader/source.rb +103 -47
- data/lib/graphql/dataloader.rb +174 -148
- data/lib/graphql/dig.rb +3 -2
- data/lib/graphql/duration_encoding_error.rb +16 -0
- data/lib/graphql/execution/errors.rb +12 -82
- data/lib/graphql/execution/interpreter/argument_value.rb +5 -1
- data/lib/graphql/execution/interpreter/arguments.rb +1 -1
- data/lib/graphql/execution/interpreter/arguments_cache.rb +30 -35
- data/lib/graphql/execution/interpreter/resolve.rb +32 -2
- data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +215 -0
- data/lib/graphql/execution/interpreter/runtime.rb +525 -502
- data/lib/graphql/execution/interpreter.rb +127 -81
- data/lib/graphql/execution/lazy.rb +7 -21
- data/lib/graphql/execution/lookahead.rb +133 -55
- data/lib/graphql/execution/multiplex.rb +6 -176
- data/lib/graphql/execution.rb +11 -4
- data/lib/graphql/introspection/directive_location_enum.rb +1 -1
- data/lib/graphql/introspection/directive_type.rb +1 -1
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +10 -17
- data/lib/graphql/introspection/field_type.rb +1 -1
- data/lib/graphql/introspection/schema_type.rb +8 -11
- data/lib/graphql/introspection/type_type.rb +13 -6
- data/lib/graphql/introspection.rb +4 -3
- data/lib/graphql/invalid_name_error.rb +1 -1
- data/lib/graphql/invalid_null_error.rb +20 -17
- data/lib/graphql/language/block_string.rb +34 -18
- 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 +114 -80
- data/lib/graphql/language/lexer.rb +375 -1489
- data/lib/graphql/language/nodes.rb +189 -104
- data/lib/graphql/language/parser.rb +807 -1941
- data/lib/graphql/language/printer.rb +366 -163
- data/lib/graphql/language/sanitized_printer.rb +21 -23
- data/lib/graphql/language/static_visitor.rb +171 -0
- data/lib/graphql/language/visitor.rb +189 -138
- data/lib/graphql/language.rb +62 -1
- data/lib/graphql/load_application_object_failed_error.rb +5 -1
- data/lib/graphql/pagination/active_record_relation_connection.rb +0 -8
- data/lib/graphql/pagination/array_connection.rb +8 -6
- data/lib/graphql/pagination/connection.rb +61 -7
- data/lib/graphql/pagination/connections.rb +3 -28
- data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -2
- data/lib/graphql/pagination/relation_connection.rb +2 -0
- data/lib/graphql/query/context/scoped_context.rb +101 -0
- data/lib/graphql/query/context.rb +131 -225
- data/lib/graphql/query/input_validation_result.rb +1 -1
- data/lib/graphql/query/null_context.rb +11 -33
- data/lib/graphql/query/partial.rb +179 -0
- data/lib/graphql/query/validation_pipeline.rb +14 -37
- data/lib/graphql/query/variable_validation_error.rb +1 -1
- data/lib/graphql/query/variables.rb +6 -19
- data/lib/graphql/query.rb +162 -98
- 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 -20
- data/lib/graphql/relay.rb +0 -15
- data/lib/graphql/rubocop/graphql/base_cop.rb +1 -1
- 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 +2 -0
- data/lib/graphql/schema/addition.rb +70 -33
- data/lib/graphql/schema/always_visible.rb +15 -0
- data/lib/graphql/schema/argument.rb +104 -59
- data/lib/graphql/schema/base_64_encoder.rb +3 -5
- data/lib/graphql/schema/build_from_definition.rb +154 -74
- data/lib/graphql/schema/directive/flagged.rb +4 -2
- data/lib/graphql/schema/directive/one_of.rb +24 -0
- data/lib/graphql/schema/directive/specified_by.rb +14 -0
- data/lib/graphql/schema/directive/transform.rb +1 -1
- data/lib/graphql/schema/directive.rb +47 -24
- data/lib/graphql/schema/enum.rb +137 -65
- data/lib/graphql/schema/enum_value.rb +11 -26
- 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 +399 -404
- data/lib/graphql/schema/field_extension.rb +2 -5
- data/lib/graphql/schema/find_inherited_value.rb +2 -7
- data/lib/graphql/schema/has_single_input_argument.rb +160 -0
- data/lib/graphql/schema/input_object.rb +144 -99
- data/lib/graphql/schema/interface.rb +34 -51
- 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 +3 -9
- data/lib/graphql/schema/loader.rb +4 -6
- data/lib/graphql/schema/member/base_dsl_methods.rb +32 -18
- data/lib/graphql/schema/member/build_type.rb +15 -9
- data/lib/graphql/schema/member/has_arguments.rb +192 -96
- data/lib/graphql/schema/member/has_ast_node.rb +12 -0
- data/lib/graphql/schema/member/has_dataloader.rb +62 -0
- data/lib/graphql/schema/member/has_deprecation_reason.rb +18 -4
- data/lib/graphql/schema/member/has_directives.rb +81 -61
- data/lib/graphql/schema/member/has_fields.rb +119 -39
- data/lib/graphql/schema/member/has_interfaces.rb +66 -23
- 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 +32 -2
- data/lib/graphql/schema/member/validates_input.rb +4 -4
- data/lib/graphql/schema/member.rb +1 -6
- data/lib/graphql/schema/mutation.rb +7 -9
- data/lib/graphql/schema/non_null.rb +1 -7
- data/lib/graphql/schema/object.rb +42 -49
- data/lib/graphql/schema/printer.rb +12 -8
- data/lib/graphql/schema/ractor_shareable.rb +79 -0
- data/lib/graphql/schema/relay_classic_mutation.rb +12 -124
- data/lib/graphql/schema/resolver/has_payload_type.rb +20 -10
- data/lib/graphql/schema/resolver.rb +96 -81
- data/lib/graphql/schema/scalar.rb +10 -30
- data/lib/graphql/schema/subscription.rb +60 -14
- data/lib/graphql/schema/timeout.rb +44 -31
- data/lib/graphql/schema/type_expression.rb +2 -2
- data/lib/graphql/schema/type_membership.rb +3 -0
- data/lib/graphql/schema/union.rb +12 -19
- 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/required_validator.rb +60 -10
- data/lib/graphql/schema/validator.rb +5 -3
- data/lib/graphql/schema/visibility/migration.rb +188 -0
- data/lib/graphql/schema/visibility/profile.rb +445 -0
- data/lib/graphql/schema/visibility/visit.rb +190 -0
- data/lib/graphql/schema/visibility.rb +311 -0
- data/lib/graphql/schema/warden.rb +318 -94
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +1148 -1085
- data/lib/graphql/static_validation/all_rules.rb +4 -3
- data/lib/graphql/static_validation/base_visitor.rb +11 -27
- data/lib/graphql/static_validation/definition_dependencies.rb +7 -1
- data/lib/graphql/static_validation/error.rb +2 -2
- 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 +3 -2
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +13 -7
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +14 -12
- 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 +48 -6
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +90 -27
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +10 -2
- 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_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/not_single_subscription_error.rb +25 -0
- data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
- data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
- data/lib/graphql/static_validation/rules/query_root_exists.rb +1 -1
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +5 -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_and_single_subscription_selection.rb +26 -0
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +19 -9
- 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 +2 -2
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +11 -2
- data/lib/graphql/static_validation/validation_context.rb +21 -5
- data/lib/graphql/static_validation/validator.rb +12 -26
- data/lib/graphql/static_validation.rb +0 -3
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +14 -6
- 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 +24 -12
- data/lib/graphql/subscriptions/serialize.rb +3 -1
- data/lib/graphql/subscriptions.rb +48 -32
- data/lib/graphql/testing/helpers.rb +158 -0
- data/lib/graphql/testing.rb +2 -0
- data/lib/graphql/tracing/active_support_notifications_trace.rb +27 -0
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +1 -1
- data/lib/graphql/tracing/appoptics_trace.rb +259 -0
- data/lib/graphql/tracing/appoptics_tracing.rb +9 -2
- data/lib/graphql/tracing/appsignal_trace.rb +54 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +2 -0
- data/lib/graphql/tracing/call_legacy_tracers.rb +66 -0
- data/lib/graphql/tracing/data_dog_trace.rb +71 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +3 -0
- data/lib/graphql/tracing/detailed_trace/memory_backend.rb +60 -0
- data/lib/graphql/tracing/detailed_trace/redis_backend.rb +72 -0
- data/lib/graphql/tracing/detailed_trace.rb +93 -0
- 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/monitor_trace.rb +283 -0
- data/lib/graphql/tracing/new_relic_trace.rb +68 -0
- data/lib/graphql/tracing/new_relic_tracing.rb +2 -0
- data/lib/graphql/tracing/notifications_trace.rb +195 -0
- data/lib/graphql/tracing/notifications_tracing.rb +2 -0
- data/lib/graphql/tracing/null_trace.rb +9 -0
- data/lib/graphql/tracing/perfetto_trace/trace.proto +141 -0
- data/lib/graphql/tracing/perfetto_trace/trace_pb.rb +33 -0
- data/lib/graphql/tracing/perfetto_trace.rb +734 -0
- data/lib/graphql/tracing/platform_trace.rb +123 -0
- data/lib/graphql/tracing/platform_tracing.rb +28 -41
- data/lib/graphql/tracing/{prometheus_tracing → prometheus_trace}/graphql_collector.rb +6 -2
- data/lib/graphql/tracing/prometheus_trace.rb +93 -0
- data/lib/graphql/tracing/prometheus_tracing.rb +5 -3
- data/lib/graphql/tracing/scout_trace.rb +49 -0
- data/lib/graphql/tracing/scout_tracing.rb +2 -0
- data/lib/graphql/tracing/sentry_trace.rb +80 -0
- data/lib/graphql/tracing/statsd_trace.rb +48 -0
- data/lib/graphql/tracing/statsd_tracing.rb +2 -0
- data/lib/graphql/tracing/trace.rb +186 -0
- data/lib/graphql/tracing.rb +32 -52
- data/lib/graphql/type_kinds.rb +8 -4
- data/lib/graphql/types/iso_8601_date.rb +4 -1
- data/lib/graphql/types/iso_8601_date_time.rb +4 -0
- 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 +65 -23
- data/lib/graphql/types/relay/edge_behaviors.rb +33 -5
- 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 +1 -1
- data/lib/graphql/types.rb +18 -10
- data/lib/graphql/unauthorized_enum_value_error.rb +13 -0
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +76 -123
- data/readme.md +13 -3
- metadata +225 -142
- 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 -55
- 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 -230
- data/lib/graphql/analysis/ast/query_depth.rb +0 -56
- data/lib/graphql/analysis/ast/visitor.rb +0 -269
- 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/inspect_result.rb +0 -50
- data/lib/graphql/backtrace/legacy_tracer.rb +0 -56
- data/lib/graphql/backtrace/tracer.rb +0 -81
- data/lib/graphql/backwards_compatibility.rb +0 -61
- data/lib/graphql/base_type.rb +0 -232
- 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 -255
- 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 -55
- data/lib/graphql/deprecation.rb +0 -9
- data/lib/graphql/directive/deprecated_directive.rb +0 -2
- data/lib/graphql/directive/include_directive.rb +0 -2
- data/lib/graphql/directive/skip_directive.rb +0 -2
- data/lib/graphql/directive.rb +0 -107
- data/lib/graphql/enum_type.rb +0 -133
- 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 -260
- data/lib/graphql/language/parser.y +0 -550
- data/lib/graphql/language/token.rb +0 -34
- 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 -54
- 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 -39
- data/lib/graphql/relay/global_id_resolve.rb +0 -17
- 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 -164
- data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -58
- data/lib/graphql/schema/member/instrumentation.rb +0 -131
- data/lib/graphql/schema/middleware_chain.rb +0 -82
- data/lib/graphql/schema/null_mask.rb +0 -11
- 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/rules/subscription_root_exists.rb +0 -17
- 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 -31
- data/lib/graphql/types/relay/node_field.rb +0 -24
- data/lib/graphql/types/relay/nodes_field.rb +0 -43
- data/lib/graphql/union_type.rb +0 -115
- data/lib/graphql/upgrader/member.rb +0 -937
- data/lib/graphql/upgrader/schema.rb +0 -38
@@ -71,14 +71,11 @@ module GraphQL
|
|
71
71
|
elsif inherited_extras
|
72
72
|
inherited_extras
|
73
73
|
else
|
74
|
-
|
74
|
+
GraphQL::EmptyObjects::EMPTY_ARRAY
|
75
75
|
end
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
|
-
NO_EXTRAS = [].freeze
|
80
|
-
private_constant :NO_EXTRAS
|
81
|
-
|
82
79
|
# Called when this extension is attached to a field.
|
83
80
|
# The field definition may be extended during this method.
|
84
81
|
# @return [void]
|
@@ -107,7 +104,7 @@ module GraphQL
|
|
107
104
|
end
|
108
105
|
end
|
109
106
|
end
|
110
|
-
if (extras = self.class.extras).
|
107
|
+
if !(extras = self.class.extras).empty?
|
111
108
|
@added_extras = extras - field.extras
|
112
109
|
field.extras(@added_extras)
|
113
110
|
else
|
@@ -2,17 +2,12 @@
|
|
2
2
|
module GraphQL
|
3
3
|
class Schema
|
4
4
|
module FindInheritedValue
|
5
|
-
module EmptyObjects
|
6
|
-
EMPTY_HASH = {}.freeze
|
7
|
-
EMPTY_ARRAY = [].freeze
|
8
|
-
end
|
9
|
-
|
10
5
|
def self.extended(child_cls)
|
11
|
-
child_cls.singleton_class.include(EmptyObjects)
|
6
|
+
child_cls.singleton_class.include(GraphQL::EmptyObjects)
|
12
7
|
end
|
13
8
|
|
14
9
|
def self.included(child_cls)
|
15
|
-
child_cls.include(EmptyObjects)
|
10
|
+
child_cls.include(GraphQL::EmptyObjects)
|
16
11
|
end
|
17
12
|
|
18
13
|
private
|
@@ -0,0 +1,160 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GraphQL
|
4
|
+
class Schema
|
5
|
+
module HasSingleInputArgument
|
6
|
+
def resolve_with_support(**inputs)
|
7
|
+
if inputs[:input].is_a?(InputObject)
|
8
|
+
input = inputs[:input].to_kwargs
|
9
|
+
else
|
10
|
+
input = inputs[:input]
|
11
|
+
end
|
12
|
+
|
13
|
+
new_extras = field ? field.extras : []
|
14
|
+
all_extras = self.class.extras + new_extras
|
15
|
+
|
16
|
+
# Transfer these from the top-level hash to the
|
17
|
+
# shortcutted `input:` object
|
18
|
+
all_extras.each do |ext|
|
19
|
+
# It's possible that the `extra` was not passed along by this point,
|
20
|
+
# don't re-add it if it wasn't given here.
|
21
|
+
if inputs.key?(ext)
|
22
|
+
input[ext] = inputs[ext]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
if input
|
27
|
+
# This is handled by Relay::Mutation::Resolve, a bit hacky, but here we are.
|
28
|
+
input_kwargs = input.to_h
|
29
|
+
else
|
30
|
+
# Relay Classic Mutations with no `argument`s
|
31
|
+
# don't require `input:`
|
32
|
+
input_kwargs = {}
|
33
|
+
end
|
34
|
+
|
35
|
+
if !input_kwargs.empty?
|
36
|
+
super(**input_kwargs)
|
37
|
+
else
|
38
|
+
super()
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.included(base)
|
43
|
+
base.extend(ClassMethods)
|
44
|
+
end
|
45
|
+
|
46
|
+
module ClassMethods
|
47
|
+
def dummy
|
48
|
+
@dummy ||= begin
|
49
|
+
d = Class.new(GraphQL::Schema::Resolver)
|
50
|
+
d.graphql_name "#{self.graphql_name}DummyResolver"
|
51
|
+
d.argument_class(self.argument_class)
|
52
|
+
# TODO make this lazier?
|
53
|
+
d.argument(:input, input_type, description: "Parameters for #{self.graphql_name}")
|
54
|
+
d
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def field_arguments(context = GraphQL::Query::NullContext.instance)
|
59
|
+
dummy.arguments(context)
|
60
|
+
end
|
61
|
+
|
62
|
+
def get_field_argument(name, context = GraphQL::Query::NullContext.instance)
|
63
|
+
dummy.get_argument(name, context)
|
64
|
+
end
|
65
|
+
|
66
|
+
def own_field_arguments
|
67
|
+
dummy.own_arguments
|
68
|
+
end
|
69
|
+
|
70
|
+
def any_field_arguments?
|
71
|
+
dummy.any_arguments?
|
72
|
+
end
|
73
|
+
|
74
|
+
def all_field_argument_definitions
|
75
|
+
dummy.all_argument_definitions
|
76
|
+
end
|
77
|
+
|
78
|
+
# Also apply this argument to the input type:
|
79
|
+
def argument(*args, own_argument: false, **kwargs, &block)
|
80
|
+
it = input_type # make sure any inherited arguments are already added to it
|
81
|
+
arg = super(*args, **kwargs, &block)
|
82
|
+
|
83
|
+
# This definition might be overriding something inherited;
|
84
|
+
# if it is, remove the inherited definition so it's not confused at runtime as having multiple definitions
|
85
|
+
prev_args = it.own_arguments[arg.graphql_name]
|
86
|
+
case prev_args
|
87
|
+
when GraphQL::Schema::Argument
|
88
|
+
if prev_args.owner != self
|
89
|
+
it.own_arguments.delete(arg.graphql_name)
|
90
|
+
end
|
91
|
+
when Array
|
92
|
+
prev_args.reject! { |a| a.owner != self }
|
93
|
+
if prev_args.empty?
|
94
|
+
it.own_arguments.delete(arg.graphql_name)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
it.add_argument(arg)
|
99
|
+
arg
|
100
|
+
end
|
101
|
+
|
102
|
+
# The base class for generated input object types
|
103
|
+
# @param new_class [Class] The base class to use for generating input object definitions
|
104
|
+
# @return [Class] The base class for this mutation's generated input object (default is {GraphQL::Schema::InputObject})
|
105
|
+
def input_object_class(new_class = nil)
|
106
|
+
if new_class
|
107
|
+
@input_object_class = new_class
|
108
|
+
end
|
109
|
+
@input_object_class || (superclass.respond_to?(:input_object_class) ? superclass.input_object_class : GraphQL::Schema::InputObject)
|
110
|
+
end
|
111
|
+
|
112
|
+
# @param new_input_type [Class, nil] If provided, it configures this mutation to accept `new_input_type` instead of generating an input type
|
113
|
+
# @return [Class] The generated {Schema::InputObject} class for this mutation's `input`
|
114
|
+
def input_type(new_input_type = nil)
|
115
|
+
if new_input_type
|
116
|
+
@input_type = new_input_type
|
117
|
+
end
|
118
|
+
@input_type ||= generate_input_type
|
119
|
+
end
|
120
|
+
|
121
|
+
private
|
122
|
+
|
123
|
+
# Generate the input type for the `input:` argument
|
124
|
+
# To customize how input objects are generated, override this method
|
125
|
+
# @return [Class] a subclass of {.input_object_class}
|
126
|
+
def generate_input_type
|
127
|
+
mutation_args = all_argument_definitions
|
128
|
+
mutation_class = self
|
129
|
+
Class.new(input_object_class) do
|
130
|
+
class << self
|
131
|
+
def default_graphql_name
|
132
|
+
"#{self.mutation.graphql_name}Input"
|
133
|
+
end
|
134
|
+
|
135
|
+
def description(new_desc = nil)
|
136
|
+
super || "Autogenerated input type of #{self.mutation.graphql_name}"
|
137
|
+
end
|
138
|
+
end
|
139
|
+
# For compatibility, in case no arguments are defined:
|
140
|
+
has_no_arguments(true)
|
141
|
+
mutation(mutation_class)
|
142
|
+
# these might be inherited:
|
143
|
+
mutation_args.each do |arg|
|
144
|
+
add_argument(arg)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
private
|
151
|
+
|
152
|
+
def authorize_arguments(args, values)
|
153
|
+
# remove the `input` wrapper to match values
|
154
|
+
input_type = args.find { |a| a.graphql_name == "input" }.type.unwrap
|
155
|
+
input_args = context.types.arguments(input_type)
|
156
|
+
super(input_args, values)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
@@ -2,7 +2,6 @@
|
|
2
2
|
module GraphQL
|
3
3
|
class Schema
|
4
4
|
class InputObject < GraphQL::Schema::Member
|
5
|
-
extend GraphQL::Schema::Member::AcceptsDefinition
|
6
5
|
extend Forwardable
|
7
6
|
extend GraphQL::Schema::Member::HasArguments
|
8
7
|
extend GraphQL::Schema::Member::HasArguments::ArgumentObjectLoader
|
@@ -11,51 +10,39 @@ module GraphQL
|
|
11
10
|
|
12
11
|
include GraphQL::Dig
|
13
12
|
|
13
|
+
# Raised when an InputObject doesn't have any arguments defined and hasn't explicitly opted out of this requirement
|
14
|
+
class ArgumentsAreRequiredError < GraphQL::Error
|
15
|
+
def initialize(input_object_type)
|
16
|
+
message = "Input Object types must have arguments, but #{input_object_type.graphql_name} doesn't have any. Define an argument for this type, remove it from your schema, or add `has_no_arguments(true)` to its definition."
|
17
|
+
super(message)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
14
21
|
# @return [GraphQL::Query::Context] The context for this query
|
15
22
|
attr_reader :context
|
16
|
-
# @return [GraphQL::
|
23
|
+
# @return [GraphQL::Execution::Interpereter::Arguments] The underlying arguments instance
|
17
24
|
attr_reader :arguments
|
18
25
|
|
19
26
|
# Ruby-like hash behaviors, read-only
|
20
27
|
def_delegators :@ruby_style_hash, :keys, :values, :each, :map, :any?, :empty?
|
21
28
|
|
22
|
-
def initialize(arguments
|
29
|
+
def initialize(arguments, ruby_kwargs:, context:, defaults_used:)
|
23
30
|
@context = context
|
24
|
-
|
25
|
-
|
26
|
-
@arguments = arguments
|
27
|
-
else
|
28
|
-
@arguments = self.class.arguments_class.new(arguments, context: context, defaults_used: defaults_used)
|
29
|
-
# Symbolized, underscored hash:
|
30
|
-
@ruby_style_hash = @arguments.to_kwargs
|
31
|
-
end
|
31
|
+
@ruby_style_hash = ruby_kwargs
|
32
|
+
@arguments = arguments
|
32
33
|
# Apply prepares, not great to have it duplicated here.
|
33
|
-
|
34
|
-
|
34
|
+
arg_defns = context ? context.types.arguments(self.class) : self.class.arguments(context).each_value
|
35
|
+
arg_defns.each do |arg_defn|
|
35
36
|
ruby_kwargs_key = arg_defn.keyword
|
36
|
-
|
37
37
|
if @ruby_style_hash.key?(ruby_kwargs_key)
|
38
|
-
loads = arg_defn.loads
|
39
|
-
# Resolvers do this loading themselves;
|
40
|
-
# With the interpreter, it's done during `coerce_arguments`
|
41
|
-
if loads && !arg_defn.from_resolver? && !context.interpreter?
|
42
|
-
value = @ruby_style_hash[ruby_kwargs_key]
|
43
|
-
loaded_value = arg_defn.load_and_authorize_value(self, value, context)
|
44
|
-
maybe_lazies << context.schema.after_lazy(loaded_value) do |loaded_value|
|
45
|
-
overwrite_argument(ruby_kwargs_key, loaded_value)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
38
|
# Weirdly, procs are applied during coercion, but not methods.
|
50
39
|
# Probably because these methods require a `self`.
|
51
|
-
if arg_defn.prepare.is_a?(Symbol) || context.nil?
|
52
|
-
prepared_value = arg_defn.prepare_value(self, @ruby_style_hash[ruby_kwargs_key])
|
40
|
+
if arg_defn.prepare.is_a?(Symbol) || context.nil?
|
41
|
+
prepared_value = arg_defn.prepare_value(self, @ruby_style_hash[ruby_kwargs_key], context: context)
|
53
42
|
overwrite_argument(ruby_kwargs_key, prepared_value)
|
54
43
|
end
|
55
44
|
end
|
56
45
|
end
|
57
|
-
|
58
|
-
@maybe_lazies = maybe_lazies
|
59
46
|
end
|
60
47
|
|
61
48
|
def to_h
|
@@ -66,32 +53,18 @@ module GraphQL
|
|
66
53
|
to_h
|
67
54
|
end
|
68
55
|
|
69
|
-
def
|
70
|
-
if
|
71
|
-
@
|
72
|
-
object = @context[:current_object]
|
73
|
-
# Pass this object's class with `as` so that messages are rendered correctly from inherited validators
|
74
|
-
Schema::Validator.validate!(self.class.validators, object, @context, @ruby_style_hash, as: self.class)
|
75
|
-
self
|
76
|
-
end
|
56
|
+
def deconstruct_keys(keys = nil)
|
57
|
+
if keys.nil?
|
58
|
+
@ruby_style_hash
|
77
59
|
else
|
78
|
-
|
60
|
+
new_h = {}
|
61
|
+
keys.each { |k| @ruby_style_hash.key?(k) && new_h[k] = @ruby_style_hash[k] }
|
62
|
+
new_h
|
79
63
|
end
|
80
64
|
end
|
81
65
|
|
82
|
-
def
|
83
|
-
|
84
|
-
if value.respond_to?(:key?)
|
85
|
-
arguments(ctx).each do |_name, input_obj_arg|
|
86
|
-
input_obj_arg = input_obj_arg.type_class
|
87
|
-
if value.key?(input_obj_arg.keyword) &&
|
88
|
-
!input_obj_arg.authorized?(obj, value[input_obj_arg.keyword], ctx)
|
89
|
-
return false
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
# It didn't early-return false:
|
94
|
-
true
|
66
|
+
def prepare
|
67
|
+
self
|
95
68
|
end
|
96
69
|
|
97
70
|
def unwrap_value(value)
|
@@ -131,34 +104,57 @@ module GraphQL
|
|
131
104
|
@ruby_style_hash.dup
|
132
105
|
end
|
133
106
|
|
107
|
+
# @api private
|
108
|
+
def validate_for(context)
|
109
|
+
object = context[:current_object]
|
110
|
+
# Pass this object's class with `as` so that messages are rendered correctly from inherited validators
|
111
|
+
Schema::Validator.validate!(self.class.validators, object, context, @ruby_style_hash, as: self.class)
|
112
|
+
nil
|
113
|
+
end
|
114
|
+
|
134
115
|
class << self
|
135
|
-
|
136
|
-
|
116
|
+
def authorized?(obj, value, ctx)
|
117
|
+
# Authorize each argument (but this doesn't apply if `prepare` is implemented):
|
118
|
+
if value.respond_to?(:key?)
|
119
|
+
ctx.types.arguments(self).each do |input_obj_arg|
|
120
|
+
if value.key?(input_obj_arg.keyword) &&
|
121
|
+
!input_obj_arg.authorized?(obj, value[input_obj_arg.keyword], ctx)
|
122
|
+
return false
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
# It didn't early-return false:
|
127
|
+
true
|
128
|
+
end
|
129
|
+
|
130
|
+
def one_of
|
131
|
+
if !one_of?
|
132
|
+
if all_argument_definitions.any? { |arg| arg.type.non_null? }
|
133
|
+
raise ArgumentError, "`one_of` may not be used with required arguments -- add `required: false` to argument definitions to use `one_of`"
|
134
|
+
end
|
135
|
+
directive(GraphQL::Schema::Directive::OneOf)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def one_of?
|
140
|
+
false # Re-defined when `OneOf` is added
|
141
|
+
end
|
137
142
|
|
138
143
|
def argument(*args, **kwargs, &block)
|
139
144
|
argument_defn = super(*args, **kwargs, &block)
|
145
|
+
if one_of?
|
146
|
+
if argument_defn.type.non_null?
|
147
|
+
raise ArgumentError, "Argument '#{argument_defn.path}' must be nullable because it is part of a OneOf type, add `required: false`."
|
148
|
+
end
|
149
|
+
if argument_defn.default_value?
|
150
|
+
raise ArgumentError, "Argument '#{argument_defn.path}' cannot have a default value because it is part of a OneOf type, remove `default_value: ...`."
|
151
|
+
end
|
152
|
+
end
|
140
153
|
# Add a method access
|
141
|
-
|
142
|
-
|
143
|
-
end
|
144
|
-
|
145
|
-
prepend Schema::Member::CachedGraphQLDefinition::DeprecatedToGraphQL
|
146
|
-
|
147
|
-
def to_graphql
|
148
|
-
type_defn = GraphQL::InputObjectType.new
|
149
|
-
type_defn.name = graphql_name
|
150
|
-
type_defn.description = description
|
151
|
-
type_defn.metadata[:type_class] = self
|
152
|
-
type_defn.mutation = mutation
|
153
|
-
type_defn.ast_node = ast_node
|
154
|
-
all_argument_definitions.each do |arg|
|
155
|
-
type_defn.arguments[arg.graphql_definition(silence_deprecation_warning: true).name] = arg.graphql_definition(silence_deprecation_warning: true) # rubocop:disable Development/ContextIsPassedCop -- legacy-related
|
154
|
+
suppress_redefinition_warning do
|
155
|
+
define_accessor_method(argument_defn.keyword)
|
156
156
|
end
|
157
|
-
|
158
|
-
self.arguments_class = GraphQL::Query::Arguments.construct_arguments_class(type_defn)
|
159
|
-
# But use this InputObject class at runtime
|
160
|
-
type_defn.arguments_class = self
|
161
|
-
type_defn
|
157
|
+
argument_defn
|
162
158
|
end
|
163
159
|
|
164
160
|
def kind
|
@@ -166,44 +162,66 @@ module GraphQL
|
|
166
162
|
end
|
167
163
|
|
168
164
|
# @api private
|
169
|
-
INVALID_OBJECT_MESSAGE = "Expected %{object} to be a key-value object
|
165
|
+
INVALID_OBJECT_MESSAGE = "Expected %{object} to be a key-value object."
|
170
166
|
|
171
167
|
def validate_non_null_input(input, ctx, max_errors: nil)
|
172
|
-
|
173
|
-
warden = ctx.warden
|
168
|
+
types = ctx.types
|
174
169
|
|
175
170
|
if input.is_a?(Array)
|
176
|
-
|
177
|
-
return result
|
171
|
+
return GraphQL::Query::InputValidationResult.from_problem(INVALID_OBJECT_MESSAGE % { object: JSON.generate(input, quirks_mode: true) })
|
178
172
|
end
|
179
173
|
|
180
174
|
if !(input.respond_to?(:to_h) || input.respond_to?(:to_unsafe_h))
|
181
175
|
# We're not sure it'll act like a hash, so reject it:
|
182
|
-
|
183
|
-
return result
|
176
|
+
return GraphQL::Query::InputValidationResult.from_problem(INVALID_OBJECT_MESSAGE % { object: JSON.generate(input, quirks_mode: true) })
|
184
177
|
end
|
185
178
|
|
186
|
-
# Inject missing required arguments
|
187
|
-
missing_required_inputs = self.arguments(ctx).reduce({}) do |m, (argument_name, argument)|
|
188
|
-
if !input.key?(argument_name) && argument.type.non_null? && warden.get_argument(self, argument_name)
|
189
|
-
m[argument_name] = nil
|
190
|
-
end
|
191
179
|
|
192
|
-
|
193
|
-
end
|
180
|
+
result = nil
|
194
181
|
|
195
182
|
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
#
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
183
|
+
input.each do |argument_name, value|
|
184
|
+
argument = types.argument(self, argument_name)
|
185
|
+
if argument.nil? && ctx.is_a?(Query::NullContext) && argument_name.is_a?(Symbol)
|
186
|
+
# Validating definition directive arguments which come in as Symbols
|
187
|
+
argument = types.arguments(self).find { |arg| arg.keyword == argument_name }
|
188
|
+
end
|
189
|
+
# Items in the input that are unexpected
|
190
|
+
if argument.nil?
|
191
|
+
result ||= Query::InputValidationResult.new
|
192
|
+
result.add_problem("Field is not defined on #{self.graphql_name}", [argument_name])
|
193
|
+
else
|
204
194
|
# Items in the input that are expected, but have invalid values
|
205
195
|
argument_result = argument.type.validate_input(value, ctx)
|
206
|
-
|
196
|
+
if !argument_result.valid?
|
197
|
+
result ||= Query::InputValidationResult.new
|
198
|
+
result.merge_result!(argument_name, argument_result)
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
# Check for missing non-null arguments
|
204
|
+
ctx.types.arguments(self).each do |argument|
|
205
|
+
if !input.key?(argument.graphql_name) && argument.type.non_null? && !argument.default_value?
|
206
|
+
result ||= Query::InputValidationResult.new
|
207
|
+
argument_result = argument.type.validate_input(nil, ctx)
|
208
|
+
if !argument_result.valid?
|
209
|
+
result.merge_result!(argument.graphql_name, argument_result)
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
if one_of?
|
215
|
+
if input.size == 1
|
216
|
+
input.each do |name, value|
|
217
|
+
if value.nil?
|
218
|
+
result ||= Query::InputValidationResult.new
|
219
|
+
result.add_problem("'#{graphql_name}' requires exactly one argument, but '#{name}' was `null`.")
|
220
|
+
end
|
221
|
+
end
|
222
|
+
else
|
223
|
+
result ||= Query::InputValidationResult.new
|
224
|
+
result.add_problem("'#{graphql_name}' requires exactly one argument, but #{input.size} were provided.")
|
207
225
|
end
|
208
226
|
end
|
209
227
|
|
@@ -217,12 +235,11 @@ module GraphQL
|
|
217
235
|
|
218
236
|
arguments = coerce_arguments(nil, value, ctx)
|
219
237
|
|
220
|
-
ctx.
|
238
|
+
ctx.query.after_lazy(arguments) do |resolved_arguments|
|
221
239
|
if resolved_arguments.is_a?(GraphQL::Error)
|
222
240
|
raise resolved_arguments
|
223
241
|
else
|
224
|
-
|
225
|
-
input_obj_instance.prepare
|
242
|
+
self.new(resolved_arguments, ruby_kwargs: resolved_arguments.keyword_arguments, context: ctx, defaults_used: nil)
|
226
243
|
end
|
227
244
|
end
|
228
245
|
end
|
@@ -249,8 +266,36 @@ module GraphQL
|
|
249
266
|
result
|
250
267
|
end
|
251
268
|
|
269
|
+
# @param new_has_no_arguments [Boolean] Call with `true` to make this InputObject type ignore the requirement to have any defined arguments.
|
270
|
+
# @return [void]
|
271
|
+
def has_no_arguments(new_has_no_arguments)
|
272
|
+
@has_no_arguments = new_has_no_arguments
|
273
|
+
nil
|
274
|
+
end
|
275
|
+
|
276
|
+
# @return [Boolean] `true` if `has_no_arguments(true)` was configued
|
277
|
+
def has_no_arguments?
|
278
|
+
@has_no_arguments
|
279
|
+
end
|
280
|
+
|
281
|
+
def arguments(context = GraphQL::Query::NullContext.instance, require_defined_arguments = true)
|
282
|
+
if require_defined_arguments && !has_no_arguments? && !any_arguments?
|
283
|
+
warn(GraphQL::Schema::InputObject::ArgumentsAreRequiredError.new(self).message + "\n\nThis will raise an error in a future GraphQL-Ruby version.")
|
284
|
+
end
|
285
|
+
super(context, false)
|
286
|
+
end
|
287
|
+
|
252
288
|
private
|
253
289
|
|
290
|
+
# Suppress redefinition warning for objectId arguments
|
291
|
+
def suppress_redefinition_warning
|
292
|
+
verbose = $VERBOSE
|
293
|
+
$VERBOSE = nil
|
294
|
+
yield
|
295
|
+
ensure
|
296
|
+
$VERBOSE = verbose
|
297
|
+
end
|
298
|
+
|
254
299
|
def define_accessor_method(method_name)
|
255
300
|
define_method(method_name) { self[method_name] }
|
256
301
|
alias_method(method_name, method_name)
|
@@ -4,8 +4,6 @@ module GraphQL
|
|
4
4
|
module Interface
|
5
5
|
include GraphQL::Schema::Member::GraphQLTypeNames
|
6
6
|
module DefinitionMethods
|
7
|
-
include GraphQL::Schema::Member::CachedGraphQLDefinition
|
8
|
-
include GraphQL::Relay::TypeExtensions
|
9
7
|
include GraphQL::Schema::Member::BaseDSLMethods
|
10
8
|
# ConfigurationExtension's responsibilities are in `def included` below
|
11
9
|
include GraphQL::Schema::Member::TypeSystemHelpers
|
@@ -15,6 +13,7 @@ module GraphQL
|
|
15
13
|
include GraphQL::Schema::Member::Scoped
|
16
14
|
include GraphQL::Schema::Member::HasAstNode
|
17
15
|
include GraphQL::Schema::Member::HasUnresolvedTypeError
|
16
|
+
include GraphQL::Schema::Member::HasDataloader
|
18
17
|
include GraphQL::Schema::Member::HasDirectives
|
19
18
|
include GraphQL::Schema::Member::HasInterfaces
|
20
19
|
|
@@ -22,7 +21,16 @@ module GraphQL
|
|
22
21
|
# - Added as class methods to this interface
|
23
22
|
# - Added as class methods to all child interfaces
|
24
23
|
def definition_methods(&block)
|
25
|
-
|
24
|
+
# Use an instance variable to tell whether it's been included previously or not;
|
25
|
+
# You can't use constant detection because constants are brought into scope
|
26
|
+
# by `include`, which has already happened at this point.
|
27
|
+
if !defined?(@_definition_methods)
|
28
|
+
defn_methods_module = Module.new
|
29
|
+
@_definition_methods = defn_methods_module
|
30
|
+
const_set(:DefinitionMethods, defn_methods_module)
|
31
|
+
extend(self::DefinitionMethods)
|
32
|
+
end
|
33
|
+
self::DefinitionMethods.module_exec(&block)
|
26
34
|
end
|
27
35
|
|
28
36
|
# @see {Schema::Warden} hides interfaces without visible implementations
|
@@ -30,16 +38,6 @@ module GraphQL
|
|
30
38
|
true
|
31
39
|
end
|
32
40
|
|
33
|
-
# The interface is accessible if any of its possible types are accessible
|
34
|
-
def accessible?(context)
|
35
|
-
context.schema.possible_types(self, context).each do |type|
|
36
|
-
if context.schema.accessible?(type, context)
|
37
|
-
return true
|
38
|
-
end
|
39
|
-
end
|
40
|
-
false
|
41
|
-
end
|
42
|
-
|
43
41
|
def type_membership_class(membership_class = nil)
|
44
42
|
if membership_class
|
45
43
|
@type_membership_class = membership_class
|
@@ -59,22 +57,14 @@ module GraphQL
|
|
59
57
|
|
60
58
|
child_class.type_membership_class(self.type_membership_class)
|
61
59
|
child_class.ancestors.reverse_each do |ancestor|
|
62
|
-
if ancestor.const_defined?(:DefinitionMethods)
|
60
|
+
if ancestor.const_defined?(:DefinitionMethods) && ancestor != child_class
|
63
61
|
child_class.extend(ancestor::DefinitionMethods)
|
64
62
|
end
|
65
63
|
end
|
66
64
|
|
67
|
-
# Use an instance variable to tell whether it's been included previously or not;
|
68
|
-
# You can't use constant detection because constants are brought into scope
|
69
|
-
# by `include`, which has already happened at this point.
|
70
|
-
if !child_class.instance_variable_defined?(:@_definition_methods)
|
71
|
-
defn_methods_module = Module.new
|
72
|
-
child_class.instance_variable_set(:@_definition_methods, defn_methods_module)
|
73
|
-
child_class.const_set(:DefinitionMethods, defn_methods_module)
|
74
|
-
child_class.extend(child_class::DefinitionMethods)
|
75
|
-
end
|
76
65
|
child_class.introspection(introspection)
|
77
66
|
child_class.description(description)
|
67
|
+
child_class.comment(nil)
|
78
68
|
# If interfaces are mixed into each other, only define this class once
|
79
69
|
if !child_class.const_defined?(:UnresolvedTypeError, false)
|
80
70
|
add_unresolved_type_error(child_class)
|
@@ -94,34 +84,30 @@ module GraphQL
|
|
94
84
|
super
|
95
85
|
end
|
96
86
|
|
87
|
+
# Register other Interface or Object types as implementers of this Interface.
|
88
|
+
#
|
89
|
+
# When those Interfaces or Objects aren't used as the return values of fields,
|
90
|
+
# they may have to be registered using this method so that GraphQL-Ruby can find them.
|
91
|
+
# @param types [Class, Module]
|
92
|
+
# @return [Array<Module, Class>] Implementers of this interface, if they're registered
|
97
93
|
def orphan_types(*types)
|
98
|
-
if types.
|
99
|
-
@orphan_types
|
94
|
+
if !types.empty?
|
95
|
+
@orphan_types ||= []
|
96
|
+
@orphan_types.concat(types)
|
100
97
|
else
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
type_defn.orphan_types = orphan_types
|
114
|
-
type_defn.type_membership_class = self.type_membership_class
|
115
|
-
type_defn.ast_node = ast_node
|
116
|
-
fields.each do |field_name, field_inst| # rubocop:disable Development/ContextIsPassedCop -- legacy-related
|
117
|
-
field_defn = field_inst.graphql_definition(silence_deprecation_warning: true)
|
118
|
-
type_defn.fields[field_defn.name] = field_defn # rubocop:disable Development/ContextIsPassedCop -- legacy-related
|
119
|
-
end
|
120
|
-
type_defn.metadata[:type_class] = self
|
121
|
-
if respond_to?(:resolve_type)
|
122
|
-
type_defn.resolve_type = method(:resolve_type)
|
98
|
+
if defined?(@orphan_types)
|
99
|
+
all_orphan_types = @orphan_types.dup
|
100
|
+
if defined?(super)
|
101
|
+
all_orphan_types += super
|
102
|
+
all_orphan_types.uniq!
|
103
|
+
end
|
104
|
+
all_orphan_types
|
105
|
+
elsif defined?(super)
|
106
|
+
super
|
107
|
+
else
|
108
|
+
EmptyObjects::EMPTY_ARRAY
|
109
|
+
end
|
123
110
|
end
|
124
|
-
type_defn
|
125
111
|
end
|
126
112
|
|
127
113
|
def kind
|
@@ -129,9 +115,6 @@ module GraphQL
|
|
129
115
|
end
|
130
116
|
end
|
131
117
|
|
132
|
-
# Extend this _after_ `DefinitionMethods` is defined, so it will be used
|
133
|
-
extend GraphQL::Schema::Member::AcceptsDefinition
|
134
|
-
|
135
118
|
extend DefinitionMethods
|
136
119
|
|
137
120
|
def unwrap
|