graphql 2.6.11 → 2.6.13
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/.rdoc_options +4 -0
- data/lib/generators/graphql/core.rb +1 -0
- data/lib/generators/graphql/detailed_trace_generator.rb +1 -0
- data/lib/generators/graphql/enum_generator.rb +1 -0
- data/lib/generators/graphql/field_extractor.rb +1 -0
- data/lib/generators/graphql/input_generator.rb +1 -0
- data/lib/generators/graphql/install/mutation_root_generator.rb +1 -0
- data/lib/generators/graphql/install_generator.rb +1 -0
- data/lib/generators/graphql/interface_generator.rb +1 -0
- data/lib/generators/graphql/loader_generator.rb +8 -2
- data/lib/generators/graphql/mutation_create_generator.rb +8 -2
- data/lib/generators/graphql/mutation_delete_generator.rb +8 -2
- data/lib/generators/graphql/mutation_generator.rb +8 -2
- data/lib/generators/graphql/mutation_update_generator.rb +8 -2
- data/lib/generators/graphql/object_generator.rb +1 -0
- data/lib/generators/graphql/orm_mutations_base.rb +8 -2
- data/lib/generators/graphql/relay.rb +1 -0
- data/lib/generators/graphql/relay_generator.rb +1 -0
- data/lib/generators/graphql/scalar_generator.rb +1 -0
- data/lib/generators/graphql/type_generator.rb +38 -8
- data/lib/generators/graphql/union_generator.rb +1 -0
- data/lib/graphql/analysis/analyzer.rb +35 -9
- data/lib/graphql/analysis/field_usage.rb +1 -0
- data/lib/graphql/analysis/max_query_complexity.rb +2 -1
- data/lib/graphql/analysis/max_query_depth.rb +1 -0
- data/lib/graphql/analysis/query_complexity.rb +57 -20
- data/lib/graphql/analysis/query_depth.rb +17 -12
- data/lib/graphql/analysis/visitor.rb +79 -16
- data/lib/graphql/analysis.rb +23 -6
- data/lib/graphql/analysis_error.rb +1 -0
- data/lib/graphql/autoload.rb +30 -7
- data/lib/graphql/backtrace/table.rb +21 -5
- data/lib/graphql/backtrace/traced_error.rb +8 -3
- data/lib/graphql/backtrace.rb +14 -9
- data/lib/graphql/coercion_error.rb +1 -0
- data/lib/graphql/current.rb +44 -19
- data/lib/graphql/dashboard/application_controller.rb +1 -0
- data/lib/graphql/dashboard/detailed_traces.rb +1 -0
- data/lib/graphql/dashboard/installable.rb +1 -0
- data/lib/graphql/dashboard/landings_controller.rb +1 -0
- data/lib/graphql/dashboard/limiters.rb +1 -0
- data/lib/graphql/dashboard/operation_store.rb +1 -0
- data/lib/graphql/dashboard/statics_controller.rb +1 -0
- data/lib/graphql/dashboard/subscriptions.rb +1 -0
- data/lib/graphql/dashboard.rb +36 -22
- data/lib/graphql/dataloader/active_record_association_source.rb +1 -0
- data/lib/graphql/dataloader/active_record_source.rb +1 -0
- data/lib/graphql/dataloader/async_dataloader.rb +10 -7
- data/lib/graphql/dataloader/null_dataloader.rb +4 -3
- data/lib/graphql/dataloader/request.rb +8 -2
- data/lib/graphql/dataloader/request_all.rb +8 -2
- data/lib/graphql/dataloader/source.rb +127 -35
- data/lib/graphql/dataloader.rb +93 -42
- data/lib/graphql/date_encoding_error.rb +2 -1
- data/lib/graphql/dig.rb +12 -3
- data/lib/graphql/duration_encoding_error.rb +2 -1
- data/lib/graphql/execution/directive_checks.rb +8 -3
- data/lib/graphql/execution/errors.rb +20 -6
- data/lib/graphql/execution/field_resolve_step.rb +40 -13
- data/lib/graphql/execution/finalize.rb +12 -6
- data/lib/graphql/execution/input_values.rb +2 -1
- data/lib/graphql/execution/interpreter/argument_value.rb +17 -5
- data/lib/graphql/execution/interpreter/arguments.rb +24 -9
- data/lib/graphql/execution/interpreter/arguments_cache.rb +2 -1
- data/lib/graphql/execution/interpreter/execution_errors.rb +1 -0
- data/lib/graphql/execution/interpreter/handles_raw_value.rb +1 -0
- data/lib/graphql/execution/interpreter/resolve.rb +18 -8
- data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +4 -1
- data/lib/graphql/execution/interpreter/runtime.rb +72 -25
- data/lib/graphql/execution/interpreter.rb +15 -6
- data/lib/graphql/execution/lazy/lazy_method_map.rb +21 -8
- data/lib/graphql/execution/lazy.rb +34 -10
- data/lib/graphql/execution/load_argument_step.rb +1 -0
- data/lib/graphql/execution/lookahead.rb +137 -54
- data/lib/graphql/execution/multiplex.rb +4 -4
- data/lib/graphql/execution/next.rb +7 -0
- data/lib/graphql/execution/prepare_object_step.rb +1 -0
- data/lib/graphql/execution/resolve_type_step.rb +2 -1
- data/lib/graphql/execution/runner.rb +9 -3
- data/lib/graphql/execution/selections_step.rb +3 -2
- data/lib/graphql/execution.rb +2 -2
- data/lib/graphql/execution_error.rb +19 -10
- data/lib/graphql/float_decoding_error.rb +1 -0
- data/lib/graphql/float_encoding_error.rb +7 -2
- data/lib/graphql/integer_decoding_error.rb +2 -1
- data/lib/graphql/integer_encoding_error.rb +8 -3
- data/lib/graphql/introspection/base_object.rb +3 -1
- data/lib/graphql/introspection/directive_location_enum.rb +1 -0
- data/lib/graphql/introspection/directive_type.rb +1 -0
- data/lib/graphql/introspection/dynamic_fields.rb +1 -0
- data/lib/graphql/introspection/entry_points.rb +1 -0
- data/lib/graphql/introspection/enum_value_type.rb +1 -0
- data/lib/graphql/introspection/field_type.rb +1 -0
- data/lib/graphql/introspection/input_value_type.rb +1 -0
- data/lib/graphql/introspection/introspection_query.rb +1 -0
- data/lib/graphql/introspection/schema_type.rb +1 -0
- data/lib/graphql/introspection/type_kind_enum.rb +1 -0
- data/lib/graphql/introspection/type_type.rb +1 -0
- data/lib/graphql/introspection.rb +1 -0
- data/lib/graphql/invalid_name_error.rb +1 -0
- data/lib/graphql/invalid_null_error.rb +19 -6
- data/lib/graphql/language/block_string.rb +2 -1
- data/lib/graphql/language/cache.rb +10 -4
- data/lib/graphql/language/comment.rb +1 -0
- data/lib/graphql/language/definition_slice.rb +1 -0
- data/lib/graphql/language/document_from_schema_definition.rb +9 -10
- data/lib/graphql/language/generation.rb +23 -9
- data/lib/graphql/language/lexer.rb +5 -0
- data/lib/graphql/language/nodes.rb +2094 -419
- data/lib/graphql/language/parser.rb +24 -17
- data/lib/graphql/language/printer.rb +31 -16
- data/lib/graphql/language/sanitized_printer.rb +16 -5
- data/lib/graphql/language/static_visitor.rb +19 -4
- data/lib/graphql/language/visitor.rb +51 -29
- data/lib/graphql/language.rb +13 -7
- data/lib/graphql/load_application_object_failed_error.rb +14 -5
- data/lib/graphql/name_validator.rb +1 -0
- data/lib/graphql/pagination/active_record_relation_connection.rb +1 -0
- data/lib/graphql/pagination/array_connection.rb +20 -6
- data/lib/graphql/pagination/connection.rb +178 -48
- data/lib/graphql/pagination/connections.rb +21 -14
- data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -0
- data/lib/graphql/pagination/relation_connection.rb +123 -22
- data/lib/graphql/pagination/sequel_dataset_connection.rb +1 -0
- data/lib/graphql/pagination.rb +1 -0
- data/lib/graphql/parse_error.rb +1 -0
- data/lib/graphql/query/context/scoped_context.rb +2 -1
- data/lib/graphql/query/context.rb +106 -35
- data/lib/graphql/query/fingerprint.rb +15 -7
- data/lib/graphql/query/input_validation_result.rb +1 -0
- data/lib/graphql/query/null_context.rb +1 -0
- data/lib/graphql/query/partial.rb +28 -15
- data/lib/graphql/query/result.rb +15 -5
- data/lib/graphql/query/validation_pipeline.rb +16 -6
- data/lib/graphql/query/variable_validation_error.rb +1 -0
- data/lib/graphql/query/variables.rb +9 -2
- data/lib/graphql/query.rb +193 -49
- data/lib/graphql/railtie.rb +7 -3
- data/lib/graphql/rake_task/validate.rb +72 -17
- data/lib/graphql/rake_task.rb +55 -23
- data/lib/graphql/relay/range_add.rb +32 -21
- data/lib/graphql/relay.rb +1 -0
- data/lib/graphql/rubocop/graphql/base_cop.rb +1 -0
- data/lib/graphql/rubocop/graphql/default_null_true.rb +9 -6
- data/lib/graphql/rubocop/graphql/default_required_true.rb +9 -6
- data/lib/graphql/rubocop/graphql/field_type_in_block.rb +12 -8
- data/lib/graphql/rubocop/graphql/root_types_in_block.rb +9 -5
- data/lib/graphql/rubocop.rb +1 -0
- data/lib/graphql/runtime_error.rb +1 -0
- data/lib/graphql/runtime_type_error.rb +1 -0
- data/lib/graphql/schema/addition.rb +18 -6
- data/lib/graphql/schema/always_visible.rb +1 -0
- data/lib/graphql/schema/argument.rb +265 -42
- data/lib/graphql/schema/base_64_encoder.rb +2 -2
- data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -0
- data/lib/graphql/schema/build_from_definition/resolve_map.rb +2 -2
- data/lib/graphql/schema/build_from_definition.rb +94 -27
- data/lib/graphql/schema/built_in_types.rb +1 -0
- data/lib/graphql/schema/directive/deprecated.rb +1 -0
- data/lib/graphql/schema/directive/feature.rb +39 -22
- data/lib/graphql/schema/directive/flagged.rb +6 -1
- data/lib/graphql/schema/directive/include.rb +1 -0
- data/lib/graphql/schema/directive/one_of.rb +1 -0
- data/lib/graphql/schema/directive/skip.rb +1 -0
- data/lib/graphql/schema/directive/specified_by.rb +1 -0
- data/lib/graphql/schema/directive/transform.rb +17 -8
- data/lib/graphql/schema/directive.rb +12 -7
- data/lib/graphql/schema/enum.rb +99 -38
- data/lib/graphql/schema/enum_value.rb +21 -13
- data/lib/graphql/schema/field/connection_extension.rb +10 -2
- data/lib/graphql/schema/field/scope_extension.rb +1 -0
- data/lib/graphql/schema/field.rb +621 -109
- data/lib/graphql/schema/field_extension.rb +89 -34
- data/lib/graphql/schema/find_inherited_value.rb +5 -3
- data/lib/graphql/schema/finder.rb +22 -8
- data/lib/graphql/schema/has_single_input_argument.rb +39 -6
- data/lib/graphql/schema/input_object.rb +40 -13
- data/lib/graphql/schema/interface.rb +33 -17
- data/lib/graphql/schema/introspection_system.rb +7 -3
- data/lib/graphql/schema/late_bound_type.rb +2 -2
- data/lib/graphql/schema/list.rb +15 -4
- data/lib/graphql/schema/loader.rb +23 -12
- data/lib/graphql/schema/member/base_dsl_methods.rb +58 -12
- data/lib/graphql/schema/member/build_type.rb +16 -5
- data/lib/graphql/schema/member/graphql_type_names.rb +10 -6
- data/lib/graphql/schema/member/has_arguments.rb +115 -48
- data/lib/graphql/schema/member/has_ast_node.rb +1 -0
- data/lib/graphql/schema/member/has_authorization.rb +5 -0
- data/lib/graphql/schema/member/has_dataloader.rb +91 -34
- data/lib/graphql/schema/member/has_deprecation_reason.rb +15 -2
- data/lib/graphql/schema/member/has_directives.rb +38 -10
- data/lib/graphql/schema/member/has_fields.rb +151 -70
- data/lib/graphql/schema/member/has_interfaces.rb +10 -2
- data/lib/graphql/schema/member/has_path.rb +14 -5
- data/lib/graphql/schema/member/has_unresolved_type_error.rb +1 -0
- data/lib/graphql/schema/member/has_validators.rb +19 -4
- data/lib/graphql/schema/member/relay_shortcuts.rb +10 -2
- data/lib/graphql/schema/member/scoped.rb +14 -3
- data/lib/graphql/schema/member/type_system_helpers.rb +36 -6
- data/lib/graphql/schema/member/validates_input.rb +1 -0
- data/lib/graphql/schema/member.rb +9 -2
- data/lib/graphql/schema/mutation.rb +50 -46
- data/lib/graphql/schema/non_null.rb +21 -5
- data/lib/graphql/schema/object.rb +33 -12
- data/lib/graphql/schema/printer.rb +52 -31
- data/lib/graphql/schema/ractor_shareable.rb +6 -2
- data/lib/graphql/schema/relay_classic_mutation.rb +3 -3
- data/lib/graphql/schema/resolver/has_payload_type.rb +29 -7
- data/lib/graphql/schema/resolver.rb +156 -45
- data/lib/graphql/schema/scalar.rb +1 -0
- data/lib/graphql/schema/subscription.rb +67 -28
- data/lib/graphql/schema/timeout.rb +65 -25
- data/lib/graphql/schema/type_expression.rb +14 -5
- data/lib/graphql/schema/type_membership.rb +29 -10
- data/lib/graphql/schema/union.rb +4 -2
- data/lib/graphql/schema/unique_within_type.rb +24 -5
- data/lib/graphql/schema/validator/all_validator.rb +17 -9
- data/lib/graphql/schema/validator/allow_blank_validator.rb +8 -2
- data/lib/graphql/schema/validator/allow_null_validator.rb +8 -2
- data/lib/graphql/schema/validator/exclusion_validator.rb +14 -5
- data/lib/graphql/schema/validator/format_validator.rb +21 -10
- data/lib/graphql/schema/validator/inclusion_validator.rb +15 -6
- data/lib/graphql/schema/validator/length_validator.rb +23 -12
- data/lib/graphql/schema/validator/numericality_validator.rb +29 -16
- data/lib/graphql/schema/validator/required_validator.rb +45 -31
- data/lib/graphql/schema/validator.rb +89 -25
- data/lib/graphql/schema/visibility/migration.rb +14 -7
- data/lib/graphql/schema/visibility/profile.rb +65 -20
- data/lib/graphql/schema/visibility/visit.rb +12 -10
- data/lib/graphql/schema/visibility.rb +24 -20
- data/lib/graphql/schema/warden.rb +117 -31
- data/lib/graphql/schema/wrapper.rb +4 -1
- data/lib/graphql/schema.rb +1046 -300
- data/lib/graphql/static_validation/all_rules.rb +2 -1
- data/lib/graphql/static_validation/base_visitor.rb +59 -9
- data/lib/graphql/static_validation/definition_dependencies.rb +27 -7
- data/lib/graphql/static_validation/error.rb +3 -0
- data/lib/graphql/static_validation/interpreter_visitor.rb +1 -0
- data/lib/graphql/static_validation/literal_validator.rb +1 -0
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +4 -0
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +1 -0
- data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +3 -0
- data/lib/graphql/static_validation/rules/argument_names_are_unique_error.rb +1 -0
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +3 -0
- data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +1 -0
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +3 -0
- data/lib/graphql/static_validation/rules/directives_are_defined_error.rb +1 -0
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +3 -0
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations_error.rb +1 -0
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +3 -0
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type_error.rb +1 -0
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +9 -1
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections_error.rb +1 -0
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +295 -134
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +14 -2
- data/lib/graphql/static_validation/rules/fragment_names_are_unique.rb +3 -0
- data/lib/graphql/static_validation/rules/fragment_names_are_unique_error.rb +1 -0
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -0
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible_error.rb +1 -0
- data/lib/graphql/static_validation/rules/fragment_types_exist.rb +3 -0
- data/lib/graphql/static_validation/rules/fragment_types_exist_error.rb +1 -0
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +3 -0
- data/lib/graphql/static_validation/rules/fragments_are_finite_error.rb +1 -0
- data/lib/graphql/static_validation/rules/fragments_are_named.rb +3 -0
- data/lib/graphql/static_validation/rules/fragments_are_named_error.rb +1 -0
- data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +3 -0
- data/lib/graphql/static_validation/rules/fragments_are_on_composite_types_error.rb +1 -0
- data/lib/graphql/static_validation/rules/fragments_are_used.rb +3 -0
- data/lib/graphql/static_validation/rules/fragments_are_used_error.rb +1 -0
- data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +3 -0
- data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +1 -0
- data/lib/graphql/static_validation/rules/mutation_root_exists.rb +3 -0
- data/lib/graphql/static_validation/rules/mutation_root_exists_error.rb +1 -0
- data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +3 -0
- data/lib/graphql/static_validation/rules/no_definitions_are_present_error.rb +1 -0
- data/lib/graphql/static_validation/rules/not_single_subscription_error.rb +1 -0
- data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +4 -0
- data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +1 -0
- data/lib/graphql/static_validation/rules/operation_names_are_valid.rb +3 -0
- data/lib/graphql/static_validation/rules/operation_names_are_valid_error.rb +1 -0
- data/lib/graphql/static_validation/rules/query_root_exists.rb +3 -0
- data/lib/graphql/static_validation/rules/query_root_exists_error.rb +1 -0
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +4 -1
- data/lib/graphql/static_validation/rules/required_arguments_are_present_error.rb +1 -0
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +4 -0
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present_error.rb +1 -0
- data/lib/graphql/static_validation/rules/subscription_root_exists_and_single_subscription_selection.rb +43 -5
- data/lib/graphql/static_validation/rules/subscription_root_exists_error.rb +1 -0
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +3 -0
- data/lib/graphql/static_validation/rules/unique_directives_per_location_error.rb +1 -0
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +3 -0
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed_error.rb +1 -0
- data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +3 -0
- data/lib/graphql/static_validation/rules/variable_names_are_unique_error.rb +1 -0
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +207 -51
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed_error.rb +1 -0
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +3 -0
- data/lib/graphql/static_validation/rules/variables_are_input_types_error.rb +1 -0
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +6 -3
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined_error.rb +1 -0
- data/lib/graphql/static_validation/validation_context.rb +3 -2
- data/lib/graphql/static_validation/validation_timeout_error.rb +1 -0
- data/lib/graphql/static_validation/validator.rb +41 -16
- data/lib/graphql/static_validation.rb +1 -0
- data/lib/graphql/string_encoding_error.rb +1 -0
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +85 -65
- data/lib/graphql/subscriptions/broadcast_analyzer.rb +10 -4
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +1 -0
- data/lib/graphql/subscriptions/event.rb +25 -6
- data/lib/graphql/subscriptions/serialize.rb +58 -19
- data/lib/graphql/subscriptions.rb +172 -46
- data/lib/graphql/testing/helpers.rb +17 -4
- data/lib/graphql/testing/mock_action_cable.rb +55 -33
- data/lib/graphql/testing.rb +1 -0
- data/lib/graphql/tracing/active_support_notifications_trace.rb +17 -9
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +2 -1
- data/lib/graphql/tracing/appoptics_trace.rb +2 -1
- data/lib/graphql/tracing/appoptics_tracing.rb +2 -1
- data/lib/graphql/tracing/appsignal_trace.rb +16 -7
- data/lib/graphql/tracing/appsignal_tracing.rb +7 -3
- data/lib/graphql/tracing/call_legacy_tracers.rb +1 -0
- data/lib/graphql/tracing/data_dog_trace.rb +17 -6
- data/lib/graphql/tracing/data_dog_tracing.rb +10 -3
- data/lib/graphql/tracing/detailed_trace/active_record_backend.rb +1 -0
- data/lib/graphql/tracing/detailed_trace/memory_backend.rb +1 -0
- data/lib/graphql/tracing/detailed_trace/redis_backend.rb +1 -0
- data/lib/graphql/tracing/detailed_trace.rb +105 -42
- data/lib/graphql/tracing/legacy_hooks_trace.rb +5 -0
- data/lib/graphql/tracing/legacy_trace.rb +1 -0
- data/lib/graphql/tracing/monitor_trace.rb +17 -11
- data/lib/graphql/tracing/new_relic_trace.rb +17 -8
- data/lib/graphql/tracing/new_relic_tracing.rb +7 -3
- data/lib/graphql/tracing/notifications_trace.rb +11 -8
- data/lib/graphql/tracing/notifications_tracing.rb +23 -7
- data/lib/graphql/tracing/null_trace.rb +1 -0
- data/lib/graphql/tracing/perfetto_trace/trace_pb.rb +1 -0
- data/lib/graphql/tracing/perfetto_trace.rb +41 -19
- data/lib/graphql/tracing/platform_trace.rb +3 -1
- data/lib/graphql/tracing/platform_tracing.rb +16 -7
- data/lib/graphql/tracing/prometheus_trace/graphql_collector.rb +1 -0
- data/lib/graphql/tracing/prometheus_trace.rb +22 -13
- data/lib/graphql/tracing/prometheus_tracing.rb +1 -0
- data/lib/graphql/tracing/scout_trace.rb +10 -4
- data/lib/graphql/tracing/scout_tracing.rb +7 -3
- data/lib/graphql/tracing/sentry_trace.rb +12 -5
- data/lib/graphql/tracing/statsd_trace.rb +12 -6
- data/lib/graphql/tracing/statsd_tracing.rb +7 -1
- data/lib/graphql/tracing/trace.rb +231 -58
- data/lib/graphql/tracing.rb +25 -9
- data/lib/graphql/type_kinds.rb +2 -1
- data/lib/graphql/types/big_int.rb +1 -0
- data/lib/graphql/types/boolean.rb +1 -0
- data/lib/graphql/types/float.rb +1 -0
- data/lib/graphql/types/id.rb +1 -0
- data/lib/graphql/types/int.rb +2 -1
- data/lib/graphql/types/iso_8601_date.rb +21 -4
- data/lib/graphql/types/iso_8601_date_time.rb +33 -6
- data/lib/graphql/types/iso_8601_duration.rb +42 -9
- data/lib/graphql/types/json.rb +1 -0
- data/lib/graphql/types/relay/base_connection.rb +38 -32
- data/lib/graphql/types/relay/base_edge.rb +15 -9
- data/lib/graphql/types/relay/connection_behaviors.rb +19 -3
- data/lib/graphql/types/relay/edge_behaviors.rb +17 -4
- data/lib/graphql/types/relay/has_node_field.rb +6 -1
- data/lib/graphql/types/relay/has_nodes_field.rb +6 -1
- data/lib/graphql/types/relay/node.rb +1 -0
- data/lib/graphql/types/relay/node_behaviors.rb +5 -1
- data/lib/graphql/types/relay/page_info.rb +1 -0
- data/lib/graphql/types/relay/page_info_behaviors.rb +1 -0
- data/lib/graphql/types/relay.rb +4 -3
- data/lib/graphql/types/string.rb +1 -0
- data/lib/graphql/types.rb +1 -0
- data/lib/graphql/unauthorized_enum_value_error.rb +4 -1
- data/lib/graphql/unauthorized_error.rb +11 -4
- data/lib/graphql/unauthorized_field_error.rb +4 -1
- data/lib/graphql/unresolved_type_error.rb +16 -5
- data/lib/graphql/version.rb +2 -1
- data/lib/graphql.rb +37 -9
- data/readme.md +1 -1
- metadata +89 -5
- data/.yardopts +0 -5
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
# typed: true
|
|
2
3
|
|
|
3
4
|
module GraphQL
|
|
4
5
|
class Schema
|
|
@@ -13,37 +14,53 @@ module GraphQL
|
|
|
13
14
|
# Note that this will stop a query _in between_ field resolutions, but
|
|
14
15
|
# it doesn't interrupt long-running `resolve` functions. Be sure to use
|
|
15
16
|
# timeout options for external connections. For more info, see
|
|
16
|
-
# www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/
|
|
17
|
+
# https://www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/
|
|
17
18
|
#
|
|
18
|
-
#
|
|
19
|
-
# class MySchema < GraphQL::Schema
|
|
20
|
-
# use GraphQL::Schema::Timeout, max_seconds: 2
|
|
21
|
-
# end
|
|
19
|
+
# **Examples**
|
|
22
20
|
#
|
|
23
|
-
#
|
|
24
|
-
#
|
|
25
|
-
#
|
|
26
|
-
#
|
|
27
|
-
#
|
|
28
|
-
#
|
|
29
|
-
#
|
|
21
|
+
# **Example: Stop resolving fields after 2 seconds**
|
|
22
|
+
#
|
|
23
|
+
# ```ruby
|
|
24
|
+
# class MySchema < GraphQL::Schema
|
|
25
|
+
# use GraphQL::Schema::Timeout, max_seconds: 2
|
|
26
|
+
# end
|
|
27
|
+
# ```
|
|
30
28
|
#
|
|
31
|
-
#
|
|
32
|
-
#
|
|
29
|
+
# **Example: Notifying Bugsnag and logging a timeout**
|
|
30
|
+
#
|
|
31
|
+
# ```ruby
|
|
32
|
+
# class MyTimeout < GraphQL::Schema::Timeout
|
|
33
|
+
# def handle_timeout(error, query)
|
|
34
|
+
# Rails.logger.warn("GraphQL Timeout: #{error.message}: #{query.query_string}")
|
|
35
|
+
# Bugsnag.notify(error, {query_string: query.query_string})
|
|
33
36
|
# end
|
|
37
|
+
# end
|
|
34
38
|
#
|
|
39
|
+
# class MySchema < GraphQL::Schema
|
|
40
|
+
# use MyTimeout, max_seconds: 2
|
|
41
|
+
# end
|
|
42
|
+
# ```
|
|
35
43
|
class Timeout
|
|
36
44
|
def self.use(schema, max_seconds: nil)
|
|
37
45
|
timeout = self.new(max_seconds: max_seconds)
|
|
38
|
-
schema.trace_with(
|
|
46
|
+
schema.trace_with(const_get(:Trace), timeout: timeout)
|
|
39
47
|
end
|
|
40
48
|
|
|
41
49
|
def initialize(max_seconds:)
|
|
42
50
|
@max_seconds = max_seconds
|
|
43
51
|
end
|
|
44
52
|
|
|
53
|
+
#--
|
|
54
|
+
|
|
55
|
+
# @requires_ancestor: Kernel
|
|
56
|
+
|
|
45
57
|
module Trace
|
|
46
|
-
#
|
|
58
|
+
# **Parameters**
|
|
59
|
+
#
|
|
60
|
+
# - `max_seconds` (`Numeric`) — how many seconds the query should be allowed to resolve new fields
|
|
61
|
+
#
|
|
62
|
+
# :call-seq:
|
|
63
|
+
# initialize(timeout:, **rest)
|
|
47
64
|
def initialize(timeout:, **rest)
|
|
48
65
|
@timeout = timeout
|
|
49
66
|
super
|
|
@@ -97,34 +114,57 @@ module GraphQL
|
|
|
97
114
|
# Called at the start of each query.
|
|
98
115
|
# The default implementation returns the `max_seconds:` value from installing this plugin.
|
|
99
116
|
#
|
|
100
|
-
#
|
|
101
|
-
#
|
|
117
|
+
# **Parameters**
|
|
118
|
+
#
|
|
119
|
+
# - `query` (`GraphQL::Query`) — The query that's about to run
|
|
120
|
+
#
|
|
121
|
+
# **Returns**
|
|
122
|
+
#
|
|
123
|
+
# - `Numeric, false` — The number of seconds after which to interrupt query execution and call `handle_error`, or `false` to bypass the timeout.
|
|
124
|
+
#
|
|
125
|
+
# :call-seq:
|
|
126
|
+
# max_seconds(GraphQL::Query query) -> Numeric | false
|
|
102
127
|
def max_seconds(query)
|
|
103
128
|
@max_seconds
|
|
104
129
|
end
|
|
105
130
|
|
|
106
131
|
# Invoked when a query times out.
|
|
107
|
-
#
|
|
108
|
-
#
|
|
132
|
+
#
|
|
133
|
+
# **Parameters**
|
|
134
|
+
#
|
|
135
|
+
# - `error` (`GraphQL::Schema::Timeout::TimeoutError`)
|
|
136
|
+
# - `query` (`GraphQL::Error`)
|
|
137
|
+
#
|
|
138
|
+
# :call-seq:
|
|
139
|
+
# handle_timeout(GraphQL::Schema::Timeout::TimeoutError error, GraphQL::Error query)
|
|
109
140
|
def handle_timeout(error, query)
|
|
110
141
|
# override to do something interesting
|
|
111
142
|
end
|
|
112
143
|
|
|
113
|
-
# Call this method (eg, from
|
|
144
|
+
# Call this method (eg, from [handle timeout](rdoc-ref:#handle_timeout)) to disable timeout tracking
|
|
114
145
|
# for the given query.
|
|
115
|
-
#
|
|
116
|
-
#
|
|
146
|
+
#
|
|
147
|
+
# **Parameters**
|
|
148
|
+
#
|
|
149
|
+
# - `query` (`GraphQL::Query`)
|
|
150
|
+
#
|
|
151
|
+
# **Returns**
|
|
152
|
+
#
|
|
153
|
+
# - `void`
|
|
154
|
+
#
|
|
155
|
+
# :call-seq:
|
|
156
|
+
# disable_timeout(GraphQL::Query query) -> void
|
|
117
157
|
def disable_timeout(query)
|
|
118
158
|
query.context.namespace(self)[:state] = false
|
|
119
159
|
nil
|
|
120
160
|
end
|
|
121
161
|
|
|
122
162
|
# This error is raised when a query exceeds `max_seconds`.
|
|
123
|
-
# Since it's a child of
|
|
163
|
+
# Since it's a child of [GraphQL::ExecutionError](rdoc-ref:GraphQL::ExecutionError),
|
|
124
164
|
# its message will be added to the response's `errors` key.
|
|
125
165
|
#
|
|
126
166
|
# To raise an error that will stop query resolution, use a custom block
|
|
127
|
-
# to take this error and raise a new one which _doesn't_ descend from
|
|
167
|
+
# to take this error and raise a new one which _doesn't_ descend from [GraphQL::ExecutionError](rdoc-ref:GraphQL::ExecutionError),
|
|
128
168
|
# such as `RuntimeError`.
|
|
129
169
|
class TimeoutError < GraphQL::ExecutionError
|
|
130
170
|
def initialize(field)
|
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
# typed: true
|
|
2
3
|
module GraphQL
|
|
3
4
|
class Schema
|
|
4
|
-
#
|
|
5
|
-
module TypeExpression
|
|
5
|
+
module TypeExpression # :nodoc:
|
|
6
6
|
# Fetch a type from a type map by its AST specification.
|
|
7
7
|
# Return `nil` if not found.
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
#
|
|
8
|
+
#
|
|
9
|
+
# **Parameters**
|
|
10
|
+
#
|
|
11
|
+
# - `type_owner` (`#type`) — A thing for looking up types by name
|
|
12
|
+
# - `ast_node` (`GraphQL::Language::Nodes::AbstractNode`)
|
|
13
|
+
#
|
|
14
|
+
# **Returns**
|
|
15
|
+
#
|
|
16
|
+
# - `Class, GraphQL::Schema::NonNull, GraphQL::Schema:List`
|
|
17
|
+
#
|
|
18
|
+
# :call-seq:
|
|
19
|
+
# build_type(#type type_owner, GraphQL::Language::Nodes::AbstractNode ast_node) -> Class | GraphQL::Schema::NonNull | GraphQL::Schema:List
|
|
11
20
|
def self.build_type(type_owner, ast_node)
|
|
12
21
|
case ast_node
|
|
13
22
|
when GraphQL::Language::Nodes::TypeName
|
|
@@ -1,32 +1,49 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
# typed: true
|
|
2
3
|
|
|
3
4
|
module GraphQL
|
|
4
5
|
class Schema
|
|
5
6
|
# This class joins an object type to an abstract type (interface or union) of which
|
|
6
7
|
# it is a member.
|
|
7
8
|
class TypeMembership
|
|
8
|
-
#
|
|
9
|
+
# **Returns**
|
|
10
|
+
#
|
|
11
|
+
# - `Class<GraphQL::Schema::Object>`
|
|
9
12
|
attr_accessor :object_type
|
|
10
13
|
|
|
11
|
-
#
|
|
14
|
+
# **Returns**
|
|
15
|
+
#
|
|
16
|
+
# - `Class<GraphQL::Schema::Union>, Module<GraphQL::Schema::Interface>`
|
|
12
17
|
attr_reader :abstract_type
|
|
13
18
|
|
|
14
|
-
#
|
|
19
|
+
# **Returns**
|
|
20
|
+
#
|
|
21
|
+
# - `Hash`
|
|
15
22
|
attr_reader :options
|
|
16
23
|
|
|
17
|
-
# Called when an object is hooked up to an abstract type, such as
|
|
18
|
-
# or
|
|
24
|
+
# Called when an object is hooked up to an abstract type, such as [Schema::Union.possible_types](rdoc-ref:Schema::Union.possible_types)
|
|
25
|
+
# or `Schema::Object.implements` (for interfaces).
|
|
26
|
+
#
|
|
27
|
+
# **Parameters**
|
|
19
28
|
#
|
|
20
|
-
#
|
|
21
|
-
#
|
|
22
|
-
#
|
|
29
|
+
# - `abstract_type` (`Class<GraphQL::Schema::Union>, Module<GraphQL::Schema::Interface>`)
|
|
30
|
+
# - `object_type` (`Class<GraphQL::Schema::Object>`)
|
|
31
|
+
# - `options` (`Hash`) — Any options passed to `.possible_types` or `.implements`
|
|
32
|
+
#
|
|
33
|
+
# :call-seq:
|
|
34
|
+
# initialize(Class[GraphQL::Schema::Union] | Module[GraphQL::Schema::Interface] abstract_type, Class[GraphQL::Schema::Object] object_type, Hash **options)
|
|
23
35
|
def initialize(abstract_type, object_type, **options)
|
|
24
36
|
@abstract_type = abstract_type
|
|
25
37
|
@object_type = object_type
|
|
26
38
|
@options = options
|
|
27
39
|
end
|
|
28
40
|
|
|
29
|
-
#
|
|
41
|
+
# **Returns**
|
|
42
|
+
#
|
|
43
|
+
# - `Boolean` — if false, [object type](rdoc-ref:#object_type) will be treated as _not_ a member of [abstract type](rdoc-ref:#abstract_type)
|
|
44
|
+
#
|
|
45
|
+
# :call-seq:
|
|
46
|
+
# visible?(ctx) -> bool
|
|
30
47
|
def visible?(ctx)
|
|
31
48
|
warden = Warden.from_context(ctx)
|
|
32
49
|
(@object_type.respond_to?(:visible?) ? warden.visible_type?(@object_type, ctx) : true) &&
|
|
@@ -45,7 +62,9 @@ module GraphQL
|
|
|
45
62
|
"#<#{self.class} #{@object_type.inspect} => #{@abstract_type.inspect}>"
|
|
46
63
|
end
|
|
47
64
|
|
|
48
|
-
|
|
65
|
+
def type_class
|
|
66
|
+
self
|
|
67
|
+
end
|
|
49
68
|
end
|
|
50
69
|
end
|
|
51
70
|
end
|
data/lib/graphql/schema/union.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
# typed: true
|
|
2
3
|
module GraphQL
|
|
3
4
|
class Schema
|
|
4
5
|
class Union < GraphQL::Schema::Member
|
|
@@ -51,8 +52,7 @@ module GraphQL
|
|
|
51
52
|
# Update a type membership whose `.object_type` is a string or late-bound type
|
|
52
53
|
# so that the type membership's `.object_type` is the given `object_type`.
|
|
53
54
|
# (This is used for updating the union after the schema as lazily loaded the union member.)
|
|
54
|
-
#
|
|
55
|
-
def assign_type_membership_object_type(object_type)
|
|
55
|
+
def assign_type_membership_object_type(object_type) # :nodoc:
|
|
56
56
|
assert_valid_union_member(object_type)
|
|
57
57
|
type_memberships.each { |tm|
|
|
58
58
|
possible_type = tm.object_type
|
|
@@ -72,11 +72,13 @@ module GraphQL
|
|
|
72
72
|
def assert_valid_union_member(type_defn)
|
|
73
73
|
case type_defn
|
|
74
74
|
when Class
|
|
75
|
+
type_defn = type_defn #: as GraphQL::Schema::Member::type_definition
|
|
75
76
|
if !type_defn.kind.object?
|
|
76
77
|
raise ArgumentError, "Union possible_types can only be object types (not #{type_defn.kind.name}, #{type_defn.inspect})"
|
|
77
78
|
end
|
|
78
79
|
when Module
|
|
79
80
|
# it's an interface type, defined as a module
|
|
81
|
+
type_defn = type_defn #: as GraphQL::Schema::Member::type_definition
|
|
80
82
|
raise ArgumentError, "Union possible_types can only be object types (not interface types), remove #{type_defn.graphql_name} (#{type_defn.inspect})"
|
|
81
83
|
when String, GraphQL::Schema::LateBoundType
|
|
82
84
|
# Ok - assume it will get checked later
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
# typed: true
|
|
2
3
|
require "base64"
|
|
3
4
|
|
|
4
5
|
module GraphQL
|
|
5
6
|
class Schema
|
|
7
|
+
#--
|
|
8
|
+
# @requires_ancestor: Kernel
|
|
6
9
|
module UniqueWithinType
|
|
7
10
|
class << self
|
|
8
11
|
attr_accessor :default_id_separator
|
|
@@ -11,9 +14,17 @@ module GraphQL
|
|
|
11
14
|
|
|
12
15
|
module_function
|
|
13
16
|
|
|
14
|
-
#
|
|
15
|
-
#
|
|
16
|
-
#
|
|
17
|
+
# **Parameters**
|
|
18
|
+
#
|
|
19
|
+
# - `type_name` (`String`)
|
|
20
|
+
# - `object_value` (`Any`)
|
|
21
|
+
#
|
|
22
|
+
# **Returns**
|
|
23
|
+
#
|
|
24
|
+
# - `String` — a unique, opaque ID generated as a function of the two inputs
|
|
25
|
+
#
|
|
26
|
+
# :call-seq:
|
|
27
|
+
# encode(String type_name, Any object_value, separator:) -> String
|
|
17
28
|
def encode(type_name, object_value, separator: self.default_id_separator)
|
|
18
29
|
object_value_str = object_value.to_s
|
|
19
30
|
|
|
@@ -24,8 +35,16 @@ module GraphQL
|
|
|
24
35
|
Base64.strict_encode64([type_name, object_value_str].join(separator))
|
|
25
36
|
end
|
|
26
37
|
|
|
27
|
-
#
|
|
28
|
-
#
|
|
38
|
+
# **Parameters**
|
|
39
|
+
#
|
|
40
|
+
# - `node_id` (`String`) — A unique ID generated by [.encode](rdoc-ref:.encode)
|
|
41
|
+
#
|
|
42
|
+
# **Returns**
|
|
43
|
+
#
|
|
44
|
+
# - `Array<(String, String)>` — The type name & value passed to [.encode](rdoc-ref:.encode)
|
|
45
|
+
#
|
|
46
|
+
# :call-seq:
|
|
47
|
+
# decode(String node_id, separator:) -> Array[(String, String)]
|
|
29
48
|
def decode(node_id, separator: self.default_id_separator)
|
|
30
49
|
GraphQL::Schema::Base64Encoder.decode(node_id).split(separator, 2)
|
|
31
50
|
end
|
|
@@ -1,25 +1,33 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
# typed: true
|
|
2
3
|
|
|
3
4
|
module GraphQL
|
|
4
5
|
class Schema
|
|
5
6
|
class Validator
|
|
6
7
|
# Use this to validate each member of an array value.
|
|
7
8
|
#
|
|
8
|
-
#
|
|
9
|
+
# **Examples**
|
|
9
10
|
#
|
|
10
|
-
#
|
|
11
|
-
# validates: { all: { format: { with: /\A[a-z0-9_]+\Z/ } } }
|
|
11
|
+
# **Example: validate format of all strings in an array**
|
|
12
12
|
#
|
|
13
|
-
#
|
|
13
|
+
# ```ruby
|
|
14
|
+
# argument :handles, [String],
|
|
15
|
+
# validates: { all: { format: { with: /\A[a-z0-9_]+\Z/ } } }
|
|
16
|
+
# ```
|
|
14
17
|
#
|
|
15
|
-
#
|
|
16
|
-
# validates: { all: { format: { with: /\A[a-z0-9_]+\Z/ }, length: { maximum: 32 } } }
|
|
18
|
+
# **Example: multiple validators can be combined**
|
|
17
19
|
#
|
|
18
|
-
#
|
|
20
|
+
# ```ruby
|
|
21
|
+
# argument :handles, [String],
|
|
22
|
+
# validates: { all: { format: { with: /\A[a-z0-9_]+\Z/ }, length: { maximum: 32 } } }
|
|
23
|
+
# ```
|
|
19
24
|
#
|
|
20
|
-
#
|
|
21
|
-
# validates: { all: { inclusion: { in: 1..12 } } }
|
|
25
|
+
# **Example: any type can be used**
|
|
22
26
|
#
|
|
27
|
+
# ```ruby
|
|
28
|
+
# argument :choices, [Integer],
|
|
29
|
+
# validates: { all: { inclusion: { in: 1..12 } } }
|
|
30
|
+
# ```
|
|
23
31
|
class AllValidator < Validator
|
|
24
32
|
def initialize(validated:, allow_blank: false, allow_null: false, **validators)
|
|
25
33
|
super(validated: validated, allow_blank: allow_blank, allow_null: allow_null)
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
# typed: true
|
|
2
3
|
|
|
3
4
|
module GraphQL
|
|
4
5
|
class Schema
|
|
5
6
|
class Validator
|
|
6
7
|
# Use this to specifically reject values that respond to `.blank?` and respond truthy for that method.
|
|
7
8
|
#
|
|
8
|
-
#
|
|
9
|
-
#
|
|
9
|
+
# **Examples**
|
|
10
|
+
#
|
|
11
|
+
# **Example: Require a non-empty string for an argument**
|
|
12
|
+
#
|
|
13
|
+
# ```ruby
|
|
14
|
+
# argument :name, String, required: true, validate: { allow_blank: false }
|
|
15
|
+
# ```
|
|
10
16
|
class AllowBlankValidator < Validator
|
|
11
17
|
def initialize(allow_blank_positional = nil, allow_blank: nil, message: "%{validated} can't be blank", **default_options)
|
|
12
18
|
@message = message
|
|
@@ -1,12 +1,18 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
# typed: true
|
|
2
3
|
|
|
3
4
|
module GraphQL
|
|
4
5
|
class Schema
|
|
5
6
|
class Validator
|
|
6
7
|
# Use this to specifically reject or permit `nil` values (given as `null` from GraphQL).
|
|
7
8
|
#
|
|
8
|
-
#
|
|
9
|
-
#
|
|
9
|
+
# **Examples**
|
|
10
|
+
#
|
|
11
|
+
# **Example: require a non-null value for an argument if it is provided**
|
|
12
|
+
#
|
|
13
|
+
# ```ruby
|
|
14
|
+
# argument :name, String, required: false, validates: { allow_null: false }
|
|
15
|
+
# ```
|
|
10
16
|
class AllowNullValidator < Validator
|
|
11
17
|
MESSAGE = "%{validated} can't be null"
|
|
12
18
|
def initialize(allow_null_positional = nil, allow_null: nil, message: MESSAGE, **default_options)
|
|
@@ -1,18 +1,27 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
# typed: true
|
|
2
3
|
|
|
3
4
|
module GraphQL
|
|
4
5
|
class Schema
|
|
5
6
|
class Validator
|
|
6
7
|
# Use this to specifically reject values from an argument.
|
|
7
8
|
#
|
|
8
|
-
#
|
|
9
|
+
# **Examples**
|
|
9
10
|
#
|
|
10
|
-
#
|
|
11
|
-
# validates: { exclusion: { in: [2, 3, 5, 7, ... ]} }
|
|
11
|
+
# **Example: disallow certain values**
|
|
12
12
|
#
|
|
13
|
+
# ```ruby
|
|
14
|
+
# argument :favorite_non_prime, Integer, required: true,
|
|
15
|
+
# validates: { exclusion: { in: [2, 3, 5, 7, ... ]} }
|
|
16
|
+
# ```
|
|
13
17
|
class ExclusionValidator < Validator
|
|
14
|
-
#
|
|
15
|
-
#
|
|
18
|
+
# **Parameters**
|
|
19
|
+
#
|
|
20
|
+
# - `message` (`String`)
|
|
21
|
+
# - `in` (`Array`) — The values to reject
|
|
22
|
+
#
|
|
23
|
+
# :call-seq:
|
|
24
|
+
# initialize(String message:, Array in:, **default_options)
|
|
16
25
|
def initialize(message: "%{validated} is reserved", in:, **default_options)
|
|
17
26
|
# `in` is a reserved word, so work around that
|
|
18
27
|
@in_list = binding.local_variable_get(:in)
|
|
@@ -1,26 +1,37 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
# typed: true
|
|
2
3
|
|
|
3
4
|
module GraphQL
|
|
4
5
|
class Schema
|
|
5
6
|
class Validator
|
|
6
7
|
# Use this to assert that string values match (or don't match) the given RegExp.
|
|
7
8
|
#
|
|
8
|
-
#
|
|
9
|
+
# **Examples**
|
|
9
10
|
#
|
|
10
|
-
#
|
|
11
|
-
# validates: { format: { with: /\A[a-z0-9_]+\Z/ } }
|
|
11
|
+
# **Example: requiring input to match a pattern**
|
|
12
12
|
#
|
|
13
|
-
#
|
|
13
|
+
# ```ruby
|
|
14
|
+
# argument :handle, String, required: true,
|
|
15
|
+
# validates: { format: { with: /\A[a-z0-9_]+\Z/ } }
|
|
16
|
+
# ```
|
|
14
17
|
#
|
|
15
|
-
#
|
|
16
|
-
# validates: { format: { without: /\A[aeiou]/ } }
|
|
18
|
+
# **Example: reject inputs that match a pattern**
|
|
17
19
|
#
|
|
18
|
-
#
|
|
20
|
+
# ```ruby
|
|
21
|
+
# argument :word_that_doesnt_begin_with_a_vowel, String, required: true,
|
|
22
|
+
# validates: { format: { without: /\A[aeiou]/ } }
|
|
19
23
|
#
|
|
24
|
+
# # It's pretty hard to come up with a legitimate use case for `without:`
|
|
25
|
+
# ```
|
|
20
26
|
class FormatValidator < Validator
|
|
21
|
-
#
|
|
22
|
-
#
|
|
23
|
-
#
|
|
27
|
+
# **Parameters**
|
|
28
|
+
#
|
|
29
|
+
# - `with` (`RegExp, nil`)
|
|
30
|
+
# - `without` (`Regexp, nil`)
|
|
31
|
+
# - `message` (`String`)
|
|
32
|
+
#
|
|
33
|
+
# :call-seq:
|
|
34
|
+
# initialize(RegExp | nil with:, Regexp | nil without:, String message:, **default_options)
|
|
24
35
|
def initialize(
|
|
25
36
|
with: nil,
|
|
26
37
|
without: nil,
|
|
@@ -1,20 +1,29 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
# typed: true
|
|
2
3
|
|
|
3
4
|
module GraphQL
|
|
4
5
|
class Schema
|
|
5
6
|
class Validator
|
|
6
7
|
# You can use this to allow certain values for an argument.
|
|
7
8
|
#
|
|
8
|
-
# Usually, a
|
|
9
|
+
# Usually, a [GraphQL::Schema::Enum](rdoc-ref:GraphQL::Schema::Enum) is better for this, because it's self-documenting.
|
|
9
10
|
#
|
|
10
|
-
#
|
|
11
|
+
# **Examples**
|
|
11
12
|
#
|
|
12
|
-
#
|
|
13
|
-
# validates: { inclusion: { in: [2, 3, 5, 7, 11, ... ] } }
|
|
13
|
+
# **Example: only allow certain values for an argument**
|
|
14
14
|
#
|
|
15
|
+
# ```ruby
|
|
16
|
+
# argument :favorite_prime, Integer, required: true,
|
|
17
|
+
# validates: { inclusion: { in: [2, 3, 5, 7, 11, ... ] } }
|
|
18
|
+
# ```
|
|
15
19
|
class InclusionValidator < Validator
|
|
16
|
-
#
|
|
17
|
-
#
|
|
20
|
+
# **Parameters**
|
|
21
|
+
#
|
|
22
|
+
# - `message` (`String`)
|
|
23
|
+
# - `in` (`Array`) — The values to allow
|
|
24
|
+
#
|
|
25
|
+
# :call-seq:
|
|
26
|
+
# initialize(Array in:, String message:, **default_options)
|
|
18
27
|
def initialize(in:, message: "%{validated} is not included in the list", **default_options)
|
|
19
28
|
# `in` is a reserved word, so work around that
|
|
20
29
|
@in_list = binding.local_variable_get(:in)
|
|
@@ -1,27 +1,38 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
# typed: true
|
|
2
3
|
|
|
3
4
|
module GraphQL
|
|
4
5
|
class Schema
|
|
5
6
|
class Validator
|
|
6
7
|
# Use this to enforce a `.length` restriction on incoming values. It works for both Strings and Lists.
|
|
7
8
|
#
|
|
8
|
-
#
|
|
9
|
+
# **Examples**
|
|
9
10
|
#
|
|
10
|
-
#
|
|
11
|
+
# **Example: Allow no more than 10 IDs**
|
|
11
12
|
#
|
|
12
|
-
#
|
|
13
|
+
# ```ruby
|
|
14
|
+
# argument :ids, [ID], required: true, validates: { length: { maximum: 10 } }
|
|
15
|
+
# ```
|
|
13
16
|
#
|
|
14
|
-
#
|
|
17
|
+
# **Example: Require three selections**
|
|
15
18
|
#
|
|
19
|
+
# ```ruby
|
|
20
|
+
# argument :ice_cream_preferences, [ICE_CREAM_FLAVOR], required: true, validates: { length: { is: 3 } }
|
|
21
|
+
# ```
|
|
16
22
|
class LengthValidator < Validator
|
|
17
|
-
#
|
|
18
|
-
#
|
|
19
|
-
#
|
|
20
|
-
#
|
|
21
|
-
#
|
|
22
|
-
#
|
|
23
|
-
#
|
|
24
|
-
#
|
|
23
|
+
# **Parameters**
|
|
24
|
+
#
|
|
25
|
+
# - `maximum` (`Integer`)
|
|
26
|
+
# - `too_long` (`String`) — Used when `maximum` is exceeded or value is greater than `within`
|
|
27
|
+
# - `minimum` (`Integer`)
|
|
28
|
+
# - `too_short` (`String`) — Used with value is less than `minimum` or less than `within`
|
|
29
|
+
# - `is` (`Integer`) — Exact length requirement
|
|
30
|
+
# - `wrong_length` (`String`) — Used when value doesn't match `is`
|
|
31
|
+
# - `within` (`Range`) — An allowed range (becomes `minimum:` and `maximum:` under the hood)
|
|
32
|
+
# - `message` (`String`)
|
|
33
|
+
#
|
|
34
|
+
# :call-seq:
|
|
35
|
+
# initialize(Integer maximum:, String too_long:)
|
|
25
36
|
def initialize(
|
|
26
37
|
maximum: nil, too_long: "%{validated} is too long (maximum is %{count})",
|
|
27
38
|
minimum: nil, too_short: "%{validated} is too short (minimum is %{count})",
|
|
@@ -1,32 +1,45 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
# typed: true
|
|
2
3
|
module GraphQL
|
|
3
4
|
class Schema
|
|
4
5
|
class Validator
|
|
5
6
|
# Use this to assert numerical comparisons hold true for inputs.
|
|
6
7
|
#
|
|
7
|
-
#
|
|
8
|
+
# **Examples**
|
|
8
9
|
#
|
|
9
|
-
#
|
|
10
|
+
# **Example: Require a number between 0 and 1**
|
|
10
11
|
#
|
|
11
|
-
#
|
|
12
|
+
# ```ruby
|
|
13
|
+
# argument :batting_average, Float, required: true, validates: { numericality: { within: 0..1 } }
|
|
14
|
+
# ```
|
|
12
15
|
#
|
|
13
|
-
#
|
|
16
|
+
# **Example: Require the number 42**
|
|
14
17
|
#
|
|
15
|
-
#
|
|
18
|
+
# ```ruby
|
|
19
|
+
# argument :the_answer, Integer, required: true, validates: { numericality: { equal_to: 42 } }
|
|
20
|
+
# ```
|
|
16
21
|
#
|
|
17
|
-
#
|
|
22
|
+
# **Example: Require a real number**
|
|
18
23
|
#
|
|
24
|
+
# ```ruby
|
|
25
|
+
# argument :items_count, Integer, required: true, validates: { numericality: { greater_than_or_equal_to: 0 } }
|
|
26
|
+
# ```
|
|
19
27
|
class NumericalityValidator < Validator
|
|
20
|
-
#
|
|
21
|
-
#
|
|
22
|
-
#
|
|
23
|
-
#
|
|
24
|
-
#
|
|
25
|
-
#
|
|
26
|
-
#
|
|
27
|
-
#
|
|
28
|
-
#
|
|
29
|
-
#
|
|
28
|
+
# **Parameters**
|
|
29
|
+
#
|
|
30
|
+
# - `greater_than` (`Integer`)
|
|
31
|
+
# - `greater_than_or_equal_to` (`Integer`)
|
|
32
|
+
# - `less_than` (`Integer`)
|
|
33
|
+
# - `less_than_or_equal_to` (`Integer`)
|
|
34
|
+
# - `equal_to` (`Integer`)
|
|
35
|
+
# - `other_than` (`Integer`)
|
|
36
|
+
# - `odd` (`Boolean`)
|
|
37
|
+
# - `even` (`Boolean`)
|
|
38
|
+
# - `within` (`Range`)
|
|
39
|
+
# - `message` (`String`) — used for all validation failures
|
|
40
|
+
#
|
|
41
|
+
# :call-seq:
|
|
42
|
+
# initialize(Integer greater_than:, Integer greater_than_or_equal_to:, Integer less_than:, Integer less_than_or_equal_to:, Integer equal_to:, Integer other_than:, bool odd:, bool even:, Range within:, String message:, null_message:, **default_options)
|
|
30
43
|
def initialize(
|
|
31
44
|
greater_than: nil, greater_than_or_equal_to: nil,
|
|
32
45
|
less_than: nil, less_than_or_equal_to: nil,
|