graphql 1.9.17 → 2.0.21
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 +54 -38
- data/lib/graphql/analysis/ast.rb +16 -16
- 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/trace.rb +96 -0
- data/lib/graphql/backtrace/traced_error.rb +0 -1
- data/lib/graphql/backtrace/tracer.rb +39 -9
- data/lib/graphql/backtrace.rb +26 -18
- 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 +104 -0
- data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
- data/lib/graphql/execution/interpreter/resolve.rb +62 -24
- data/lib/graphql/execution/interpreter/runtime.rb +830 -417
- data/lib/graphql/execution/interpreter.rb +206 -74
- data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
- data/lib/graphql/execution/lazy.rb +11 -21
- data/lib/graphql/execution/lookahead.rb +65 -136
- data/lib/graphql/execution/multiplex.rb +6 -152
- data/lib/graphql/execution.rb +11 -4
- data/lib/graphql/filter.rb +8 -3
- 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 +12 -6
- 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 +12 -12
- 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 +136 -78
- data/lib/graphql/language/lexer.rb +216 -1462
- data/lib/graphql/language/nodes.rb +129 -132
- data/lib/graphql/language/parser.rb +994 -932
- data/lib/graphql/language/parser.y +152 -120
- 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 +192 -84
- data/lib/graphql/language.rb +3 -1
- data/lib/graphql/name_validator.rb +2 -7
- data/lib/graphql/pagination/active_record_relation_connection.rb +77 -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 +205 -203
- 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 +22 -9
- 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 +95 -43
- 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 +285 -36
- 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 +348 -205
- 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 +134 -15
- data/lib/graphql/schema/enum.rb +137 -39
- data/lib/graphql/schema/enum_value.rb +17 -23
- 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 +504 -331
- data/lib/graphql/schema/field_extension.rb +86 -2
- data/lib/graphql/schema/find_inherited_value.rb +12 -1
- data/lib/graphql/schema/finder.rb +16 -14
- data/lib/graphql/schema/input_object.rb +182 -60
- data/lib/graphql/schema/interface.rb +24 -49
- data/lib/graphql/schema/introspection_system.rb +103 -37
- data/lib/graphql/schema/late_bound_type.rb +9 -2
- data/lib/graphql/schema/list.rb +61 -3
- data/lib/graphql/schema/loader.rb +144 -96
- data/lib/graphql/schema/member/base_dsl_methods.rb +41 -37
- data/lib/graphql/schema/member/build_type.rb +24 -15
- data/lib/graphql/schema/member/has_arguments.rb +310 -26
- data/lib/graphql/schema/member/has_ast_node.rb +32 -0
- data/lib/graphql/schema/member/has_deprecation_reason.rb +24 -0
- data/lib/graphql/schema/member/has_directives.rb +118 -0
- data/lib/graphql/schema/member/has_fields.rb +166 -44
- data/lib/graphql/schema/member/has_interfaces.rb +129 -0
- data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
- data/lib/graphql/schema/member/has_validators.rb +57 -0
- data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
- data/lib/graphql/schema/member/type_system_helpers.rb +20 -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 +36 -60
- data/lib/graphql/schema/printer.rb +16 -35
- data/lib/graphql/schema/relay_classic_mutation.rb +91 -44
- data/lib/graphql/schema/resolver/has_payload_type.rb +51 -11
- data/lib/graphql/schema/resolver.rb +147 -94
- data/lib/graphql/schema/scalar.rb +40 -15
- data/lib/graphql/schema/subscription.rb +60 -31
- data/lib/graphql/schema/timeout.rb +45 -35
- data/lib/graphql/schema/type_expression.rb +21 -13
- data/lib/graphql/schema/type_membership.rb +23 -6
- data/lib/graphql/schema/union.rb +49 -15
- 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 +213 -35
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +857 -884
- 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 +69 -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 +15 -7
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +96 -53
- 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 +32 -20
- 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 +84 -35
- 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_trace.rb +16 -0
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
- data/lib/graphql/tracing/appoptics_trace.rb +231 -0
- data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
- data/lib/graphql/tracing/appsignal_trace.rb +77 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
- data/lib/graphql/tracing/data_dog_trace.rb +148 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +34 -2
- data/lib/graphql/tracing/legacy_trace.rb +65 -0
- data/lib/graphql/tracing/new_relic_trace.rb +75 -0
- data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
- data/lib/graphql/tracing/notifications_trace.rb +42 -0
- data/lib/graphql/tracing/notifications_tracing.rb +59 -0
- data/lib/graphql/tracing/platform_trace.rb +109 -0
- data/lib/graphql/tracing/platform_tracing.rb +76 -35
- data/lib/graphql/tracing/prometheus_trace.rb +89 -0
- data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +5 -2
- data/lib/graphql/tracing/prometheus_tracing.rb +11 -3
- data/lib/graphql/tracing/scout_trace.rb +72 -0
- data/lib/graphql/tracing/scout_tracing.rb +19 -0
- data/lib/graphql/tracing/statsd_trace.rb +56 -0
- data/lib/graphql/tracing/statsd_tracing.rb +42 -0
- data/lib/graphql/tracing/trace.rb +75 -0
- data/lib/graphql/tracing.rb +23 -67
- data/lib/graphql/type_kinds.rb +6 -3
- 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 +176 -0
- data/lib/graphql/types/relay/edge_behaviors.rb +75 -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 +25 -0
- data/lib/graphql/types/relay/page_info.rb +2 -14
- data/lib/graphql/types/relay/page_info_behaviors.rb +30 -0
- data/lib/graphql/types/relay.rb +10 -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 +63 -65
- data/readme.md +3 -6
- metadata +127 -236
- 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 -50
- data/lib/graphql/define/instance_definable.rb +0 -300
- 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/language/lexer.rl +0 -258
- 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 -66
- 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 -128
- data/lib/graphql/upgrader/member.rb +0 -936
- data/lib/graphql/upgrader/schema.rb +0 -37
@@ -2,11 +2,11 @@
|
|
2
2
|
module GraphQL
|
3
3
|
class Schema
|
4
4
|
BUILT_IN_TYPES = {
|
5
|
-
"Int" =>
|
6
|
-
"String" =>
|
7
|
-
"Float" =>
|
8
|
-
"Boolean" =>
|
9
|
-
"ID" =>
|
5
|
+
"Int" => GraphQL::Types::Int,
|
6
|
+
"String" => GraphQL::Types::String,
|
7
|
+
"Float" => GraphQL::Types::Float,
|
8
|
+
"Boolean" => GraphQL::Types::Boolean,
|
9
|
+
"ID" => GraphQL::Types::ID,
|
10
10
|
}
|
11
11
|
end
|
12
12
|
end
|
@@ -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
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
class Schema
|
4
|
+
class Directive < GraphQL::Schema::Member
|
5
|
+
class OneOf < GraphQL::Schema::Directive
|
6
|
+
description "Requires that exactly one field must be supplied and that field must not be `null`."
|
7
|
+
locations(GraphQL::Schema::Directive::INPUT_OBJECT)
|
8
|
+
default_directive true
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
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(:
|
42
|
+
response = context.namespace(:interpreter_runtime)[: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,13 +8,33 @@ 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::HasArguments::HasDirectiveArguments
|
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
|
+
|
21
|
+
# Return a name based on the class name,
|
22
|
+
# but downcase the first letter.
|
12
23
|
def default_graphql_name
|
13
|
-
|
24
|
+
@default_graphql_name ||= begin
|
25
|
+
camelized_name = super.dup
|
26
|
+
camelized_name[0] = camelized_name[0].downcase
|
27
|
+
-camelized_name
|
28
|
+
end
|
14
29
|
end
|
15
30
|
|
16
31
|
def locations(*new_locations)
|
17
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
|
18
38
|
@locations = new_locations
|
19
39
|
else
|
20
40
|
@locations ||= (superclass.respond_to?(:locations) ? superclass.locations : [])
|
@@ -27,26 +47,21 @@ module GraphQL
|
|
27
47
|
elsif @default_directive.nil?
|
28
48
|
@default_directive = (superclass.respond_to?(:default_directive) ? superclass.default_directive : false)
|
29
49
|
else
|
30
|
-
|
50
|
+
!!@default_directive
|
31
51
|
end
|
32
52
|
end
|
33
53
|
|
34
|
-
def
|
35
|
-
|
36
|
-
defn.name = self.graphql_name
|
37
|
-
defn.description = self.description
|
38
|
-
defn.locations = self.locations
|
39
|
-
defn.default_directive = self.default_directive
|
40
|
-
defn.metadata[:type_class] = self
|
41
|
-
arguments.each do |name, arg_defn|
|
42
|
-
arg_graphql = arg_defn.to_graphql
|
43
|
-
defn.arguments[arg_graphql.name] = arg_graphql
|
44
|
-
end
|
45
|
-
defn
|
54
|
+
def default_directive?
|
55
|
+
default_directive
|
46
56
|
end
|
47
57
|
|
48
58
|
# If false, this part of the query won't be evaluated
|
49
|
-
def include?(_object,
|
59
|
+
def include?(_object, arguments, context)
|
60
|
+
static_include?(arguments, context)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Determines whether {Execution::Lookahead} considers the field to be selected
|
64
|
+
def static_include?(_arguments, _context)
|
50
65
|
true
|
51
66
|
end
|
52
67
|
|
@@ -54,6 +69,61 @@ module GraphQL
|
|
54
69
|
def resolve(object, arguments, context)
|
55
70
|
yield
|
56
71
|
end
|
72
|
+
|
73
|
+
# Continuing is passed as a block, yield to continue.
|
74
|
+
def resolve_each(object, arguments, context)
|
75
|
+
yield
|
76
|
+
end
|
77
|
+
|
78
|
+
def on_field?
|
79
|
+
locations.include?(FIELD)
|
80
|
+
end
|
81
|
+
|
82
|
+
def on_fragment?
|
83
|
+
locations.include?(FRAGMENT_SPREAD) && locations.include?(INLINE_FRAGMENT)
|
84
|
+
end
|
85
|
+
|
86
|
+
def on_operation?
|
87
|
+
locations.include?(QUERY) && locations.include?(MUTATION) && locations.include?(SUBSCRIPTION)
|
88
|
+
end
|
89
|
+
|
90
|
+
def repeatable?
|
91
|
+
!!@repeatable
|
92
|
+
end
|
93
|
+
|
94
|
+
def repeatable(new_value)
|
95
|
+
@repeatable = new_value
|
96
|
+
end
|
97
|
+
|
98
|
+
private
|
99
|
+
|
100
|
+
def inherited(subclass)
|
101
|
+
super
|
102
|
+
subclass.class_eval do
|
103
|
+
@default_graphql_name ||= nil
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
# @return [GraphQL::Schema::Field, GraphQL::Schema::Argument, Class, Module]
|
109
|
+
attr_reader :owner
|
110
|
+
|
111
|
+
# @return [GraphQL::Interpreter::Arguments]
|
112
|
+
attr_reader :arguments
|
113
|
+
|
114
|
+
def initialize(owner, **arguments)
|
115
|
+
@owner = owner
|
116
|
+
assert_valid_owner
|
117
|
+
# It's be nice if we had the real context here, but we don't. What we _would_ get is:
|
118
|
+
# - error handling
|
119
|
+
# - lazy resolution
|
120
|
+
# Probably, those won't be needed here, since these are configuration arguments,
|
121
|
+
# not runtime arguments.
|
122
|
+
@arguments = self.class.coerce_arguments(nil, arguments, Query::NullContext)
|
123
|
+
end
|
124
|
+
|
125
|
+
def graphql_name
|
126
|
+
self.class.graphql_name
|
57
127
|
end
|
58
128
|
|
59
129
|
LOCATIONS = [
|
@@ -75,6 +145,7 @@ module GraphQL
|
|
75
145
|
ENUM_VALUE = :ENUM_VALUE,
|
76
146
|
INPUT_OBJECT = :INPUT_OBJECT,
|
77
147
|
INPUT_FIELD_DEFINITION = :INPUT_FIELD_DEFINITION,
|
148
|
+
VARIABLE_DEFINITION = :VARIABLE_DEFINITION,
|
78
149
|
]
|
79
150
|
|
80
151
|
DEFAULT_DEPRECATION_REASON = 'No longer supported'
|
@@ -97,7 +168,55 @@ module GraphQL
|
|
97
168
|
ENUM_VALUE: 'Location adjacent to an enum value definition.',
|
98
169
|
INPUT_OBJECT: 'Location adjacent to an input object type definition.',
|
99
170
|
INPUT_FIELD_DEFINITION: 'Location adjacent to an input object field definition.',
|
171
|
+
VARIABLE_DEFINITION: 'Location adjacent to a variable definition.',
|
100
172
|
}
|
173
|
+
|
174
|
+
private
|
175
|
+
|
176
|
+
def assert_valid_owner
|
177
|
+
case @owner
|
178
|
+
when Class
|
179
|
+
if @owner < GraphQL::Schema::Object
|
180
|
+
assert_has_location(OBJECT)
|
181
|
+
elsif @owner < GraphQL::Schema::Union
|
182
|
+
assert_has_location(UNION)
|
183
|
+
elsif @owner < GraphQL::Schema::Enum
|
184
|
+
assert_has_location(ENUM)
|
185
|
+
elsif @owner < GraphQL::Schema::InputObject
|
186
|
+
assert_has_location(INPUT_OBJECT)
|
187
|
+
elsif @owner < GraphQL::Schema::Scalar
|
188
|
+
assert_has_location(SCALAR)
|
189
|
+
elsif @owner < GraphQL::Schema
|
190
|
+
assert_has_location(SCHEMA)
|
191
|
+
else
|
192
|
+
raise "Unexpected directive owner class: #{@owner}"
|
193
|
+
end
|
194
|
+
when Module
|
195
|
+
assert_has_location(INTERFACE)
|
196
|
+
when GraphQL::Schema::Argument
|
197
|
+
if @owner.owner.is_a?(GraphQL::Schema::Field)
|
198
|
+
assert_has_location(ARGUMENT_DEFINITION)
|
199
|
+
else
|
200
|
+
assert_has_location(INPUT_FIELD_DEFINITION)
|
201
|
+
end
|
202
|
+
when GraphQL::Schema::Field
|
203
|
+
assert_has_location(FIELD_DEFINITION)
|
204
|
+
when GraphQL::Schema::EnumValue
|
205
|
+
assert_has_location(ENUM_VALUE)
|
206
|
+
else
|
207
|
+
raise "Unexpected directive owner: #{@owner.inspect}"
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
def assert_has_location(location)
|
212
|
+
if !self.class.locations.include?(location)
|
213
|
+
raise ArgumentError, <<-MD
|
214
|
+
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(", ")}).
|
215
|
+
|
216
|
+
Use `locations(#{location})` to update this directive's definition, or remove it from #{@owner.graphql_name}.
|
217
|
+
MD
|
218
|
+
end
|
219
|
+
end
|
101
220
|
end
|
102
221
|
end
|
103
222
|
end
|
data/lib/graphql/schema/enum.rb
CHANGED
@@ -1,31 +1,47 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module GraphQL
|
4
|
-
# Extend this class to define GraphQL enums in your schema.
|
5
|
-
#
|
6
|
-
# By default, GraphQL enum values are translated into Ruby strings.
|
7
|
-
# You can provide a custom value with the `value:` keyword.
|
8
|
-
#
|
9
|
-
# @example
|
10
|
-
# # equivalent to
|
11
|
-
# # enum PizzaTopping {
|
12
|
-
# # MUSHROOMS
|
13
|
-
# # ONIONS
|
14
|
-
# # PEPPERS
|
15
|
-
# # }
|
16
|
-
# class PizzaTopping < GraphQL::Enum
|
17
|
-
# value :MUSHROOMS
|
18
|
-
# value :ONIONS
|
19
|
-
# value :PEPPERS
|
20
|
-
# end
|
21
4
|
class Schema
|
5
|
+
# Extend this class to define GraphQL enums in your schema.
|
6
|
+
#
|
7
|
+
# By default, GraphQL enum values are translated into Ruby strings.
|
8
|
+
# You can provide a custom value with the `value:` keyword.
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
# # equivalent to
|
12
|
+
# # enum PizzaTopping {
|
13
|
+
# # MUSHROOMS
|
14
|
+
# # ONIONS
|
15
|
+
# # PEPPERS
|
16
|
+
# # }
|
17
|
+
# class PizzaTopping < GraphQL::Enum
|
18
|
+
# value :MUSHROOMS
|
19
|
+
# value :ONIONS
|
20
|
+
# value :PEPPERS
|
21
|
+
# end
|
22
22
|
class Enum < GraphQL::Schema::Member
|
23
|
-
extend GraphQL::Schema::Member::
|
23
|
+
extend GraphQL::Schema::Member::ValidatesInput
|
24
24
|
|
25
|
-
class
|
26
|
-
|
27
|
-
|
25
|
+
class UnresolvedValueError < GraphQL::Error
|
26
|
+
def initialize(value:, enum:, context:)
|
27
|
+
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."
|
28
|
+
message = if (cp = context[:current_path]) && (cf = context[:current_field])
|
29
|
+
"`#{cf.path}` returned `#{value.inspect}` at `#{cp.join(".")}`#{fix_message}"
|
30
|
+
else
|
31
|
+
"`#{value.inspect}` was returned for `#{enum.graphql_name}`#{fix_message}"
|
32
|
+
end
|
33
|
+
super(message)
|
34
|
+
end
|
35
|
+
end
|
28
36
|
|
37
|
+
class MissingValuesError < GraphQL::Error
|
38
|
+
def initialize(enum_type)
|
39
|
+
@enum_type = enum_type
|
40
|
+
super("Enum types require at least one value, but #{enum_type.graphql_name} didn't provide any for this query. Make sure at least one value is defined and visible for this query.")
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
class << self
|
29
45
|
# Define a value for this enum
|
30
46
|
# @param graphql_name [String, Symbol] the GraphQL value for this, usually `SCREAMING_CASE`
|
31
47
|
# @param description [String], the GraphQL description for this value, present in documentation
|
@@ -36,42 +52,124 @@ module GraphQL
|
|
36
52
|
def value(*args, **kwargs, &block)
|
37
53
|
kwargs[:owner] = self
|
38
54
|
value = enum_value_class.new(*args, **kwargs, &block)
|
39
|
-
|
40
|
-
|
55
|
+
key = value.graphql_name
|
56
|
+
prev_value = own_values[key]
|
57
|
+
case prev_value
|
58
|
+
when nil
|
59
|
+
own_values[key] = value
|
60
|
+
when GraphQL::Schema::EnumValue
|
61
|
+
own_values[key] = [prev_value, value]
|
62
|
+
when Array
|
63
|
+
prev_value << value
|
64
|
+
else
|
65
|
+
raise "Invariant: Unexpected enum value for #{key.inspect}: #{prev_value.inspect}"
|
66
|
+
end
|
67
|
+
value
|
41
68
|
end
|
42
69
|
|
43
|
-
# @return [
|
44
|
-
def
|
45
|
-
inherited_values = superclass
|
46
|
-
|
47
|
-
|
70
|
+
# @return [Array<GraphQL::Schema::EnumValue>] Possible values of this enum
|
71
|
+
def enum_values(context = GraphQL::Query::NullContext)
|
72
|
+
inherited_values = superclass.respond_to?(:enum_values) ? superclass.enum_values(context) : nil
|
73
|
+
visible_values = []
|
74
|
+
warden = Warden.from_context(context)
|
75
|
+
own_values.each do |key, values_entry|
|
76
|
+
if (v = Warden.visible_entry?(:visible_enum_value?, values_entry, context, warden))
|
77
|
+
visible_values << v
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
if inherited_values
|
82
|
+
# Local values take precedence over inherited ones
|
83
|
+
inherited_values.each do |i_val|
|
84
|
+
if !visible_values.any? { |v| v.graphql_name == i_val.graphql_name }
|
85
|
+
visible_values << i_val
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
visible_values
|
48
91
|
end
|
49
92
|
|
50
|
-
# @return [
|
51
|
-
def
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
93
|
+
# @return [Array<Schema::EnumValue>] An unfiltered list of all definitions
|
94
|
+
def all_enum_value_definitions
|
95
|
+
all_defns = if superclass.respond_to?(:all_enum_value_definitions)
|
96
|
+
superclass.all_enum_value_definitions
|
97
|
+
else
|
98
|
+
[]
|
99
|
+
end
|
100
|
+
|
101
|
+
@own_values && @own_values.each do |_key, value|
|
102
|
+
if value.is_a?(Array)
|
103
|
+
all_defns.concat(value)
|
104
|
+
else
|
105
|
+
all_defns << value
|
106
|
+
end
|
58
107
|
end
|
59
|
-
|
60
|
-
|
108
|
+
|
109
|
+
all_defns
|
110
|
+
end
|
111
|
+
|
112
|
+
# @return [Hash<String => GraphQL::Schema::EnumValue>] Possible values of this enum, keyed by name.
|
113
|
+
def values(context = GraphQL::Query::NullContext)
|
114
|
+
enum_values(context).each_with_object({}) { |val, obj| obj[val.graphql_name] = val }
|
61
115
|
end
|
62
116
|
|
63
117
|
# @return [Class] for handling `value(...)` inputs and building `GraphQL::Enum::EnumValue`s out of them
|
64
118
|
def enum_value_class(new_enum_value_class = nil)
|
65
119
|
if new_enum_value_class
|
66
120
|
@enum_value_class = new_enum_value_class
|
121
|
+
elsif defined?(@enum_value_class) && @enum_value_class
|
122
|
+
@enum_value_class
|
123
|
+
else
|
124
|
+
superclass <= GraphQL::Schema::Enum ? superclass.enum_value_class : nil
|
67
125
|
end
|
68
|
-
@enum_value_class || (superclass <= GraphQL::Schema::Enum ? superclass.enum_value_class : nil)
|
69
126
|
end
|
70
127
|
|
71
128
|
def kind
|
72
129
|
GraphQL::TypeKinds::ENUM
|
73
130
|
end
|
74
131
|
|
132
|
+
def validate_non_null_input(value_name, ctx, max_errors: nil)
|
133
|
+
allowed_values = ctx.warden.enum_values(self)
|
134
|
+
matching_value = allowed_values.find { |v| v.graphql_name == value_name }
|
135
|
+
|
136
|
+
if matching_value.nil?
|
137
|
+
GraphQL::Query::InputValidationResult.from_problem("Expected #{GraphQL::Language.serialize(value_name)} to be one of: #{allowed_values.map(&:graphql_name).join(', ')}")
|
138
|
+
else
|
139
|
+
nil
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def coerce_result(value, ctx)
|
144
|
+
warden = ctx.warden
|
145
|
+
all_values = warden ? warden.enum_values(self) : values.each_value
|
146
|
+
enum_value = all_values.find { |val| val.value == value }
|
147
|
+
if enum_value
|
148
|
+
enum_value.graphql_name
|
149
|
+
else
|
150
|
+
raise self::UnresolvedValueError.new(enum: self, value: value, context: ctx)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
def coerce_input(value_name, ctx)
|
155
|
+
all_values = ctx.warden ? ctx.warden.enum_values(self) : values.each_value
|
156
|
+
|
157
|
+
if v = all_values.find { |val| val.graphql_name == value_name }
|
158
|
+
v.value
|
159
|
+
elsif v = all_values.find { |val| val.value == value_name }
|
160
|
+
# this is for matching default values, which are "inputs", but they're
|
161
|
+
# the Ruby value, not the GraphQL string.
|
162
|
+
v.value
|
163
|
+
else
|
164
|
+
nil
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
def inherited(child_class)
|
169
|
+
child_class.const_set(:UnresolvedValueError, Class.new(Schema::Enum::UnresolvedValueError))
|
170
|
+
super
|
171
|
+
end
|
172
|
+
|
75
173
|
private
|
76
174
|
|
77
175
|
def own_values
|
@@ -13,12 +13,6 @@ module GraphQL
|
|
13
13
|
# # arguments to `value(...)` in Enum classes are passed here
|
14
14
|
# super
|
15
15
|
# end
|
16
|
-
#
|
17
|
-
# def to_graphql
|
18
|
-
# enum_value = super
|
19
|
-
# # customize the derived GraphQL::EnumValue here
|
20
|
-
# enum_value
|
21
|
-
# end
|
22
16
|
# end
|
23
17
|
#
|
24
18
|
# class BaseEnum < GraphQL::Schema::Enum
|
@@ -26,23 +20,31 @@ module GraphQL
|
|
26
20
|
# enum_value_class CustomEnumValue
|
27
21
|
# end
|
28
22
|
class EnumValue < GraphQL::Schema::Member
|
29
|
-
include GraphQL::Schema::Member::AcceptsDefinition
|
30
23
|
include GraphQL::Schema::Member::HasPath
|
24
|
+
include GraphQL::Schema::Member::HasAstNode
|
25
|
+
include GraphQL::Schema::Member::HasDirectives
|
26
|
+
include GraphQL::Schema::Member::HasDeprecationReason
|
31
27
|
|
32
28
|
attr_reader :graphql_name
|
33
29
|
|
34
30
|
# @return [Class] The enum type that owns this value
|
35
31
|
attr_reader :owner
|
36
32
|
|
37
|
-
|
38
|
-
attr_accessor :deprecation_reason
|
39
|
-
|
40
|
-
def initialize(graphql_name, desc = nil, owner:, description: nil, value: nil, deprecation_reason: nil, &block)
|
33
|
+
def initialize(graphql_name, desc = nil, owner:, ast_node: nil, directives: nil, description: nil, value: NOT_CONFIGURED, deprecation_reason: nil, &block)
|
41
34
|
@graphql_name = graphql_name.to_s
|
35
|
+
GraphQL::NameValidator.validate!(@graphql_name)
|
42
36
|
@description = desc || description
|
43
|
-
@value = value
|
44
|
-
|
37
|
+
@value = value === NOT_CONFIGURED ? @graphql_name : value
|
38
|
+
if deprecation_reason
|
39
|
+
self.deprecation_reason = deprecation_reason
|
40
|
+
end
|
45
41
|
@owner = owner
|
42
|
+
@ast_node = ast_node
|
43
|
+
if directives
|
44
|
+
directives.each do |dir_class, dir_options|
|
45
|
+
directive(dir_class, **dir_options)
|
46
|
+
end
|
47
|
+
end
|
46
48
|
|
47
49
|
if block_given?
|
48
50
|
instance_eval(&block)
|
@@ -63,19 +65,11 @@ module GraphQL
|
|
63
65
|
@value
|
64
66
|
end
|
65
67
|
|
66
|
-
|
67
|
-
|
68
|
-
enum_value = GraphQL::EnumType::EnumValue.new
|
69
|
-
enum_value.name = @graphql_name
|
70
|
-
enum_value.description = @description
|
71
|
-
enum_value.value = @value
|
72
|
-
enum_value.deprecation_reason = @deprecation_reason
|
73
|
-
enum_value.metadata[:type_class] = self
|
74
|
-
enum_value
|
68
|
+
def inspect
|
69
|
+
"#<#{self.class} #{path} @value=#{@value.inspect}#{description ? " @description=#{description.inspect}" : ""}>"
|
75
70
|
end
|
76
71
|
|
77
72
|
def visible?(_ctx); true; end
|
78
|
-
def accessible?(_ctx); true; end
|
79
73
|
def authorized?(_ctx); true; end
|
80
74
|
end
|
81
75
|
end
|