graphql 1.9.21 → 2.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of graphql might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/generators/graphql/core.rb +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 +45 -8
- 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 +49 -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 +25 -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/ast/field_usage.rb +31 -2
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
- data/lib/graphql/analysis/ast/query_complexity.rb +175 -68
- data/lib/graphql/analysis/ast/query_depth.rb +0 -1
- data/lib/graphql/analysis/ast/visitor.rb +17 -8
- data/lib/graphql/analysis/ast.rb +14 -14
- data/lib/graphql/analysis.rb +0 -7
- data/lib/graphql/backtrace/inspect_result.rb +0 -1
- data/lib/graphql/backtrace/table.rb +37 -16
- data/lib/graphql/backtrace/traced_error.rb +0 -1
- data/lib/graphql/backtrace/tracer.rb +39 -9
- data/lib/graphql/backtrace.rb +20 -17
- data/lib/graphql/dataloader/null_dataloader.rb +24 -0
- data/lib/graphql/dataloader/request.rb +19 -0
- data/lib/graphql/dataloader/request_all.rb +19 -0
- data/lib/graphql/dataloader/source.rb +164 -0
- data/lib/graphql/dataloader.rb +311 -0
- data/lib/graphql/date_encoding_error.rb +16 -0
- data/lib/graphql/deprecation.rb +9 -0
- data/lib/graphql/dig.rb +1 -1
- data/lib/graphql/execution/directive_checks.rb +2 -2
- data/lib/graphql/execution/errors.rb +77 -45
- 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 +44 -25
- data/lib/graphql/execution/interpreter/runtime.rb +755 -395
- data/lib/graphql/execution/interpreter.rb +201 -74
- data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
- data/lib/graphql/execution/lazy.rb +5 -9
- data/lib/graphql/execution/lookahead.rb +65 -136
- data/lib/graphql/execution/multiplex.rb +5 -152
- data/lib/graphql/execution.rb +11 -4
- data/lib/graphql/filter.rb +1 -1
- data/lib/graphql/integer_decoding_error.rb +17 -0
- data/lib/graphql/integer_encoding_error.rb +18 -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 +11 -5
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +5 -18
- 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 +10 -10
- data/lib/graphql/introspection/type_type.rb +34 -17
- data/lib/graphql/introspection.rb +100 -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 +104 -68
- data/lib/graphql/language/lexer.rb +83 -40
- data/lib/graphql/language/lexer.rl +31 -9
- data/lib/graphql/language/nodes.rb +64 -93
- data/lib/graphql/language/parser.rb +940 -896
- data/lib/graphql/language/parser.y +130 -103
- data/lib/graphql/language/printer.rb +48 -23
- 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/pagination/active_record_relation_connection.rb +85 -0
- data/lib/graphql/pagination/array_connection.rb +79 -0
- data/lib/graphql/pagination/connection.rb +253 -0
- data/lib/graphql/pagination/connections.rb +135 -0
- data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
- data/lib/graphql/pagination/relation_connection.rb +228 -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/context.rb +172 -198
- data/lib/graphql/query/fingerprint.rb +26 -0
- data/lib/graphql/query/input_validation_result.rb +33 -7
- data/lib/graphql/query/null_context.rb +21 -8
- data/lib/graphql/query/validation_pipeline.rb +16 -38
- data/lib/graphql/query/variable_validation_error.rb +3 -3
- data/lib/graphql/query/variables.rb +39 -12
- data/lib/graphql/query.rb +74 -38
- data/lib/graphql/railtie.rb +6 -102
- data/lib/graphql/rake_task/validate.rb +4 -1
- data/lib/graphql/rake_task.rb +41 -10
- data/lib/graphql/relay/range_add.rb +17 -10
- data/lib/graphql/relay.rb +0 -15
- data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
- data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
- data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
- data/lib/graphql/rubocop.rb +4 -0
- data/lib/graphql/schema/addition.rb +245 -0
- data/lib/graphql/schema/argument.rb +286 -31
- 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 +334 -220
- data/lib/graphql/schema/built_in_types.rb +5 -5
- 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/one_of.rb +12 -0
- data/lib/graphql/schema/directive/skip.rb +2 -2
- data/lib/graphql/schema/directive/transform.rb +14 -2
- data/lib/graphql/schema/directive.rb +117 -14
- data/lib/graphql/schema/enum.rb +113 -22
- data/lib/graphql/schema/enum_value.rb +16 -21
- data/lib/graphql/schema/field/connection_extension.rb +50 -20
- data/lib/graphql/schema/field/scope_extension.rb +1 -1
- data/lib/graphql/schema/field.rb +491 -329
- 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 +182 -60
- data/lib/graphql/schema/interface.rb +28 -43
- data/lib/graphql/schema/introspection_system.rb +101 -38
- data/lib/graphql/schema/late_bound_type.rb +7 -2
- data/lib/graphql/schema/list.rb +61 -3
- data/lib/graphql/schema/loader.rb +144 -102
- data/lib/graphql/schema/member/base_dsl_methods.rb +33 -32
- data/lib/graphql/schema/member/build_type.rb +24 -15
- data/lib/graphql/schema/member/has_arguments.rb +261 -24
- 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 +113 -0
- data/lib/graphql/schema/member/has_fields.rb +99 -34
- data/lib/graphql/schema/member/has_interfaces.rb +88 -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/relay_shortcuts.rb +28 -2
- 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 -6
- data/lib/graphql/schema/mutation.rb +4 -9
- data/lib/graphql/schema/non_null.rb +34 -4
- data/lib/graphql/schema/object.rb +38 -60
- data/lib/graphql/schema/printer.rb +16 -35
- data/lib/graphql/schema/relay_classic_mutation.rb +90 -43
- data/lib/graphql/schema/resolver/has_payload_type.rb +46 -6
- data/lib/graphql/schema/resolver.rb +146 -93
- data/lib/graphql/schema/scalar.rb +40 -15
- data/lib/graphql/schema/subscription.rb +55 -26
- data/lib/graphql/schema/timeout.rb +29 -15
- data/lib/graphql/schema/type_expression.rb +21 -13
- data/lib/graphql/schema/type_membership.rb +22 -5
- data/lib/graphql/schema/union.rb +48 -14
- data/lib/graphql/schema/unique_within_type.rb +1 -2
- 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 +187 -33
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +773 -892
- data/lib/graphql/static_validation/all_rules.rb +3 -0
- data/lib/graphql/static_validation/base_visitor.rb +21 -31
- data/lib/graphql/static_validation/definition_dependencies.rb +7 -2
- data/lib/graphql/static_validation/error.rb +3 -1
- data/lib/graphql/static_validation/literal_validator.rb +55 -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 +12 -6
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +14 -14
- 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/one_of_input_objects_are_valid.rb +66 -0
- data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
- data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
- data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +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 +13 -7
- 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 +31 -19
- data/lib/graphql/static_validation.rb +1 -2
- data/lib/graphql/string_encoding_error.rb +13 -3
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +129 -22
- data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
- data/lib/graphql/subscriptions/event.rb +85 -31
- data/lib/graphql/subscriptions/instrumentation.rb +0 -47
- data/lib/graphql/subscriptions/serialize.rb +53 -6
- data/lib/graphql/subscriptions.rb +137 -57
- 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 +34 -2
- 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 +67 -38
- 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/statsd_tracing.rb +42 -0
- data/lib/graphql/tracing.rb +15 -36
- 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 +20 -9
- data/lib/graphql/types/iso_8601_date_time.rb +36 -10
- data/lib/graphql/types/relay/base_connection.rb +18 -90
- data/lib/graphql/types/relay/base_edge.rb +2 -34
- data/lib/graphql/types/relay/connection_behaviors.rb +158 -0
- data/lib/graphql/types/relay/default_relay.rb +27 -0
- data/lib/graphql/types/relay/edge_behaviors.rb +65 -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 +19 -0
- 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 -5
- data/lib/graphql/types/string.rb +8 -2
- data/lib/graphql/unauthorized_error.rb +2 -2
- data/lib/graphql/unresolved_type_error.rb +2 -2
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +41 -58
- data/readme.md +3 -6
- metadata +103 -237
- data/lib/graphql/analysis/analyze_query.rb +0 -91
- data/lib/graphql/analysis/field_usage.rb +0 -45
- data/lib/graphql/analysis/max_query_complexity.rb +0 -26
- data/lib/graphql/analysis/max_query_depth.rb +0 -26
- data/lib/graphql/analysis/query_complexity.rb +0 -88
- data/lib/graphql/analysis/query_depth.rb +0 -43
- data/lib/graphql/analysis/reducer_state.rb +0 -48
- data/lib/graphql/argument.rb +0 -159
- data/lib/graphql/authorization.rb +0 -82
- data/lib/graphql/backwards_compatibility.rb +0 -60
- data/lib/graphql/base_type.rb +0 -226
- 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 -435
- data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
- data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -213
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -91
- data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
- data/lib/graphql/compatibility/query_parser_specification.rb +0 -264
- data/lib/graphql/compatibility/schema_parser_specification.rb +0 -680
- 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 -311
- 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 -42
- data/lib/graphql/directive/deprecated_directive.rb +0 -13
- data/lib/graphql/directive/include_directive.rb +0 -2
- data/lib/graphql/directive/skip_directive.rb +0 -2
- data/lib/graphql/directive.rb +0 -104
- data/lib/graphql/enum_type.rb +0 -193
- data/lib/graphql/execution/execute.rb +0 -326
- data/lib/graphql/execution/flatten.rb +0 -40
- data/lib/graphql/execution/instrumentation.rb +0 -92
- data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
- 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 -330
- data/lib/graphql/float_type.rb +0 -2
- data/lib/graphql/function.rb +0 -153
- data/lib/graphql/id_type.rb +0 -2
- data/lib/graphql/input_object_type.rb +0 -154
- data/lib/graphql/int_type.rb +0 -2
- data/lib/graphql/interface_type.rb +0 -86
- 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/list_type.rb +0 -80
- data/lib/graphql/literal_validation_error.rb +0 -6
- data/lib/graphql/non_null_type.rb +0 -81
- data/lib/graphql/object_type.rb +0 -141
- data/lib/graphql/query/arguments.rb +0 -187
- data/lib/graphql/query/arguments_cache.rb +0 -25
- data/lib/graphql/query/executor.rb +0 -53
- data/lib/graphql/query/literal_input.rb +0 -116
- 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 -39
- data/lib/graphql/relay/array_connection.rb +0 -85
- data/lib/graphql/relay/base_connection.rb +0 -172
- 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 -40
- data/lib/graphql/relay/edge.rb +0 -27
- data/lib/graphql/relay/edge_type.rb +0 -18
- data/lib/graphql/relay/edges_instrumentation.rb +0 -40
- data/lib/graphql/relay/global_id_resolve.rb +0 -18
- data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
- data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
- data/lib/graphql/relay/mutation/resolve.rb +0 -56
- data/lib/graphql/relay/mutation/result.rb +0 -38
- data/lib/graphql/relay/mutation.rb +0 -190
- data/lib/graphql/relay/node.rb +0 -36
- data/lib/graphql/relay/page_info.rb +0 -7
- data/lib/graphql/relay/relation_connection.rb +0 -190
- data/lib/graphql/relay/type_extensions.rb +0 -30
- data/lib/graphql/scalar_type.rb +0 -133
- 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 -15
- data/lib/graphql/schema/member/accepts_definition.rb +0 -152
- data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -26
- data/lib/graphql/schema/member/instrumentation.rb +0 -132
- data/lib/graphql/schema/middleware_chain.rb +0 -82
- data/lib/graphql/schema/possible_types.rb +0 -39
- data/lib/graphql/schema/rescue_middleware.rb +0 -60
- data/lib/graphql/schema/timeout_middleware.rb +0 -86
- data/lib/graphql/schema/traversal.rb +0 -228
- data/lib/graphql/schema/validation.rb +0 -303
- data/lib/graphql/static_validation/default_visitor.rb +0 -15
- data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
- data/lib/graphql/string_type.rb +0 -2
- data/lib/graphql/subscriptions/subscription_root.rb +0 -74
- data/lib/graphql/tracing/skylight_tracing.rb +0 -62
- 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/types/relay/node_field.rb +0 -43
- data/lib/graphql/types/relay/nodes_field.rb +0 -45
- data/lib/graphql/union_type.rb +0 -135
- data/lib/graphql/upgrader/member.rb +0 -936
- data/lib/graphql/upgrader/schema.rb +0 -37
@@ -1,190 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require "graphql/relay/mutation/instrumentation"
|
3
|
-
require "graphql/relay/mutation/resolve"
|
4
|
-
require "graphql/relay/mutation/result"
|
5
|
-
|
6
|
-
module GraphQL
|
7
|
-
module Relay
|
8
|
-
# Define a Relay mutation:
|
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
|
-
|
94
|
-
class Mutation
|
95
|
-
include GraphQL::Define::InstanceDefinable
|
96
|
-
accepts_definitions(
|
97
|
-
:name, :description, :resolve,
|
98
|
-
:return_type,
|
99
|
-
:return_interfaces,
|
100
|
-
input_field: GraphQL::Define::AssignArgument,
|
101
|
-
return_field: GraphQL::Define::AssignObjectField,
|
102
|
-
function: GraphQL::Define::AssignMutationFunction,
|
103
|
-
)
|
104
|
-
attr_accessor :name, :description, :fields, :arguments
|
105
|
-
attr_writer :return_type, :return_interfaces
|
106
|
-
|
107
|
-
ensure_defined(
|
108
|
-
:input_fields, :return_fields, :name, :description,
|
109
|
-
:fields, :arguments, :return_type,
|
110
|
-
:return_interfaces, :resolve=,
|
111
|
-
:field, :result_class, :input_type
|
112
|
-
)
|
113
|
-
# For backwards compat, but do we need this separate API?
|
114
|
-
alias :return_fields :fields
|
115
|
-
alias :input_fields :arguments
|
116
|
-
|
117
|
-
def initialize
|
118
|
-
@fields = {}
|
119
|
-
@arguments = {}
|
120
|
-
@has_generated_return_type = false
|
121
|
-
end
|
122
|
-
|
123
|
-
def has_generated_return_type?
|
124
|
-
# Trigger the generation of the return type, if it is dynamically generated:
|
125
|
-
return_type
|
126
|
-
@has_generated_return_type
|
127
|
-
end
|
128
|
-
|
129
|
-
def resolve=(new_resolve_proc)
|
130
|
-
@resolve_proc = new_resolve_proc
|
131
|
-
end
|
132
|
-
|
133
|
-
def field
|
134
|
-
@field ||= begin
|
135
|
-
relay_mutation = self
|
136
|
-
field_resolve_proc = @resolve_proc
|
137
|
-
GraphQL::Field.define do
|
138
|
-
type(relay_mutation.return_type)
|
139
|
-
description(relay_mutation.description)
|
140
|
-
argument :input, !relay_mutation.input_type
|
141
|
-
resolve(field_resolve_proc)
|
142
|
-
mutation(relay_mutation)
|
143
|
-
end
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
def return_interfaces
|
148
|
-
@return_interfaces ||= []
|
149
|
-
end
|
150
|
-
|
151
|
-
def return_type
|
152
|
-
@return_type ||= begin
|
153
|
-
@has_generated_return_type = true
|
154
|
-
relay_mutation = self
|
155
|
-
GraphQL::ObjectType.define do
|
156
|
-
name("#{relay_mutation.name}Payload")
|
157
|
-
description("Autogenerated return type of #{relay_mutation.name}")
|
158
|
-
field :clientMutationId, types.String, "A unique identifier for the client performing the mutation.", property: :client_mutation_id
|
159
|
-
interfaces relay_mutation.return_interfaces
|
160
|
-
relay_mutation.return_fields.each do |name, field_obj|
|
161
|
-
field name, field: field_obj
|
162
|
-
end
|
163
|
-
mutation(relay_mutation)
|
164
|
-
end
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
def input_type
|
169
|
-
@input_type ||= begin
|
170
|
-
relay_mutation = self
|
171
|
-
input_object_type = GraphQL::InputObjectType.define do
|
172
|
-
name("#{relay_mutation.name}Input")
|
173
|
-
description("Autogenerated input type of #{relay_mutation.name}")
|
174
|
-
input_field :clientMutationId, types.String, "A unique identifier for the client performing the mutation."
|
175
|
-
mutation(relay_mutation)
|
176
|
-
end
|
177
|
-
input_fields.each do |name, arg|
|
178
|
-
input_object_type.arguments[name] = arg
|
179
|
-
end
|
180
|
-
|
181
|
-
input_object_type
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
def result_class
|
186
|
-
@result_class ||= Result.define_subclass(self)
|
187
|
-
end
|
188
|
-
end
|
189
|
-
end
|
190
|
-
end
|
data/lib/graphql/relay/node.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Relay
|
4
|
-
# Helpers for working with Relay-specific Node objects.
|
5
|
-
module Node
|
6
|
-
# @return [GraphQL::Field] a field for finding objects by their global ID.
|
7
|
-
def self.field(**kwargs, &block)
|
8
|
-
# We have to define it fresh each time because
|
9
|
-
# its name will be modified and its description
|
10
|
-
# _may_ be modified.
|
11
|
-
field = GraphQL::Types::Relay::NodeField.graphql_definition
|
12
|
-
|
13
|
-
if kwargs.any? || block
|
14
|
-
field = field.redefine(**kwargs, &block)
|
15
|
-
end
|
16
|
-
|
17
|
-
field
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.plural_field(**kwargs, &block)
|
21
|
-
field = GraphQL::Types::Relay::NodesField.graphql_definition
|
22
|
-
|
23
|
-
if kwargs.any? || block
|
24
|
-
field = field.redefine(**kwargs, &block)
|
25
|
-
end
|
26
|
-
|
27
|
-
field
|
28
|
-
end
|
29
|
-
|
30
|
-
# @return [GraphQL::InterfaceType] The interface which all Relay types must implement
|
31
|
-
def self.interface
|
32
|
-
@interface ||= GraphQL::Types::Relay::Node.graphql_definition
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,190 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Relay
|
4
|
-
# A connection implementation to expose SQL collection objects.
|
5
|
-
# It works for:
|
6
|
-
# - `ActiveRecord::Relation`
|
7
|
-
# - `Sequel::Dataset`
|
8
|
-
class RelationConnection < BaseConnection
|
9
|
-
def cursor_from_node(item)
|
10
|
-
item_index = paged_nodes.index(item)
|
11
|
-
if item_index.nil?
|
12
|
-
raise("Can't generate cursor, item not found in connection: #{item}")
|
13
|
-
else
|
14
|
-
offset = item_index + 1 + ((paged_nodes_offset || 0) - (relation_offset(sliced_nodes) || 0))
|
15
|
-
|
16
|
-
if after
|
17
|
-
offset += offset_from_cursor(after)
|
18
|
-
elsif before
|
19
|
-
offset += offset_from_cursor(before) - 1 - sliced_nodes_count
|
20
|
-
end
|
21
|
-
|
22
|
-
encode(offset.to_s)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def has_next_page
|
27
|
-
if first
|
28
|
-
if defined?(ActiveRecord::Relation) && nodes.is_a?(ActiveRecord::Relation)
|
29
|
-
initial_offset = after ? offset_from_cursor(after) : 0
|
30
|
-
return paged_nodes.length >= first && nodes.offset(first + initial_offset).exists?
|
31
|
-
end
|
32
|
-
return paged_nodes.length >= first && sliced_nodes_count > first
|
33
|
-
end
|
34
|
-
if GraphQL::Relay::ConnectionType.bidirectional_pagination && last
|
35
|
-
return sliced_nodes_count >= last
|
36
|
-
end
|
37
|
-
false
|
38
|
-
end
|
39
|
-
|
40
|
-
def has_previous_page
|
41
|
-
if last
|
42
|
-
paged_nodes.length >= last && sliced_nodes_count > last
|
43
|
-
elsif GraphQL::Relay::ConnectionType.bidirectional_pagination && after
|
44
|
-
# We've already paginated through the collection a bit,
|
45
|
-
# there are nodes behind us
|
46
|
-
offset_from_cursor(after) > 0
|
47
|
-
else
|
48
|
-
false
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def first
|
53
|
-
return @first if defined? @first
|
54
|
-
|
55
|
-
@first = get_limited_arg(:first)
|
56
|
-
@first = max_page_size if @first && max_page_size && @first > max_page_size
|
57
|
-
@first
|
58
|
-
end
|
59
|
-
|
60
|
-
def last
|
61
|
-
return @last if defined? @last
|
62
|
-
|
63
|
-
@last = get_limited_arg(:last)
|
64
|
-
@last = max_page_size if @last && max_page_size && @last > max_page_size
|
65
|
-
@last
|
66
|
-
end
|
67
|
-
|
68
|
-
private
|
69
|
-
|
70
|
-
# apply first / last limit results
|
71
|
-
# @return [Array]
|
72
|
-
def paged_nodes
|
73
|
-
return @paged_nodes if defined? @paged_nodes
|
74
|
-
|
75
|
-
items = sliced_nodes
|
76
|
-
|
77
|
-
if first
|
78
|
-
if relation_limit(items).nil? || relation_limit(items) > first
|
79
|
-
items = items.limit(first)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
if last
|
84
|
-
if relation_limit(items)
|
85
|
-
if last <= relation_limit(items)
|
86
|
-
offset = (relation_offset(items) || 0) + (relation_limit(items) - last)
|
87
|
-
items = items.offset(offset).limit(last)
|
88
|
-
end
|
89
|
-
else
|
90
|
-
slice_count = relation_count(items)
|
91
|
-
offset = (relation_offset(items) || 0) + slice_count - [last, slice_count].min
|
92
|
-
items = items.offset(offset).limit(last)
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
if max_page_size && !first && !last
|
97
|
-
if relation_limit(items).nil? || relation_limit(items) > max_page_size
|
98
|
-
items = items.limit(max_page_size)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
# Store this here so we can convert the relation to an Array
|
103
|
-
# (this avoids an extra DB call on Sequel)
|
104
|
-
@paged_nodes_offset = relation_offset(items)
|
105
|
-
@paged_nodes = items.to_a
|
106
|
-
end
|
107
|
-
|
108
|
-
def paged_nodes_offset
|
109
|
-
paged_nodes && @paged_nodes_offset
|
110
|
-
end
|
111
|
-
|
112
|
-
def relation_offset(relation)
|
113
|
-
if relation.respond_to?(:offset_value)
|
114
|
-
relation.offset_value
|
115
|
-
else
|
116
|
-
relation.opts[:offset]
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
def relation_limit(relation)
|
121
|
-
if relation.respond_to?(:limit_value)
|
122
|
-
relation.limit_value
|
123
|
-
else
|
124
|
-
relation.opts[:limit]
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
# If a relation contains a `.group` clause, a `.count` will return a Hash.
|
129
|
-
def relation_count(relation)
|
130
|
-
count_or_hash = if(defined?(ActiveRecord::Relation) && relation.is_a?(ActiveRecord::Relation))
|
131
|
-
relation.respond_to?(:unscope)? relation.unscope(:order).count(:all) : relation.count(:all)
|
132
|
-
else # eg, Sequel::Dataset, don't mess up others
|
133
|
-
relation.count
|
134
|
-
end
|
135
|
-
count_or_hash.is_a?(Integer) ? count_or_hash : count_or_hash.length
|
136
|
-
end
|
137
|
-
|
138
|
-
# Apply cursors to edges
|
139
|
-
def sliced_nodes
|
140
|
-
return @sliced_nodes if defined? @sliced_nodes
|
141
|
-
|
142
|
-
@sliced_nodes = nodes
|
143
|
-
|
144
|
-
if after
|
145
|
-
offset = (relation_offset(@sliced_nodes) || 0) + offset_from_cursor(after)
|
146
|
-
@sliced_nodes = @sliced_nodes.offset(offset)
|
147
|
-
end
|
148
|
-
|
149
|
-
if before && after
|
150
|
-
if offset_from_cursor(after) < offset_from_cursor(before)
|
151
|
-
@sliced_nodes = limit_nodes(@sliced_nodes, offset_from_cursor(before) - offset_from_cursor(after) - 1)
|
152
|
-
else
|
153
|
-
@sliced_nodes = limit_nodes(@sliced_nodes, 0)
|
154
|
-
end
|
155
|
-
|
156
|
-
elsif before
|
157
|
-
@sliced_nodes = limit_nodes(@sliced_nodes, offset_from_cursor(before) - 1)
|
158
|
-
end
|
159
|
-
|
160
|
-
@sliced_nodes
|
161
|
-
end
|
162
|
-
|
163
|
-
def limit_nodes(sliced_nodes, limit)
|
164
|
-
if limit > 0 || defined?(ActiveRecord::Relation) && sliced_nodes.is_a?(ActiveRecord::Relation)
|
165
|
-
sliced_nodes.limit(limit)
|
166
|
-
else
|
167
|
-
sliced_nodes.where(false)
|
168
|
-
end
|
169
|
-
end
|
170
|
-
|
171
|
-
def sliced_nodes_count
|
172
|
-
return @sliced_nodes_count if defined? @sliced_nodes_count
|
173
|
-
|
174
|
-
# If a relation contains a `.group` clause, a `.count` will return a Hash.
|
175
|
-
@sliced_nodes_count = relation_count(sliced_nodes)
|
176
|
-
end
|
177
|
-
|
178
|
-
def offset_from_cursor(cursor)
|
179
|
-
decode(cursor).to_i
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
if defined?(ActiveRecord::Relation)
|
184
|
-
BaseConnection.register_connection_implementation(ActiveRecord::Relation, RelationConnection)
|
185
|
-
end
|
186
|
-
if defined?(Sequel::Dataset)
|
187
|
-
BaseConnection.register_connection_implementation(Sequel::Dataset, RelationConnection)
|
188
|
-
end
|
189
|
-
end
|
190
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module Relay
|
4
|
-
# Mixin for Relay-related methods in type objects
|
5
|
-
# (used by BaseType and Schema::Member).
|
6
|
-
module TypeExtensions
|
7
|
-
# @return [GraphQL::ObjectType] The default connection type for this object type
|
8
|
-
def connection_type
|
9
|
-
@connection_type ||= define_connection
|
10
|
-
end
|
11
|
-
|
12
|
-
# Define a custom connection type for this object type
|
13
|
-
# @return [GraphQL::ObjectType]
|
14
|
-
def define_connection(**kwargs, &block)
|
15
|
-
GraphQL::Relay::ConnectionType.create_type(self, **kwargs, &block)
|
16
|
-
end
|
17
|
-
|
18
|
-
# @return [GraphQL::ObjectType] The default edge type for this object type
|
19
|
-
def edge_type
|
20
|
-
@edge_type ||= define_edge
|
21
|
-
end
|
22
|
-
|
23
|
-
# Define a custom edge type for this object type
|
24
|
-
# @return [GraphQL::ObjectType]
|
25
|
-
def define_edge(**kwargs, &block)
|
26
|
-
GraphQL::Relay::EdgeType.create_type(self, **kwargs, &block)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
data/lib/graphql/scalar_type.rb
DELETED
@@ -1,133 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
# # GraphQL::ScalarType
|
4
|
-
#
|
5
|
-
# Scalars are plain values. They are leaf nodes in a GraphQL query tree.
|
6
|
-
#
|
7
|
-
# ## Built-in Scalars
|
8
|
-
#
|
9
|
-
# `GraphQL` comes with standard built-in scalars:
|
10
|
-
#
|
11
|
-
# |Constant | `.define` helper|
|
12
|
-
# |-------|--------|
|
13
|
-
# |`GraphQL::STRING_TYPE` | `types.String`|
|
14
|
-
# |`GraphQL::INT_TYPE` | `types.Int`|
|
15
|
-
# |`GraphQL::FLOAT_TYPE` | `types.Float`|
|
16
|
-
# |`GraphQL::ID_TYPE` | `types.ID`|
|
17
|
-
# |`GraphQL::BOOLEAN_TYPE` | `types.Boolean`|
|
18
|
-
#
|
19
|
-
# (`types` is an instance of `GraphQL::Definition::TypeDefiner`; `.String`, `.Float`, etc are methods which return built-in scalars.)
|
20
|
-
#
|
21
|
-
# ## Custom Scalars
|
22
|
-
#
|
23
|
-
# You can define custom scalars for your GraphQL server. It requires some special functions:
|
24
|
-
#
|
25
|
-
# - `coerce_input` is used to prepare incoming values for GraphQL execution. (Incoming values come from variables or literal values in the query string.)
|
26
|
-
# - `coerce_result` is used to turn Ruby values _back_ into serializable values for query responses.
|
27
|
-
#
|
28
|
-
# @example defining a type for Time
|
29
|
-
# TimeType = GraphQL::ScalarType.define do
|
30
|
-
# name "Time"
|
31
|
-
# description "Time since epoch in seconds"
|
32
|
-
#
|
33
|
-
# coerce_input ->(value, ctx) { Time.at(Float(value)) }
|
34
|
-
# coerce_result ->(value, ctx) { value.to_f }
|
35
|
-
# end
|
36
|
-
#
|
37
|
-
#
|
38
|
-
# You can customize the error message for invalid input values by raising a `GraphQL::CoercionError` within `coerce_input`:
|
39
|
-
#
|
40
|
-
# @example raising a custom error message
|
41
|
-
# TimeType = GraphQL::ScalarType.define do
|
42
|
-
# name "Time"
|
43
|
-
# description "Time since epoch in seconds"
|
44
|
-
#
|
45
|
-
# coerce_input ->(value, ctx) do
|
46
|
-
# begin
|
47
|
-
# Time.at(Float(value))
|
48
|
-
# rescue ArgumentError
|
49
|
-
# raise GraphQL::CoercionError, "cannot coerce `#{value.inspect}` to Float"
|
50
|
-
# end
|
51
|
-
# end
|
52
|
-
#
|
53
|
-
# coerce_result ->(value, ctx) { value.to_f }
|
54
|
-
# end
|
55
|
-
#
|
56
|
-
# This will result in the message of the `GraphQL::CoercionError` being used in the error response:
|
57
|
-
#
|
58
|
-
# @example custom error response
|
59
|
-
# {"message"=>"cannot coerce `"2"` to Float", "locations"=>[{"line"=>3, "column"=>9}], "fields"=>["arg"]}
|
60
|
-
#
|
61
|
-
class ScalarType < GraphQL::BaseType
|
62
|
-
accepts_definitions :coerce, :coerce_input, :coerce_result
|
63
|
-
ensure_defined :coerce_non_null_input, :coerce_result
|
64
|
-
|
65
|
-
module NoOpCoerce
|
66
|
-
def self.call(val, ctx)
|
67
|
-
val
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
def initialize
|
72
|
-
super
|
73
|
-
self.coerce = NoOpCoerce
|
74
|
-
end
|
75
|
-
|
76
|
-
def coerce=(proc)
|
77
|
-
self.coerce_input = proc
|
78
|
-
self.coerce_result = proc
|
79
|
-
end
|
80
|
-
|
81
|
-
def coerce_input=(coerce_input_fn)
|
82
|
-
if !coerce_input_fn.nil?
|
83
|
-
@coerce_input_proc = ensure_two_arg(coerce_input_fn, :coerce_input)
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def coerce_result(value, ctx = nil)
|
88
|
-
if ctx.nil?
|
89
|
-
warn_deprecated_coerce("coerce_isolated_result")
|
90
|
-
ctx = GraphQL::Query::NullContext
|
91
|
-
end
|
92
|
-
@coerce_result_proc.call(value, ctx)
|
93
|
-
end
|
94
|
-
|
95
|
-
def coerce_result=(coerce_result_fn)
|
96
|
-
if !coerce_result_fn.nil?
|
97
|
-
@coerce_result_proc = ensure_two_arg(coerce_result_fn, :coerce_result)
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
def kind
|
102
|
-
GraphQL::TypeKinds::SCALAR
|
103
|
-
end
|
104
|
-
|
105
|
-
private
|
106
|
-
|
107
|
-
def ensure_two_arg(callable, method_name)
|
108
|
-
GraphQL::BackwardsCompatibility.wrap_arity(callable, from: 1, to: 2, name: "#{name}.#{method_name}(val, ctx)")
|
109
|
-
end
|
110
|
-
|
111
|
-
def coerce_non_null_input(value, ctx)
|
112
|
-
@coerce_input_proc.call(raw_coercion_input(value), ctx)
|
113
|
-
end
|
114
|
-
|
115
|
-
def raw_coercion_input(value)
|
116
|
-
if value.is_a?(GraphQL::Language::Nodes::InputObject)
|
117
|
-
value.to_h
|
118
|
-
elsif value.is_a?(Array)
|
119
|
-
value.map { |element| raw_coercion_input(element) }
|
120
|
-
else
|
121
|
-
value
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
def validate_non_null_input(value, ctx)
|
126
|
-
result = Query::InputValidationResult.new
|
127
|
-
if value.is_a?(GraphQL::Language::Nodes::Enum) || coerce_non_null_input(value, ctx).nil?
|
128
|
-
result.add_problem("Could not coerce value #{GraphQL::Language.serialize(value)} to #{name}")
|
129
|
-
end
|
130
|
-
result
|
131
|
-
end
|
132
|
-
end
|
133
|
-
end
|
@@ -1,35 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
class Schema
|
4
|
-
# In early GraphQL versions, errors would be "automatically"
|
5
|
-
# rescued and replaced with `"Internal error"`. That behavior
|
6
|
-
# was undesirable but this middleware is offered for people who
|
7
|
-
# want to preserve it.
|
8
|
-
#
|
9
|
-
# It has a couple of differences from the previous behavior:
|
10
|
-
#
|
11
|
-
# - Other parts of the query _will_ be run (previously,
|
12
|
-
# execution would stop when the error was raised and the result
|
13
|
-
# would have no `"data"` key at all)
|
14
|
-
# - The entry in {Query::Context#errors} is a {GraphQL::ExecutionError}, _not_
|
15
|
-
# the originally-raised error.
|
16
|
-
# - The entry in the `"errors"` key includes the location of the field
|
17
|
-
# which raised the errors.
|
18
|
-
#
|
19
|
-
# @example Use CatchallMiddleware with your schema
|
20
|
-
# # All errors will be suppressed and replaced with "Internal error" messages
|
21
|
-
# MySchema.middleware << GraphQL::Schema::CatchallMiddleware
|
22
|
-
#
|
23
|
-
module CatchallMiddleware
|
24
|
-
MESSAGE = "Internal error"
|
25
|
-
|
26
|
-
# Rescue any error and replace it with a {GraphQL::ExecutionError}
|
27
|
-
# whose message is {MESSAGE}
|
28
|
-
def self.call(parent_type, parent_object, field_definition, field_args, query_context)
|
29
|
-
yield
|
30
|
-
rescue StandardError
|
31
|
-
GraphQL::ExecutionError.new(MESSAGE)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
class Schema
|
4
|
-
module DefaultTypeError
|
5
|
-
def self.call(type_error, ctx)
|
6
|
-
case type_error
|
7
|
-
when GraphQL::InvalidNullError
|
8
|
-
ctx.errors << type_error
|
9
|
-
when GraphQL::UnresolvedTypeError, GraphQL::StringEncodingError, GraphQL::IntegerEncodingError
|
10
|
-
raise type_error
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|