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
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module GraphQL
|
|
3
|
+
class Schema
|
|
4
|
+
class Directive < GraphQL::Schema::Member
|
|
5
|
+
class Deprecated < GraphQL::Schema::Directive
|
|
6
|
+
description "Marks an element of a GraphQL schema as no longer supported."
|
|
7
|
+
locations(GraphQL::Schema::Directive::FIELD_DEFINITION, GraphQL::Schema::Directive::ENUM_VALUE, GraphQL::Schema::Directive::ARGUMENT_DEFINITION, GraphQL::Schema::Directive::INPUT_FIELD_DEFINITION)
|
|
8
|
+
|
|
9
|
+
reason_description = "Explains why this element was deprecated, usually also including a "\
|
|
10
|
+
"suggestion for how to access supported similar data. Formatted "\
|
|
11
|
+
"in [Markdown](https://daringfireball.net/projects/markdown/)."
|
|
12
|
+
|
|
13
|
+
argument :reason, String, reason_description, default_value: Directive::DEFAULT_DEPRECATION_REASON, required: false
|
|
14
|
+
default_directive true
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module GraphQL
|
|
3
|
+
class Schema
|
|
4
|
+
class Directive < GraphQL::Schema::Member
|
|
5
|
+
# This is _similar_ to {Directive::Feature}, except it's prescribed by the server, not the client.
|
|
6
|
+
#
|
|
7
|
+
# In this case, the server hides types and fields _entirely_, unless the current context has certain `:flags` present.
|
|
8
|
+
class Flagged < GraphQL::Schema::Directive
|
|
9
|
+
def initialize(target, **options)
|
|
10
|
+
if target.is_a?(Module) && !target.ancestors.include?(VisibleByFlag)
|
|
11
|
+
# This is type class of some kind, `include` will put this module
|
|
12
|
+
# in between the type class itself and its super class, so `super` will work fine
|
|
13
|
+
target.include(VisibleByFlag)
|
|
14
|
+
elsif !target.is_a?(VisibleByFlag)
|
|
15
|
+
# This is an instance of a base class. `include` won't put this in front of the
|
|
16
|
+
# base class implementation, so we need to `.prepend`.
|
|
17
|
+
# `#visible?` could probably be moved to a module and then this could use `include` instead.
|
|
18
|
+
target.class.prepend(VisibleByFlag)
|
|
19
|
+
end
|
|
20
|
+
super
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
description "Hides this part of the schema unless the named flag is present in context[:flags]"
|
|
24
|
+
|
|
25
|
+
locations(
|
|
26
|
+
GraphQL::Schema::Directive::FIELD_DEFINITION,
|
|
27
|
+
GraphQL::Schema::Directive::OBJECT,
|
|
28
|
+
GraphQL::Schema::Directive::SCALAR,
|
|
29
|
+
GraphQL::Schema::Directive::ENUM,
|
|
30
|
+
GraphQL::Schema::Directive::UNION,
|
|
31
|
+
GraphQL::Schema::Directive::INTERFACE,
|
|
32
|
+
GraphQL::Schema::Directive::INPUT_OBJECT,
|
|
33
|
+
GraphQL::Schema::Directive::ENUM_VALUE,
|
|
34
|
+
GraphQL::Schema::Directive::ARGUMENT_DEFINITION,
|
|
35
|
+
GraphQL::Schema::Directive::INPUT_FIELD_DEFINITION,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
argument :by, [String], "Flags to check for this schema member"
|
|
39
|
+
|
|
40
|
+
module VisibleByFlag
|
|
41
|
+
def self.included(schema_class)
|
|
42
|
+
schema_class.extend(self)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def visible?(context)
|
|
46
|
+
if dir = self.directives.find { |d| d.is_a?(Flagged) }
|
|
47
|
+
relevant_flags = (f = context[:flags]) && dir.arguments[:by] & f # rubocop:disable Development/ContextIsPassedCop -- definition-related
|
|
48
|
+
relevant_flags && relevant_flags.any? && super
|
|
49
|
+
else
|
|
50
|
+
super
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -11,12 +11,12 @@ module GraphQL
|
|
|
11
11
|
GraphQL::Schema::Directive::INLINE_FRAGMENT
|
|
12
12
|
)
|
|
13
13
|
|
|
14
|
-
argument :if, Boolean,
|
|
14
|
+
argument :if, Boolean,
|
|
15
15
|
description: "Included when true."
|
|
16
16
|
|
|
17
17
|
default_directive true
|
|
18
18
|
|
|
19
|
-
def self.
|
|
19
|
+
def self.static_include?(args, ctx)
|
|
20
20
|
!!args[:if]
|
|
21
21
|
end
|
|
22
22
|
end
|
|
@@ -11,12 +11,12 @@ module GraphQL
|
|
|
11
11
|
GraphQL::Schema::Directive::INLINE_FRAGMENT
|
|
12
12
|
)
|
|
13
13
|
|
|
14
|
-
argument :if, Boolean,
|
|
14
|
+
argument :if, Boolean,
|
|
15
15
|
description: "Skipped when true."
|
|
16
16
|
|
|
17
17
|
default_directive true
|
|
18
18
|
|
|
19
|
-
def self.
|
|
19
|
+
def self.static_include?(args, ctx)
|
|
20
20
|
!args[:if]
|
|
21
21
|
end
|
|
22
22
|
end
|
|
@@ -24,7 +24,7 @@ module GraphQL
|
|
|
24
24
|
GraphQL::Schema::Directive::FIELD,
|
|
25
25
|
)
|
|
26
26
|
|
|
27
|
-
argument :by, String,
|
|
27
|
+
argument :by, String,
|
|
28
28
|
description: "The name of the transform to run if applicable"
|
|
29
29
|
|
|
30
30
|
TRANSFORMS = [
|
|
@@ -39,7 +39,19 @@ module GraphQL
|
|
|
39
39
|
transform_name = arguments[:by]
|
|
40
40
|
if TRANSFORMS.include?(transform_name) && return_value.respond_to?(transform_name)
|
|
41
41
|
return_value = return_value.public_send(transform_name)
|
|
42
|
-
context.namespace(:interpreter)[:runtime].
|
|
42
|
+
response = context.namespace(:interpreter)[:runtime].final_result
|
|
43
|
+
*keys, last = path
|
|
44
|
+
keys.each do |key|
|
|
45
|
+
if response && (response = response[key])
|
|
46
|
+
next
|
|
47
|
+
else
|
|
48
|
+
break
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
if response
|
|
52
|
+
response[last] = return_value
|
|
53
|
+
end
|
|
54
|
+
nil
|
|
43
55
|
end
|
|
44
56
|
end
|
|
45
57
|
end
|
|
@@ -8,12 +8,21 @@ module GraphQL
|
|
|
8
8
|
# - {.resolve}: Wraps field resolution (so it should call `yield` to continue)
|
|
9
9
|
class Directive < GraphQL::Schema::Member
|
|
10
10
|
extend GraphQL::Schema::Member::HasArguments
|
|
11
|
+
extend GraphQL::Schema::Member::AcceptsDefinition
|
|
12
|
+
|
|
11
13
|
class << self
|
|
14
|
+
# Directives aren't types, they don't have kinds.
|
|
15
|
+
undef_method :kind
|
|
16
|
+
|
|
17
|
+
def path
|
|
18
|
+
"@#{super}"
|
|
19
|
+
end
|
|
20
|
+
|
|
12
21
|
# Return a name based on the class name,
|
|
13
22
|
# but downcase the first letter.
|
|
14
23
|
def default_graphql_name
|
|
15
24
|
@default_graphql_name ||= begin
|
|
16
|
-
camelized_name = super
|
|
25
|
+
camelized_name = super.dup
|
|
17
26
|
camelized_name[0] = camelized_name[0].downcase
|
|
18
27
|
camelized_name
|
|
19
28
|
end
|
|
@@ -21,6 +30,11 @@ module GraphQL
|
|
|
21
30
|
|
|
22
31
|
def locations(*new_locations)
|
|
23
32
|
if new_locations.any?
|
|
33
|
+
new_locations.each do |new_loc|
|
|
34
|
+
if !LOCATIONS.include?(new_loc.to_sym)
|
|
35
|
+
raise ArgumentError, "#{self} (#{self.graphql_name}) has an invalid directive location: `locations #{new_loc}` "
|
|
36
|
+
end
|
|
37
|
+
end
|
|
24
38
|
@locations = new_locations
|
|
25
39
|
else
|
|
26
40
|
@locations ||= (superclass.respond_to?(:locations) ? superclass.locations : [])
|
|
@@ -33,26 +47,41 @@ module GraphQL
|
|
|
33
47
|
elsif @default_directive.nil?
|
|
34
48
|
@default_directive = (superclass.respond_to?(:default_directive) ? superclass.default_directive : false)
|
|
35
49
|
else
|
|
36
|
-
|
|
50
|
+
!!@default_directive
|
|
37
51
|
end
|
|
38
52
|
end
|
|
39
53
|
|
|
54
|
+
def default_directive?
|
|
55
|
+
default_directive
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
prepend Schema::Member::CachedGraphQLDefinition::DeprecatedToGraphQL
|
|
59
|
+
|
|
40
60
|
def to_graphql
|
|
41
61
|
defn = GraphQL::Directive.new
|
|
42
62
|
defn.name = self.graphql_name
|
|
43
63
|
defn.description = self.description
|
|
44
64
|
defn.locations = self.locations
|
|
45
65
|
defn.default_directive = self.default_directive
|
|
66
|
+
defn.ast_node = ast_node
|
|
46
67
|
defn.metadata[:type_class] = self
|
|
47
|
-
|
|
48
|
-
arg_graphql = arg_defn.to_graphql
|
|
49
|
-
defn.arguments[arg_graphql.name] = arg_graphql
|
|
68
|
+
all_argument_definitions.each do |arg_defn|
|
|
69
|
+
arg_graphql = arg_defn.to_graphql(silence_deprecation_warning: true)
|
|
70
|
+
defn.arguments[arg_graphql.name] = arg_graphql # rubocop:disable Development/ContextIsPassedCop -- legacy-related
|
|
50
71
|
end
|
|
72
|
+
# Make a reference to a classic-style Arguments class
|
|
73
|
+
defn.arguments_class = GraphQL::Query::Arguments.construct_arguments_class(defn)
|
|
74
|
+
|
|
51
75
|
defn
|
|
52
76
|
end
|
|
53
77
|
|
|
54
78
|
# If false, this part of the query won't be evaluated
|
|
55
|
-
def include?(_object,
|
|
79
|
+
def include?(_object, arguments, context)
|
|
80
|
+
static_include?(arguments, context)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Determines whether {Execution::Lookahead} considers the field to be selected
|
|
84
|
+
def static_include?(_arguments, _context)
|
|
56
85
|
true
|
|
57
86
|
end
|
|
58
87
|
|
|
@@ -60,6 +89,52 @@ module GraphQL
|
|
|
60
89
|
def resolve(object, arguments, context)
|
|
61
90
|
yield
|
|
62
91
|
end
|
|
92
|
+
|
|
93
|
+
# Continuing is passed as a block, yield to continue.
|
|
94
|
+
def resolve_each(object, arguments, context)
|
|
95
|
+
yield
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def on_field?
|
|
99
|
+
locations.include?(FIELD)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def on_fragment?
|
|
103
|
+
locations.include?(FRAGMENT_SPREAD) && locations.include?(INLINE_FRAGMENT)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def on_operation?
|
|
107
|
+
locations.include?(QUERY) && locations.include?(MUTATION) && locations.include?(SUBSCRIPTION)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def repeatable?
|
|
111
|
+
!!@repeatable
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def repeatable(new_value)
|
|
115
|
+
@repeatable = new_value
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# @return [GraphQL::Schema::Field, GraphQL::Schema::Argument, Class, Module]
|
|
120
|
+
attr_reader :owner
|
|
121
|
+
|
|
122
|
+
# @return [GraphQL::Interpreter::Arguments]
|
|
123
|
+
attr_reader :arguments
|
|
124
|
+
|
|
125
|
+
def initialize(owner, **arguments)
|
|
126
|
+
@owner = owner
|
|
127
|
+
assert_valid_owner
|
|
128
|
+
# It's be nice if we had the real context here, but we don't. What we _would_ get is:
|
|
129
|
+
# - error handling
|
|
130
|
+
# - lazy resolution
|
|
131
|
+
# Probably, those won't be needed here, since these are configuration arguments,
|
|
132
|
+
# not runtime arguments.
|
|
133
|
+
@arguments = self.class.coerce_arguments(nil, arguments, Query::NullContext)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
def graphql_name
|
|
137
|
+
self.class.graphql_name
|
|
63
138
|
end
|
|
64
139
|
|
|
65
140
|
LOCATIONS = [
|
|
@@ -81,6 +156,7 @@ module GraphQL
|
|
|
81
156
|
ENUM_VALUE = :ENUM_VALUE,
|
|
82
157
|
INPUT_OBJECT = :INPUT_OBJECT,
|
|
83
158
|
INPUT_FIELD_DEFINITION = :INPUT_FIELD_DEFINITION,
|
|
159
|
+
VARIABLE_DEFINITION = :VARIABLE_DEFINITION,
|
|
84
160
|
]
|
|
85
161
|
|
|
86
162
|
DEFAULT_DEPRECATION_REASON = 'No longer supported'
|
|
@@ -103,7 +179,55 @@ module GraphQL
|
|
|
103
179
|
ENUM_VALUE: 'Location adjacent to an enum value definition.',
|
|
104
180
|
INPUT_OBJECT: 'Location adjacent to an input object type definition.',
|
|
105
181
|
INPUT_FIELD_DEFINITION: 'Location adjacent to an input object field definition.',
|
|
182
|
+
VARIABLE_DEFINITION: 'Location adjacent to a variable definition.',
|
|
106
183
|
}
|
|
184
|
+
|
|
185
|
+
private
|
|
186
|
+
|
|
187
|
+
def assert_valid_owner
|
|
188
|
+
case @owner
|
|
189
|
+
when Class
|
|
190
|
+
if @owner < GraphQL::Schema::Object
|
|
191
|
+
assert_has_location(OBJECT)
|
|
192
|
+
elsif @owner < GraphQL::Schema::Union
|
|
193
|
+
assert_has_location(UNION)
|
|
194
|
+
elsif @owner < GraphQL::Schema::Enum
|
|
195
|
+
assert_has_location(ENUM)
|
|
196
|
+
elsif @owner < GraphQL::Schema::InputObject
|
|
197
|
+
assert_has_location(INPUT_OBJECT)
|
|
198
|
+
elsif @owner < GraphQL::Schema::Scalar
|
|
199
|
+
assert_has_location(SCALAR)
|
|
200
|
+
elsif @owner < GraphQL::Schema
|
|
201
|
+
assert_has_location(SCHEMA)
|
|
202
|
+
else
|
|
203
|
+
raise "Unexpected directive owner class: #{@owner}"
|
|
204
|
+
end
|
|
205
|
+
when Module
|
|
206
|
+
assert_has_location(INTERFACE)
|
|
207
|
+
when GraphQL::Schema::Argument
|
|
208
|
+
if @owner.owner.is_a?(GraphQL::Schema::Field)
|
|
209
|
+
assert_has_location(ARGUMENT_DEFINITION)
|
|
210
|
+
else
|
|
211
|
+
assert_has_location(INPUT_FIELD_DEFINITION)
|
|
212
|
+
end
|
|
213
|
+
when GraphQL::Schema::Field
|
|
214
|
+
assert_has_location(FIELD_DEFINITION)
|
|
215
|
+
when GraphQL::Schema::EnumValue
|
|
216
|
+
assert_has_location(ENUM_VALUE)
|
|
217
|
+
else
|
|
218
|
+
raise "Unexpected directive owner: #{@owner.inspect}"
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def assert_has_location(location)
|
|
223
|
+
if !self.class.locations.include?(location)
|
|
224
|
+
raise ArgumentError, <<-MD
|
|
225
|
+
Directive `@#{self.class.graphql_name}` can't be attached to #{@owner.graphql_name} because #{location} isn't included in its locations (#{self.class.locations.join(", ")}).
|
|
226
|
+
|
|
227
|
+
Use `locations(#{location})` to update this directive's definition, or remove it from #{@owner.graphql_name}.
|
|
228
|
+
MD
|
|
229
|
+
end
|
|
230
|
+
end
|
|
107
231
|
end
|
|
108
232
|
end
|
|
109
233
|
end
|
data/lib/graphql/schema/enum.rb
CHANGED
|
@@ -21,11 +21,21 @@ module GraphQL
|
|
|
21
21
|
class Schema
|
|
22
22
|
class Enum < GraphQL::Schema::Member
|
|
23
23
|
extend GraphQL::Schema::Member::AcceptsDefinition
|
|
24
|
+
extend GraphQL::Schema::Member::ValidatesInput
|
|
24
25
|
|
|
25
|
-
class
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
class UnresolvedValueError < GraphQL::EnumType::UnresolvedValueError
|
|
27
|
+
def initialize(value:, enum:, context:)
|
|
28
|
+
fix_message = ", but this isn't a valid value for `#{enum.graphql_name}`. Update the field or resolver to return one of `#{enum.graphql_name}`'s values instead."
|
|
29
|
+
message = if (cp = context[:current_path]) && (cf = context[:current_field])
|
|
30
|
+
"`#{cf.path}` returned `#{value.inspect}` at `#{cp.join(".")}`#{fix_message}"
|
|
31
|
+
else
|
|
32
|
+
"`#{value.inspect}` was returned for `#{enum.graphql_name}`#{fix_message}"
|
|
33
|
+
end
|
|
34
|
+
super(message)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
28
37
|
|
|
38
|
+
class << self
|
|
29
39
|
# Define a value for this enum
|
|
30
40
|
# @param graphql_name [String, Symbol] the GraphQL value for this, usually `SCREAMING_CASE`
|
|
31
41
|
# @param description [String], the GraphQL description for this value, present in documentation
|
|
@@ -36,25 +46,79 @@ module GraphQL
|
|
|
36
46
|
def value(*args, **kwargs, &block)
|
|
37
47
|
kwargs[:owner] = self
|
|
38
48
|
value = enum_value_class.new(*args, **kwargs, &block)
|
|
39
|
-
|
|
40
|
-
|
|
49
|
+
key = value.graphql_name
|
|
50
|
+
prev_value = own_values[key]
|
|
51
|
+
case prev_value
|
|
52
|
+
when nil
|
|
53
|
+
own_values[key] = value
|
|
54
|
+
when GraphQL::Schema::EnumValue
|
|
55
|
+
own_values[key] = [prev_value, value]
|
|
56
|
+
when Array
|
|
57
|
+
prev_value << value
|
|
58
|
+
else
|
|
59
|
+
raise "Invariant: Unexpected enum value for #{key.inspect}: #{prev_value.inspect}"
|
|
60
|
+
end
|
|
61
|
+
value
|
|
41
62
|
end
|
|
42
63
|
|
|
43
|
-
# @return [
|
|
44
|
-
def
|
|
45
|
-
inherited_values = superclass
|
|
46
|
-
|
|
47
|
-
|
|
64
|
+
# @return [Array<GraphQL::Schema::EnumValue>] Possible values of this enum
|
|
65
|
+
def enum_values(context = GraphQL::Query::NullContext)
|
|
66
|
+
inherited_values = superclass.respond_to?(:enum_values) ? superclass.enum_values(context) : nil
|
|
67
|
+
visible_values = []
|
|
68
|
+
warden = Warden.from_context(context)
|
|
69
|
+
own_values.each do |key, values_entry|
|
|
70
|
+
if (v = Warden.visible_entry?(:visible_enum_value?, values_entry, context, warden))
|
|
71
|
+
visible_values << v
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
if inherited_values
|
|
76
|
+
# Local values take precedence over inherited ones
|
|
77
|
+
inherited_values.each do |i_val|
|
|
78
|
+
if !visible_values.any? { |v| v.graphql_name == i_val.graphql_name }
|
|
79
|
+
visible_values << i_val
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
visible_values
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# @return [Array<Schema::EnumValue>] An unfiltered list of all definitions
|
|
88
|
+
def all_enum_value_definitions
|
|
89
|
+
all_defns = if superclass.respond_to?(:all_enum_value_definitions)
|
|
90
|
+
superclass.all_enum_value_definitions
|
|
91
|
+
else
|
|
92
|
+
[]
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
@own_values && @own_values.each do |_key, value|
|
|
96
|
+
if value.is_a?(Array)
|
|
97
|
+
all_defns.concat(value)
|
|
98
|
+
else
|
|
99
|
+
all_defns << value
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
all_defns
|
|
48
104
|
end
|
|
49
105
|
|
|
106
|
+
# @return [Hash<String => GraphQL::Schema::EnumValue>] Possible values of this enum, keyed by name.
|
|
107
|
+
def values(context = GraphQL::Query::NullContext)
|
|
108
|
+
enum_values(context).each_with_object({}) { |val, obj| obj[val.graphql_name] = val }
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
prepend Schema::Member::CachedGraphQLDefinition::DeprecatedToGraphQL
|
|
112
|
+
|
|
50
113
|
# @return [GraphQL::EnumType]
|
|
51
114
|
def to_graphql
|
|
52
115
|
enum_type = GraphQL::EnumType.new
|
|
53
116
|
enum_type.name = graphql_name
|
|
54
117
|
enum_type.description = description
|
|
55
118
|
enum_type.introspection = introspection
|
|
119
|
+
enum_type.ast_node = ast_node
|
|
56
120
|
values.each do |name, val|
|
|
57
|
-
enum_type.add_value(val.
|
|
121
|
+
enum_type.add_value(val.deprecated_to_graphql)
|
|
58
122
|
end
|
|
59
123
|
enum_type.metadata[:type_class] = self
|
|
60
124
|
enum_type
|
|
@@ -64,14 +128,59 @@ module GraphQL
|
|
|
64
128
|
def enum_value_class(new_enum_value_class = nil)
|
|
65
129
|
if new_enum_value_class
|
|
66
130
|
@enum_value_class = new_enum_value_class
|
|
131
|
+
elsif defined?(@enum_value_class) && @enum_value_class
|
|
132
|
+
@enum_value_class
|
|
133
|
+
else
|
|
134
|
+
superclass <= GraphQL::Schema::Enum ? superclass.enum_value_class : nil
|
|
67
135
|
end
|
|
68
|
-
@enum_value_class || (superclass <= GraphQL::Schema::Enum ? superclass.enum_value_class : nil)
|
|
69
136
|
end
|
|
70
137
|
|
|
71
138
|
def kind
|
|
72
139
|
GraphQL::TypeKinds::ENUM
|
|
73
140
|
end
|
|
74
141
|
|
|
142
|
+
def validate_non_null_input(value_name, ctx, max_errors: nil)
|
|
143
|
+
result = GraphQL::Query::InputValidationResult.new
|
|
144
|
+
allowed_values = ctx.warden.enum_values(self)
|
|
145
|
+
matching_value = allowed_values.find { |v| v.graphql_name == value_name }
|
|
146
|
+
|
|
147
|
+
if matching_value.nil?
|
|
148
|
+
result.add_problem("Expected #{GraphQL::Language.serialize(value_name)} to be one of: #{allowed_values.map(&:graphql_name).join(', ')}")
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
result
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def coerce_result(value, ctx)
|
|
155
|
+
warden = ctx.warden
|
|
156
|
+
all_values = warden ? warden.enum_values(self) : values.each_value
|
|
157
|
+
enum_value = all_values.find { |val| val.value == value }
|
|
158
|
+
if enum_value
|
|
159
|
+
enum_value.graphql_name
|
|
160
|
+
else
|
|
161
|
+
raise self::UnresolvedValueError.new(enum: self, value: value, context: ctx)
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def coerce_input(value_name, ctx)
|
|
166
|
+
all_values = ctx.warden ? ctx.warden.enum_values(self) : values.each_value
|
|
167
|
+
|
|
168
|
+
if v = all_values.find { |val| val.graphql_name == value_name }
|
|
169
|
+
v.value
|
|
170
|
+
elsif v = all_values.find { |val| val.value == value_name }
|
|
171
|
+
# this is for matching default values, which are "inputs", but they're
|
|
172
|
+
# the Ruby value, not the GraphQL string.
|
|
173
|
+
v.value
|
|
174
|
+
else
|
|
175
|
+
nil
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
def inherited(child_class)
|
|
180
|
+
child_class.const_set(:UnresolvedValueError, Class.new(Schema::Enum::UnresolvedValueError))
|
|
181
|
+
super
|
|
182
|
+
end
|
|
183
|
+
|
|
75
184
|
private
|
|
76
185
|
|
|
77
186
|
def own_values
|
|
@@ -26,26 +26,36 @@ module GraphQL
|
|
|
26
26
|
# enum_value_class CustomEnumValue
|
|
27
27
|
# end
|
|
28
28
|
class EnumValue < GraphQL::Schema::Member
|
|
29
|
+
include GraphQL::Schema::Member::CachedGraphQLDefinition
|
|
29
30
|
include GraphQL::Schema::Member::AcceptsDefinition
|
|
30
31
|
include GraphQL::Schema::Member::HasPath
|
|
32
|
+
include GraphQL::Schema::Member::HasAstNode
|
|
33
|
+
include GraphQL::Schema::Member::HasDirectives
|
|
34
|
+
include GraphQL::Schema::Member::HasDeprecationReason
|
|
31
35
|
|
|
32
36
|
attr_reader :graphql_name
|
|
33
37
|
|
|
34
38
|
# @return [Class] The enum type that owns this value
|
|
35
39
|
attr_reader :owner
|
|
36
40
|
|
|
37
|
-
|
|
38
|
-
attr_accessor :deprecation_reason
|
|
39
|
-
|
|
40
|
-
def initialize(graphql_name, desc = nil, owner:, description: nil, value: nil, deprecation_reason: nil, &block)
|
|
41
|
+
def initialize(graphql_name, desc = nil, owner:, ast_node: nil, directives: nil, description: nil, value: nil, deprecation_reason: nil, &block)
|
|
41
42
|
@graphql_name = graphql_name.to_s
|
|
43
|
+
GraphQL::NameValidator.validate!(@graphql_name)
|
|
42
44
|
@description = desc || description
|
|
43
45
|
@value = value.nil? ? @graphql_name : value
|
|
44
|
-
|
|
46
|
+
if deprecation_reason
|
|
47
|
+
self.deprecation_reason = deprecation_reason
|
|
48
|
+
end
|
|
45
49
|
@owner = owner
|
|
50
|
+
@ast_node = ast_node
|
|
51
|
+
if directives
|
|
52
|
+
directives.each do |dir_class, dir_options|
|
|
53
|
+
directive(dir_class, **dir_options)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
46
56
|
|
|
47
57
|
if block_given?
|
|
48
|
-
|
|
58
|
+
instance_exec(self, &block)
|
|
49
59
|
end
|
|
50
60
|
end
|
|
51
61
|
|
|
@@ -63,17 +73,24 @@ module GraphQL
|
|
|
63
73
|
@value
|
|
64
74
|
end
|
|
65
75
|
|
|
76
|
+
prepend Schema::Member::CachedGraphQLDefinition::DeprecatedToGraphQL
|
|
77
|
+
|
|
66
78
|
# @return [GraphQL::EnumType::EnumValue] A runtime-ready object derived from this object
|
|
67
79
|
def to_graphql
|
|
68
80
|
enum_value = GraphQL::EnumType::EnumValue.new
|
|
69
81
|
enum_value.name = @graphql_name
|
|
70
82
|
enum_value.description = @description
|
|
71
83
|
enum_value.value = @value
|
|
72
|
-
enum_value.deprecation_reason =
|
|
84
|
+
enum_value.deprecation_reason = self.deprecation_reason
|
|
73
85
|
enum_value.metadata[:type_class] = self
|
|
86
|
+
enum_value.ast_node = ast_node
|
|
74
87
|
enum_value
|
|
75
88
|
end
|
|
76
89
|
|
|
90
|
+
def inspect
|
|
91
|
+
"#<#{self.class} #{path} @value=#{@value.inspect}#{description ? " @description=#{description.inspect}" : ""}>"
|
|
92
|
+
end
|
|
93
|
+
|
|
77
94
|
def visible?(_ctx); true; end
|
|
78
95
|
def accessible?(_ctx); true; end
|
|
79
96
|
def authorized?(_ctx); true; end
|
|
@@ -18,32 +18,58 @@ module GraphQL
|
|
|
18
18
|
next_args.delete(:last)
|
|
19
19
|
next_args.delete(:before)
|
|
20
20
|
next_args.delete(:after)
|
|
21
|
-
yield(object, next_args)
|
|
21
|
+
yield(object, next_args, arguments)
|
|
22
22
|
end
|
|
23
23
|
|
|
24
24
|
def after_resolve(value:, object:, arguments:, context:, memo:)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
25
|
+
original_arguments = memo
|
|
26
|
+
# rename some inputs to avoid conflicts inside the block
|
|
27
|
+
maybe_lazy = value
|
|
28
|
+
value = nil
|
|
29
|
+
context.schema.after_lazy(maybe_lazy) do |resolved_value|
|
|
30
|
+
value = resolved_value
|
|
31
|
+
if value.is_a? GraphQL::ExecutionError
|
|
32
|
+
# This isn't even going to work because context doesn't have ast_node anymore
|
|
33
|
+
context.add_error(value)
|
|
34
|
+
nil
|
|
35
|
+
elsif value.nil?
|
|
36
|
+
nil
|
|
37
|
+
elsif value.is_a?(GraphQL::Pagination::Connection)
|
|
38
|
+
# update the connection with some things that may not have been provided
|
|
39
|
+
value.context ||= context
|
|
40
|
+
value.parent ||= object.object
|
|
41
|
+
value.first_value ||= original_arguments[:first]
|
|
42
|
+
value.after_value ||= original_arguments[:after]
|
|
43
|
+
value.last_value ||= original_arguments[:last]
|
|
44
|
+
value.before_value ||= original_arguments[:before]
|
|
45
|
+
value.arguments ||= original_arguments # rubocop:disable Development/ContextIsPassedCop -- unrelated .arguments method
|
|
46
|
+
value.field ||= field
|
|
47
|
+
if field.has_max_page_size? && !value.has_max_page_size_override?
|
|
48
|
+
value.max_page_size = field.max_page_size
|
|
49
|
+
end
|
|
50
|
+
if context.schema.new_connections? && (custom_t = context.schema.connections.edge_class_for_field(@field))
|
|
51
|
+
value.edge_class = custom_t
|
|
52
|
+
end
|
|
53
|
+
value
|
|
54
|
+
elsif context.schema.new_connections?
|
|
55
|
+
context.namespace(:connections)[:all_wrappers] ||= context.schema.connections.all_wrappers
|
|
56
|
+
context.schema.connections.wrap(field, object.object, value, original_arguments, context)
|
|
57
|
+
else
|
|
58
|
+
if object.is_a?(GraphQL::Schema::Object)
|
|
59
|
+
object = object.object
|
|
60
|
+
end
|
|
61
|
+
connection_class = GraphQL::Relay::BaseConnection.connection_for_nodes(value)
|
|
62
|
+
connection_class.new(
|
|
63
|
+
value,
|
|
64
|
+
original_arguments,
|
|
65
|
+
field: field,
|
|
66
|
+
max_page_size: field.max_page_size,
|
|
67
|
+
parent: object,
|
|
68
|
+
context: context,
|
|
69
|
+
)
|
|
34
70
|
end
|
|
35
|
-
connection_class = GraphQL::Relay::BaseConnection.connection_for_nodes(value)
|
|
36
|
-
connection_class.new(
|
|
37
|
-
value,
|
|
38
|
-
arguments,
|
|
39
|
-
field: field,
|
|
40
|
-
max_page_size: field.max_page_size,
|
|
41
|
-
parent: object,
|
|
42
|
-
context: context,
|
|
43
|
-
)
|
|
44
71
|
end
|
|
45
72
|
end
|
|
46
|
-
|
|
47
73
|
end
|
|
48
74
|
end
|
|
49
75
|
end
|