graphql 1.10.2 → 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 +24 -33
- 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 +30 -1
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
- data/lib/graphql/analysis/ast/query_complexity.rb +125 -117
- data/lib/graphql/analysis/ast/query_depth.rb +0 -1
- data/lib/graphql/analysis/ast/visitor.rb +52 -36
- data/lib/graphql/analysis/ast.rb +7 -8
- data/lib/graphql/analysis.rb +0 -7
- data/lib/graphql/backtrace/inspect_result.rb +0 -1
- data/lib/graphql/backtrace/table.rb +31 -18
- 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/errors.rb +77 -44
- 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 +826 -464
- data/lib/graphql/execution/interpreter.rb +206 -68
- data/lib/graphql/execution/lazy.rb +11 -21
- data/lib/graphql/execution/lookahead.rb +55 -136
- data/lib/graphql/execution/multiplex.rb +6 -162
- data/lib/graphql/execution.rb +11 -4
- data/lib/graphql/filter.rb +7 -2
- data/lib/graphql/integer_decoding_error.rb +17 -0
- data/lib/graphql/integer_encoding_error.rb +18 -2
- data/lib/graphql/introspection/directive_location_enum.rb +2 -2
- data/lib/graphql/introspection/directive_type.rb +11 -5
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +4 -17
- 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 +15 -3
- data/lib/graphql/introspection/introspection_query.rb +6 -92
- data/lib/graphql/introspection/schema_type.rb +11 -6
- data/lib/graphql/introspection/type_type.rb +31 -14
- 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/document_from_schema_definition.rb +96 -44
- data/lib/graphql/language/lexer.rb +216 -1462
- data/lib/graphql/language/nodes.rb +126 -129
- data/lib/graphql/language/parser.rb +997 -933
- data/lib/graphql/language/parser.y +148 -118
- 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 +2 -0
- data/lib/graphql/name_validator.rb +2 -7
- data/lib/graphql/pagination/active_record_relation_connection.rb +45 -3
- data/lib/graphql/pagination/array_connection.rb +6 -4
- data/lib/graphql/pagination/connection.rb +105 -23
- data/lib/graphql/pagination/connections.rb +62 -35
- data/lib/graphql/pagination/relation_connection.rb +88 -36
- data/lib/graphql/parse_error.rb +0 -1
- data/lib/graphql/query/context.rb +203 -198
- data/lib/graphql/query/fingerprint.rb +26 -0
- data/lib/graphql/query/input_validation_result.rb +33 -7
- data/lib/graphql/query/null_context.rb +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 +36 -12
- data/lib/graphql/query.rb +92 -44
- data/lib/graphql/railtie.rb +6 -102
- data/lib/graphql/rake_task/validate.rb +1 -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 +250 -46
- data/lib/graphql/schema/base_64_encoder.rb +2 -0
- data/lib/graphql/schema/build_from_definition/resolve_map.rb +3 -1
- data/lib/graphql/schema/build_from_definition.rb +243 -89
- data/lib/graphql/schema/directive/deprecated.rb +1 -1
- 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 +1 -1
- data/lib/graphql/schema/directive/one_of.rb +12 -0
- data/lib/graphql/schema/directive/skip.rb +1 -1
- data/lib/graphql/schema/directive/transform.rb +14 -2
- data/lib/graphql/schema/directive.rb +108 -20
- data/lib/graphql/schema/enum.rb +105 -44
- data/lib/graphql/schema/enum_value.rb +15 -25
- data/lib/graphql/schema/field/connection_extension.rb +50 -30
- data/lib/graphql/schema/field/scope_extension.rb +1 -1
- data/lib/graphql/schema/field.rb +476 -331
- data/lib/graphql/schema/field_extension.rb +86 -2
- data/lib/graphql/schema/find_inherited_value.rb +6 -8
- data/lib/graphql/schema/finder.rb +5 -5
- data/lib/graphql/schema/input_object.rb +133 -121
- data/lib/graphql/schema/interface.rb +17 -45
- data/lib/graphql/schema/introspection_system.rb +3 -8
- data/lib/graphql/schema/late_bound_type.rb +8 -2
- data/lib/graphql/schema/list.rb +25 -8
- data/lib/graphql/schema/loader.rb +139 -103
- data/lib/graphql/schema/member/base_dsl_methods.rb +29 -35
- data/lib/graphql/schema/member/build_type.rb +19 -14
- data/lib/graphql/schema/member/has_arguments.rb +310 -26
- data/lib/graphql/schema/member/has_ast_node.rb +16 -1
- 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 +164 -42
- 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 +3 -3
- data/lib/graphql/schema/member.rb +6 -6
- data/lib/graphql/schema/mutation.rb +4 -9
- data/lib/graphql/schema/non_null.rb +12 -7
- data/lib/graphql/schema/object.rb +35 -69
- data/lib/graphql/schema/printer.rb +16 -34
- data/lib/graphql/schema/relay_classic_mutation.rb +90 -43
- data/lib/graphql/schema/resolver/has_payload_type.rb +51 -11
- data/lib/graphql/schema/resolver.rb +144 -79
- data/lib/graphql/schema/scalar.rb +27 -18
- data/lib/graphql/schema/subscription.rb +55 -26
- data/lib/graphql/schema/timeout.rb +45 -35
- data/lib/graphql/schema/type_expression.rb +1 -1
- data/lib/graphql/schema/type_membership.rb +21 -4
- data/lib/graphql/schema/union.rb +48 -13
- 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 +185 -32
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +471 -1116
- data/lib/graphql/static_validation/all_rules.rb +3 -0
- data/lib/graphql/static_validation/base_visitor.rb +13 -27
- 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 +44 -87
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +28 -22
- 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 +13 -13
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +12 -4
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +92 -49
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
- 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 +6 -7
- 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 +9 -10
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +14 -8
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +4 -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 +126 -19
- 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 +81 -35
- data/lib/graphql/subscriptions/instrumentation.rb +0 -52
- data/lib/graphql/subscriptions/serialize.rb +53 -6
- data/lib/graphql/subscriptions.rb +113 -58
- data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -21
- 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 +15 -0
- data/lib/graphql/tracing/data_dog_trace.rb +148 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +26 -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 +1 -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 +64 -43
- 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 +3 -3
- data/lib/graphql/tracing/scout_trace.rb +72 -0
- data/lib/graphql/tracing/scout_tracing.rb +11 -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 -71
- 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 -92
- 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/version.rb +1 -1
- data/lib/graphql.rb +54 -65
- data/readme.md +3 -6
- metadata +116 -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 -131
- data/lib/graphql/authorization.rb +0 -82
- data/lib/graphql/backwards_compatibility.rb +0 -60
- data/lib/graphql/base_type.rb +0 -230
- 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 -87
- data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
- data/lib/graphql/compatibility/query_parser_specification.rb +0 -264
- data/lib/graphql/compatibility/schema_parser_specification.rb +0 -680
- data/lib/graphql/compatibility.rb +0 -5
- data/lib/graphql/define/assign_argument.rb +0 -12
- data/lib/graphql/define/assign_connection.rb +0 -13
- data/lib/graphql/define/assign_enum_value.rb +0 -18
- data/lib/graphql/define/assign_global_id_field.rb +0 -11
- data/lib/graphql/define/assign_mutation_function.rb +0 -34
- data/lib/graphql/define/assign_object_field.rb +0 -42
- data/lib/graphql/define/defined_object_proxy.rb +0 -53
- data/lib/graphql/define/instance_definable.rb +0 -210
- 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 -2
- data/lib/graphql/directive/include_directive.rb +0 -2
- data/lib/graphql/directive/skip_directive.rb +0 -2
- data/lib/graphql/directive.rb +0 -107
- data/lib/graphql/enum_type.rb +0 -127
- 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 -222
- data/lib/graphql/float_type.rb +0 -2
- data/lib/graphql/function.rb +0 -124
- data/lib/graphql/id_type.rb +0 -2
- data/lib/graphql/input_object_type.rb +0 -132
- data/lib/graphql/int_type.rb +0 -2
- data/lib/graphql/interface_type.rb +0 -65
- 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 -71
- data/lib/graphql/object_type.rb +0 -121
- data/lib/graphql/query/arguments.rb +0 -188
- 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 -136
- 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 -176
- 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 -41
- data/lib/graphql/relay/edge.rb +0 -27
- data/lib/graphql/relay/edge_type.rb +0 -19
- 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 -105
- 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 -76
- 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 -31
- 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 -65
- data/lib/graphql/tracing/skylight_tracing.rb +0 -70
- 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 -113
- data/lib/graphql/upgrader/member.rb +0 -936
- data/lib/graphql/upgrader/schema.rb +0 -37
@@ -15,15 +15,65 @@ module GraphQL
|
|
15
15
|
# @return [Object]
|
16
16
|
attr_reader :options
|
17
17
|
|
18
|
+
# @return [Array<Symbol>, nil] `default_argument`s added, if any were added (otherwise, `nil`)
|
19
|
+
attr_reader :added_default_arguments
|
20
|
+
|
18
21
|
# Called when the extension is mounted with `extension(name, options)`.
|
19
|
-
# The instance
|
22
|
+
# The instance will be frozen to avoid improper use of state during execution.
|
20
23
|
# @param field [GraphQL::Schema::Field] The field where this extension was mounted
|
21
24
|
# @param options [Object] The second argument to `extension`, or `{}` if nothing was passed.
|
22
25
|
def initialize(field:, options:)
|
23
26
|
@field = field
|
24
27
|
@options = options || {}
|
28
|
+
@added_default_arguments = nil
|
25
29
|
apply
|
26
|
-
|
30
|
+
end
|
31
|
+
|
32
|
+
class << self
|
33
|
+
# @return [Array(Array, Hash), nil] A list of default argument configs, or `nil` if there aren't any
|
34
|
+
def default_argument_configurations
|
35
|
+
args = superclass.respond_to?(:default_argument_configurations) ? superclass.default_argument_configurations : nil
|
36
|
+
if @own_default_argument_configurations
|
37
|
+
if args
|
38
|
+
args.concat(@own_default_argument_configurations)
|
39
|
+
else
|
40
|
+
args = @own_default_argument_configurations.dup
|
41
|
+
end
|
42
|
+
end
|
43
|
+
args
|
44
|
+
end
|
45
|
+
|
46
|
+
# @see Argument#initialize
|
47
|
+
# @see HasArguments#argument
|
48
|
+
def default_argument(*argument_args, **argument_kwargs)
|
49
|
+
configs = @own_default_argument_configurations ||= []
|
50
|
+
configs << [argument_args, argument_kwargs]
|
51
|
+
end
|
52
|
+
|
53
|
+
# If configured, these `extras` will be added to the field if they aren't already present,
|
54
|
+
# but removed by from `arguments` before the field's `resolve` is called.
|
55
|
+
# (The extras _will_ be present for other extensions, though.)
|
56
|
+
#
|
57
|
+
# @param new_extras [Array<Symbol>] If provided, assign extras used by this extension
|
58
|
+
# @return [Array<Symbol>] any extras assigned to this extension
|
59
|
+
def extras(new_extras = nil)
|
60
|
+
if new_extras
|
61
|
+
@own_extras = new_extras
|
62
|
+
end
|
63
|
+
|
64
|
+
inherited_extras = self.superclass.respond_to?(:extras) ? superclass.extras : nil
|
65
|
+
if @own_extras
|
66
|
+
if inherited_extras
|
67
|
+
inherited_extras + @own_extras
|
68
|
+
else
|
69
|
+
@own_extras
|
70
|
+
end
|
71
|
+
elsif inherited_extras
|
72
|
+
inherited_extras
|
73
|
+
else
|
74
|
+
GraphQL::EmptyObjects::EMPTY_ARRAY
|
75
|
+
end
|
76
|
+
end
|
27
77
|
end
|
28
78
|
|
29
79
|
# Called when this extension is attached to a field.
|
@@ -32,6 +82,40 @@ module GraphQL
|
|
32
82
|
def apply
|
33
83
|
end
|
34
84
|
|
85
|
+
# Called after the field's definition block has been executed.
|
86
|
+
# (Any arguments from the block are present on `field`)
|
87
|
+
# @return [void]
|
88
|
+
def after_define
|
89
|
+
end
|
90
|
+
|
91
|
+
# @api private
|
92
|
+
def after_define_apply
|
93
|
+
after_define
|
94
|
+
if (configs = self.class.default_argument_configurations)
|
95
|
+
existing_keywords = field.all_argument_definitions.map(&:keyword)
|
96
|
+
existing_keywords.uniq!
|
97
|
+
@added_default_arguments = []
|
98
|
+
configs.each do |config|
|
99
|
+
argument_args, argument_kwargs = config
|
100
|
+
arg_name = argument_args[0]
|
101
|
+
if !existing_keywords.include?(arg_name)
|
102
|
+
@added_default_arguments << arg_name
|
103
|
+
field.argument(*argument_args, **argument_kwargs)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
if (extras = self.class.extras).any?
|
108
|
+
@added_extras = extras - field.extras
|
109
|
+
field.extras(@added_extras)
|
110
|
+
else
|
111
|
+
@added_extras = nil
|
112
|
+
end
|
113
|
+
freeze
|
114
|
+
end
|
115
|
+
|
116
|
+
# @api private
|
117
|
+
attr_reader :added_extras
|
118
|
+
|
35
119
|
# Called before resolving {#field}. It should either:
|
36
120
|
#
|
37
121
|
# - `yield` values to continue execution; OR
|
@@ -1,17 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
module GraphQL
|
2
3
|
class Schema
|
3
4
|
module FindInheritedValue
|
4
|
-
module EmptyObjects
|
5
|
-
EMPTY_HASH = {}.freeze
|
6
|
-
EMPTY_ARRAY = [].freeze
|
7
|
-
end
|
8
|
-
|
9
5
|
def self.extended(child_cls)
|
10
|
-
child_cls.singleton_class.include(EmptyObjects)
|
6
|
+
child_cls.singleton_class.include(GraphQL::EmptyObjects)
|
11
7
|
end
|
12
8
|
|
13
9
|
def self.included(child_cls)
|
14
|
-
child_cls.include(EmptyObjects)
|
10
|
+
child_cls.include(GraphQL::EmptyObjects)
|
15
11
|
end
|
16
12
|
|
17
13
|
private
|
@@ -20,7 +16,9 @@ module GraphQL
|
|
20
16
|
if self.is_a?(Class)
|
21
17
|
superclass.respond_to?(method_name, true) ? superclass.send(method_name) : default_value
|
22
18
|
else
|
23
|
-
|
19
|
+
ancestors_except_self = ancestors
|
20
|
+
ancestors_except_self.delete(self)
|
21
|
+
ancestors_except_self.each do |ancestor|
|
24
22
|
if ancestor.respond_to?(method_name, true)
|
25
23
|
return ancestor.send(method_name)
|
26
24
|
end
|
@@ -38,7 +38,7 @@ module GraphQL
|
|
38
38
|
|
39
39
|
find_in_directive(directive, path: path)
|
40
40
|
else
|
41
|
-
type = schema.get_type(type_or_directive)
|
41
|
+
type = schema.get_type(type_or_directive) # rubocop:disable Development/ContextIsPassedCop -- build-time
|
42
42
|
|
43
43
|
if type.nil?
|
44
44
|
raise MemberNotFoundError, "Could not find type `#{type_or_directive}` in schema."
|
@@ -56,7 +56,7 @@ module GraphQL
|
|
56
56
|
|
57
57
|
def find_in_directive(directive, path:)
|
58
58
|
argument_name = path.shift
|
59
|
-
argument = directive.
|
59
|
+
argument = directive.get_argument(argument_name) # rubocop:disable Development/ContextIsPassedCop -- build-time
|
60
60
|
|
61
61
|
if argument.nil?
|
62
62
|
raise MemberNotFoundError, "Could not find argument `#{argument_name}` on directive #{directive}."
|
@@ -102,7 +102,7 @@ module GraphQL
|
|
102
102
|
|
103
103
|
def find_in_field(field, path:)
|
104
104
|
argument_name = path.shift
|
105
|
-
argument = field.
|
105
|
+
argument = field.get_argument(argument_name) # rubocop:disable Development/ContextIsPassedCop -- build-time
|
106
106
|
|
107
107
|
if argument.nil?
|
108
108
|
raise MemberNotFoundError, "Could not find argument `#{argument_name}` on field `#{field.name}`."
|
@@ -119,7 +119,7 @@ module GraphQL
|
|
119
119
|
|
120
120
|
def find_in_input_object(input_object, path:)
|
121
121
|
field_name = path.shift
|
122
|
-
input_field = input_object.
|
122
|
+
input_field = input_object.get_argument(field_name) # rubocop:disable Development/ContextIsPassedCop -- build-time
|
123
123
|
|
124
124
|
if input_field.nil?
|
125
125
|
raise MemberNotFoundError, "Could not find input field `#{field_name}` on input object type `#{input_object.graphql_name}`."
|
@@ -136,7 +136,7 @@ module GraphQL
|
|
136
136
|
|
137
137
|
def find_in_enum_type(enum_type, path:)
|
138
138
|
value_name = path.shift
|
139
|
-
enum_value = enum_type.
|
139
|
+
enum_value = enum_type.enum_values.find { |v| v.graphql_name == value_name } # rubocop:disable Development/ContextIsPassedCop -- build-time, not runtime
|
140
140
|
|
141
141
|
if enum_value.nil?
|
142
142
|
raise MemberNotFoundError, "Could not find enum value `#{value_name}` on enum type `#{enum_type.graphql_name}`."
|
@@ -2,57 +2,42 @@
|
|
2
2
|
module GraphQL
|
3
3
|
class Schema
|
4
4
|
class InputObject < GraphQL::Schema::Member
|
5
|
-
extend GraphQL::Schema::Member::AcceptsDefinition
|
6
5
|
extend Forwardable
|
7
6
|
extend GraphQL::Schema::Member::HasArguments
|
7
|
+
extend GraphQL::Schema::Member::HasArguments::ArgumentObjectLoader
|
8
8
|
extend GraphQL::Schema::Member::ValidatesInput
|
9
|
+
extend GraphQL::Schema::Member::HasValidators
|
9
10
|
|
10
11
|
include GraphQL::Dig
|
11
12
|
|
12
|
-
|
13
|
+
# @return [GraphQL::Query::Context] The context for this query
|
14
|
+
attr_reader :context
|
15
|
+
# @return [GraphQL::Execution::Interpereter::Arguments] The underlying arguments instance
|
16
|
+
attr_reader :arguments
|
17
|
+
|
18
|
+
# Ruby-like hash behaviors, read-only
|
19
|
+
def_delegators :@ruby_style_hash, :keys, :values, :each, :map, :any?, :empty?
|
20
|
+
|
21
|
+
def initialize(arguments, ruby_kwargs:, context:, defaults_used:)
|
13
22
|
@context = context
|
14
|
-
|
15
|
-
|
16
|
-
else
|
17
|
-
@arguments = self.class.arguments_class.new(values, context: context, defaults_used: defaults_used)
|
18
|
-
# Symbolized, underscored hash:
|
19
|
-
@ruby_style_hash = @arguments.to_kwargs
|
20
|
-
end
|
23
|
+
@ruby_style_hash = ruby_kwargs
|
24
|
+
@arguments = arguments
|
21
25
|
# Apply prepares, not great to have it duplicated here.
|
22
|
-
|
23
|
-
self.class.arguments.each do |name, arg_defn|
|
24
|
-
@arguments_by_keyword[arg_defn.keyword] = arg_defn
|
26
|
+
self.class.arguments(context).each_value do |arg_defn|
|
25
27
|
ruby_kwargs_key = arg_defn.keyword
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
else
|
33
|
-
load_application_object(arg_defn, loads, value)
|
28
|
+
if @ruby_style_hash.key?(ruby_kwargs_key)
|
29
|
+
# Weirdly, procs are applied during coercion, but not methods.
|
30
|
+
# Probably because these methods require a `self`.
|
31
|
+
if arg_defn.prepare.is_a?(Symbol) || context.nil?
|
32
|
+
prepared_value = arg_defn.prepare_value(self, @ruby_style_hash[ruby_kwargs_key])
|
33
|
+
overwrite_argument(ruby_kwargs_key, prepared_value)
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
37
|
-
if @ruby_style_hash.key?(ruby_kwargs_key) && arg_defn.prepare
|
38
|
-
@ruby_style_hash[ruby_kwargs_key] = arg_defn.prepare_value(self, @ruby_style_hash[ruby_kwargs_key])
|
39
|
-
end
|
40
36
|
end
|
41
37
|
end
|
42
38
|
|
43
|
-
# @return [GraphQL::Query::Context] The context for this query
|
44
|
-
attr_reader :context
|
45
|
-
|
46
|
-
# @return [GraphQL::Query::Arguments] The underlying arguments instance
|
47
|
-
attr_reader :arguments
|
48
|
-
|
49
|
-
# Ruby-like hash behaviors, read-only
|
50
|
-
def_delegators :@ruby_style_hash, :keys, :values, :each, :map, :any?, :empty?
|
51
|
-
|
52
39
|
def to_h
|
53
|
-
@ruby_style_hash
|
54
|
-
h.merge(key => unwrap_value(value))
|
55
|
-
end
|
40
|
+
unwrap_value(@ruby_style_hash)
|
56
41
|
end
|
57
42
|
|
58
43
|
def to_hash
|
@@ -60,7 +45,41 @@ module GraphQL
|
|
60
45
|
end
|
61
46
|
|
62
47
|
def prepare
|
63
|
-
|
48
|
+
if @context
|
49
|
+
object = @context[:current_object]
|
50
|
+
# Pass this object's class with `as` so that messages are rendered correctly from inherited validators
|
51
|
+
Schema::Validator.validate!(self.class.validators, object, @context, @ruby_style_hash, as: self.class)
|
52
|
+
self
|
53
|
+
else
|
54
|
+
self
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.authorized?(obj, value, ctx)
|
59
|
+
# Authorize each argument (but this doesn't apply if `prepare` is implemented):
|
60
|
+
if value.respond_to?(:key?)
|
61
|
+
arguments(ctx).each do |_name, input_obj_arg|
|
62
|
+
if value.key?(input_obj_arg.keyword) &&
|
63
|
+
!input_obj_arg.authorized?(obj, value[input_obj_arg.keyword], ctx)
|
64
|
+
return false
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
# It didn't early-return false:
|
69
|
+
true
|
70
|
+
end
|
71
|
+
|
72
|
+
def self.one_of
|
73
|
+
if !one_of?
|
74
|
+
if all_argument_definitions.any? { |arg| arg.type.non_null? }
|
75
|
+
raise ArgumentError, "`one_of` may not be used with required arguments -- add `required: false` to argument definitions to use `one_of`"
|
76
|
+
end
|
77
|
+
directive(GraphQL::Schema::Directive::OneOf)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.one_of?
|
82
|
+
directives.any? { |d| d.is_a?(GraphQL::Schema::Directive::OneOf) }
|
64
83
|
end
|
65
84
|
|
66
85
|
def unwrap_value(value)
|
@@ -68,8 +87,8 @@ module GraphQL
|
|
68
87
|
when Array
|
69
88
|
value.map { |item| unwrap_value(item) }
|
70
89
|
when Hash
|
71
|
-
value.
|
72
|
-
h.merge(key => unwrap_value(value))
|
90
|
+
value.reduce({}) do |h, (key, value)|
|
91
|
+
h.merge!(key => unwrap_value(value))
|
73
92
|
end
|
74
93
|
when InputObject
|
75
94
|
value.to_h
|
@@ -101,33 +120,24 @@ module GraphQL
|
|
101
120
|
end
|
102
121
|
|
103
122
|
class << self
|
104
|
-
# @return [Class<GraphQL::Arguments>]
|
105
|
-
attr_accessor :arguments_class
|
106
|
-
|
107
123
|
def argument(*args, **kwargs, &block)
|
108
124
|
argument_defn = super(*args, **kwargs, &block)
|
125
|
+
if one_of?
|
126
|
+
if argument_defn.type.non_null?
|
127
|
+
raise ArgumentError, "Argument '#{argument_defn.path}' must be nullable because it is part of a OneOf type, add `required: false`."
|
128
|
+
end
|
129
|
+
if argument_defn.default_value?
|
130
|
+
raise ArgumentError, "Argument '#{argument_defn.path}' cannot have a default value because it is part of a OneOf type, remove `default_value: ...`."
|
131
|
+
end
|
132
|
+
end
|
109
133
|
# Add a method access
|
110
134
|
method_name = argument_defn.keyword
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
type_defn = GraphQL::InputObjectType.new
|
118
|
-
type_defn.name = graphql_name
|
119
|
-
type_defn.description = description
|
120
|
-
type_defn.metadata[:type_class] = self
|
121
|
-
type_defn.mutation = mutation
|
122
|
-
type_defn.ast_node = ast_node
|
123
|
-
arguments.each do |name, arg|
|
124
|
-
type_defn.arguments[arg.graphql_definition.name] = arg.graphql_definition
|
125
|
-
end
|
126
|
-
# Make a reference to a classic-style Arguments class
|
127
|
-
self.arguments_class = GraphQL::Query::Arguments.construct_arguments_class(type_defn)
|
128
|
-
# But use this InputObject class at runtime
|
129
|
-
type_defn.arguments_class = self
|
130
|
-
type_defn
|
135
|
+
class_eval <<-RUBY, __FILE__, __LINE__
|
136
|
+
def #{method_name}
|
137
|
+
self[#{method_name.inspect}]
|
138
|
+
end
|
139
|
+
RUBY
|
140
|
+
argument_defn
|
131
141
|
end
|
132
142
|
|
133
143
|
def kind
|
@@ -137,47 +147,57 @@ module GraphQL
|
|
137
147
|
# @api private
|
138
148
|
INVALID_OBJECT_MESSAGE = "Expected %{object} to be a key-value object responding to `to_h` or `to_unsafe_h`."
|
139
149
|
|
140
|
-
|
141
|
-
def validate_non_null_input(input, ctx)
|
142
|
-
result = GraphQL::Query::InputValidationResult.new
|
143
|
-
|
150
|
+
def validate_non_null_input(input, ctx, max_errors: nil)
|
144
151
|
warden = ctx.warden
|
145
152
|
|
146
153
|
if input.is_a?(Array)
|
147
|
-
|
148
|
-
return result
|
154
|
+
return GraphQL::Query::InputValidationResult.from_problem(INVALID_OBJECT_MESSAGE % { object: JSON.generate(input, quirks_mode: true) })
|
149
155
|
end
|
150
156
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
begin
|
155
|
-
input.to_h
|
156
|
-
rescue
|
157
|
-
begin
|
158
|
-
# Handle ActionController::Parameters:
|
159
|
-
input.to_unsafe_h
|
160
|
-
rescue
|
161
|
-
# We're not sure it'll act like a hash, so reject it:
|
162
|
-
result.add_problem(INVALID_OBJECT_MESSAGE % { object: JSON.generate(input, quirks_mode: true) })
|
163
|
-
return result
|
164
|
-
end
|
157
|
+
if !(input.respond_to?(:to_h) || input.respond_to?(:to_unsafe_h))
|
158
|
+
# We're not sure it'll act like a hash, so reject it:
|
159
|
+
return GraphQL::Query::InputValidationResult.from_problem(INVALID_OBJECT_MESSAGE % { object: JSON.generate(input, quirks_mode: true) })
|
165
160
|
end
|
166
161
|
|
167
|
-
|
162
|
+
# Inject missing required arguments
|
163
|
+
missing_required_inputs = self.arguments(ctx).reduce({}) do |m, (argument_name, argument)|
|
164
|
+
if !input.key?(argument_name) && argument.type.non_null? && warden.get_argument(self, argument_name)
|
165
|
+
m[argument_name] = nil
|
166
|
+
end
|
167
|
+
|
168
|
+
m
|
169
|
+
end
|
168
170
|
|
169
|
-
|
170
|
-
input.each do |
|
171
|
-
|
172
|
-
|
171
|
+
result = nil
|
172
|
+
[input, missing_required_inputs].each do |args_to_validate|
|
173
|
+
args_to_validate.each do |argument_name, value|
|
174
|
+
argument = warden.get_argument(self, argument_name)
|
175
|
+
# Items in the input that are unexpected
|
176
|
+
if argument.nil?
|
177
|
+
result ||= Query::InputValidationResult.new
|
178
|
+
result.add_problem("Field is not defined on #{self.graphql_name}", [argument_name])
|
179
|
+
else
|
180
|
+
# Items in the input that are expected, but have invalid values
|
181
|
+
argument_result = argument.type.validate_input(value, ctx)
|
182
|
+
result ||= Query::InputValidationResult.new
|
183
|
+
if !argument_result.valid?
|
184
|
+
result.merge_result!(argument_name, argument_result)
|
185
|
+
end
|
186
|
+
end
|
173
187
|
end
|
174
188
|
end
|
175
189
|
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
190
|
+
if one_of?
|
191
|
+
if input.size == 1
|
192
|
+
input.each do |name, value|
|
193
|
+
if value.nil?
|
194
|
+
result ||= Query::InputValidationResult.new
|
195
|
+
result.add_problem("'#{graphql_name}' requires exactly one argument, but '#{name}' was `null`.")
|
196
|
+
end
|
197
|
+
end
|
198
|
+
else
|
199
|
+
result ||= Query::InputValidationResult.new
|
200
|
+
result.add_problem("'#{graphql_name}' requires exactly one argument, but #{input.size} were provided.")
|
181
201
|
end
|
182
202
|
end
|
183
203
|
|
@@ -188,46 +208,28 @@ module GraphQL
|
|
188
208
|
if value.nil?
|
189
209
|
return nil
|
190
210
|
end
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
# Accept either string or symbol
|
198
|
-
field_value = if value.key?(name)
|
199
|
-
has_value = true
|
200
|
-
value[name]
|
201
|
-
elsif value.key?(arg_key)
|
202
|
-
has_value = true
|
203
|
-
value[arg_key]
|
204
|
-
elsif argument_defn.default_value?
|
205
|
-
has_value = true
|
206
|
-
argument_defn.default_value
|
211
|
+
|
212
|
+
arguments = coerce_arguments(nil, value, ctx)
|
213
|
+
|
214
|
+
ctx.schema.after_lazy(arguments) do |resolved_arguments|
|
215
|
+
if resolved_arguments.is_a?(GraphQL::Error)
|
216
|
+
raise resolved_arguments
|
207
217
|
else
|
208
|
-
nil
|
209
|
-
|
210
|
-
# Only continue if some value was found for this argument
|
211
|
-
if has_value
|
212
|
-
coerced_value = argument_defn.type.coerce_input(field_value, ctx)
|
213
|
-
prepared_value = argument_defn.prepare_value(nil, coerced_value, context: ctx)
|
214
|
-
input_values[arg_key] = prepared_value
|
218
|
+
input_obj_instance = self.new(resolved_arguments, ruby_kwargs: resolved_arguments.keyword_arguments, context: ctx, defaults_used: nil)
|
219
|
+
input_obj_instance.prepare
|
215
220
|
end
|
216
221
|
end
|
217
|
-
|
218
|
-
input_obj_instance = self.new(ruby_kwargs: input_values, context: ctx, defaults_used: nil)
|
219
|
-
input_obj_instance.prepare
|
220
222
|
end
|
221
223
|
|
222
224
|
# It's funny to think of a _result_ of an input object.
|
223
225
|
# This is used for rendering the default value in introspection responses.
|
224
226
|
def coerce_result(value, ctx)
|
225
|
-
# Allow the application to provide values as :
|
226
|
-
value = value.reduce({}) { |memo, (k, v)| memo[k.to_s] = v; memo }
|
227
|
+
# Allow the application to provide values as :snake_symbols, and convert them to the camelStrings
|
228
|
+
value = value.reduce({}) { |memo, (k, v)| memo[Member::BuildType.camelize(k.to_s)] = v; memo }
|
227
229
|
|
228
230
|
result = {}
|
229
231
|
|
230
|
-
arguments.each do |input_key, input_field_defn|
|
232
|
+
arguments(ctx).each do |input_key, input_field_defn|
|
231
233
|
input_value = value[input_key]
|
232
234
|
if value.key?(input_key)
|
233
235
|
result[input_key] = if input_value.nil?
|
@@ -241,6 +243,16 @@ module GraphQL
|
|
241
243
|
result
|
242
244
|
end
|
243
245
|
end
|
246
|
+
|
247
|
+
private
|
248
|
+
|
249
|
+
def overwrite_argument(key, value)
|
250
|
+
# Argument keywords come in frozen from the interpreter, dup them before modifying them.
|
251
|
+
if @ruby_style_hash.frozen?
|
252
|
+
@ruby_style_hash = @ruby_style_hash.dup
|
253
|
+
end
|
254
|
+
@ruby_style_hash[key] = value
|
255
|
+
end
|
244
256
|
end
|
245
257
|
end
|
246
258
|
end
|
@@ -4,8 +4,6 @@ module GraphQL
|
|
4
4
|
module Interface
|
5
5
|
include GraphQL::Schema::Member::GraphQLTypeNames
|
6
6
|
module DefinitionMethods
|
7
|
-
include GraphQL::Schema::Member::CachedGraphQLDefinition
|
8
|
-
include GraphQL::Relay::TypeExtensions
|
9
7
|
include GraphQL::Schema::Member::BaseDSLMethods
|
10
8
|
# ConfigurationExtension's responsibilities are in `def included` below
|
11
9
|
include GraphQL::Schema::Member::TypeSystemHelpers
|
@@ -14,6 +12,9 @@ module GraphQL
|
|
14
12
|
include GraphQL::Schema::Member::RelayShortcuts
|
15
13
|
include GraphQL::Schema::Member::Scoped
|
16
14
|
include GraphQL::Schema::Member::HasAstNode
|
15
|
+
include GraphQL::Schema::Member::HasUnresolvedTypeError
|
16
|
+
include GraphQL::Schema::Member::HasDirectives
|
17
|
+
include GraphQL::Schema::Member::HasInterfaces
|
17
18
|
|
18
19
|
# Methods defined in this block will be:
|
19
20
|
# - Added as class methods to this interface
|
@@ -27,14 +28,12 @@ module GraphQL
|
|
27
28
|
true
|
28
29
|
end
|
29
30
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
end
|
31
|
+
def type_membership_class(membership_class = nil)
|
32
|
+
if membership_class
|
33
|
+
@type_membership_class = membership_class
|
34
|
+
else
|
35
|
+
@type_membership_class || find_inherited_value(:type_membership_class, GraphQL::Schema::TypeMembership)
|
36
36
|
end
|
37
|
-
false
|
38
37
|
end
|
39
38
|
|
40
39
|
# Here's the tricky part. Make sure behavior keeps making its way down the inheritance chain.
|
@@ -46,9 +45,11 @@ module GraphQL
|
|
46
45
|
# We need this before we can call `own_interfaces`
|
47
46
|
child_class.extend(Schema::Interface::DefinitionMethods)
|
48
47
|
|
49
|
-
child_class.
|
50
|
-
child_class.
|
51
|
-
|
48
|
+
child_class.type_membership_class(self.type_membership_class)
|
49
|
+
child_class.ancestors.reverse_each do |ancestor|
|
50
|
+
if ancestor.const_defined?(:DefinitionMethods)
|
51
|
+
child_class.extend(ancestor::DefinitionMethods)
|
52
|
+
end
|
52
53
|
end
|
53
54
|
|
54
55
|
# Use an instance variable to tell whether it's been included previously or not;
|
@@ -62,12 +63,13 @@ module GraphQL
|
|
62
63
|
end
|
63
64
|
child_class.introspection(introspection)
|
64
65
|
child_class.description(description)
|
65
|
-
|
66
|
-
|
66
|
+
# If interfaces are mixed into each other, only define this class once
|
67
|
+
if !child_class.const_defined?(:UnresolvedTypeError, false)
|
68
|
+
add_unresolved_type_error(child_class)
|
67
69
|
end
|
68
70
|
elsif child_class < GraphQL::Schema::Object
|
69
71
|
# This is being included into an object type, make sure it's using `implements(...)`
|
70
|
-
backtrace_line = caller(0, 10).find { |line| line.include?("schema/
|
72
|
+
backtrace_line = caller(0, 10).find { |line| line.include?("schema/member/has_interfaces.rb") && line.include?("in `implements'")}
|
71
73
|
if !backtrace_line
|
72
74
|
raise "Attach interfaces using `implements(#{self})`, not `include(#{self})`"
|
73
75
|
end
|
@@ -86,41 +88,11 @@ module GraphQL
|
|
86
88
|
end
|
87
89
|
end
|
88
90
|
|
89
|
-
def to_graphql
|
90
|
-
type_defn = GraphQL::InterfaceType.new
|
91
|
-
type_defn.name = graphql_name
|
92
|
-
type_defn.description = description
|
93
|
-
type_defn.orphan_types = orphan_types
|
94
|
-
type_defn.ast_node = ast_node
|
95
|
-
fields.each do |field_name, field_inst|
|
96
|
-
field_defn = field_inst.graphql_definition
|
97
|
-
type_defn.fields[field_defn.name] = field_defn
|
98
|
-
end
|
99
|
-
type_defn.metadata[:type_class] = self
|
100
|
-
if respond_to?(:resolve_type)
|
101
|
-
type_defn.resolve_type = method(:resolve_type)
|
102
|
-
end
|
103
|
-
type_defn
|
104
|
-
end
|
105
|
-
|
106
91
|
def kind
|
107
92
|
GraphQL::TypeKinds::INTERFACE
|
108
93
|
end
|
109
|
-
|
110
|
-
protected
|
111
|
-
|
112
|
-
def own_interfaces
|
113
|
-
@own_interfaces ||= []
|
114
|
-
end
|
115
|
-
|
116
|
-
def interfaces
|
117
|
-
own_interfaces + (own_interfaces.map { |i| i.own_interfaces }).flatten
|
118
|
-
end
|
119
94
|
end
|
120
95
|
|
121
|
-
# Extend this _after_ `DefinitionMethods` is defined, so it will be used
|
122
|
-
extend GraphQL::Schema::Member::AcceptsDefinition
|
123
|
-
|
124
96
|
extend DefinitionMethods
|
125
97
|
|
126
98
|
def unwrap
|
@@ -89,9 +89,9 @@ module GraphQL
|
|
89
89
|
case late_bound_type
|
90
90
|
when GraphQL::Schema::LateBoundType
|
91
91
|
@schema.get_type(late_bound_type.name)
|
92
|
-
when GraphQL::Schema::List
|
92
|
+
when GraphQL::Schema::List
|
93
93
|
resolve_late_binding(late_bound_type.of_type).to_list_type
|
94
|
-
when GraphQL::Schema::NonNull
|
94
|
+
when GraphQL::Schema::NonNull
|
95
95
|
resolve_late_binding(late_bound_type.of_type).to_non_null_type
|
96
96
|
when Module
|
97
97
|
# It's a normal type -- no change required
|
@@ -103,12 +103,7 @@ module GraphQL
|
|
103
103
|
|
104
104
|
def load_constant(class_name)
|
105
105
|
const = @custom_namespace.const_get(class_name)
|
106
|
-
|
107
|
-
dup_type_class(const)
|
108
|
-
else
|
109
|
-
# Use `.to_graphql` to get a freshly-made version, not shared between schemas
|
110
|
-
const.to_graphql
|
111
|
-
end
|
106
|
+
dup_type_class(const)
|
112
107
|
rescue NameError
|
113
108
|
# Dup the built-in so that the cached fields aren't shared
|
114
109
|
dup_type_class(@built_in_namespace.const_get(class_name))
|