graphql 1.9.21 → 2.0.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of graphql might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/generators/graphql/core.rb +21 -10
- data/lib/generators/graphql/enum_generator.rb +4 -10
- data/lib/generators/graphql/field_extractor.rb +31 -0
- data/lib/generators/graphql/input_generator.rb +50 -0
- data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
- data/lib/generators/graphql/{templates → install/templates}/base_mutation.erb +2 -0
- data/lib/generators/graphql/{templates → install/templates}/mutation_type.erb +2 -0
- data/lib/generators/graphql/install_generator.rb +45 -8
- data/lib/generators/graphql/interface_generator.rb +7 -7
- data/lib/generators/graphql/loader_generator.rb +1 -0
- data/lib/generators/graphql/mutation_create_generator.rb +22 -0
- data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
- data/lib/generators/graphql/mutation_generator.rb +6 -30
- data/lib/generators/graphql/mutation_update_generator.rb +22 -0
- data/lib/generators/graphql/object_generator.rb +28 -12
- data/lib/generators/graphql/orm_mutations_base.rb +40 -0
- data/lib/generators/graphql/relay.rb +49 -0
- data/lib/generators/graphql/relay_generator.rb +21 -0
- data/lib/generators/graphql/scalar_generator.rb +4 -2
- data/lib/generators/graphql/templates/base_argument.erb +2 -0
- data/lib/generators/graphql/templates/base_connection.erb +8 -0
- data/lib/generators/graphql/templates/base_edge.erb +8 -0
- data/lib/generators/graphql/templates/base_enum.erb +2 -0
- data/lib/generators/graphql/templates/base_field.erb +2 -0
- data/lib/generators/graphql/templates/base_input_object.erb +2 -0
- data/lib/generators/graphql/templates/base_interface.erb +2 -0
- data/lib/generators/graphql/templates/base_object.erb +2 -0
- data/lib/generators/graphql/templates/base_scalar.erb +2 -0
- data/lib/generators/graphql/templates/base_union.erb +2 -0
- data/lib/generators/graphql/templates/enum.erb +7 -1
- data/lib/generators/graphql/templates/graphql_controller.erb +16 -12
- data/lib/generators/graphql/templates/input.erb +9 -0
- data/lib/generators/graphql/templates/interface.erb +6 -2
- data/lib/generators/graphql/templates/loader.erb +2 -0
- data/lib/generators/graphql/templates/mutation.erb +3 -1
- data/lib/generators/graphql/templates/mutation_create.erb +20 -0
- data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
- data/lib/generators/graphql/templates/mutation_update.erb +21 -0
- data/lib/generators/graphql/templates/node_type.erb +9 -0
- data/lib/generators/graphql/templates/object.erb +7 -3
- data/lib/generators/graphql/templates/query_type.erb +3 -3
- data/lib/generators/graphql/templates/scalar.erb +5 -1
- data/lib/generators/graphql/templates/schema.erb +25 -27
- data/lib/generators/graphql/templates/union.erb +6 -2
- data/lib/generators/graphql/type_generator.rb +47 -10
- data/lib/generators/graphql/union_generator.rb +5 -5
- data/lib/graphql/analysis/ast/field_usage.rb +31 -2
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
- data/lib/graphql/analysis/ast/query_complexity.rb +175 -68
- data/lib/graphql/analysis/ast/query_depth.rb +0 -1
- data/lib/graphql/analysis/ast/visitor.rb +17 -8
- data/lib/graphql/analysis/ast.rb +14 -14
- data/lib/graphql/analysis.rb +0 -7
- data/lib/graphql/backtrace/inspect_result.rb +0 -1
- data/lib/graphql/backtrace/table.rb +37 -16
- data/lib/graphql/backtrace/traced_error.rb +0 -1
- data/lib/graphql/backtrace/tracer.rb +39 -9
- data/lib/graphql/backtrace.rb +20 -17
- data/lib/graphql/dataloader/null_dataloader.rb +24 -0
- data/lib/graphql/dataloader/request.rb +19 -0
- data/lib/graphql/dataloader/request_all.rb +19 -0
- data/lib/graphql/dataloader/source.rb +164 -0
- data/lib/graphql/dataloader.rb +311 -0
- data/lib/graphql/date_encoding_error.rb +16 -0
- data/lib/graphql/deprecation.rb +9 -0
- data/lib/graphql/dig.rb +1 -1
- data/lib/graphql/execution/directive_checks.rb +2 -2
- data/lib/graphql/execution/errors.rb +77 -45
- data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
- data/lib/graphql/execution/interpreter/arguments.rb +88 -0
- data/lib/graphql/execution/interpreter/arguments_cache.rb +105 -0
- data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
- data/lib/graphql/execution/interpreter/resolve.rb +44 -25
- data/lib/graphql/execution/interpreter/runtime.rb +755 -395
- data/lib/graphql/execution/interpreter.rb +201 -74
- data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
- data/lib/graphql/execution/lazy.rb +5 -9
- data/lib/graphql/execution/lookahead.rb +65 -136
- data/lib/graphql/execution/multiplex.rb +5 -152
- data/lib/graphql/execution.rb +11 -4
- data/lib/graphql/filter.rb +1 -1
- data/lib/graphql/integer_decoding_error.rb +17 -0
- data/lib/graphql/integer_encoding_error.rb +18 -2
- data/lib/graphql/introspection/base_object.rb +2 -5
- data/lib/graphql/introspection/directive_location_enum.rb +2 -2
- data/lib/graphql/introspection/directive_type.rb +11 -5
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +5 -18
- data/lib/graphql/introspection/enum_value_type.rb +2 -2
- data/lib/graphql/introspection/field_type.rb +9 -5
- data/lib/graphql/introspection/input_value_type.rb +41 -11
- data/lib/graphql/introspection/introspection_query.rb +6 -92
- data/lib/graphql/introspection/schema_type.rb +10 -10
- data/lib/graphql/introspection/type_type.rb +34 -17
- data/lib/graphql/introspection.rb +100 -0
- data/lib/graphql/invalid_null_error.rb +18 -0
- data/lib/graphql/language/block_string.rb +20 -5
- data/lib/graphql/language/cache.rb +37 -0
- data/lib/graphql/language/definition_slice.rb +21 -10
- data/lib/graphql/language/document_from_schema_definition.rb +104 -68
- data/lib/graphql/language/lexer.rb +83 -40
- data/lib/graphql/language/lexer.rl +31 -9
- data/lib/graphql/language/nodes.rb +64 -93
- data/lib/graphql/language/parser.rb +940 -896
- data/lib/graphql/language/parser.y +130 -103
- data/lib/graphql/language/printer.rb +48 -23
- data/lib/graphql/language/sanitized_printer.rb +222 -0
- data/lib/graphql/language/token.rb +0 -4
- data/lib/graphql/language/visitor.rb +2 -2
- data/lib/graphql/language.rb +3 -1
- data/lib/graphql/name_validator.rb +2 -7
- data/lib/graphql/pagination/active_record_relation_connection.rb +85 -0
- data/lib/graphql/pagination/array_connection.rb +79 -0
- data/lib/graphql/pagination/connection.rb +253 -0
- data/lib/graphql/pagination/connections.rb +135 -0
- data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
- data/lib/graphql/pagination/relation_connection.rb +228 -0
- data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
- data/lib/graphql/pagination.rb +6 -0
- data/lib/graphql/parse_error.rb +0 -1
- data/lib/graphql/query/context.rb +172 -198
- data/lib/graphql/query/fingerprint.rb +26 -0
- data/lib/graphql/query/input_validation_result.rb +33 -7
- data/lib/graphql/query/null_context.rb +21 -8
- data/lib/graphql/query/validation_pipeline.rb +16 -38
- data/lib/graphql/query/variable_validation_error.rb +3 -3
- data/lib/graphql/query/variables.rb +39 -12
- data/lib/graphql/query.rb +74 -38
- data/lib/graphql/railtie.rb +6 -102
- data/lib/graphql/rake_task/validate.rb +4 -1
- data/lib/graphql/rake_task.rb +41 -10
- data/lib/graphql/relay/range_add.rb +17 -10
- data/lib/graphql/relay.rb +0 -15
- data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
- data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
- data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
- data/lib/graphql/rubocop.rb +4 -0
- data/lib/graphql/schema/addition.rb +245 -0
- data/lib/graphql/schema/argument.rb +286 -31
- data/lib/graphql/schema/base_64_encoder.rb +2 -0
- data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
- data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
- data/lib/graphql/schema/build_from_definition.rb +334 -220
- data/lib/graphql/schema/built_in_types.rb +5 -5
- data/lib/graphql/schema/directive/deprecated.rb +18 -0
- data/lib/graphql/schema/directive/feature.rb +1 -1
- data/lib/graphql/schema/directive/flagged.rb +57 -0
- data/lib/graphql/schema/directive/include.rb +2 -2
- data/lib/graphql/schema/directive/one_of.rb +12 -0
- data/lib/graphql/schema/directive/skip.rb +2 -2
- data/lib/graphql/schema/directive/transform.rb +14 -2
- data/lib/graphql/schema/directive.rb +117 -14
- data/lib/graphql/schema/enum.rb +113 -22
- data/lib/graphql/schema/enum_value.rb +16 -21
- data/lib/graphql/schema/field/connection_extension.rb +50 -20
- data/lib/graphql/schema/field/scope_extension.rb +1 -1
- data/lib/graphql/schema/field.rb +491 -329
- data/lib/graphql/schema/field_extension.rb +89 -2
- data/lib/graphql/schema/find_inherited_value.rb +17 -1
- data/lib/graphql/schema/finder.rb +16 -14
- data/lib/graphql/schema/input_object.rb +182 -60
- data/lib/graphql/schema/interface.rb +28 -43
- data/lib/graphql/schema/introspection_system.rb +101 -38
- data/lib/graphql/schema/late_bound_type.rb +7 -2
- data/lib/graphql/schema/list.rb +61 -3
- data/lib/graphql/schema/loader.rb +144 -102
- data/lib/graphql/schema/member/base_dsl_methods.rb +33 -32
- data/lib/graphql/schema/member/build_type.rb +24 -15
- data/lib/graphql/schema/member/has_arguments.rb +261 -24
- data/lib/graphql/schema/member/has_ast_node.rb +20 -0
- data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
- data/lib/graphql/schema/member/has_directives.rb +113 -0
- data/lib/graphql/schema/member/has_fields.rb +99 -34
- data/lib/graphql/schema/member/has_interfaces.rb +88 -0
- data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
- data/lib/graphql/schema/member/has_validators.rb +31 -0
- data/lib/graphql/schema/member/relay_shortcuts.rb +28 -2
- data/lib/graphql/schema/member/type_system_helpers.rb +3 -3
- data/lib/graphql/schema/member/validates_input.rb +33 -0
- data/lib/graphql/schema/member.rb +11 -6
- data/lib/graphql/schema/mutation.rb +4 -9
- data/lib/graphql/schema/non_null.rb +34 -4
- data/lib/graphql/schema/object.rb +38 -60
- data/lib/graphql/schema/printer.rb +16 -35
- data/lib/graphql/schema/relay_classic_mutation.rb +90 -43
- data/lib/graphql/schema/resolver/has_payload_type.rb +46 -6
- data/lib/graphql/schema/resolver.rb +146 -93
- data/lib/graphql/schema/scalar.rb +40 -15
- data/lib/graphql/schema/subscription.rb +55 -26
- data/lib/graphql/schema/timeout.rb +29 -15
- data/lib/graphql/schema/type_expression.rb +21 -13
- data/lib/graphql/schema/type_membership.rb +22 -5
- data/lib/graphql/schema/union.rb +48 -14
- data/lib/graphql/schema/unique_within_type.rb +1 -2
- data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
- data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
- data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
- data/lib/graphql/schema/validator/format_validator.rb +48 -0
- data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
- data/lib/graphql/schema/validator/length_validator.rb +59 -0
- data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
- data/lib/graphql/schema/validator/required_validator.rb +82 -0
- data/lib/graphql/schema/validator.rb +171 -0
- data/lib/graphql/schema/warden.rb +187 -33
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +773 -892
- data/lib/graphql/static_validation/all_rules.rb +3 -0
- data/lib/graphql/static_validation/base_visitor.rb +21 -31
- data/lib/graphql/static_validation/definition_dependencies.rb +7 -2
- data/lib/graphql/static_validation/error.rb +3 -1
- data/lib/graphql/static_validation/literal_validator.rb +55 -26
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +45 -83
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +35 -26
- data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +12 -6
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +14 -14
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -5
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +94 -51
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
- data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
- data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
- data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
- data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
- data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
- data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +4 -2
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +9 -10
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +13 -7
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +19 -14
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
- data/lib/graphql/static_validation/type_stack.rb +2 -2
- data/lib/graphql/static_validation/validation_context.rb +13 -3
- data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
- data/lib/graphql/static_validation/validator.rb +31 -19
- data/lib/graphql/static_validation.rb +1 -2
- data/lib/graphql/string_encoding_error.rb +13 -3
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +129 -22
- data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
- data/lib/graphql/subscriptions/event.rb +85 -31
- data/lib/graphql/subscriptions/instrumentation.rb +0 -47
- data/lib/graphql/subscriptions/serialize.rb +53 -6
- data/lib/graphql/subscriptions.rb +137 -57
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
- data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +34 -2
- data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
- data/lib/graphql/tracing/notifications_tracing.rb +59 -0
- data/lib/graphql/tracing/platform_tracing.rb +67 -38
- data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +4 -1
- data/lib/graphql/tracing/prometheus_tracing.rb +8 -0
- data/lib/graphql/tracing/scout_tracing.rb +19 -0
- data/lib/graphql/tracing/statsd_tracing.rb +42 -0
- data/lib/graphql/tracing.rb +15 -36
- data/lib/graphql/types/big_int.rb +5 -1
- data/lib/graphql/types/int.rb +10 -3
- data/lib/graphql/types/iso_8601_date.rb +20 -9
- data/lib/graphql/types/iso_8601_date_time.rb +36 -10
- data/lib/graphql/types/relay/base_connection.rb +18 -90
- data/lib/graphql/types/relay/base_edge.rb +2 -34
- data/lib/graphql/types/relay/connection_behaviors.rb +158 -0
- data/lib/graphql/types/relay/default_relay.rb +27 -0
- data/lib/graphql/types/relay/edge_behaviors.rb +65 -0
- data/lib/graphql/types/relay/has_node_field.rb +41 -0
- data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
- data/lib/graphql/types/relay/node.rb +2 -4
- data/lib/graphql/types/relay/node_behaviors.rb +19 -0
- data/lib/graphql/types/relay/page_info.rb +2 -14
- data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
- data/lib/graphql/types/relay.rb +11 -5
- data/lib/graphql/types/string.rb +8 -2
- data/lib/graphql/unauthorized_error.rb +2 -2
- data/lib/graphql/unresolved_type_error.rb +2 -2
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +41 -58
- data/readme.md +3 -6
- metadata +103 -237
- data/lib/graphql/analysis/analyze_query.rb +0 -91
- data/lib/graphql/analysis/field_usage.rb +0 -45
- data/lib/graphql/analysis/max_query_complexity.rb +0 -26
- data/lib/graphql/analysis/max_query_depth.rb +0 -26
- data/lib/graphql/analysis/query_complexity.rb +0 -88
- data/lib/graphql/analysis/query_depth.rb +0 -43
- data/lib/graphql/analysis/reducer_state.rb +0 -48
- data/lib/graphql/argument.rb +0 -159
- data/lib/graphql/authorization.rb +0 -82
- data/lib/graphql/backwards_compatibility.rb +0 -60
- data/lib/graphql/base_type.rb +0 -226
- data/lib/graphql/boolean_type.rb +0 -2
- data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
- data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
- data/lib/graphql/compatibility/execution_specification.rb +0 -435
- data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
- data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -213
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -91
- data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
- data/lib/graphql/compatibility/query_parser_specification.rb +0 -264
- data/lib/graphql/compatibility/schema_parser_specification.rb +0 -680
- data/lib/graphql/compatibility.rb +0 -5
- data/lib/graphql/define/assign_argument.rb +0 -12
- data/lib/graphql/define/assign_connection.rb +0 -13
- data/lib/graphql/define/assign_enum_value.rb +0 -18
- data/lib/graphql/define/assign_global_id_field.rb +0 -11
- data/lib/graphql/define/assign_mutation_function.rb +0 -34
- data/lib/graphql/define/assign_object_field.rb +0 -42
- data/lib/graphql/define/defined_object_proxy.rb +0 -53
- data/lib/graphql/define/instance_definable.rb +0 -311
- data/lib/graphql/define/no_definition_error.rb +0 -7
- data/lib/graphql/define/non_null_with_bang.rb +0 -16
- data/lib/graphql/define/type_definer.rb +0 -31
- data/lib/graphql/define.rb +0 -31
- data/lib/graphql/deprecated_dsl.rb +0 -42
- data/lib/graphql/directive/deprecated_directive.rb +0 -13
- data/lib/graphql/directive/include_directive.rb +0 -2
- data/lib/graphql/directive/skip_directive.rb +0 -2
- data/lib/graphql/directive.rb +0 -104
- data/lib/graphql/enum_type.rb +0 -193
- data/lib/graphql/execution/execute.rb +0 -326
- data/lib/graphql/execution/flatten.rb +0 -40
- data/lib/graphql/execution/instrumentation.rb +0 -92
- data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
- data/lib/graphql/execution/lazy/resolve.rb +0 -91
- data/lib/graphql/execution/typecast.rb +0 -50
- data/lib/graphql/field/resolve.rb +0 -59
- data/lib/graphql/field.rb +0 -330
- data/lib/graphql/float_type.rb +0 -2
- data/lib/graphql/function.rb +0 -153
- data/lib/graphql/id_type.rb +0 -2
- data/lib/graphql/input_object_type.rb +0 -154
- data/lib/graphql/int_type.rb +0 -2
- data/lib/graphql/interface_type.rb +0 -86
- data/lib/graphql/internal_representation/document.rb +0 -27
- data/lib/graphql/internal_representation/node.rb +0 -206
- data/lib/graphql/internal_representation/print.rb +0 -51
- data/lib/graphql/internal_representation/rewrite.rb +0 -184
- data/lib/graphql/internal_representation/scope.rb +0 -88
- data/lib/graphql/internal_representation/visit.rb +0 -36
- data/lib/graphql/internal_representation.rb +0 -7
- data/lib/graphql/list_type.rb +0 -80
- data/lib/graphql/literal_validation_error.rb +0 -6
- data/lib/graphql/non_null_type.rb +0 -81
- data/lib/graphql/object_type.rb +0 -141
- data/lib/graphql/query/arguments.rb +0 -187
- data/lib/graphql/query/arguments_cache.rb +0 -25
- data/lib/graphql/query/executor.rb +0 -53
- data/lib/graphql/query/literal_input.rb +0 -116
- data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
- data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
- data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
- data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
- data/lib/graphql/query/serial_execution.rb +0 -39
- data/lib/graphql/relay/array_connection.rb +0 -85
- data/lib/graphql/relay/base_connection.rb +0 -172
- data/lib/graphql/relay/connection_instrumentation.rb +0 -54
- data/lib/graphql/relay/connection_resolve.rb +0 -43
- data/lib/graphql/relay/connection_type.rb +0 -40
- data/lib/graphql/relay/edge.rb +0 -27
- data/lib/graphql/relay/edge_type.rb +0 -18
- data/lib/graphql/relay/edges_instrumentation.rb +0 -40
- data/lib/graphql/relay/global_id_resolve.rb +0 -18
- data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
- data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
- data/lib/graphql/relay/mutation/resolve.rb +0 -56
- data/lib/graphql/relay/mutation/result.rb +0 -38
- data/lib/graphql/relay/mutation.rb +0 -190
- data/lib/graphql/relay/node.rb +0 -36
- data/lib/graphql/relay/page_info.rb +0 -7
- data/lib/graphql/relay/relation_connection.rb +0 -190
- data/lib/graphql/relay/type_extensions.rb +0 -30
- data/lib/graphql/scalar_type.rb +0 -133
- data/lib/graphql/schema/catchall_middleware.rb +0 -35
- data/lib/graphql/schema/default_parse_error.rb +0 -10
- data/lib/graphql/schema/default_type_error.rb +0 -15
- data/lib/graphql/schema/member/accepts_definition.rb +0 -152
- data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -26
- data/lib/graphql/schema/member/instrumentation.rb +0 -132
- data/lib/graphql/schema/middleware_chain.rb +0 -82
- data/lib/graphql/schema/possible_types.rb +0 -39
- data/lib/graphql/schema/rescue_middleware.rb +0 -60
- data/lib/graphql/schema/timeout_middleware.rb +0 -86
- data/lib/graphql/schema/traversal.rb +0 -228
- data/lib/graphql/schema/validation.rb +0 -303
- data/lib/graphql/static_validation/default_visitor.rb +0 -15
- data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
- data/lib/graphql/string_type.rb +0 -2
- data/lib/graphql/subscriptions/subscription_root.rb +0 -74
- data/lib/graphql/tracing/skylight_tracing.rb +0 -62
- data/lib/graphql/types/relay/base_field.rb +0 -22
- data/lib/graphql/types/relay/base_interface.rb +0 -29
- data/lib/graphql/types/relay/base_object.rb +0 -26
- data/lib/graphql/types/relay/node_field.rb +0 -43
- data/lib/graphql/types/relay/nodes_field.rb +0 -45
- data/lib/graphql/union_type.rb +0 -135
- data/lib/graphql/upgrader/member.rb +0 -936
- data/lib/graphql/upgrader/schema.rb +0 -37
@@ -18,16 +18,18 @@ module GraphQL
|
|
18
18
|
# @param new_name [String]
|
19
19
|
# @return [String]
|
20
20
|
def graphql_name(new_name = nil)
|
21
|
-
|
22
|
-
|
21
|
+
if new_name
|
22
|
+
GraphQL::NameValidator.validate!(new_name)
|
23
23
|
@graphql_name = new_name
|
24
|
-
when overridden = overridden_graphql_name
|
25
|
-
overridden
|
26
24
|
else
|
27
|
-
default_graphql_name
|
25
|
+
overridden_graphql_name || default_graphql_name
|
28
26
|
end
|
29
27
|
end
|
30
28
|
|
29
|
+
def overridden_graphql_name
|
30
|
+
defined?(@graphql_name) ? @graphql_name : nil
|
31
|
+
end
|
32
|
+
|
31
33
|
# Just a convenience method to point out that people should use graphql_name instead
|
32
34
|
def name(new_name = nil)
|
33
35
|
return super() if new_name.nil?
|
@@ -45,8 +47,23 @@ module GraphQL
|
|
45
47
|
def description(new_description = nil)
|
46
48
|
if new_description
|
47
49
|
@description = new_description
|
50
|
+
elsif defined?(@description)
|
51
|
+
@description
|
48
52
|
else
|
49
|
-
|
53
|
+
nil
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# This pushes some configurations _down_ the inheritance tree,
|
58
|
+
# in order to prevent repetitive lookups at runtime.
|
59
|
+
module ConfigurationExtension
|
60
|
+
def inherited(child_class)
|
61
|
+
child_class.introspection(introspection)
|
62
|
+
child_class.description(description)
|
63
|
+
if overridden_graphql_name
|
64
|
+
child_class.graphql_name(overridden_graphql_name)
|
65
|
+
end
|
66
|
+
super
|
50
67
|
end
|
51
68
|
end
|
52
69
|
|
@@ -54,8 +71,10 @@ module GraphQL
|
|
54
71
|
def introspection(new_introspection = nil)
|
55
72
|
if !new_introspection.nil?
|
56
73
|
@introspection = new_introspection
|
74
|
+
elsif defined?(@introspection)
|
75
|
+
@introspection
|
57
76
|
else
|
58
|
-
|
77
|
+
false
|
59
78
|
end
|
60
79
|
end
|
61
80
|
|
@@ -68,21 +87,15 @@ module GraphQL
|
|
68
87
|
def mutation(mutation_class = nil)
|
69
88
|
if mutation_class
|
70
89
|
@mutation = mutation_class
|
90
|
+
elsif defined?(@mutation)
|
91
|
+
@mutation
|
92
|
+
else
|
93
|
+
nil
|
71
94
|
end
|
72
|
-
@mutation
|
73
|
-
end
|
74
|
-
|
75
|
-
# @return [GraphQL::BaseType] Convert this type to a legacy-style object.
|
76
|
-
def to_graphql
|
77
|
-
raise GraphQL::RequiredImplementationMissingError
|
78
95
|
end
|
79
96
|
|
80
97
|
alias :unwrap :itself
|
81
98
|
|
82
|
-
def overridden_graphql_name
|
83
|
-
@graphql_name || find_inherited_value(:overridden_graphql_name)
|
84
|
-
end
|
85
|
-
|
86
99
|
# Creates the default name for a schema member.
|
87
100
|
# The default name is the Ruby constant name,
|
88
101
|
# without any namespaces and with any `-Type` suffix removed
|
@@ -95,27 +108,15 @@ module GraphQL
|
|
95
108
|
end
|
96
109
|
|
97
110
|
def visible?(context)
|
98
|
-
|
99
|
-
@mutation.visible?(context)
|
100
|
-
else
|
101
|
-
true
|
102
|
-
end
|
111
|
+
true
|
103
112
|
end
|
104
113
|
|
105
114
|
def accessible?(context)
|
106
|
-
|
107
|
-
@mutation.accessible?(context)
|
108
|
-
else
|
109
|
-
true
|
110
|
-
end
|
115
|
+
true
|
111
116
|
end
|
112
117
|
|
113
118
|
def authorized?(object, context)
|
114
|
-
|
115
|
-
@mutation.authorized?(object, context)
|
116
|
-
else
|
117
|
-
true
|
118
|
-
end
|
119
|
+
true
|
119
120
|
end
|
120
121
|
end
|
121
122
|
end
|
@@ -35,18 +35,16 @@ module GraphQL
|
|
35
35
|
else
|
36
36
|
maybe_type = constantize(type_expr)
|
37
37
|
case maybe_type
|
38
|
-
when GraphQL::BaseType
|
39
|
-
maybe_type
|
40
38
|
when Module
|
41
39
|
# This is a way to check that it's the right kind of module:
|
42
|
-
if maybe_type.respond_to?(:
|
40
|
+
if maybe_type.respond_to?(:kind)
|
43
41
|
maybe_type
|
44
42
|
else
|
45
43
|
raise ArgumentError, "Unexpected class/module found for GraphQL type: #{type_expr} (must be type definition class/module)"
|
46
44
|
end
|
47
45
|
end
|
48
46
|
end
|
49
|
-
when GraphQL::
|
47
|
+
when GraphQL::Schema::LateBoundType
|
50
48
|
type_expr
|
51
49
|
when Array
|
52
50
|
case type_expr.length
|
@@ -56,28 +54,32 @@ module GraphQL
|
|
56
54
|
parse_type(type_expr.first, null: false)
|
57
55
|
when 2
|
58
56
|
inner_type, nullable_option = type_expr
|
59
|
-
if nullable_option.keys != [:null] || nullable_option
|
57
|
+
if nullable_option.keys != [:null] || (nullable_option[:null] != true && nullable_option[:null] != false)
|
60
58
|
raise ArgumentError, LIST_TYPE_ERROR
|
61
59
|
end
|
62
60
|
list_type = true
|
63
|
-
parse_type(inner_type, null:
|
61
|
+
parse_type(inner_type, null: nullable_option[:null])
|
64
62
|
else
|
65
63
|
raise ArgumentError, LIST_TYPE_ERROR
|
66
64
|
end
|
65
|
+
when GraphQL::Schema::NonNull, GraphQL::Schema::List
|
66
|
+
type_expr
|
67
67
|
when Module
|
68
68
|
# This is a way to check that it's the right kind of module:
|
69
|
-
if type_expr.respond_to?(:
|
69
|
+
if type_expr.respond_to?(:kind)
|
70
70
|
type_expr
|
71
71
|
else
|
72
|
-
# Eg `String` => GraphQL::
|
72
|
+
# Eg `String` => GraphQL::Types::String
|
73
73
|
parse_type(type_expr.name, null: true)
|
74
74
|
end
|
75
|
+
when Proc
|
76
|
+
parse_type(type_expr.call, null: true)
|
75
77
|
when false
|
76
78
|
raise ArgumentError, "Received `false` instead of a type, maybe a `!` should be replaced with `null: true` (for fields) or `required: true` (for arguments)"
|
77
79
|
end
|
78
80
|
|
79
81
|
if return_type.nil?
|
80
|
-
raise "Unexpected type input: #{type_expr} (#{type_expr.class})"
|
82
|
+
raise "Unexpected type input: #{type_expr.inspect} (#{type_expr.class})"
|
81
83
|
end
|
82
84
|
|
83
85
|
# Apply list_type first, that way the
|
@@ -96,7 +98,7 @@ module GraphQL
|
|
96
98
|
|
97
99
|
def to_type_name(something)
|
98
100
|
case something
|
99
|
-
when GraphQL::
|
101
|
+
when GraphQL::Schema::LateBoundType
|
100
102
|
something.unwrap.name
|
101
103
|
when Array
|
102
104
|
to_type_name(something.first)
|
@@ -116,8 +118,9 @@ module GraphQL
|
|
116
118
|
end
|
117
119
|
|
118
120
|
def camelize(string)
|
121
|
+
return string if string == '_'
|
119
122
|
return string unless string.include?("_")
|
120
|
-
camelized = string.split('_').
|
123
|
+
camelized = string.split('_').each(&:capitalize!).join
|
121
124
|
camelized[0] = camelized[0].downcase
|
122
125
|
if (match_data = string.match(/\A(_+)/))
|
123
126
|
camelized = "#{match_data[0]}#{camelized}"
|
@@ -158,10 +161,16 @@ module GraphQL
|
|
158
161
|
end
|
159
162
|
|
160
163
|
def underscore(string)
|
161
|
-
string
|
162
|
-
|
163
|
-
|
164
|
-
|
164
|
+
if string.match?(/\A[a-z_]+\Z/)
|
165
|
+
return string
|
166
|
+
end
|
167
|
+
string2 = string.dup
|
168
|
+
|
169
|
+
string2.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2') # URLDecoder -> URL_Decoder
|
170
|
+
string2.gsub!(/([a-z\d])([A-Z])/,'\1_\2') # someThing -> some_Thing
|
171
|
+
string2.downcase!
|
172
|
+
|
173
|
+
string2
|
165
174
|
end
|
166
175
|
end
|
167
176
|
end
|
@@ -14,7 +14,7 @@ module GraphQL
|
|
14
14
|
end
|
15
15
|
|
16
16
|
# @see {GraphQL::Schema::Argument#initialize} for parameters
|
17
|
-
# @return [GraphQL::Schema::Argument] An instance of {
|
17
|
+
# @return [GraphQL::Schema::Argument] An instance of {argument_class}, created from `*args`
|
18
18
|
def argument(*args, **kwargs, &block)
|
19
19
|
kwargs[:owner] = self
|
20
20
|
loads = kwargs[:loads]
|
@@ -37,24 +37,159 @@ module GraphQL
|
|
37
37
|
end
|
38
38
|
arg_defn = self.argument_class.new(*args, **kwargs, &block)
|
39
39
|
add_argument(arg_defn)
|
40
|
+
|
41
|
+
if self.is_a?(Class) && !method_defined?(:"load_#{arg_defn.keyword}")
|
42
|
+
method_owner = if self < GraphQL::Schema::InputObject || self < GraphQL::Schema::Directive
|
43
|
+
"self."
|
44
|
+
elsif self < GraphQL::Schema::Resolver
|
45
|
+
""
|
46
|
+
else
|
47
|
+
raise "Unexpected argument owner: #{self}"
|
48
|
+
end
|
49
|
+
if loads && arg_defn.type.list?
|
50
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
51
|
+
def #{method_owner}load_#{arg_defn.keyword}(values, context = nil)
|
52
|
+
argument = get_argument("#{arg_defn.graphql_name}")
|
53
|
+
(context || self.context).schema.after_lazy(values) do |values2|
|
54
|
+
GraphQL::Execution::Lazy.all(values2.map { |value| load_application_object(argument, value, context || self.context) })
|
55
|
+
end
|
56
|
+
end
|
57
|
+
RUBY
|
58
|
+
elsif loads
|
59
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
60
|
+
def #{method_owner}load_#{arg_defn.keyword}(value, context = nil)
|
61
|
+
argument = get_argument("#{arg_defn.graphql_name}")
|
62
|
+
load_application_object(argument, value, context || self.context)
|
63
|
+
end
|
64
|
+
RUBY
|
65
|
+
else
|
66
|
+
class_eval <<-RUBY, __FILE__, __LINE__ + 1
|
67
|
+
def #{method_owner}load_#{arg_defn.keyword}(value, _context = nil)
|
68
|
+
value
|
69
|
+
end
|
70
|
+
RUBY
|
71
|
+
end
|
72
|
+
end
|
73
|
+
arg_defn
|
40
74
|
end
|
41
75
|
|
42
76
|
# Register this argument with the class.
|
43
77
|
# @param arg_defn [GraphQL::Schema::Argument]
|
44
78
|
# @return [GraphQL::Schema::Argument]
|
45
79
|
def add_argument(arg_defn)
|
46
|
-
own_arguments
|
80
|
+
@own_arguments ||= {}
|
81
|
+
prev_defn = @own_arguments[arg_defn.name]
|
82
|
+
case prev_defn
|
83
|
+
when nil
|
84
|
+
@own_arguments[arg_defn.name] = arg_defn
|
85
|
+
when Array
|
86
|
+
prev_defn << arg_defn
|
87
|
+
when GraphQL::Schema::Argument
|
88
|
+
@own_arguments[arg_defn.name] = [prev_defn, arg_defn]
|
89
|
+
else
|
90
|
+
raise "Invariant: unexpected `@own_arguments[#{arg_defn.name.inspect}]`: #{prev_defn.inspect}"
|
91
|
+
end
|
47
92
|
arg_defn
|
48
93
|
end
|
49
94
|
|
95
|
+
def remove_argument(arg_defn)
|
96
|
+
prev_defn = @own_arguments[arg_defn.name]
|
97
|
+
case prev_defn
|
98
|
+
when nil
|
99
|
+
# done
|
100
|
+
when Array
|
101
|
+
prev_defn.delete(arg_defn)
|
102
|
+
when GraphQL::Schema::Argument
|
103
|
+
@own_arguments.delete(arg_defn.name)
|
104
|
+
else
|
105
|
+
raise "Invariant: unexpected `@own_arguments[#{arg_defn.name.inspect}]`: #{prev_defn.inspect}"
|
106
|
+
end
|
107
|
+
nil
|
108
|
+
end
|
109
|
+
|
50
110
|
# @return [Hash<String => GraphQL::Schema::Argument] Arguments defined on this thing, keyed by name. Includes inherited definitions
|
51
|
-
def arguments
|
52
|
-
inherited_arguments =
|
111
|
+
def arguments(context = GraphQL::Query::NullContext)
|
112
|
+
inherited_arguments = if self.is_a?(Class) && superclass.respond_to?(:arguments)
|
113
|
+
superclass.arguments(context)
|
114
|
+
elsif defined?(@resolver_class) && @resolver_class
|
115
|
+
@resolver_class.field_arguments(context)
|
116
|
+
else
|
117
|
+
nil
|
118
|
+
end
|
53
119
|
# Local definitions override inherited ones
|
120
|
+
if own_arguments.any?
|
121
|
+
own_arguments_that_apply = {}
|
122
|
+
own_arguments.each do |name, args_entry|
|
123
|
+
if (visible_defn = Warden.visible_entry?(:visible_argument?, args_entry, context))
|
124
|
+
own_arguments_that_apply[visible_defn.graphql_name] = visible_defn
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
54
129
|
if inherited_arguments
|
55
|
-
|
130
|
+
if own_arguments_that_apply
|
131
|
+
inherited_arguments.merge(own_arguments_that_apply)
|
132
|
+
else
|
133
|
+
inherited_arguments
|
134
|
+
end
|
135
|
+
else
|
136
|
+
# might be nil if there are actually no arguments
|
137
|
+
own_arguments_that_apply || own_arguments
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
def all_argument_definitions
|
142
|
+
if self.is_a?(Class)
|
143
|
+
all_defns = {}
|
144
|
+
ancestors.reverse_each do |ancestor|
|
145
|
+
if ancestor.respond_to?(:own_arguments)
|
146
|
+
all_defns.merge!(ancestor.own_arguments)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
elsif defined?(@resolver_class) && @resolver_class
|
150
|
+
all_defns = {}
|
151
|
+
@resolver_class.all_field_argument_definitions.each do |arg_defn|
|
152
|
+
key = arg_defn.graphql_name
|
153
|
+
case (current_value = all_defns[key])
|
154
|
+
when nil
|
155
|
+
all_defns[key] = arg_defn
|
156
|
+
when Array
|
157
|
+
current_value << arg_defn
|
158
|
+
when GraphQL::Schema::Argument
|
159
|
+
all_defns[key] = [current_value, arg_defn]
|
160
|
+
else
|
161
|
+
raise "Invariant: Unexpected argument definition, #{current_value.class}: #{current_value.inspect}"
|
162
|
+
end
|
163
|
+
end
|
164
|
+
all_defns.merge!(own_arguments)
|
56
165
|
else
|
57
|
-
own_arguments
|
166
|
+
all_defns = own_arguments
|
167
|
+
end
|
168
|
+
all_defns = all_defns.values
|
169
|
+
all_defns.flatten!
|
170
|
+
all_defns
|
171
|
+
end
|
172
|
+
|
173
|
+
# @return [GraphQL::Schema::Argument, nil] Argument defined on this thing, fetched by name.
|
174
|
+
def get_argument(argument_name, context = GraphQL::Query::NullContext)
|
175
|
+
warden = Warden.from_context(context)
|
176
|
+
if !self.is_a?(Class)
|
177
|
+
if (arg_config = own_arguments[argument_name]) && (visible_arg = Warden.visible_entry?(:visible_argument?, arg_config, context, warden))
|
178
|
+
visible_arg
|
179
|
+
elsif defined?(@resolver_class) && @resolver_class
|
180
|
+
@resolver_class.get_field_argument(argument_name, context)
|
181
|
+
else
|
182
|
+
nil
|
183
|
+
end
|
184
|
+
else
|
185
|
+
for ancestor in ancestors
|
186
|
+
if ancestor.respond_to?(:own_arguments) &&
|
187
|
+
(a = ancestor.own_arguments[argument_name]) &&
|
188
|
+
(a = Warden.visible_entry?(:visible_argument?, a, context, warden))
|
189
|
+
return a
|
190
|
+
end
|
191
|
+
end
|
192
|
+
nil
|
58
193
|
end
|
59
194
|
end
|
60
195
|
|
@@ -63,12 +198,94 @@ module GraphQL
|
|
63
198
|
self.class.argument_class(new_arg_class)
|
64
199
|
end
|
65
200
|
|
201
|
+
# @api private
|
202
|
+
# If given a block, it will eventually yield the loaded args to the block.
|
203
|
+
#
|
204
|
+
# If no block is given, it will immediately dataload (but might return a Lazy).
|
205
|
+
#
|
206
|
+
# @param values [Hash<String, Object>]
|
207
|
+
# @param context [GraphQL::Query::Context]
|
208
|
+
# @yield [Interpreter::Arguments, Execution::Lazy<Interpeter::Arguments>]
|
209
|
+
# @return [Interpreter::Arguments, Execution::Lazy<Interpeter::Arguments>]
|
210
|
+
def coerce_arguments(parent_object, values, context, &block)
|
211
|
+
# Cache this hash to avoid re-merging it
|
212
|
+
arg_defns = self.arguments(context)
|
213
|
+
total_args_count = arg_defns.size
|
214
|
+
|
215
|
+
finished_args = nil
|
216
|
+
prepare_finished_args = -> {
|
217
|
+
if total_args_count == 0
|
218
|
+
finished_args = GraphQL::Execution::Interpreter::Arguments::EMPTY
|
219
|
+
if block_given?
|
220
|
+
block.call(finished_args)
|
221
|
+
end
|
222
|
+
else
|
223
|
+
argument_values = {}
|
224
|
+
resolved_args_count = 0
|
225
|
+
raised_error = false
|
226
|
+
arg_defns.each do |arg_name, arg_defn|
|
227
|
+
context.dataloader.append_job do
|
228
|
+
begin
|
229
|
+
arg_defn.coerce_into_values(parent_object, values, context, argument_values)
|
230
|
+
rescue GraphQL::ExecutionError, GraphQL::UnauthorizedError => err
|
231
|
+
raised_error = true
|
232
|
+
finished_args = err
|
233
|
+
if block_given?
|
234
|
+
block.call(finished_args)
|
235
|
+
end
|
236
|
+
end
|
237
|
+
|
238
|
+
resolved_args_count += 1
|
239
|
+
if resolved_args_count == total_args_count && !raised_error
|
240
|
+
finished_args = context.schema.after_any_lazies(argument_values.values) {
|
241
|
+
GraphQL::Execution::Interpreter::Arguments.new(
|
242
|
+
argument_values: argument_values,
|
243
|
+
)
|
244
|
+
}
|
245
|
+
if block_given?
|
246
|
+
block.call(finished_args)
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
end
|
251
|
+
end
|
252
|
+
}
|
253
|
+
|
254
|
+
if block_given?
|
255
|
+
prepare_finished_args.call
|
256
|
+
nil
|
257
|
+
else
|
258
|
+
# This API returns eagerly, gotta run it now
|
259
|
+
context.dataloader.run_isolated(&prepare_finished_args)
|
260
|
+
finished_args
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
# Usually, this is validated statically by RequiredArgumentsArePresent,
|
265
|
+
# but not for directives.
|
266
|
+
# TODO apply static validations on schema definitions?
|
267
|
+
def validate_directive_argument(arg_defn, value)
|
268
|
+
if arg_defn.owner.is_a?(Class) && arg_defn.owner < GraphQL::Schema::Directive
|
269
|
+
if value.nil? && arg_defn.type.non_null?
|
270
|
+
raise ArgumentError, "#{arg_defn.path} is required, but no value was given"
|
271
|
+
end
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
def arguments_statically_coercible?
|
276
|
+
return @arguments_statically_coercible if defined?(@arguments_statically_coercible)
|
277
|
+
|
278
|
+
@arguments_statically_coercible = all_argument_definitions.all?(&:statically_coercible?)
|
279
|
+
end
|
280
|
+
|
66
281
|
module ArgumentClassAccessor
|
67
282
|
def argument_class(new_arg_class = nil)
|
68
283
|
if new_arg_class
|
69
284
|
@argument_class = new_arg_class
|
285
|
+
elsif defined?(@argument_class) && @argument_class
|
286
|
+
@argument_class
|
70
287
|
else
|
71
|
-
|
288
|
+
superclass.respond_to?(:argument_class) ? superclass.argument_class : GraphQL::Schema::Argument
|
72
289
|
end
|
73
290
|
end
|
74
291
|
end
|
@@ -85,9 +302,20 @@ module GraphQL
|
|
85
302
|
context.schema.object_from_id(id, context)
|
86
303
|
end
|
87
304
|
|
88
|
-
def load_application_object(argument,
|
305
|
+
def load_application_object(argument, id, context)
|
89
306
|
# See if any object can be found for this ID
|
90
|
-
|
307
|
+
if id.nil?
|
308
|
+
return nil
|
309
|
+
end
|
310
|
+
object_from_id(argument.loads, id, context)
|
311
|
+
end
|
312
|
+
|
313
|
+
def load_and_authorize_application_object(argument, id, context)
|
314
|
+
loaded_application_object = load_application_object(argument, id, context)
|
315
|
+
authorize_application_object(argument, id, context, loaded_application_object)
|
316
|
+
end
|
317
|
+
|
318
|
+
def authorize_application_object(argument, id, context, loaded_application_object)
|
91
319
|
context.schema.after_lazy(loaded_application_object) do |application_object|
|
92
320
|
if application_object.nil?
|
93
321
|
err = GraphQL::LoadApplicationObjectFailedError.new(argument: argument, id: id, object: application_object)
|
@@ -95,9 +323,15 @@ module GraphQL
|
|
95
323
|
end
|
96
324
|
# Double-check that the located object is actually of this type
|
97
325
|
# (Don't want to allow arbitrary access to objects this way)
|
98
|
-
|
99
|
-
context.schema.after_lazy(
|
100
|
-
|
326
|
+
maybe_lazy_resolve_type = context.schema.resolve_type(argument.loads, application_object, context)
|
327
|
+
context.schema.after_lazy(maybe_lazy_resolve_type) do |resolve_type_result|
|
328
|
+
if resolve_type_result.is_a?(Array) && resolve_type_result.size == 2
|
329
|
+
application_object_type, application_object = resolve_type_result
|
330
|
+
else
|
331
|
+
application_object_type = resolve_type_result
|
332
|
+
# application_object is already assigned
|
333
|
+
end
|
334
|
+
possible_object_types = context.warden.possible_types(argument.loads)
|
101
335
|
if !possible_object_types.include?(application_object_type)
|
102
336
|
err = GraphQL::LoadApplicationObjectFailedError.new(argument: argument, id: id, object: application_object)
|
103
337
|
load_application_object_failed(err)
|
@@ -105,20 +339,22 @@ module GraphQL
|
|
105
339
|
# This object was loaded successfully
|
106
340
|
# and resolved to the right type,
|
107
341
|
# now apply the `.authorized?` class method if there is one
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
342
|
+
context.schema.after_lazy(application_object_type.authorized?(application_object, context)) do |authed|
|
343
|
+
if authed
|
344
|
+
application_object
|
345
|
+
else
|
346
|
+
err = GraphQL::UnauthorizedError.new(
|
347
|
+
object: application_object,
|
348
|
+
type: application_object_type,
|
349
|
+
context: context,
|
350
|
+
)
|
351
|
+
if self.respond_to?(:unauthorized_object)
|
352
|
+
err.set_backtrace(caller)
|
353
|
+
unauthorized_object(err)
|
112
354
|
else
|
113
|
-
raise
|
114
|
-
object: application_object,
|
115
|
-
type: class_based_type,
|
116
|
-
context: context,
|
117
|
-
)
|
355
|
+
raise err
|
118
356
|
end
|
119
357
|
end
|
120
|
-
else
|
121
|
-
application_object
|
122
358
|
end
|
123
359
|
end
|
124
360
|
end
|
@@ -130,8 +366,9 @@ module GraphQL
|
|
130
366
|
end
|
131
367
|
end
|
132
368
|
|
369
|
+
NO_ARGUMENTS = {}.freeze
|
133
370
|
def own_arguments
|
134
|
-
@own_arguments
|
371
|
+
@own_arguments || NO_ARGUMENTS
|
135
372
|
end
|
136
373
|
end
|
137
374
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
class Schema
|
4
|
+
class Member
|
5
|
+
module HasAstNode
|
6
|
+
# If this schema was parsed from a `.graphql` file (or other SDL),
|
7
|
+
# this is the AST node that defined this part of the schema.
|
8
|
+
def ast_node(new_ast_node = nil)
|
9
|
+
if new_ast_node
|
10
|
+
@ast_node = new_ast_node
|
11
|
+
elsif defined?(@ast_node)
|
12
|
+
@ast_node
|
13
|
+
else
|
14
|
+
nil
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GraphQL
|
4
|
+
class Schema
|
5
|
+
class Member
|
6
|
+
module HasDeprecationReason
|
7
|
+
# @return [String, nil] Explains why this member was deprecated (if present, this will be marked deprecated in introspection)
|
8
|
+
def deprecation_reason
|
9
|
+
dir = self.directives.find { |d| d.is_a?(GraphQL::Schema::Directive::Deprecated) }
|
10
|
+
dir && dir.arguments[:reason] # rubocop:disable Development/ContextIsPassedCop -- definition-related
|
11
|
+
end
|
12
|
+
|
13
|
+
# Set the deprecation reason for this member, or remove it by assigning `nil`
|
14
|
+
# @param text [String, nil]
|
15
|
+
def deprecation_reason=(text)
|
16
|
+
if text.nil?
|
17
|
+
remove_directive(GraphQL::Schema::Directive::Deprecated)
|
18
|
+
else
|
19
|
+
directive(GraphQL::Schema::Directive::Deprecated, reason: text)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|