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
@@ -11,10 +11,11 @@ module GraphQL
|
|
11
11
|
def self.extended(cls)
|
12
12
|
cls.extend(ArgumentClassAccessor)
|
13
13
|
cls.include(ArgumentObjectLoader)
|
14
|
+
cls.extend(ClassConfigured)
|
14
15
|
end
|
15
16
|
|
16
17
|
# @see {GraphQL::Schema::Argument#initialize} for parameters
|
17
|
-
# @return [GraphQL::Schema::Argument] An instance of {
|
18
|
+
# @return [GraphQL::Schema::Argument] An instance of {argument_class}, created from `*args`
|
18
19
|
def argument(*args, **kwargs, &block)
|
19
20
|
kwargs[:owner] = self
|
20
21
|
loads = kwargs[:loads]
|
@@ -37,39 +38,6 @@ module GraphQL
|
|
37
38
|
end
|
38
39
|
arg_defn = self.argument_class.new(*args, **kwargs, &block)
|
39
40
|
add_argument(arg_defn)
|
40
|
-
|
41
|
-
if self.is_a?(Class) && !method_defined?(:"load_#{arg_defn.keyword}")
|
42
|
-
method_owner = if self < GraphQL::Schema::InputObject || self < GraphQL::Schema::Directive
|
43
|
-
"self."
|
44
|
-
elsif self < GraphQL::Schema::Resolver
|
45
|
-
""
|
46
|
-
else
|
47
|
-
raise "Unexpected argument owner: #{self}"
|
48
|
-
end
|
49
|
-
if loads && arg_defn.type.list?
|
50
|
-
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
51
|
-
def #{method_owner}load_#{arg_defn.keyword}(values, context = nil)
|
52
|
-
argument = get_argument("#{arg_defn.graphql_name}")
|
53
|
-
(context || self.context).schema.after_lazy(values) do |values2|
|
54
|
-
GraphQL::Execution::Lazy.all(values2.map { |value| load_application_object(argument, value, context || self.context) })
|
55
|
-
end
|
56
|
-
end
|
57
|
-
RUBY
|
58
|
-
elsif loads
|
59
|
-
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
60
|
-
def #{method_owner}load_#{arg_defn.keyword}(value, context = nil)
|
61
|
-
argument = get_argument("#{arg_defn.graphql_name}")
|
62
|
-
load_application_object(argument, value, context || self.context)
|
63
|
-
end
|
64
|
-
RUBY
|
65
|
-
else
|
66
|
-
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
67
|
-
def #{method_owner}load_#{arg_defn.keyword}(value, _context = nil)
|
68
|
-
value
|
69
|
-
end
|
70
|
-
RUBY
|
71
|
-
end
|
72
|
-
end
|
73
41
|
arg_defn
|
74
42
|
end
|
75
43
|
|
@@ -78,25 +46,38 @@ module GraphQL
|
|
78
46
|
# @return [GraphQL::Schema::Argument]
|
79
47
|
def add_argument(arg_defn)
|
80
48
|
@own_arguments ||= {}
|
81
|
-
prev_defn = own_arguments[arg_defn.name]
|
49
|
+
prev_defn = @own_arguments[arg_defn.name]
|
82
50
|
case prev_defn
|
83
51
|
when nil
|
84
|
-
own_arguments[arg_defn.name] = arg_defn
|
52
|
+
@own_arguments[arg_defn.name] = arg_defn
|
85
53
|
when Array
|
86
54
|
prev_defn << arg_defn
|
87
55
|
when GraphQL::Schema::Argument
|
88
|
-
own_arguments[arg_defn.name] = [prev_defn, arg_defn]
|
56
|
+
@own_arguments[arg_defn.name] = [prev_defn, arg_defn]
|
89
57
|
else
|
90
58
|
raise "Invariant: unexpected `@own_arguments[#{arg_defn.name.inspect}]`: #{prev_defn.inspect}"
|
91
59
|
end
|
92
60
|
arg_defn
|
93
61
|
end
|
94
62
|
|
63
|
+
def remove_argument(arg_defn)
|
64
|
+
prev_defn = @own_arguments[arg_defn.name]
|
65
|
+
case prev_defn
|
66
|
+
when nil
|
67
|
+
# done
|
68
|
+
when Array
|
69
|
+
prev_defn.delete(arg_defn)
|
70
|
+
when GraphQL::Schema::Argument
|
71
|
+
@own_arguments.delete(arg_defn.name)
|
72
|
+
else
|
73
|
+
raise "Invariant: unexpected `@own_arguments[#{arg_defn.name.inspect}]`: #{prev_defn.inspect}"
|
74
|
+
end
|
75
|
+
nil
|
76
|
+
end
|
77
|
+
|
95
78
|
# @return [Hash<String => GraphQL::Schema::Argument] Arguments defined on this thing, keyed by name. Includes inherited definitions
|
96
|
-
def arguments(context = GraphQL::Query::NullContext)
|
97
|
-
|
98
|
-
# Local definitions override inherited ones
|
99
|
-
if own_arguments.any?
|
79
|
+
def arguments(context = GraphQL::Query::NullContext.instance, _require_defined_arguments = nil)
|
80
|
+
if !own_arguments.empty?
|
100
81
|
own_arguments_that_apply = {}
|
101
82
|
own_arguments.each do |name, args_entry|
|
102
83
|
if (visible_defn = Warden.visible_entry?(:visible_argument?, args_entry, context))
|
@@ -104,49 +85,136 @@ module GraphQL
|
|
104
85
|
end
|
105
86
|
end
|
106
87
|
end
|
88
|
+
# might be nil if there are actually no arguments
|
89
|
+
own_arguments_that_apply || own_arguments
|
90
|
+
end
|
107
91
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
92
|
+
def any_arguments?
|
93
|
+
!own_arguments.empty?
|
94
|
+
end
|
95
|
+
|
96
|
+
module ClassConfigured
|
97
|
+
def inherited(child_class)
|
98
|
+
super
|
99
|
+
child_class.extend(InheritedArguments)
|
100
|
+
end
|
101
|
+
|
102
|
+
module InheritedArguments
|
103
|
+
def arguments(context = GraphQL::Query::NullContext.instance, require_defined_arguments = true)
|
104
|
+
own_arguments = super(context, require_defined_arguments)
|
105
|
+
inherited_arguments = superclass.arguments(context, false)
|
106
|
+
|
107
|
+
if !own_arguments.empty?
|
108
|
+
if !inherited_arguments.empty?
|
109
|
+
# Local definitions override inherited ones
|
110
|
+
inherited_arguments.merge(own_arguments)
|
111
|
+
else
|
112
|
+
own_arguments
|
113
|
+
end
|
114
|
+
else
|
115
|
+
inherited_arguments
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def any_arguments?
|
120
|
+
super || superclass.any_arguments?
|
121
|
+
end
|
122
|
+
|
123
|
+
def all_argument_definitions
|
124
|
+
all_defns = {}
|
125
|
+
ancestors.reverse_each do |ancestor|
|
126
|
+
if ancestor.respond_to?(:own_arguments)
|
127
|
+
all_defns.merge!(ancestor.own_arguments)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
all_defns = all_defns.values
|
131
|
+
all_defns.flatten!
|
132
|
+
all_defns
|
133
|
+
end
|
134
|
+
|
135
|
+
|
136
|
+
def get_argument(argument_name, context = GraphQL::Query::NullContext.instance)
|
137
|
+
warden = Warden.from_context(context)
|
138
|
+
skip_visible = context.respond_to?(:types) && context.types.is_a?(GraphQL::Schema::Visibility::Profile)
|
139
|
+
for ancestor in ancestors
|
140
|
+
if ancestor.respond_to?(:own_arguments) &&
|
141
|
+
(a = ancestor.own_arguments[argument_name]) &&
|
142
|
+
(skip_visible || (a = Warden.visible_entry?(:visible_argument?, a, context, warden)))
|
143
|
+
return a
|
144
|
+
end
|
145
|
+
end
|
146
|
+
nil
|
113
147
|
end
|
114
|
-
else
|
115
|
-
# might be nil if there are actually no arguments
|
116
|
-
own_arguments_that_apply || own_arguments
|
117
148
|
end
|
118
149
|
end
|
119
150
|
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
151
|
+
module FieldConfigured
|
152
|
+
def arguments(context = GraphQL::Query::NullContext.instance, _require_defined_arguments = nil)
|
153
|
+
own_arguments = super
|
154
|
+
if @resolver_class
|
155
|
+
inherited_arguments = @resolver_class.field_arguments(context)
|
156
|
+
if !own_arguments.empty?
|
157
|
+
if !inherited_arguments.empty?
|
158
|
+
inherited_arguments.merge(own_arguments)
|
159
|
+
else
|
160
|
+
own_arguments
|
161
|
+
end
|
162
|
+
else
|
163
|
+
inherited_arguments
|
126
164
|
end
|
165
|
+
else
|
166
|
+
own_arguments
|
127
167
|
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def any_arguments?
|
171
|
+
super || (@resolver_class && @resolver_class.any_field_arguments?)
|
172
|
+
end
|
173
|
+
|
174
|
+
def all_argument_definitions
|
175
|
+
if @resolver_class
|
176
|
+
all_defns = {}
|
177
|
+
@resolver_class.all_field_argument_definitions.each do |arg_defn|
|
178
|
+
key = arg_defn.graphql_name
|
179
|
+
case (current_value = all_defns[key])
|
180
|
+
when nil
|
181
|
+
all_defns[key] = arg_defn
|
182
|
+
when Array
|
183
|
+
current_value << arg_defn
|
184
|
+
when GraphQL::Schema::Argument
|
185
|
+
all_defns[key] = [current_value, arg_defn]
|
186
|
+
else
|
187
|
+
raise "Invariant: Unexpected argument definition, #{current_value.class}: #{current_value.inspect}"
|
188
|
+
end
|
189
|
+
end
|
190
|
+
all_defns.merge!(own_arguments)
|
191
|
+
all_defns = all_defns.values
|
192
|
+
all_defns.flatten!
|
193
|
+
all_defns
|
194
|
+
else
|
195
|
+
super
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
def all_argument_definitions
|
201
|
+
if !own_arguments.empty?
|
202
|
+
all_defns = own_arguments.values
|
203
|
+
all_defns.flatten!
|
204
|
+
all_defns
|
128
205
|
else
|
129
|
-
|
206
|
+
EmptyObjects::EMPTY_ARRAY
|
130
207
|
end
|
131
|
-
all_defns = all_defns.values
|
132
|
-
all_defns.flatten!
|
133
|
-
all_defns
|
134
208
|
end
|
135
209
|
|
136
210
|
# @return [GraphQL::Schema::Argument, nil] Argument defined on this thing, fetched by name.
|
137
|
-
def get_argument(argument_name, context = GraphQL::Query::NullContext)
|
211
|
+
def get_argument(argument_name, context = GraphQL::Query::NullContext.instance)
|
138
212
|
warden = Warden.from_context(context)
|
139
|
-
if
|
140
|
-
|
141
|
-
|
213
|
+
if (arg_config = own_arguments[argument_name]) && ((context.respond_to?(:types) && context.types.is_a?(GraphQL::Schema::Visibility::Profile)) || (visible_arg = Warden.visible_entry?(:visible_argument?, arg_config, context, warden)))
|
214
|
+
visible_arg || arg_config
|
215
|
+
elsif defined?(@resolver_class) && @resolver_class
|
216
|
+
@resolver_class.get_field_argument(argument_name, context)
|
142
217
|
else
|
143
|
-
for ancestor in ancestors
|
144
|
-
if ancestor.respond_to?(:own_arguments) &&
|
145
|
-
(a = ancestor.own_arguments[argument_name]) &&
|
146
|
-
(a = Warden.visible_entry?(:visible_argument?, a, context, warden))
|
147
|
-
return a
|
148
|
-
end
|
149
|
-
end
|
150
218
|
nil
|
151
219
|
end
|
152
220
|
end
|
@@ -163,11 +231,11 @@ module GraphQL
|
|
163
231
|
#
|
164
232
|
# @param values [Hash<String, Object>]
|
165
233
|
# @param context [GraphQL::Query::Context]
|
166
|
-
# @yield [Interpreter::Arguments, Execution::Lazy<
|
167
|
-
# @return [Interpreter::Arguments, Execution::Lazy<
|
234
|
+
# @yield [Interpreter::Arguments, Execution::Lazy<Interpreter::Arguments>]
|
235
|
+
# @return [Interpreter::Arguments, Execution::Lazy<Interpreter::Arguments>]
|
168
236
|
def coerce_arguments(parent_object, values, context, &block)
|
169
237
|
# Cache this hash to avoid re-merging it
|
170
|
-
arg_defns = context.
|
238
|
+
arg_defns = context.types.arguments(self)
|
171
239
|
total_args_count = arg_defns.size
|
172
240
|
|
173
241
|
finished_args = nil
|
@@ -223,7 +291,12 @@ module GraphQL
|
|
223
291
|
# but not for directives.
|
224
292
|
# TODO apply static validations on schema definitions?
|
225
293
|
def validate_directive_argument(arg_defn, value)
|
226
|
-
|
294
|
+
# this is only implemented on directives.
|
295
|
+
nil
|
296
|
+
end
|
297
|
+
|
298
|
+
module HasDirectiveArguments
|
299
|
+
def validate_directive_argument(arg_defn, value)
|
227
300
|
if value.nil? && arg_defn.type.non_null?
|
228
301
|
raise ArgumentError, "#{arg_defn.path} is required, but no value was given"
|
229
302
|
end
|
@@ -231,9 +304,11 @@ module GraphQL
|
|
231
304
|
end
|
232
305
|
|
233
306
|
def arguments_statically_coercible?
|
234
|
-
|
235
|
-
|
236
|
-
|
307
|
+
if defined?(@arguments_statically_coercible) && !@arguments_statically_coercible.nil?
|
308
|
+
@arguments_statically_coercible
|
309
|
+
else
|
310
|
+
@arguments_statically_coercible = all_argument_definitions.all?(&:statically_coercible?)
|
311
|
+
end
|
237
312
|
end
|
238
313
|
|
239
314
|
module ArgumentClassAccessor
|
@@ -274,31 +349,54 @@ module GraphQL
|
|
274
349
|
end
|
275
350
|
|
276
351
|
def authorize_application_object(argument, id, context, loaded_application_object)
|
277
|
-
context.
|
352
|
+
context.query.after_lazy(loaded_application_object) do |application_object|
|
278
353
|
if application_object.nil?
|
279
|
-
err = GraphQL::LoadApplicationObjectFailedError.new(argument: argument, id: id, object: application_object)
|
280
|
-
load_application_object_failed(err)
|
354
|
+
err = GraphQL::LoadApplicationObjectFailedError.new(context: context, argument: argument, id: id, object: application_object)
|
355
|
+
application_object = load_application_object_failed(err)
|
281
356
|
end
|
282
357
|
# Double-check that the located object is actually of this type
|
283
358
|
# (Don't want to allow arbitrary access to objects this way)
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
359
|
+
if application_object.nil?
|
360
|
+
nil
|
361
|
+
else
|
362
|
+
arg_loads_type = argument.loads
|
363
|
+
maybe_lazy_resolve_type = context.schema.resolve_type(arg_loads_type, application_object, context)
|
364
|
+
context.query.after_lazy(maybe_lazy_resolve_type) do |resolve_type_result|
|
365
|
+
if resolve_type_result.is_a?(Array) && resolve_type_result.size == 2
|
366
|
+
application_object_type, application_object = resolve_type_result
|
367
|
+
else
|
368
|
+
application_object_type = resolve_type_result
|
369
|
+
# application_object is already assigned
|
370
|
+
end
|
371
|
+
|
372
|
+
passes_possible_types_check = if context.types.loadable?(arg_loads_type, context)
|
373
|
+
if arg_loads_type.kind.abstract?
|
374
|
+
# This union/interface is used in `loads:` but not otherwise visible to this query
|
375
|
+
context.types.loadable_possible_types(arg_loads_type, context).include?(application_object_type)
|
376
|
+
else
|
377
|
+
true
|
378
|
+
end
|
379
|
+
else
|
380
|
+
context.types.possible_types(arg_loads_type).include?(application_object_type)
|
381
|
+
end
|
382
|
+
if !passes_possible_types_check
|
383
|
+
err = GraphQL::LoadApplicationObjectFailedError.new(context: context, argument: argument, id: id, object: application_object)
|
384
|
+
application_object = load_application_object_failed(err)
|
385
|
+
end
|
386
|
+
|
387
|
+
if application_object.nil?
|
388
|
+
nil
|
389
|
+
else
|
390
|
+
# This object was loaded successfully
|
391
|
+
# and resolved to the right type,
|
392
|
+
# now apply the `.authorized?` class method if there is one
|
393
|
+
context.query.after_lazy(application_object_type.authorized?(application_object, context)) do |authed|
|
296
394
|
if authed
|
297
395
|
application_object
|
298
396
|
else
|
299
397
|
err = GraphQL::UnauthorizedError.new(
|
300
398
|
object: application_object,
|
301
|
-
type:
|
399
|
+
type: application_object_type,
|
302
400
|
context: context,
|
303
401
|
)
|
304
402
|
if self.respond_to?(:unauthorized_object)
|
@@ -309,8 +407,6 @@ module GraphQL
|
|
309
407
|
end
|
310
408
|
end
|
311
409
|
end
|
312
|
-
else
|
313
|
-
application_object
|
314
410
|
end
|
315
411
|
end
|
316
412
|
end
|
@@ -322,7 +418,7 @@ module GraphQL
|
|
322
418
|
end
|
323
419
|
end
|
324
420
|
|
325
|
-
NO_ARGUMENTS =
|
421
|
+
NO_ARGUMENTS = GraphQL::EmptyObjects::EMPTY_HASH
|
326
422
|
def own_arguments
|
327
423
|
@own_arguments || NO_ARGUMENTS
|
328
424
|
end
|
@@ -3,6 +3,16 @@ module GraphQL
|
|
3
3
|
class Schema
|
4
4
|
class Member
|
5
5
|
module HasAstNode
|
6
|
+
def self.extended(child_cls)
|
7
|
+
super
|
8
|
+
child_cls.ast_node = nil
|
9
|
+
end
|
10
|
+
|
11
|
+
def inherited(child_cls)
|
12
|
+
super
|
13
|
+
child_cls.ast_node = nil
|
14
|
+
end
|
15
|
+
|
6
16
|
# If this schema was parsed from a `.graphql` file (or other SDL),
|
7
17
|
# this is the AST node that defined this part of the schema.
|
8
18
|
def ast_node(new_ast_node = nil)
|
@@ -14,6 +24,8 @@ module GraphQL
|
|
14
24
|
nil
|
15
25
|
end
|
16
26
|
end
|
27
|
+
|
28
|
+
attr_writer :ast_node
|
17
29
|
end
|
18
30
|
end
|
19
31
|
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GraphQL
|
4
|
+
class Schema
|
5
|
+
class Member
|
6
|
+
# @api public
|
7
|
+
# Shared methods for working with {Dataloader} inside GraphQL runtime objects.
|
8
|
+
module HasDataloader
|
9
|
+
# @return [GraphQL::Dataloader] The dataloader for the currently-running query
|
10
|
+
def dataloader
|
11
|
+
context.dataloader
|
12
|
+
end
|
13
|
+
|
14
|
+
# A shortcut method for loading a key from a source.
|
15
|
+
# Identical to `dataloader.with(source_class, *source_args).load(load_key)`
|
16
|
+
# @param source_class [Class<GraphQL::Dataloader::Source>]
|
17
|
+
# @param source_args [Array<Object>] Any extra parameters defined in `source_class`'s `initialize` method
|
18
|
+
# @param load_key [Object] The key to look up using `def fetch`
|
19
|
+
def dataload(source_class, *source_args, load_key)
|
20
|
+
dataloader.with(source_class, *source_args).load(load_key)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Find an object with ActiveRecord via {Dataloader::ActiveRecordSource}.
|
24
|
+
# @param model [Class<ActiveRecord::Base>]
|
25
|
+
# @param find_by_value [Object] Usually an `id`, might be another value if `find_by:` is also provided
|
26
|
+
# @param find_by [Symbol, String] A column name to look the record up by. (Defaults to the model's primary key.)
|
27
|
+
# @return [ActiveRecord::Base, nil]
|
28
|
+
# @example Finding a record by ID
|
29
|
+
# dataload_record(Post, 5) # Like `Post.find(5)`, but dataloaded
|
30
|
+
# @example Finding a record by another attribute
|
31
|
+
# dataload_record(User, "matz", find_by: :handle) # Like `User.find_by(handle: "matz")`, but dataloaded
|
32
|
+
def dataload_record(model, find_by_value, find_by: nil)
|
33
|
+
source = if find_by
|
34
|
+
dataloader.with(Dataloader::ActiveRecordSource, model, find_by: find_by)
|
35
|
+
else
|
36
|
+
dataloader.with(Dataloader::ActiveRecordSource, model)
|
37
|
+
end
|
38
|
+
|
39
|
+
source.load(find_by_value)
|
40
|
+
end
|
41
|
+
|
42
|
+
# Look up an associated record using a Rails association (via {Dataloader::ActiveRecordAssociationSource})
|
43
|
+
# @param association_name [Symbol] A `belongs_to` or `has_one` association. (If a `has_many` association is named here, it will be selected without pagination.)
|
44
|
+
# @param record [ActiveRecord::Base] The object that the association belongs to.
|
45
|
+
# @param scope [ActiveRecord::Relation] A scope to look up the associated record in
|
46
|
+
# @return [ActiveRecord::Base, nil] The associated record, if there is one
|
47
|
+
# @example Looking up a belongs_to on the current object
|
48
|
+
# dataload_association(:parent) # Equivalent to `object.parent`, but dataloaded
|
49
|
+
# @example Looking up an associated record on some other object
|
50
|
+
# dataload_association(comment, :post) # Equivalent to `comment.post`, but dataloaded
|
51
|
+
def dataload_association(record = object, association_name, scope: nil)
|
52
|
+
source = if scope
|
53
|
+
dataloader.with(Dataloader::ActiveRecordAssociationSource, association_name, scope)
|
54
|
+
else
|
55
|
+
dataloader.with(Dataloader::ActiveRecordAssociationSource, association_name)
|
56
|
+
end
|
57
|
+
source.load(record)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -5,20 +5,34 @@ module GraphQL
|
|
5
5
|
class Member
|
6
6
|
module HasDeprecationReason
|
7
7
|
# @return [String, nil] Explains why this member was deprecated (if present, this will be marked deprecated in introspection)
|
8
|
-
|
9
|
-
dir = self.directives.find { |d| d.is_a?(GraphQL::Schema::Directive::Deprecated) }
|
10
|
-
dir && dir.arguments[:reason] # rubocop:disable Development/ContextIsPassedCop -- definition-related
|
11
|
-
end
|
8
|
+
attr_reader :deprecation_reason
|
12
9
|
|
13
10
|
# Set the deprecation reason for this member, or remove it by assigning `nil`
|
14
11
|
# @param text [String, nil]
|
15
12
|
def deprecation_reason=(text)
|
13
|
+
@deprecation_reason = text
|
16
14
|
if text.nil?
|
17
15
|
remove_directive(GraphQL::Schema::Directive::Deprecated)
|
18
16
|
else
|
17
|
+
# This removes a previously-attached directive, if there is one:
|
19
18
|
directive(GraphQL::Schema::Directive::Deprecated, reason: text)
|
20
19
|
end
|
21
20
|
end
|
21
|
+
|
22
|
+
def self.extended(child_class)
|
23
|
+
super
|
24
|
+
child_class.extend(ClassMethods)
|
25
|
+
end
|
26
|
+
|
27
|
+
module ClassMethods
|
28
|
+
def deprecation_reason(new_reason = NOT_CONFIGURED)
|
29
|
+
if NOT_CONFIGURED.equal?(new_reason)
|
30
|
+
super()
|
31
|
+
else
|
32
|
+
self.deprecation_reason = new_reason
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
22
36
|
end
|
23
37
|
end
|
24
38
|
end
|