graphql 1.9.18 → 1.13.24
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/core.rb +21 -10
- data/lib/generators/graphql/enum_generator.rb +4 -10
- data/lib/generators/graphql/field_extractor.rb +31 -0
- data/lib/generators/graphql/input_generator.rb +50 -0
- data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
- data/lib/generators/graphql/{templates → install/templates}/base_mutation.erb +2 -0
- data/lib/generators/graphql/{templates → install/templates}/mutation_type.erb +2 -0
- data/lib/generators/graphql/install_generator.rb +44 -7
- data/lib/generators/graphql/interface_generator.rb +7 -7
- data/lib/generators/graphql/loader_generator.rb +1 -0
- data/lib/generators/graphql/mutation_create_generator.rb +22 -0
- data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
- data/lib/generators/graphql/mutation_generator.rb +6 -30
- data/lib/generators/graphql/mutation_update_generator.rb +22 -0
- data/lib/generators/graphql/object_generator.rb +28 -12
- data/lib/generators/graphql/orm_mutations_base.rb +40 -0
- data/lib/generators/graphql/relay.rb +63 -0
- data/lib/generators/graphql/relay_generator.rb +21 -0
- data/lib/generators/graphql/scalar_generator.rb +4 -2
- data/lib/generators/graphql/templates/base_argument.erb +2 -0
- data/lib/generators/graphql/templates/base_connection.erb +8 -0
- data/lib/generators/graphql/templates/base_edge.erb +8 -0
- data/lib/generators/graphql/templates/base_enum.erb +2 -0
- data/lib/generators/graphql/templates/base_field.erb +2 -0
- data/lib/generators/graphql/templates/base_input_object.erb +2 -0
- data/lib/generators/graphql/templates/base_interface.erb +2 -0
- data/lib/generators/graphql/templates/base_object.erb +2 -0
- data/lib/generators/graphql/templates/base_scalar.erb +2 -0
- data/lib/generators/graphql/templates/base_union.erb +2 -0
- data/lib/generators/graphql/templates/enum.erb +7 -1
- data/lib/generators/graphql/templates/graphql_controller.erb +16 -12
- data/lib/generators/graphql/templates/input.erb +9 -0
- data/lib/generators/graphql/templates/interface.erb +6 -2
- data/lib/generators/graphql/templates/loader.erb +2 -0
- data/lib/generators/graphql/templates/mutation.erb +3 -1
- data/lib/generators/graphql/templates/mutation_create.erb +20 -0
- data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
- data/lib/generators/graphql/templates/mutation_update.erb +21 -0
- data/lib/generators/graphql/templates/node_type.erb +9 -0
- data/lib/generators/graphql/templates/object.erb +7 -3
- data/lib/generators/graphql/templates/query_type.erb +3 -3
- data/lib/generators/graphql/templates/scalar.erb +5 -1
- data/lib/generators/graphql/templates/schema.erb +22 -27
- data/lib/generators/graphql/templates/union.erb +6 -2
- data/lib/generators/graphql/type_generator.rb +47 -10
- data/lib/generators/graphql/union_generator.rb +5 -5
- data/lib/graphql/analysis/analyze_query.rb +7 -0
- data/lib/graphql/analysis/ast/field_usage.rb +29 -2
- data/lib/graphql/analysis/ast/query_complexity.rb +174 -67
- data/lib/graphql/analysis/ast/visitor.rb +16 -7
- data/lib/graphql/analysis/ast.rb +21 -11
- data/lib/graphql/argument.rb +8 -36
- data/lib/graphql/backtrace/inspect_result.rb +0 -1
- data/lib/graphql/backtrace/legacy_tracer.rb +56 -0
- data/lib/graphql/backtrace/table.rb +44 -5
- data/lib/graphql/backtrace/traced_error.rb +0 -1
- data/lib/graphql/backtrace/tracer.rb +40 -9
- data/lib/graphql/backtrace.rb +28 -19
- data/lib/graphql/backwards_compatibility.rb +2 -1
- data/lib/graphql/base_type.rb +10 -4
- data/lib/graphql/boolean_type.rb +1 -1
- data/lib/graphql/compatibility/execution_specification/specification_schema.rb +2 -2
- data/lib/graphql/compatibility/execution_specification.rb +1 -0
- data/lib/graphql/compatibility/lazy_execution_specification.rb +2 -0
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +5 -9
- data/lib/graphql/compatibility/query_parser_specification.rb +2 -0
- data/lib/graphql/compatibility/schema_parser_specification.rb +2 -0
- data/lib/graphql/dataloader/null_dataloader.rb +22 -0
- data/lib/graphql/dataloader/request.rb +19 -0
- data/lib/graphql/dataloader/request_all.rb +19 -0
- data/lib/graphql/dataloader/source.rb +155 -0
- data/lib/graphql/dataloader.rb +308 -0
- data/lib/graphql/date_encoding_error.rb +16 -0
- data/lib/graphql/define/assign_enum_value.rb +1 -1
- data/lib/graphql/define/assign_global_id_field.rb +2 -2
- data/lib/graphql/define/assign_object_field.rb +1 -1
- data/lib/graphql/define/defined_object_proxy.rb +5 -8
- data/lib/graphql/define/instance_definable.rb +60 -110
- data/lib/graphql/define/type_definer.rb +5 -5
- data/lib/graphql/deprecated_dsl.rb +18 -5
- data/lib/graphql/deprecation.rb +9 -0
- data/lib/graphql/directive/deprecated_directive.rb +1 -12
- data/lib/graphql/directive/include_directive.rb +1 -1
- data/lib/graphql/directive/skip_directive.rb +1 -1
- data/lib/graphql/directive.rb +9 -6
- data/lib/graphql/enum_type.rb +14 -74
- data/lib/graphql/execution/directive_checks.rb +2 -2
- data/lib/graphql/execution/errors.rb +110 -8
- data/lib/graphql/execution/execute.rb +8 -1
- data/lib/graphql/execution/instrumentation.rb +1 -1
- data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
- data/lib/graphql/execution/interpreter/arguments.rb +88 -0
- data/lib/graphql/execution/interpreter/arguments_cache.rb +105 -0
- data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
- data/lib/graphql/execution/interpreter/resolve.rb +37 -25
- data/lib/graphql/execution/interpreter/runtime.rb +721 -386
- data/lib/graphql/execution/interpreter.rb +42 -19
- data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
- data/lib/graphql/execution/lazy.rb +5 -1
- data/lib/graphql/execution/lookahead.rb +39 -114
- data/lib/graphql/execution/multiplex.rb +50 -25
- data/lib/graphql/field.rb +15 -119
- data/lib/graphql/filter.rb +1 -1
- data/lib/graphql/float_type.rb +1 -1
- data/lib/graphql/function.rb +5 -30
- data/lib/graphql/id_type.rb +1 -1
- data/lib/graphql/input_object_type.rb +9 -25
- data/lib/graphql/int_type.rb +1 -1
- data/lib/graphql/integer_decoding_error.rb +17 -0
- data/lib/graphql/integer_encoding_error.rb +18 -2
- data/lib/graphql/interface_type.rb +10 -24
- data/lib/graphql/internal_representation/document.rb +2 -2
- data/lib/graphql/internal_representation/rewrite.rb +1 -1
- data/lib/graphql/internal_representation/scope.rb +2 -2
- data/lib/graphql/internal_representation/visit.rb +2 -2
- data/lib/graphql/introspection/base_object.rb +2 -5
- data/lib/graphql/introspection/directive_location_enum.rb +2 -2
- data/lib/graphql/introspection/directive_type.rb +12 -6
- data/lib/graphql/introspection/entry_points.rb +9 -9
- data/lib/graphql/introspection/enum_value_type.rb +2 -2
- data/lib/graphql/introspection/field_type.rb +9 -5
- data/lib/graphql/introspection/input_value_type.rb +41 -11
- data/lib/graphql/introspection/introspection_query.rb +6 -92
- data/lib/graphql/introspection/schema_type.rb +12 -12
- data/lib/graphql/introspection/type_type.rb +27 -17
- data/lib/graphql/introspection.rb +99 -0
- data/lib/graphql/invalid_null_error.rb +18 -0
- data/lib/graphql/language/block_string.rb +20 -5
- data/lib/graphql/language/cache.rb +37 -0
- data/lib/graphql/language/definition_slice.rb +21 -10
- data/lib/graphql/language/document_from_schema_definition.rb +116 -63
- data/lib/graphql/language/lexer.rb +53 -27
- data/lib/graphql/language/lexer.rl +5 -3
- data/lib/graphql/language/nodes.rb +67 -93
- data/lib/graphql/language/parser.rb +929 -896
- data/lib/graphql/language/parser.y +125 -102
- data/lib/graphql/language/printer.rb +11 -2
- data/lib/graphql/language/sanitized_printer.rb +222 -0
- data/lib/graphql/language/token.rb +0 -4
- data/lib/graphql/language/visitor.rb +2 -2
- data/lib/graphql/language.rb +3 -1
- data/lib/graphql/name_validator.rb +2 -7
- data/lib/graphql/non_null_type.rb +0 -10
- data/lib/graphql/object_type.rb +47 -58
- data/lib/graphql/pagination/active_record_relation_connection.rb +85 -0
- data/lib/graphql/pagination/array_connection.rb +77 -0
- data/lib/graphql/pagination/connection.rb +226 -0
- data/lib/graphql/pagination/connections.rb +160 -0
- data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
- data/lib/graphql/pagination/relation_connection.rb +226 -0
- data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
- data/lib/graphql/pagination.rb +6 -0
- data/lib/graphql/parse_error.rb +0 -1
- data/lib/graphql/query/arguments.rb +6 -4
- data/lib/graphql/query/arguments_cache.rb +1 -2
- data/lib/graphql/query/context.rb +52 -7
- data/lib/graphql/query/executor.rb +0 -1
- data/lib/graphql/query/fingerprint.rb +26 -0
- data/lib/graphql/query/input_validation_result.rb +32 -6
- data/lib/graphql/query/literal_input.rb +31 -11
- data/lib/graphql/query/null_context.rb +24 -8
- data/lib/graphql/query/serial_execution/field_resolution.rb +1 -1
- data/lib/graphql/query/serial_execution.rb +1 -0
- data/lib/graphql/query/validation_pipeline.rb +6 -4
- data/lib/graphql/query/variable_validation_error.rb +3 -3
- data/lib/graphql/query/variables.rb +50 -10
- data/lib/graphql/query.rb +77 -18
- data/lib/graphql/railtie.rb +9 -1
- data/lib/graphql/rake_task/validate.rb +3 -0
- data/lib/graphql/rake_task.rb +12 -9
- data/lib/graphql/relay/array_connection.rb +10 -12
- data/lib/graphql/relay/base_connection.rb +30 -13
- data/lib/graphql/relay/connection_instrumentation.rb +4 -4
- data/lib/graphql/relay/connection_type.rb +18 -4
- data/lib/graphql/relay/edge_type.rb +1 -0
- data/lib/graphql/relay/edges_instrumentation.rb +1 -2
- data/lib/graphql/relay/global_id_resolve.rb +1 -2
- data/lib/graphql/relay/mutation.rb +3 -87
- data/lib/graphql/relay/node.rb +3 -0
- data/lib/graphql/relay/page_info.rb +1 -1
- data/lib/graphql/relay/range_add.rb +27 -9
- data/lib/graphql/relay/relation_connection.rb +8 -10
- data/lib/graphql/relay/type_extensions.rb +2 -0
- data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
- data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
- data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
- data/lib/graphql/rubocop.rb +4 -0
- data/lib/graphql/scalar_type.rb +18 -60
- data/lib/graphql/schema/addition.rb +247 -0
- data/lib/graphql/schema/argument.rb +274 -18
- data/lib/graphql/schema/base_64_encoder.rb +2 -0
- data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
- data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
- data/lib/graphql/schema/build_from_definition.rb +320 -219
- data/lib/graphql/schema/built_in_types.rb +5 -5
- data/lib/graphql/schema/default_type_error.rb +2 -0
- data/lib/graphql/schema/directive/deprecated.rb +18 -0
- data/lib/graphql/schema/directive/feature.rb +1 -1
- data/lib/graphql/schema/directive/flagged.rb +57 -0
- data/lib/graphql/schema/directive/include.rb +2 -2
- data/lib/graphql/schema/directive/skip.rb +2 -2
- data/lib/graphql/schema/directive/transform.rb +14 -2
- data/lib/graphql/schema/directive.rb +130 -6
- data/lib/graphql/schema/enum.rb +121 -12
- data/lib/graphql/schema/enum_value.rb +24 -7
- data/lib/graphql/schema/field/connection_extension.rb +46 -20
- data/lib/graphql/schema/field/scope_extension.rb +1 -1
- data/lib/graphql/schema/field.rb +465 -181
- data/lib/graphql/schema/field_extension.rb +89 -2
- data/lib/graphql/schema/find_inherited_value.rb +17 -1
- data/lib/graphql/schema/finder.rb +16 -14
- data/lib/graphql/schema/input_object.rb +172 -37
- data/lib/graphql/schema/interface.rb +39 -25
- data/lib/graphql/schema/introspection_system.rb +106 -38
- data/lib/graphql/schema/late_bound_type.rb +3 -2
- data/lib/graphql/schema/list.rb +65 -1
- data/lib/graphql/schema/loader.rb +145 -102
- data/lib/graphql/schema/member/accepts_definition.rb +15 -3
- data/lib/graphql/schema/member/base_dsl_methods.rb +34 -28
- data/lib/graphql/schema/member/build_type.rb +19 -8
- data/lib/graphql/schema/member/cached_graphql_definition.rb +34 -2
- data/lib/graphql/schema/member/has_arguments.rb +206 -13
- data/lib/graphql/schema/member/has_ast_node.rb +20 -0
- data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
- data/lib/graphql/schema/member/has_directives.rb +98 -0
- data/lib/graphql/schema/member/has_fields.rb +97 -32
- data/lib/graphql/schema/member/has_interfaces.rb +100 -0
- data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
- data/lib/graphql/schema/member/has_validators.rb +31 -0
- data/lib/graphql/schema/member/instrumentation.rb +0 -1
- data/lib/graphql/schema/member/type_system_helpers.rb +3 -3
- data/lib/graphql/schema/member/validates_input.rb +33 -0
- data/lib/graphql/schema/member.rb +11 -0
- data/lib/graphql/schema/middleware_chain.rb +1 -1
- data/lib/graphql/schema/mutation.rb +4 -0
- data/lib/graphql/schema/non_null.rb +37 -1
- data/lib/graphql/schema/object.rb +51 -38
- data/lib/graphql/schema/possible_types.rb +9 -4
- data/lib/graphql/schema/printer.rb +16 -35
- data/lib/graphql/schema/relay_classic_mutation.rb +40 -4
- data/lib/graphql/schema/resolver/has_payload_type.rb +34 -4
- data/lib/graphql/schema/resolver.rb +133 -79
- data/lib/graphql/schema/scalar.rb +43 -3
- data/lib/graphql/schema/subscription.rb +57 -21
- data/lib/graphql/schema/timeout.rb +29 -15
- data/lib/graphql/schema/timeout_middleware.rb +3 -1
- data/lib/graphql/schema/traversal.rb +2 -2
- data/lib/graphql/schema/type_expression.rb +21 -13
- data/lib/graphql/schema/type_membership.rb +19 -5
- data/lib/graphql/schema/union.rb +44 -3
- data/lib/graphql/schema/unique_within_type.rb +1 -2
- data/lib/graphql/schema/validation.rb +14 -4
- data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
- data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
- data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
- data/lib/graphql/schema/validator/format_validator.rb +48 -0
- data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
- data/lib/graphql/schema/validator/length_validator.rb +59 -0
- data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
- data/lib/graphql/schema/validator/required_validator.rb +82 -0
- data/lib/graphql/schema/validator.rb +171 -0
- data/lib/graphql/schema/warden.rb +193 -34
- data/lib/graphql/schema.rb +882 -247
- data/lib/graphql/static_validation/all_rules.rb +2 -0
- data/lib/graphql/static_validation/base_visitor.rb +17 -10
- data/lib/graphql/static_validation/definition_dependencies.rb +0 -1
- data/lib/graphql/static_validation/error.rb +3 -1
- data/lib/graphql/static_validation/literal_validator.rb +51 -26
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +45 -83
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +35 -26
- data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +1 -1
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +2 -2
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -5
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +94 -51
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
- data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
- data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
- data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
- data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +4 -2
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +9 -10
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +1 -1
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +19 -14
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
- data/lib/graphql/static_validation/type_stack.rb +2 -2
- data/lib/graphql/static_validation/validation_context.rb +13 -3
- data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
- data/lib/graphql/static_validation/validator.rb +43 -9
- data/lib/graphql/static_validation.rb +1 -0
- data/lib/graphql/string_encoding_error.rb +13 -3
- data/lib/graphql/string_type.rb +1 -1
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +123 -22
- data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +21 -0
- data/lib/graphql/subscriptions/event.rb +84 -30
- data/lib/graphql/subscriptions/instrumentation.rb +10 -6
- data/lib/graphql/subscriptions/serialize.rb +53 -6
- data/lib/graphql/subscriptions/subscription_root.rb +15 -5
- data/lib/graphql/subscriptions.rb +117 -49
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
- data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +32 -15
- data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
- data/lib/graphql/tracing/notifications_tracing.rb +59 -0
- data/lib/graphql/tracing/platform_tracing.rb +66 -10
- data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +4 -1
- data/lib/graphql/tracing/prometheus_tracing.rb +8 -0
- data/lib/graphql/tracing/scout_tracing.rb +19 -0
- data/lib/graphql/tracing/skylight_tracing.rb +9 -1
- data/lib/graphql/tracing/statsd_tracing.rb +42 -0
- data/lib/graphql/tracing.rb +15 -35
- data/lib/graphql/types/big_int.rb +5 -1
- data/lib/graphql/types/int.rb +10 -3
- data/lib/graphql/types/iso_8601_date.rb +16 -8
- data/lib/graphql/types/iso_8601_date_time.rb +32 -10
- data/lib/graphql/types/relay/base_connection.rb +6 -88
- data/lib/graphql/types/relay/base_edge.rb +2 -34
- data/lib/graphql/types/relay/connection_behaviors.rb +174 -0
- data/lib/graphql/types/relay/default_relay.rb +31 -0
- data/lib/graphql/types/relay/edge_behaviors.rb +64 -0
- data/lib/graphql/types/relay/has_node_field.rb +41 -0
- data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
- data/lib/graphql/types/relay/node.rb +2 -4
- data/lib/graphql/types/relay/node_behaviors.rb +15 -0
- data/lib/graphql/types/relay/node_field.rb +3 -22
- data/lib/graphql/types/relay/nodes_field.rb +16 -18
- data/lib/graphql/types/relay/page_info.rb +2 -14
- data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
- data/lib/graphql/types/relay.rb +11 -3
- data/lib/graphql/types/string.rb +8 -2
- data/lib/graphql/unauthorized_error.rb +2 -2
- data/lib/graphql/union_type.rb +5 -25
- data/lib/graphql/unresolved_type_error.rb +2 -2
- data/lib/graphql/upgrader/member.rb +1 -0
- data/lib/graphql/upgrader/schema.rb +1 -0
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +87 -31
- data/readme.md +3 -6
- metadata +126 -124
- data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
- data/lib/graphql/literal_validation_error.rb +0 -6
- data/lib/graphql/types/relay/base_field.rb +0 -22
- data/lib/graphql/types/relay/base_interface.rb +0 -29
- data/lib/graphql/types/relay/base_object.rb +0 -26
data/lib/graphql/query.rb
CHANGED
|
@@ -3,6 +3,7 @@ require "graphql/query/arguments"
|
|
|
3
3
|
require "graphql/query/arguments_cache"
|
|
4
4
|
require "graphql/query/context"
|
|
5
5
|
require "graphql/query/executor"
|
|
6
|
+
require "graphql/query/fingerprint"
|
|
6
7
|
require "graphql/query/literal_input"
|
|
7
8
|
require "graphql/query/null_context"
|
|
8
9
|
require "graphql/query/result"
|
|
@@ -78,19 +79,25 @@ module GraphQL
|
|
|
78
79
|
# @param max_complexity [Numeric] the maximum field complexity for this query (falls back to schema-level value)
|
|
79
80
|
# @param except [<#call(schema_member, context)>] If provided, objects will be hidden from the schema when `.call(schema_member, context)` returns truthy
|
|
80
81
|
# @param only [<#call(schema_member, context)>] If provided, objects will be hidden from the schema when `.call(schema_member, context)` returns false
|
|
81
|
-
def initialize(schema, query_string = nil, query: nil, document: nil, context: nil, variables: nil, validate: true, subscription_topic: nil, operation_name: nil, root_value: nil, max_depth: schema.max_depth, max_complexity: schema.max_complexity, except: nil, only: nil)
|
|
82
|
+
def initialize(schema, query_string = nil, query: nil, document: nil, context: nil, variables: nil, validate: true, subscription_topic: nil, operation_name: nil, root_value: nil, max_depth: schema.max_depth, max_complexity: schema.max_complexity, except: nil, only: nil, warden: nil)
|
|
82
83
|
# Even if `variables: nil` is passed, use an empty hash for simpler logic
|
|
83
84
|
variables ||= {}
|
|
85
|
+
|
|
86
|
+
# Use the `.graphql_definition` here which will return legacy types instead of classes
|
|
87
|
+
if schema.is_a?(Class) && !schema.interpreter?
|
|
88
|
+
schema = schema.graphql_definition
|
|
89
|
+
end
|
|
84
90
|
@schema = schema
|
|
91
|
+
@interpreter = @schema.interpreter?
|
|
85
92
|
@filter = schema.default_filter.merge(except: except, only: only)
|
|
86
93
|
@context = schema.context_class.new(query: self, object: root_value, values: context)
|
|
94
|
+
@warden = warden
|
|
87
95
|
@subscription_topic = subscription_topic
|
|
88
96
|
@root_value = root_value
|
|
89
97
|
@fragments = nil
|
|
90
98
|
@operations = nil
|
|
91
99
|
@validate = validate
|
|
92
|
-
|
|
93
|
-
@tracers = schema.tracers + GraphQL::Tracing.tracers + (context ? context.fetch(:tracers, []) : [])
|
|
100
|
+
@tracers = schema.tracers + (context ? context.fetch(:tracers, []) : [])
|
|
94
101
|
# Support `ctx[:backtrace] = true` for wrapping backtraces
|
|
95
102
|
if context && context[:backtrace] && !@tracers.include?(GraphQL::Backtrace::Tracer)
|
|
96
103
|
@tracers << GraphQL::Backtrace::Tracer
|
|
@@ -100,7 +107,7 @@ module GraphQL
|
|
|
100
107
|
if variables.is_a?(String)
|
|
101
108
|
raise ArgumentError, "Query variables should be a Hash, not a String. Try JSON.parse to prepare variables."
|
|
102
109
|
else
|
|
103
|
-
@provided_variables = variables
|
|
110
|
+
@provided_variables = variables || {}
|
|
104
111
|
end
|
|
105
112
|
|
|
106
113
|
@query_string = query_string || query
|
|
@@ -110,6 +117,10 @@ module GraphQL
|
|
|
110
117
|
raise ArgumentError, "Query should only be provided a query string or a document, not both."
|
|
111
118
|
end
|
|
112
119
|
|
|
120
|
+
if @query_string && !@query_string.is_a?(String)
|
|
121
|
+
raise ArgumentError, "Query string argument should be a String, got #{@query_string.class.name} instead."
|
|
122
|
+
end
|
|
123
|
+
|
|
113
124
|
# A two-layer cache of type resolution:
|
|
114
125
|
# { abstract_type => { value => resolved_type } }
|
|
115
126
|
@resolved_types_cache = Hash.new do |h1, k1|
|
|
@@ -118,8 +129,6 @@ module GraphQL
|
|
|
118
129
|
end
|
|
119
130
|
end
|
|
120
131
|
|
|
121
|
-
@arguments_cache = ArgumentsCache.build(self)
|
|
122
|
-
|
|
123
132
|
# Trying to execute a document
|
|
124
133
|
# with no operations returns an empty hash
|
|
125
134
|
@ast_variables = []
|
|
@@ -144,7 +153,11 @@ module GraphQL
|
|
|
144
153
|
@query_string ||= (document ? document.to_query_string : nil)
|
|
145
154
|
end
|
|
146
155
|
|
|
147
|
-
|
|
156
|
+
def interpreter?
|
|
157
|
+
@interpreter
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
attr_accessor :multiplex
|
|
148
161
|
|
|
149
162
|
def subscription_update?
|
|
150
163
|
@subscription_topic && subscription?
|
|
@@ -156,7 +169,7 @@ module GraphQL
|
|
|
156
169
|
@lookahead ||= begin
|
|
157
170
|
ast_node = selected_operation
|
|
158
171
|
root_type = warden.root_type_for_operation(ast_node.operation_type || "query")
|
|
159
|
-
root_type = root_type.
|
|
172
|
+
root_type = root_type.type_class || raise("Invariant: `lookahead` only works with class-based types")
|
|
160
173
|
GraphQL::Execution::Lookahead.new(query: self, root_type: root_type, ast_nodes: [ast_node])
|
|
161
174
|
end
|
|
162
175
|
end
|
|
@@ -186,9 +199,7 @@ module GraphQL
|
|
|
186
199
|
# @return [Hash] A GraphQL response, with `"data"` and/or `"errors"` keys
|
|
187
200
|
def result
|
|
188
201
|
if !@executed
|
|
189
|
-
|
|
190
|
-
Execution::Multiplex.run_queries(@schema, [self], context: @context)
|
|
191
|
-
}
|
|
202
|
+
Execution::Multiplex.run_queries(@schema, [self], context: @context)
|
|
192
203
|
end
|
|
193
204
|
@result ||= Query::Result.new(query: self, values: @result_values)
|
|
194
205
|
end
|
|
@@ -237,10 +248,60 @@ module GraphQL
|
|
|
237
248
|
end
|
|
238
249
|
|
|
239
250
|
# Node-level cache for calculating arguments. Used during execution and query analysis.
|
|
240
|
-
# @
|
|
241
|
-
# @
|
|
242
|
-
|
|
243
|
-
|
|
251
|
+
# @param ast_node [GraphQL::Language::Nodes::AbstractNode]
|
|
252
|
+
# @param definition [GraphQL::Schema::Field]
|
|
253
|
+
# @param parent_object [GraphQL::Schema::Object]
|
|
254
|
+
# @return Hash{Symbol => Object}
|
|
255
|
+
def arguments_for(ast_node, definition, parent_object: nil)
|
|
256
|
+
if interpreter?
|
|
257
|
+
arguments_cache.fetch(ast_node, definition, parent_object)
|
|
258
|
+
else
|
|
259
|
+
arguments_cache[ast_node][definition]
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
def arguments_cache
|
|
264
|
+
if interpreter?
|
|
265
|
+
@arguments_cache ||= Execution::Interpreter::ArgumentsCache.new(self)
|
|
266
|
+
else
|
|
267
|
+
@arguments_cache ||= ArgumentsCache.build(self)
|
|
268
|
+
end
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
# A version of the given query string, with:
|
|
272
|
+
# - Variables inlined to the query
|
|
273
|
+
# - Strings replaced with `<REDACTED>`
|
|
274
|
+
# @return [String, nil] Returns nil if the query is invalid.
|
|
275
|
+
def sanitized_query_string(inline_variables: true)
|
|
276
|
+
with_prepared_ast {
|
|
277
|
+
schema.sanitized_printer.new(self, inline_variables: inline_variables).sanitized_query_string
|
|
278
|
+
}
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
# This contains a few components:
|
|
282
|
+
#
|
|
283
|
+
# - The selected operation name (or `anonymous`)
|
|
284
|
+
# - The fingerprint of the query string
|
|
285
|
+
# - The number of given variables (for readability)
|
|
286
|
+
# - The fingerprint of the given variables
|
|
287
|
+
#
|
|
288
|
+
# This fingerprint can be used to track runs of the same operation-variables combination over time.
|
|
289
|
+
#
|
|
290
|
+
# @see operation_fingerprint
|
|
291
|
+
# @see variables_fingerprint
|
|
292
|
+
# @return [String] An opaque hash identifying this operation-variables combination
|
|
293
|
+
def fingerprint
|
|
294
|
+
@fingerprint ||= "#{operation_fingerprint}/#{variables_fingerprint}"
|
|
295
|
+
end
|
|
296
|
+
|
|
297
|
+
# @return [String] An opaque hash for identifying this query's given query string and selected operation
|
|
298
|
+
def operation_fingerprint
|
|
299
|
+
@operation_fingerprint ||= "#{selected_operation_name || "anonymous"}/#{Fingerprint.generate(query_string)}"
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
# @return [String] An opaque hash for identifying this query's given a variable values (not including defaults)
|
|
303
|
+
def variables_fingerprint
|
|
304
|
+
@variables_fingerprint ||= "#{provided_variables.size}/#{Fingerprint.generate(provided_variables.to_json)}"
|
|
244
305
|
end
|
|
245
306
|
|
|
246
307
|
def validation_pipeline
|
|
@@ -320,8 +381,7 @@ module GraphQL
|
|
|
320
381
|
|
|
321
382
|
def prepare_ast
|
|
322
383
|
@prepared_ast = true
|
|
323
|
-
@warden
|
|
324
|
-
|
|
384
|
+
@warden ||= GraphQL::Schema::Warden.new(@filter, schema: @schema, context: @context)
|
|
325
385
|
parse_error = nil
|
|
326
386
|
@document ||= begin
|
|
327
387
|
if query_string
|
|
@@ -374,7 +434,6 @@ module GraphQL
|
|
|
374
434
|
|
|
375
435
|
@validation_pipeline = GraphQL::Query::ValidationPipeline.new(
|
|
376
436
|
query: self,
|
|
377
|
-
validate: @validate,
|
|
378
437
|
parse_error: parse_error,
|
|
379
438
|
operation_name_error: operation_name_error,
|
|
380
439
|
max_depth: @max_depth,
|
data/lib/graphql/railtie.rb
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
4
3
|
module GraphQL
|
|
5
4
|
class Railtie < Rails::Railtie
|
|
5
|
+
config.before_configuration do
|
|
6
|
+
# Bootsnap compile cache has similar expiration properties,
|
|
7
|
+
# so we assume that if the user has bootsnap setup it's ok
|
|
8
|
+
# to piggy back on it.
|
|
9
|
+
if ::Object.const_defined?("Bootsnap::CompileCache::ISeq") && Bootsnap::CompileCache::ISeq.cache_dir
|
|
10
|
+
Language::Parser.cache ||= Language::Cache.new(Pathname.new(Bootsnap::CompileCache::ISeq.cache_dir).join('graphql'))
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
6
14
|
rake_tasks do
|
|
7
15
|
# Defer this so that you only need the `parser` gem when you _run_ the upgrader
|
|
8
16
|
def load_upgraders
|
|
@@ -7,6 +7,9 @@ module GraphQL
|
|
|
7
7
|
desc "Get the checksum of a graphql-pro version and compare it to published versions on GitHub and graphql-ruby.org"
|
|
8
8
|
task "graphql:pro:validate", [:gem_version] do |t, args|
|
|
9
9
|
version = args[:gem_version]
|
|
10
|
+
if version.nil?
|
|
11
|
+
raise ArgumentError, "A specific version is required, eg `rake graphql:pro:validate[1.12.0]`"
|
|
12
|
+
end
|
|
10
13
|
check = "\e[32m✓\e[0m"
|
|
11
14
|
ex = "\e[31m✘\e[0m"
|
|
12
15
|
puts "Validating graphql-pro v#{version}"
|
data/lib/graphql/rake_task.rb
CHANGED
|
@@ -76,15 +76,7 @@ module GraphQL
|
|
|
76
76
|
# Set the parameters of this task by passing keyword arguments
|
|
77
77
|
# or assigning attributes inside the block
|
|
78
78
|
def initialize(options = {})
|
|
79
|
-
|
|
80
|
-
[:environment]
|
|
81
|
-
else
|
|
82
|
-
[]
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
all_options = DEFAULT_OPTIONS
|
|
86
|
-
.merge(dependencies: default_dependencies)
|
|
87
|
-
.merge(options)
|
|
79
|
+
all_options = DEFAULT_OPTIONS.merge(options)
|
|
88
80
|
all_options.each do |k, v|
|
|
89
81
|
self.public_send("#{k}=", v)
|
|
90
82
|
end
|
|
@@ -106,6 +98,9 @@ module GraphQL
|
|
|
106
98
|
result = schema.public_send(method_name, only: @only, except: @except, context: context)
|
|
107
99
|
dir = File.dirname(file)
|
|
108
100
|
FileUtils.mkdir_p(dir)
|
|
101
|
+
if !result.end_with?("\n")
|
|
102
|
+
result += "\n"
|
|
103
|
+
end
|
|
109
104
|
File.write(file, result)
|
|
110
105
|
end
|
|
111
106
|
|
|
@@ -117,18 +112,26 @@ module GraphQL
|
|
|
117
112
|
File.join(@directory, @json_outfile)
|
|
118
113
|
end
|
|
119
114
|
|
|
115
|
+
def load_rails_environment_if_defined
|
|
116
|
+
if Rake::Task.task_defined?('environment')
|
|
117
|
+
Rake::Task['environment'].invoke
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
120
121
|
# Use the Rake DSL to add tasks
|
|
121
122
|
def define_task
|
|
122
123
|
namespace(@namespace) do
|
|
123
124
|
namespace("schema") do
|
|
124
125
|
desc("Dump the schema to IDL in #{idl_path}")
|
|
125
126
|
task :idl => @dependencies do
|
|
127
|
+
load_rails_environment_if_defined
|
|
126
128
|
write_outfile(:to_definition, idl_path)
|
|
127
129
|
puts "Schema IDL dumped into #{idl_path}"
|
|
128
130
|
end
|
|
129
131
|
|
|
130
132
|
desc("Dump the schema to JSON in #{json_path}")
|
|
131
133
|
task :json => @dependencies do
|
|
134
|
+
load_rails_environment_if_defined
|
|
132
135
|
write_outfile(:to_json, json_path)
|
|
133
136
|
puts "Schema JSON dumped into #{json_path}"
|
|
134
137
|
end
|
|
@@ -31,24 +31,22 @@ module GraphQL
|
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
-
private
|
|
35
|
-
|
|
36
34
|
def first
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
35
|
+
@first ||= begin
|
|
36
|
+
capped = limit_pagination_argument(arguments[:first], max_page_size)
|
|
37
|
+
if capped.nil? && last.nil?
|
|
38
|
+
capped = max_page_size
|
|
39
|
+
end
|
|
40
|
+
capped
|
|
41
|
+
end
|
|
42
42
|
end
|
|
43
43
|
|
|
44
44
|
def last
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
@last = get_limited_arg(:last)
|
|
48
|
-
@last = max_page_size if @last && max_page_size && @last > max_page_size
|
|
49
|
-
@last
|
|
45
|
+
@last ||= limit_pagination_argument(arguments[:last], max_page_size)
|
|
50
46
|
end
|
|
51
47
|
|
|
48
|
+
private
|
|
49
|
+
|
|
52
50
|
# apply first / last limit results
|
|
53
51
|
def paged_nodes
|
|
54
52
|
@paged_nodes ||= begin
|
|
@@ -25,6 +25,10 @@ module GraphQL
|
|
|
25
25
|
# @param nodes [Object] A collection of nodes (eg, Array, AR::Relation)
|
|
26
26
|
# @return [subclass of BaseConnection] a connection Class for wrapping `nodes`
|
|
27
27
|
def connection_for_nodes(nodes)
|
|
28
|
+
# If it's a new-style connection object, it's already ready to go
|
|
29
|
+
if nodes.is_a?(GraphQL::Pagination::Connection)
|
|
30
|
+
return nodes
|
|
31
|
+
end
|
|
28
32
|
# Check for class _names_ because classes can be redefined in Rails development
|
|
29
33
|
nodes.class.ancestors.each do |ancestor|
|
|
30
34
|
conn_impl = CONNECTION_IMPLEMENTATIONS[ancestor.name]
|
|
@@ -55,6 +59,13 @@ module GraphQL
|
|
|
55
59
|
# @param parent [Object] The object which this collection belongs to
|
|
56
60
|
# @param context [GraphQL::Query::Context] The context from the field being resolved
|
|
57
61
|
def initialize(nodes, arguments, field: nil, max_page_size: nil, parent: nil, context: nil)
|
|
62
|
+
GraphQL::Deprecation.warn "GraphQL::Relay::BaseConnection (used for #{self.class}) will be removed from GraphQL-Ruby 2.0, use GraphQL::Pagination::Connections instead: https://graphql-ruby.org/pagination/overview.html"
|
|
63
|
+
|
|
64
|
+
deprecated_caller = caller(0, 10).find { |c| !c.include?("lib/graphql") }
|
|
65
|
+
if deprecated_caller
|
|
66
|
+
GraphQL::Deprecation.warn " -> called from #{deprecated_caller}"
|
|
67
|
+
end
|
|
68
|
+
|
|
58
69
|
@context = context
|
|
59
70
|
@nodes = nodes
|
|
60
71
|
@arguments = arguments
|
|
@@ -70,14 +81,18 @@ module GraphQL
|
|
|
70
81
|
|
|
71
82
|
def decode(data)
|
|
72
83
|
@encoder.decode(data, nonce: true)
|
|
73
|
-
rescue ArgumentError
|
|
74
|
-
raise GraphQL::ExecutionError, "Invalid cursor: #{data.inspect}"
|
|
75
84
|
end
|
|
76
85
|
|
|
77
86
|
# The value passed as `first:`, if there was one. Negative numbers become `0`.
|
|
78
87
|
# @return [Integer, nil]
|
|
79
88
|
def first
|
|
80
|
-
@first ||=
|
|
89
|
+
@first ||= begin
|
|
90
|
+
capped = limit_pagination_argument(arguments[:first], max_page_size)
|
|
91
|
+
if capped.nil? && last.nil?
|
|
92
|
+
capped = max_page_size
|
|
93
|
+
end
|
|
94
|
+
capped
|
|
95
|
+
end
|
|
81
96
|
end
|
|
82
97
|
|
|
83
98
|
# The value passed as `after:`, if there was one
|
|
@@ -89,7 +104,7 @@ module GraphQL
|
|
|
89
104
|
# The value passed as `last:`, if there was one. Negative numbers become `0`.
|
|
90
105
|
# @return [Integer, nil]
|
|
91
106
|
def last
|
|
92
|
-
@last ||=
|
|
107
|
+
@last ||= limit_pagination_argument(arguments[:last], max_page_size)
|
|
93
108
|
end
|
|
94
109
|
|
|
95
110
|
# The value passed as `before:`, if there was one
|
|
@@ -148,16 +163,18 @@ module GraphQL
|
|
|
148
163
|
|
|
149
164
|
private
|
|
150
165
|
|
|
151
|
-
#
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
166
|
+
# @param argument [nil, Integer] `first` or `last`, as provided by the client
|
|
167
|
+
# @param max_page_size [nil, Integer]
|
|
168
|
+
# @return [nil, Integer] `nil` if the input was `nil`, otherwise a value between `0` and `max_page_size`
|
|
169
|
+
def limit_pagination_argument(argument, max_page_size)
|
|
170
|
+
if argument
|
|
171
|
+
if argument < 0
|
|
172
|
+
argument = 0
|
|
173
|
+
elsif max_page_size && argument > max_page_size
|
|
174
|
+
argument = max_page_size
|
|
175
|
+
end
|
|
160
176
|
end
|
|
177
|
+
argument
|
|
161
178
|
end
|
|
162
179
|
|
|
163
180
|
def paged_nodes
|
|
@@ -10,10 +10,10 @@ module GraphQL
|
|
|
10
10
|
def self.default_arguments
|
|
11
11
|
@default_arguments ||= begin
|
|
12
12
|
argument_definitions = [
|
|
13
|
-
["first", GraphQL::
|
|
14
|
-
["after", GraphQL::
|
|
15
|
-
["last", GraphQL::
|
|
16
|
-
["before", GraphQL::
|
|
13
|
+
["first", GraphQL::DEPRECATED_INT_TYPE, "Returns the first _n_ elements from the list."],
|
|
14
|
+
["after", GraphQL::DEPRECATED_STRING_TYPE, "Returns the elements in the list that come after the specified cursor."],
|
|
15
|
+
["last", GraphQL::DEPRECATED_INT_TYPE, "Returns the last _n_ elements from the list."],
|
|
16
|
+
["before", GraphQL::DEPRECATED_STRING_TYPE, "Returns the elements in the list that come before the specified cursor."],
|
|
17
17
|
]
|
|
18
18
|
|
|
19
19
|
argument_definitions.reduce({}) do |memo, arg_defn|
|
|
@@ -1,25 +1,39 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
module GraphQL
|
|
3
3
|
module Relay
|
|
4
|
+
# @api deprecated
|
|
4
5
|
module ConnectionType
|
|
5
6
|
class << self
|
|
6
7
|
# @return [Boolean] If true, connection types get a `nodes` shortcut field
|
|
7
|
-
|
|
8
|
+
def default_nodes_field=(new_setting)
|
|
9
|
+
if new_setting
|
|
10
|
+
warn("GraphQL::Relay::ConnectionType will be removed in GraphQL 2.0.0; migrate to `GraphQL::Pagination::Connections` and remove this setting (`default_nodes_field = true`).")
|
|
11
|
+
end
|
|
12
|
+
@default_nodes_field = new_setting
|
|
13
|
+
end
|
|
14
|
+
attr_reader :default_nodes_field
|
|
15
|
+
|
|
8
16
|
# @return [Boolean] If true, connections check for reverse-direction `has*Page` values
|
|
9
|
-
|
|
17
|
+
def bidirectional_pagination=(new_setting)
|
|
18
|
+
if new_setting
|
|
19
|
+
warn("GraphQL::Relay::ConnectionType will be removed in GraphQL 2.0.0; migrate to `GraphQL::Pagination::Connections` and remove this setting (`bidirectional_pagination = true`).")
|
|
20
|
+
end
|
|
21
|
+
@bidirectional_pagination = new_setting
|
|
22
|
+
end
|
|
23
|
+
attr_reader :bidirectional_pagination
|
|
10
24
|
end
|
|
11
25
|
|
|
12
26
|
self.default_nodes_field = false
|
|
13
27
|
self.bidirectional_pagination = false
|
|
14
28
|
|
|
15
|
-
#
|
|
29
|
+
# @api deprecated
|
|
16
30
|
def self.create_type(wrapped_type, edge_type: nil, edge_class: GraphQL::Relay::Edge, nodes_field: ConnectionType.default_nodes_field, &block)
|
|
17
31
|
custom_edge_class = edge_class
|
|
18
32
|
|
|
19
33
|
# Any call that would trigger `wrapped_type.ensure_defined`
|
|
20
34
|
# must be inside this lazy block, otherwise we get weird
|
|
21
35
|
# cyclical dependency errors :S
|
|
22
|
-
ObjectType.
|
|
36
|
+
ObjectType.deprecated_define do
|
|
23
37
|
type_name = wrapped_type.is_a?(GraphQL::BaseType) ? wrapped_type.name : wrapped_type.graphql_name
|
|
24
38
|
edge_type ||= wrapped_type.edge_type
|
|
25
39
|
name("#{type_name}Connection")
|
|
@@ -16,7 +16,6 @@ module GraphQL
|
|
|
16
16
|
end
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
|
|
20
19
|
class EdgesResolve
|
|
21
20
|
def initialize(edge_class:, resolve:)
|
|
22
21
|
@edge_class = edge_class
|
|
@@ -31,7 +30,7 @@ module GraphQL
|
|
|
31
30
|
if ctx.schema.lazy?(nodes)
|
|
32
31
|
nodes
|
|
33
32
|
else
|
|
34
|
-
nodes.map { |item| @edge_class.new(item, parent) }
|
|
33
|
+
nodes.map { |item| item.is_a?(GraphQL::Pagination::Connection::Edge) ? item : @edge_class.new(item, parent) }
|
|
35
34
|
end
|
|
36
35
|
end
|
|
37
36
|
end
|
|
@@ -10,8 +10,7 @@ module GraphQL
|
|
|
10
10
|
if obj.is_a?(GraphQL::Schema::Object)
|
|
11
11
|
obj = obj.object
|
|
12
12
|
end
|
|
13
|
-
|
|
14
|
-
ctx.query.schema.id_from_object(obj, type, ctx)
|
|
13
|
+
ctx.query.schema.id_from_object(obj, @type, ctx)
|
|
15
14
|
end
|
|
16
15
|
end
|
|
17
16
|
end
|
|
@@ -5,95 +5,10 @@ require "graphql/relay/mutation/result"
|
|
|
5
5
|
|
|
6
6
|
module GraphQL
|
|
7
7
|
module Relay
|
|
8
|
-
#
|
|
9
|
-
# - give it a name (used for derived inputs & outputs)
|
|
10
|
-
# - declare its inputs
|
|
11
|
-
# - declare its outputs
|
|
12
|
-
# - declare the mutation procedure
|
|
13
|
-
#
|
|
14
|
-
# `resolve` should return a hash with a key for each of the `return_field`s
|
|
15
|
-
#
|
|
16
|
-
# Inputs may also contain a `clientMutationId`
|
|
17
|
-
#
|
|
18
|
-
# @example Updating the name of an item
|
|
19
|
-
# UpdateNameMutation = GraphQL::Relay::Mutation.define do
|
|
20
|
-
# name "UpdateName"
|
|
21
|
-
#
|
|
22
|
-
# input_field :name, !types.String
|
|
23
|
-
# input_field :itemId, !types.ID
|
|
24
|
-
#
|
|
25
|
-
# return_field :item, ItemType
|
|
26
|
-
#
|
|
27
|
-
# resolve ->(inputs, ctx) {
|
|
28
|
-
# item = Item.find_by_id(inputs[:id])
|
|
29
|
-
# item.update(name: inputs[:name])
|
|
30
|
-
# {item: item}
|
|
31
|
-
# }
|
|
32
|
-
# end
|
|
33
|
-
#
|
|
34
|
-
# MutationType = GraphQL::ObjectType.define do
|
|
35
|
-
# # The mutation object exposes a field:
|
|
36
|
-
# field :updateName, field: UpdateNameMutation.field
|
|
37
|
-
# end
|
|
38
|
-
#
|
|
39
|
-
# # Then query it:
|
|
40
|
-
# query_string = %|
|
|
41
|
-
# mutation updateName {
|
|
42
|
-
# updateName(input: {itemId: 1, name: "new name", clientMutationId: "1234"}) {
|
|
43
|
-
# item { name }
|
|
44
|
-
# clientMutationId
|
|
45
|
-
# }|
|
|
46
|
-
#
|
|
47
|
-
# GraphQL::Query.new(MySchema, query_string).result
|
|
48
|
-
# # {"data" => {
|
|
49
|
-
# # "updateName" => {
|
|
50
|
-
# # "item" => { "name" => "new name"},
|
|
51
|
-
# # "clientMutationId" => "1234"
|
|
52
|
-
# # }
|
|
53
|
-
# # }}
|
|
54
|
-
#
|
|
55
|
-
# @example Using a GraphQL::Function
|
|
56
|
-
# class UpdateAttributes < GraphQL::Function
|
|
57
|
-
# attr_reader :model, :return_as, :arguments
|
|
58
|
-
#
|
|
59
|
-
# def initialize(model:, return_as:, attributes:)
|
|
60
|
-
# @model = model
|
|
61
|
-
# @arguments = {}
|
|
62
|
-
# attributes.each do |name, type|
|
|
63
|
-
# arg_name = name.to_s
|
|
64
|
-
# @arguments[arg_name] = GraphQL::Argument.define(name: arg_name, type: type)
|
|
65
|
-
# end
|
|
66
|
-
# @arguments["id"] = GraphQL::Argument.define(name: "id", type: !GraphQL::ID_TYPE)
|
|
67
|
-
# @return_as = return_as
|
|
68
|
-
# @attributes = attributes
|
|
69
|
-
# end
|
|
70
|
-
#
|
|
71
|
-
# def type
|
|
72
|
-
# fn = self
|
|
73
|
-
# GraphQL::ObjectType.define do
|
|
74
|
-
# name "Update#{fn.model.name}AttributesResponse"
|
|
75
|
-
# field :clientMutationId, types.ID
|
|
76
|
-
# field fn.return_as.keys[0], fn.return_as.values[0]
|
|
77
|
-
# end
|
|
78
|
-
# end
|
|
79
|
-
#
|
|
80
|
-
# def call(obj, args, ctx)
|
|
81
|
-
# record = @model.find(args[:inputs][:id])
|
|
82
|
-
# new_values = {}
|
|
83
|
-
# @attributes.each { |a| new_values[a] = args[a] }
|
|
84
|
-
# record.update(new_values)
|
|
85
|
-
# { @return_as => record }
|
|
86
|
-
# end
|
|
87
|
-
# end
|
|
88
|
-
#
|
|
89
|
-
# UpdateNameMutation = GraphQL::Relay::Mutation.define do
|
|
90
|
-
# name "UpdateName"
|
|
91
|
-
# function UpdateAttributes.new(model: Item, return_as: { item: ItemType }, attributes: {name: !types.String})
|
|
92
|
-
# end
|
|
93
|
-
|
|
8
|
+
# @api deprecated
|
|
94
9
|
class Mutation
|
|
95
10
|
include GraphQL::Define::InstanceDefinable
|
|
96
|
-
|
|
11
|
+
deprecated_accepts_definitions(
|
|
97
12
|
:name, :description, :resolve,
|
|
98
13
|
:return_type,
|
|
99
14
|
:return_interfaces,
|
|
@@ -115,6 +30,7 @@ module GraphQL
|
|
|
115
30
|
alias :input_fields :arguments
|
|
116
31
|
|
|
117
32
|
def initialize
|
|
33
|
+
GraphQL::Deprecation.warn "GraphQL::Relay::Mutation will be removed from GraphQL-Ruby 2.0, use GraphQL::Schema::RelayClassicMutation instead: https://graphql-ruby.org/mutations/mutation_classes"
|
|
118
34
|
@fields = {}
|
|
119
35
|
@arguments = {}
|
|
120
36
|
@has_generated_return_type = false
|
data/lib/graphql/relay/node.rb
CHANGED
|
@@ -5,6 +5,7 @@ module GraphQL
|
|
|
5
5
|
module Node
|
|
6
6
|
# @return [GraphQL::Field] a field for finding objects by their global ID.
|
|
7
7
|
def self.field(**kwargs, &block)
|
|
8
|
+
GraphQL::Deprecation.warn "GraphQL::Relay::Node.field will be removed from GraphQL-Ruby 2.0, use GraphQL::Types::Relay::NodeField instead"
|
|
8
9
|
# We have to define it fresh each time because
|
|
9
10
|
# its name will be modified and its description
|
|
10
11
|
# _may_ be modified.
|
|
@@ -18,6 +19,7 @@ module GraphQL
|
|
|
18
19
|
end
|
|
19
20
|
|
|
20
21
|
def self.plural_field(**kwargs, &block)
|
|
22
|
+
GraphQL::Deprecation.warn "GraphQL::Relay::Nodes.field will be removed from GraphQL-Ruby 2.0, use GraphQL::Types::Relay::NodesField instead"
|
|
21
23
|
field = GraphQL::Types::Relay::NodesField.graphql_definition
|
|
22
24
|
|
|
23
25
|
if kwargs.any? || block
|
|
@@ -29,6 +31,7 @@ module GraphQL
|
|
|
29
31
|
|
|
30
32
|
# @return [GraphQL::InterfaceType] The interface which all Relay types must implement
|
|
31
33
|
def self.interface
|
|
34
|
+
GraphQL::Deprecation.warn "GraphQL::Relay::Node.interface will be removed from GraphQL-Ruby 2.0, use GraphQL::Types::Relay::Node instead"
|
|
32
35
|
@interface ||= GraphQL::Types::Relay::Node.graphql_definition
|
|
33
36
|
end
|
|
34
37
|
end
|