graphql 1.9.18 → 1.13.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/generators/graphql/core.rb +21 -10
- data/lib/generators/graphql/enum_generator.rb +4 -10
- data/lib/generators/graphql/field_extractor.rb +31 -0
- data/lib/generators/graphql/input_generator.rb +50 -0
- data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
- data/lib/generators/graphql/{templates → install/templates}/base_mutation.erb +2 -0
- data/lib/generators/graphql/{templates → install/templates}/mutation_type.erb +2 -0
- data/lib/generators/graphql/install_generator.rb +44 -7
- data/lib/generators/graphql/interface_generator.rb +7 -7
- data/lib/generators/graphql/loader_generator.rb +1 -0
- data/lib/generators/graphql/mutation_create_generator.rb +22 -0
- data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
- data/lib/generators/graphql/mutation_generator.rb +6 -30
- data/lib/generators/graphql/mutation_update_generator.rb +22 -0
- data/lib/generators/graphql/object_generator.rb +28 -12
- data/lib/generators/graphql/orm_mutations_base.rb +40 -0
- data/lib/generators/graphql/relay.rb +63 -0
- data/lib/generators/graphql/relay_generator.rb +21 -0
- data/lib/generators/graphql/scalar_generator.rb +4 -2
- data/lib/generators/graphql/templates/base_argument.erb +2 -0
- data/lib/generators/graphql/templates/base_connection.erb +8 -0
- data/lib/generators/graphql/templates/base_edge.erb +8 -0
- data/lib/generators/graphql/templates/base_enum.erb +2 -0
- data/lib/generators/graphql/templates/base_field.erb +2 -0
- data/lib/generators/graphql/templates/base_input_object.erb +2 -0
- data/lib/generators/graphql/templates/base_interface.erb +2 -0
- data/lib/generators/graphql/templates/base_object.erb +2 -0
- data/lib/generators/graphql/templates/base_scalar.erb +2 -0
- data/lib/generators/graphql/templates/base_union.erb +2 -0
- data/lib/generators/graphql/templates/enum.erb +7 -1
- data/lib/generators/graphql/templates/graphql_controller.erb +16 -12
- data/lib/generators/graphql/templates/input.erb +9 -0
- data/lib/generators/graphql/templates/interface.erb +6 -2
- data/lib/generators/graphql/templates/loader.erb +2 -0
- data/lib/generators/graphql/templates/mutation.erb +3 -1
- data/lib/generators/graphql/templates/mutation_create.erb +20 -0
- data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
- data/lib/generators/graphql/templates/mutation_update.erb +21 -0
- data/lib/generators/graphql/templates/node_type.erb +9 -0
- data/lib/generators/graphql/templates/object.erb +7 -3
- data/lib/generators/graphql/templates/query_type.erb +3 -3
- data/lib/generators/graphql/templates/scalar.erb +5 -1
- data/lib/generators/graphql/templates/schema.erb +22 -27
- data/lib/generators/graphql/templates/union.erb +6 -2
- data/lib/generators/graphql/type_generator.rb +47 -10
- data/lib/generators/graphql/union_generator.rb +5 -5
- data/lib/graphql/analysis/analyze_query.rb +7 -0
- data/lib/graphql/analysis/ast/field_usage.rb +29 -2
- data/lib/graphql/analysis/ast/query_complexity.rb +174 -67
- data/lib/graphql/analysis/ast/visitor.rb +16 -7
- data/lib/graphql/analysis/ast.rb +21 -11
- data/lib/graphql/argument.rb +8 -36
- data/lib/graphql/backtrace/inspect_result.rb +0 -1
- data/lib/graphql/backtrace/legacy_tracer.rb +56 -0
- data/lib/graphql/backtrace/table.rb +44 -5
- data/lib/graphql/backtrace/traced_error.rb +0 -1
- data/lib/graphql/backtrace/tracer.rb +40 -9
- data/lib/graphql/backtrace.rb +28 -19
- data/lib/graphql/backwards_compatibility.rb +2 -1
- data/lib/graphql/base_type.rb +10 -4
- data/lib/graphql/boolean_type.rb +1 -1
- data/lib/graphql/compatibility/execution_specification/specification_schema.rb +2 -2
- data/lib/graphql/compatibility/execution_specification.rb +1 -0
- data/lib/graphql/compatibility/lazy_execution_specification.rb +2 -0
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +5 -9
- data/lib/graphql/compatibility/query_parser_specification.rb +2 -0
- data/lib/graphql/compatibility/schema_parser_specification.rb +2 -0
- data/lib/graphql/dataloader/null_dataloader.rb +22 -0
- data/lib/graphql/dataloader/request.rb +19 -0
- data/lib/graphql/dataloader/request_all.rb +19 -0
- data/lib/graphql/dataloader/source.rb +155 -0
- data/lib/graphql/dataloader.rb +308 -0
- data/lib/graphql/date_encoding_error.rb +16 -0
- data/lib/graphql/define/assign_enum_value.rb +1 -1
- data/lib/graphql/define/assign_global_id_field.rb +2 -2
- data/lib/graphql/define/assign_object_field.rb +1 -1
- data/lib/graphql/define/defined_object_proxy.rb +5 -8
- data/lib/graphql/define/instance_definable.rb +60 -110
- data/lib/graphql/define/type_definer.rb +5 -5
- data/lib/graphql/deprecated_dsl.rb +18 -5
- data/lib/graphql/deprecation.rb +9 -0
- data/lib/graphql/directive/deprecated_directive.rb +1 -12
- data/lib/graphql/directive/include_directive.rb +1 -1
- data/lib/graphql/directive/skip_directive.rb +1 -1
- data/lib/graphql/directive.rb +9 -6
- data/lib/graphql/enum_type.rb +14 -74
- data/lib/graphql/execution/directive_checks.rb +2 -2
- data/lib/graphql/execution/errors.rb +110 -8
- data/lib/graphql/execution/execute.rb +8 -1
- data/lib/graphql/execution/instrumentation.rb +1 -1
- data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
- data/lib/graphql/execution/interpreter/arguments.rb +88 -0
- data/lib/graphql/execution/interpreter/arguments_cache.rb +105 -0
- data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
- data/lib/graphql/execution/interpreter/resolve.rb +37 -25
- data/lib/graphql/execution/interpreter/runtime.rb +721 -386
- data/lib/graphql/execution/interpreter.rb +42 -19
- data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
- data/lib/graphql/execution/lazy.rb +5 -1
- data/lib/graphql/execution/lookahead.rb +39 -114
- data/lib/graphql/execution/multiplex.rb +50 -25
- data/lib/graphql/field.rb +15 -119
- data/lib/graphql/filter.rb +1 -1
- data/lib/graphql/float_type.rb +1 -1
- data/lib/graphql/function.rb +5 -30
- data/lib/graphql/id_type.rb +1 -1
- data/lib/graphql/input_object_type.rb +9 -25
- data/lib/graphql/int_type.rb +1 -1
- data/lib/graphql/integer_decoding_error.rb +17 -0
- data/lib/graphql/integer_encoding_error.rb +18 -2
- data/lib/graphql/interface_type.rb +10 -24
- data/lib/graphql/internal_representation/document.rb +2 -2
- data/lib/graphql/internal_representation/rewrite.rb +1 -1
- data/lib/graphql/internal_representation/scope.rb +2 -2
- data/lib/graphql/internal_representation/visit.rb +2 -2
- data/lib/graphql/introspection/base_object.rb +2 -5
- data/lib/graphql/introspection/directive_location_enum.rb +2 -2
- data/lib/graphql/introspection/directive_type.rb +12 -6
- data/lib/graphql/introspection/entry_points.rb +9 -9
- data/lib/graphql/introspection/enum_value_type.rb +2 -2
- data/lib/graphql/introspection/field_type.rb +9 -5
- data/lib/graphql/introspection/input_value_type.rb +41 -11
- data/lib/graphql/introspection/introspection_query.rb +6 -92
- data/lib/graphql/introspection/schema_type.rb +12 -12
- data/lib/graphql/introspection/type_type.rb +27 -17
- data/lib/graphql/introspection.rb +99 -0
- data/lib/graphql/invalid_null_error.rb +18 -0
- data/lib/graphql/language/block_string.rb +20 -5
- data/lib/graphql/language/cache.rb +37 -0
- data/lib/graphql/language/definition_slice.rb +21 -10
- data/lib/graphql/language/document_from_schema_definition.rb +116 -63
- data/lib/graphql/language/lexer.rb +53 -27
- data/lib/graphql/language/lexer.rl +5 -3
- data/lib/graphql/language/nodes.rb +67 -93
- data/lib/graphql/language/parser.rb +929 -896
- data/lib/graphql/language/parser.y +125 -102
- data/lib/graphql/language/printer.rb +11 -2
- data/lib/graphql/language/sanitized_printer.rb +222 -0
- data/lib/graphql/language/token.rb +0 -4
- data/lib/graphql/language/visitor.rb +2 -2
- data/lib/graphql/language.rb +3 -1
- data/lib/graphql/name_validator.rb +2 -7
- data/lib/graphql/non_null_type.rb +0 -10
- data/lib/graphql/object_type.rb +47 -58
- data/lib/graphql/pagination/active_record_relation_connection.rb +85 -0
- data/lib/graphql/pagination/array_connection.rb +77 -0
- data/lib/graphql/pagination/connection.rb +226 -0
- data/lib/graphql/pagination/connections.rb +160 -0
- data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
- data/lib/graphql/pagination/relation_connection.rb +226 -0
- data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
- data/lib/graphql/pagination.rb +6 -0
- data/lib/graphql/parse_error.rb +0 -1
- data/lib/graphql/query/arguments.rb +6 -4
- data/lib/graphql/query/arguments_cache.rb +1 -2
- data/lib/graphql/query/context.rb +52 -7
- data/lib/graphql/query/executor.rb +0 -1
- data/lib/graphql/query/fingerprint.rb +26 -0
- data/lib/graphql/query/input_validation_result.rb +32 -6
- data/lib/graphql/query/literal_input.rb +31 -11
- data/lib/graphql/query/null_context.rb +24 -8
- data/lib/graphql/query/serial_execution/field_resolution.rb +1 -1
- data/lib/graphql/query/serial_execution.rb +1 -0
- data/lib/graphql/query/validation_pipeline.rb +6 -4
- data/lib/graphql/query/variable_validation_error.rb +3 -3
- data/lib/graphql/query/variables.rb +50 -10
- data/lib/graphql/query.rb +77 -18
- data/lib/graphql/railtie.rb +9 -1
- data/lib/graphql/rake_task/validate.rb +3 -0
- data/lib/graphql/rake_task.rb +12 -9
- data/lib/graphql/relay/array_connection.rb +10 -12
- data/lib/graphql/relay/base_connection.rb +30 -13
- data/lib/graphql/relay/connection_instrumentation.rb +4 -4
- data/lib/graphql/relay/connection_type.rb +18 -4
- data/lib/graphql/relay/edge_type.rb +1 -0
- data/lib/graphql/relay/edges_instrumentation.rb +1 -2
- data/lib/graphql/relay/global_id_resolve.rb +1 -2
- data/lib/graphql/relay/mutation.rb +3 -87
- data/lib/graphql/relay/node.rb +3 -0
- data/lib/graphql/relay/page_info.rb +1 -1
- data/lib/graphql/relay/range_add.rb +27 -9
- data/lib/graphql/relay/relation_connection.rb +8 -10
- data/lib/graphql/relay/type_extensions.rb +2 -0
- data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
- data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
- data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
- data/lib/graphql/rubocop.rb +4 -0
- data/lib/graphql/scalar_type.rb +18 -60
- data/lib/graphql/schema/addition.rb +247 -0
- data/lib/graphql/schema/argument.rb +274 -18
- data/lib/graphql/schema/base_64_encoder.rb +2 -0
- data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
- data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
- data/lib/graphql/schema/build_from_definition.rb +320 -219
- data/lib/graphql/schema/built_in_types.rb +5 -5
- data/lib/graphql/schema/default_type_error.rb +2 -0
- data/lib/graphql/schema/directive/deprecated.rb +18 -0
- data/lib/graphql/schema/directive/feature.rb +1 -1
- data/lib/graphql/schema/directive/flagged.rb +57 -0
- data/lib/graphql/schema/directive/include.rb +2 -2
- data/lib/graphql/schema/directive/skip.rb +2 -2
- data/lib/graphql/schema/directive/transform.rb +14 -2
- data/lib/graphql/schema/directive.rb +130 -6
- data/lib/graphql/schema/enum.rb +121 -12
- data/lib/graphql/schema/enum_value.rb +24 -7
- data/lib/graphql/schema/field/connection_extension.rb +46 -20
- data/lib/graphql/schema/field/scope_extension.rb +1 -1
- data/lib/graphql/schema/field.rb +465 -181
- data/lib/graphql/schema/field_extension.rb +89 -2
- data/lib/graphql/schema/find_inherited_value.rb +17 -1
- data/lib/graphql/schema/finder.rb +16 -14
- data/lib/graphql/schema/input_object.rb +172 -37
- data/lib/graphql/schema/interface.rb +39 -25
- data/lib/graphql/schema/introspection_system.rb +106 -38
- data/lib/graphql/schema/late_bound_type.rb +3 -2
- data/lib/graphql/schema/list.rb +65 -1
- data/lib/graphql/schema/loader.rb +145 -102
- data/lib/graphql/schema/member/accepts_definition.rb +15 -3
- data/lib/graphql/schema/member/base_dsl_methods.rb +34 -28
- data/lib/graphql/schema/member/build_type.rb +19 -8
- data/lib/graphql/schema/member/cached_graphql_definition.rb +34 -2
- data/lib/graphql/schema/member/has_arguments.rb +206 -13
- data/lib/graphql/schema/member/has_ast_node.rb +20 -0
- data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
- data/lib/graphql/schema/member/has_directives.rb +98 -0
- data/lib/graphql/schema/member/has_fields.rb +97 -32
- data/lib/graphql/schema/member/has_interfaces.rb +100 -0
- data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
- data/lib/graphql/schema/member/has_validators.rb +31 -0
- data/lib/graphql/schema/member/instrumentation.rb +0 -1
- data/lib/graphql/schema/member/type_system_helpers.rb +3 -3
- data/lib/graphql/schema/member/validates_input.rb +33 -0
- data/lib/graphql/schema/member.rb +11 -0
- data/lib/graphql/schema/middleware_chain.rb +1 -1
- data/lib/graphql/schema/mutation.rb +4 -0
- data/lib/graphql/schema/non_null.rb +37 -1
- data/lib/graphql/schema/object.rb +51 -38
- data/lib/graphql/schema/possible_types.rb +9 -4
- data/lib/graphql/schema/printer.rb +16 -35
- data/lib/graphql/schema/relay_classic_mutation.rb +40 -4
- data/lib/graphql/schema/resolver/has_payload_type.rb +34 -4
- data/lib/graphql/schema/resolver.rb +133 -79
- data/lib/graphql/schema/scalar.rb +43 -3
- data/lib/graphql/schema/subscription.rb +57 -21
- data/lib/graphql/schema/timeout.rb +29 -15
- data/lib/graphql/schema/timeout_middleware.rb +3 -1
- data/lib/graphql/schema/traversal.rb +2 -2
- data/lib/graphql/schema/type_expression.rb +21 -13
- data/lib/graphql/schema/type_membership.rb +19 -5
- data/lib/graphql/schema/union.rb +44 -3
- data/lib/graphql/schema/unique_within_type.rb +1 -2
- data/lib/graphql/schema/validation.rb +14 -4
- data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
- data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
- data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
- data/lib/graphql/schema/validator/format_validator.rb +48 -0
- data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
- data/lib/graphql/schema/validator/length_validator.rb +59 -0
- data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
- data/lib/graphql/schema/validator/required_validator.rb +82 -0
- data/lib/graphql/schema/validator.rb +171 -0
- data/lib/graphql/schema/warden.rb +193 -34
- data/lib/graphql/schema.rb +882 -247
- data/lib/graphql/static_validation/all_rules.rb +2 -0
- data/lib/graphql/static_validation/base_visitor.rb +17 -10
- data/lib/graphql/static_validation/definition_dependencies.rb +0 -1
- data/lib/graphql/static_validation/error.rb +3 -1
- data/lib/graphql/static_validation/literal_validator.rb +51 -26
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +45 -83
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +35 -26
- data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +1 -1
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +2 -2
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -5
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +94 -51
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
- data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
- data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
- data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
- data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +4 -2
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +9 -10
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +1 -1
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +19 -14
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
- data/lib/graphql/static_validation/type_stack.rb +2 -2
- data/lib/graphql/static_validation/validation_context.rb +13 -3
- data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
- data/lib/graphql/static_validation/validator.rb +43 -9
- data/lib/graphql/static_validation.rb +1 -0
- data/lib/graphql/string_encoding_error.rb +13 -3
- data/lib/graphql/string_type.rb +1 -1
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +123 -22
- data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +21 -0
- data/lib/graphql/subscriptions/event.rb +84 -30
- data/lib/graphql/subscriptions/instrumentation.rb +10 -6
- data/lib/graphql/subscriptions/serialize.rb +53 -6
- data/lib/graphql/subscriptions/subscription_root.rb +15 -5
- data/lib/graphql/subscriptions.rb +117 -49
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
- data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +32 -15
- data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
- data/lib/graphql/tracing/notifications_tracing.rb +59 -0
- data/lib/graphql/tracing/platform_tracing.rb +66 -10
- data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +4 -1
- data/lib/graphql/tracing/prometheus_tracing.rb +8 -0
- data/lib/graphql/tracing/scout_tracing.rb +19 -0
- data/lib/graphql/tracing/skylight_tracing.rb +9 -1
- data/lib/graphql/tracing/statsd_tracing.rb +42 -0
- data/lib/graphql/tracing.rb +15 -35
- data/lib/graphql/types/big_int.rb +5 -1
- data/lib/graphql/types/int.rb +10 -3
- data/lib/graphql/types/iso_8601_date.rb +16 -8
- data/lib/graphql/types/iso_8601_date_time.rb +32 -10
- data/lib/graphql/types/relay/base_connection.rb +6 -88
- data/lib/graphql/types/relay/base_edge.rb +2 -34
- data/lib/graphql/types/relay/connection_behaviors.rb +174 -0
- data/lib/graphql/types/relay/default_relay.rb +31 -0
- data/lib/graphql/types/relay/edge_behaviors.rb +64 -0
- data/lib/graphql/types/relay/has_node_field.rb +41 -0
- data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
- data/lib/graphql/types/relay/node.rb +2 -4
- data/lib/graphql/types/relay/node_behaviors.rb +15 -0
- data/lib/graphql/types/relay/node_field.rb +3 -22
- data/lib/graphql/types/relay/nodes_field.rb +16 -18
- data/lib/graphql/types/relay/page_info.rb +2 -14
- data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
- data/lib/graphql/types/relay.rb +11 -3
- data/lib/graphql/types/string.rb +8 -2
- data/lib/graphql/unauthorized_error.rb +2 -2
- data/lib/graphql/union_type.rb +5 -25
- data/lib/graphql/unresolved_type_error.rb +2 -2
- data/lib/graphql/upgrader/member.rb +1 -0
- data/lib/graphql/upgrader/schema.rb +1 -0
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +87 -31
- data/readme.md +3 -6
- metadata +126 -124
- data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
- data/lib/graphql/literal_validation_error.rb +0 -6
- data/lib/graphql/types/relay/base_field.rb +0 -22
- data/lib/graphql/types/relay/base_interface.rb +0 -29
- data/lib/graphql/types/relay/base_object.rb +0 -26
|
@@ -9,7 +9,7 @@ module GraphQL
|
|
|
9
9
|
# should be ordered and paginated before providing it here.
|
|
10
10
|
#
|
|
11
11
|
# @example Adding a comment to list of comments
|
|
12
|
-
# post = Post.find(args[:
|
|
12
|
+
# post = Post.find(args[:post_id])
|
|
13
13
|
# comments = post.comments
|
|
14
14
|
# new_comment = comments.build(body: args[:body])
|
|
15
15
|
# new_comment.save!
|
|
@@ -18,13 +18,13 @@ module GraphQL
|
|
|
18
18
|
# parent: post,
|
|
19
19
|
# collection: comments,
|
|
20
20
|
# item: new_comment,
|
|
21
|
-
# context:
|
|
21
|
+
# context: context,
|
|
22
22
|
# )
|
|
23
23
|
#
|
|
24
24
|
# response = {
|
|
25
25
|
# post: post,
|
|
26
|
-
#
|
|
27
|
-
#
|
|
26
|
+
# comments_connection: range_add.connection,
|
|
27
|
+
# new_comment_edge: range_add.edge,
|
|
28
28
|
# }
|
|
29
29
|
class RangeAdd
|
|
30
30
|
attr_reader :edge, :connection, :parent
|
|
@@ -33,12 +33,30 @@ module GraphQL
|
|
|
33
33
|
# @param item [Object] The newly-added item (will be wrapped in `edge_class`)
|
|
34
34
|
# @param parent [Object] The owner of `collection`, will be passed to the connection if provided
|
|
35
35
|
# @param context [GraphQL::Query::Context] The surrounding `ctx`, will be passed to the connection if provided (this is required for cursor encoders)
|
|
36
|
-
# @param edge_class [Class] The class to wrap `item` with
|
|
37
|
-
def initialize(collection:, item:, parent: nil, context: nil, edge_class:
|
|
38
|
-
|
|
36
|
+
# @param edge_class [Class] The class to wrap `item` with (defaults to the connection's edge class)
|
|
37
|
+
def initialize(collection:, item:, parent: nil, context: nil, edge_class: nil)
|
|
38
|
+
if context.nil?
|
|
39
|
+
caller_loc = caller(2, 1).first
|
|
40
|
+
GraphQL::Deprecation.warn("`context: ...` will be required by `RangeAdd.new` in GraphQL-Ruby 2.0. Add `context: context` to the call at #{caller_loc}.")
|
|
41
|
+
end
|
|
42
|
+
if context && context.schema.new_connections?
|
|
43
|
+
conn_class = context.schema.connections.wrapper_for(collection)
|
|
44
|
+
# The rest will be added by ConnectionExtension
|
|
45
|
+
@connection = conn_class.new(collection, parent: parent, context: context, edge_class: edge_class)
|
|
46
|
+
# Check if this connection supports it, to support old versions of GraphQL-Pro
|
|
47
|
+
@edge = if @connection.respond_to?(:range_add_edge)
|
|
48
|
+
@connection.range_add_edge(item)
|
|
49
|
+
else
|
|
50
|
+
@connection.edge_class.new(item, @connection)
|
|
51
|
+
end
|
|
52
|
+
else
|
|
53
|
+
connection_class = BaseConnection.connection_for_nodes(collection)
|
|
54
|
+
@connection = connection_class.new(collection, {}, parent: parent, context: context)
|
|
55
|
+
edge_class ||= Relay::Edge
|
|
56
|
+
@edge = edge_class.new(item, @connection)
|
|
57
|
+
end
|
|
58
|
+
|
|
39
59
|
@parent = parent
|
|
40
|
-
@connection = connection_class.new(collection, {}, parent: parent, context: context)
|
|
41
|
-
@edge = edge_class.new(item, @connection)
|
|
42
60
|
end
|
|
43
61
|
end
|
|
44
62
|
end
|
|
@@ -50,19 +50,17 @@ module GraphQL
|
|
|
50
50
|
end
|
|
51
51
|
|
|
52
52
|
def first
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
@first ||= begin
|
|
54
|
+
capped = limit_pagination_argument(arguments[:first], max_page_size)
|
|
55
|
+
if capped.nil? && last.nil?
|
|
56
|
+
capped = max_page_size
|
|
57
|
+
end
|
|
58
|
+
capped
|
|
59
|
+
end
|
|
58
60
|
end
|
|
59
61
|
|
|
60
62
|
def last
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
@last = get_limited_arg(:last)
|
|
64
|
-
@last = max_page_size if @last && max_page_size && @last > max_page_size
|
|
65
|
-
@last
|
|
63
|
+
@last ||= limit_pagination_argument(arguments[:last], max_page_size)
|
|
66
64
|
end
|
|
67
65
|
|
|
68
66
|
private
|
|
@@ -12,6 +12,7 @@ module GraphQL
|
|
|
12
12
|
# Define a custom connection type for this object type
|
|
13
13
|
# @return [GraphQL::ObjectType]
|
|
14
14
|
def define_connection(**kwargs, &block)
|
|
15
|
+
GraphQL::Deprecation.warn ".connection_type and .define_connection will be removed from GraphQL-Ruby 2.0, use class-based type definitions instead: https://graphql-ruby.org/schema/class_based_api.html"
|
|
15
16
|
GraphQL::Relay::ConnectionType.create_type(self, **kwargs, &block)
|
|
16
17
|
end
|
|
17
18
|
|
|
@@ -23,6 +24,7 @@ module GraphQL
|
|
|
23
24
|
# Define a custom edge type for this object type
|
|
24
25
|
# @return [GraphQL::ObjectType]
|
|
25
26
|
def define_edge(**kwargs, &block)
|
|
27
|
+
GraphQL::Deprecation.warn ".edge_type and .define_edge will be removed from GraphQL-Ruby 2.0, use class-based type definitions instead: https://graphql-ruby.org/schema/class_based_api.html"
|
|
26
28
|
GraphQL::Relay::EdgeType.create_type(self, **kwargs, &block)
|
|
27
29
|
end
|
|
28
30
|
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require "rubocop"
|
|
3
|
+
|
|
4
|
+
module GraphQL
|
|
5
|
+
module Rubocop
|
|
6
|
+
module GraphQL
|
|
7
|
+
class BaseCop < RuboCop::Cop::Base
|
|
8
|
+
extend RuboCop::Cop::AutoCorrector
|
|
9
|
+
|
|
10
|
+
# Return the source of `send_node`, but without the keyword argument represented by `pair_node`
|
|
11
|
+
def source_without_keyword_argument(send_node, pair_node)
|
|
12
|
+
# work back to the preceeding comma
|
|
13
|
+
first_pos = pair_node.location.expression.begin_pos
|
|
14
|
+
end_pos = pair_node.location.expression.end_pos
|
|
15
|
+
node_source = send_node.source_range.source
|
|
16
|
+
node_first_pos = send_node.location.expression.begin_pos
|
|
17
|
+
|
|
18
|
+
relative_first_pos = first_pos - node_first_pos
|
|
19
|
+
relative_last_pos = end_pos - node_first_pos
|
|
20
|
+
|
|
21
|
+
begin_removal_pos = relative_first_pos
|
|
22
|
+
while node_source[begin_removal_pos] != ","
|
|
23
|
+
begin_removal_pos -= 1
|
|
24
|
+
if begin_removal_pos < 1
|
|
25
|
+
raise "Invariant: somehow backtracked to beginning of node looking for a comma (node source: #{node_source.inspect})"
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end_removal_pos = relative_last_pos
|
|
30
|
+
cleaned_node_source = node_source[0...begin_removal_pos] + node_source[end_removal_pos..-1]
|
|
31
|
+
cleaned_node_source
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require_relative "base_cop"
|
|
3
|
+
|
|
4
|
+
module GraphQL
|
|
5
|
+
module Rubocop
|
|
6
|
+
module GraphQL
|
|
7
|
+
# Identify (and auto-correct) any field configuration which duplicates
|
|
8
|
+
# the default `null: true` property.
|
|
9
|
+
#
|
|
10
|
+
# `null: true` is default because nullable fields can always be converted
|
|
11
|
+
# to non-null fields (`null: false`) without a breaking change. (The opposite change, from `null: false`
|
|
12
|
+
# to `null: true`, change.)
|
|
13
|
+
#
|
|
14
|
+
# @example
|
|
15
|
+
# # Both of these define `name: String` in GraphQL:
|
|
16
|
+
#
|
|
17
|
+
# # bad
|
|
18
|
+
# field :name, String, null: true
|
|
19
|
+
#
|
|
20
|
+
# # good
|
|
21
|
+
# field :name, String
|
|
22
|
+
#
|
|
23
|
+
class DefaultNullTrue < BaseCop
|
|
24
|
+
MSG = "`null: true` is the default and can be removed."
|
|
25
|
+
|
|
26
|
+
def_node_matcher :field_config_with_null_true?, <<-Pattern
|
|
27
|
+
(
|
|
28
|
+
send nil? :field ... (hash $(pair (sym :null) (true)) ...)
|
|
29
|
+
)
|
|
30
|
+
Pattern
|
|
31
|
+
|
|
32
|
+
def on_send(node)
|
|
33
|
+
field_config_with_null_true?(node) do |null_config|
|
|
34
|
+
add_offense(null_config) do |corrector|
|
|
35
|
+
cleaned_node_source = source_without_keyword_argument(node, null_config)
|
|
36
|
+
corrector.replace(node.source_range, cleaned_node_source)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require_relative "./base_cop"
|
|
3
|
+
|
|
4
|
+
module GraphQL
|
|
5
|
+
module Rubocop
|
|
6
|
+
module GraphQL
|
|
7
|
+
# Identify (and auto-correct) any argument configuration which duplicates
|
|
8
|
+
# the default `required: true` property.
|
|
9
|
+
#
|
|
10
|
+
# `required: true` is default because required arguments can always be converted
|
|
11
|
+
# to optional arguments (`required: false`) without a breaking change. (The opposite change, from `required: false`
|
|
12
|
+
# to `required: true`, change.)
|
|
13
|
+
#
|
|
14
|
+
# @example
|
|
15
|
+
# # Both of these define `id: ID!` in GraphQL:
|
|
16
|
+
#
|
|
17
|
+
# # bad
|
|
18
|
+
# argument :id, ID, required: true
|
|
19
|
+
#
|
|
20
|
+
# # good
|
|
21
|
+
# argument :id, ID
|
|
22
|
+
#
|
|
23
|
+
class DefaultRequiredTrue < BaseCop
|
|
24
|
+
MSG = "`required: true` is the default and can be removed."
|
|
25
|
+
|
|
26
|
+
def_node_matcher :argument_config_with_required_true?, <<-Pattern
|
|
27
|
+
(
|
|
28
|
+
send {nil? _} :argument ... (hash <$(pair (sym :required) (true)) ...>)
|
|
29
|
+
)
|
|
30
|
+
Pattern
|
|
31
|
+
|
|
32
|
+
def on_send(node)
|
|
33
|
+
argument_config_with_required_true?(node) do |required_config|
|
|
34
|
+
add_offense(required_config) do |corrector|
|
|
35
|
+
cleaned_node_source = source_without_keyword_argument(node, required_config)
|
|
36
|
+
corrector.replace(node, cleaned_node_source)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
data/lib/graphql/scalar_type.rb
CHANGED
|
@@ -1,65 +1,10 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
module GraphQL
|
|
3
|
-
#
|
|
4
|
-
#
|
|
5
|
-
# Scalars are plain values. They are leaf nodes in a GraphQL query tree.
|
|
6
|
-
#
|
|
7
|
-
# ## Built-in Scalars
|
|
8
|
-
#
|
|
9
|
-
# `GraphQL` comes with standard built-in scalars:
|
|
10
|
-
#
|
|
11
|
-
# |Constant | `.define` helper|
|
|
12
|
-
# |-------|--------|
|
|
13
|
-
# |`GraphQL::STRING_TYPE` | `types.String`|
|
|
14
|
-
# |`GraphQL::INT_TYPE` | `types.Int`|
|
|
15
|
-
# |`GraphQL::FLOAT_TYPE` | `types.Float`|
|
|
16
|
-
# |`GraphQL::ID_TYPE` | `types.ID`|
|
|
17
|
-
# |`GraphQL::BOOLEAN_TYPE` | `types.Boolean`|
|
|
18
|
-
#
|
|
19
|
-
# (`types` is an instance of `GraphQL::Definition::TypeDefiner`; `.String`, `.Float`, etc are methods which return built-in scalars.)
|
|
20
|
-
#
|
|
21
|
-
# ## Custom Scalars
|
|
22
|
-
#
|
|
23
|
-
# You can define custom scalars for your GraphQL server. It requires some special functions:
|
|
24
|
-
#
|
|
25
|
-
# - `coerce_input` is used to prepare incoming values for GraphQL execution. (Incoming values come from variables or literal values in the query string.)
|
|
26
|
-
# - `coerce_result` is used to turn Ruby values _back_ into serializable values for query responses.
|
|
27
|
-
#
|
|
28
|
-
# @example defining a type for Time
|
|
29
|
-
# TimeType = GraphQL::ScalarType.define do
|
|
30
|
-
# name "Time"
|
|
31
|
-
# description "Time since epoch in seconds"
|
|
32
|
-
#
|
|
33
|
-
# coerce_input ->(value, ctx) { Time.at(Float(value)) }
|
|
34
|
-
# coerce_result ->(value, ctx) { value.to_f }
|
|
35
|
-
# end
|
|
36
|
-
#
|
|
37
|
-
#
|
|
38
|
-
# You can customize the error message for invalid input values by raising a `GraphQL::CoercionError` within `coerce_input`:
|
|
39
|
-
#
|
|
40
|
-
# @example raising a custom error message
|
|
41
|
-
# TimeType = GraphQL::ScalarType.define do
|
|
42
|
-
# name "Time"
|
|
43
|
-
# description "Time since epoch in seconds"
|
|
44
|
-
#
|
|
45
|
-
# coerce_input ->(value, ctx) do
|
|
46
|
-
# begin
|
|
47
|
-
# Time.at(Float(value))
|
|
48
|
-
# rescue ArgumentError
|
|
49
|
-
# raise GraphQL::CoercionError, "cannot coerce `#{value.inspect}` to Float"
|
|
50
|
-
# end
|
|
51
|
-
# end
|
|
52
|
-
#
|
|
53
|
-
# coerce_result ->(value, ctx) { value.to_f }
|
|
54
|
-
# end
|
|
55
|
-
#
|
|
56
|
-
# This will result in the message of the `GraphQL::CoercionError` being used in the error response:
|
|
57
|
-
#
|
|
58
|
-
# @example custom error response
|
|
59
|
-
# {"message"=>"cannot coerce `"2"` to Float", "locations"=>[{"line"=>3, "column"=>9}], "fields"=>["arg"]}
|
|
60
|
-
#
|
|
3
|
+
# @api deprecated
|
|
61
4
|
class ScalarType < GraphQL::BaseType
|
|
62
|
-
|
|
5
|
+
extend Define::InstanceDefinable::DeprecatedDefine
|
|
6
|
+
|
|
7
|
+
deprecated_accepts_definitions :coerce, :coerce_input, :coerce_result
|
|
63
8
|
ensure_defined :coerce_non_null_input, :coerce_result
|
|
64
9
|
|
|
65
10
|
module NoOpCoerce
|
|
@@ -124,8 +69,21 @@ module GraphQL
|
|
|
124
69
|
|
|
125
70
|
def validate_non_null_input(value, ctx)
|
|
126
71
|
result = Query::InputValidationResult.new
|
|
127
|
-
|
|
72
|
+
|
|
73
|
+
coerced_result = begin
|
|
74
|
+
coerce_non_null_input(value, ctx)
|
|
75
|
+
rescue GraphQL::CoercionError => err
|
|
76
|
+
err
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
if value.is_a?(GraphQL::Language::Nodes::Enum) || coerced_result.nil?
|
|
128
80
|
result.add_problem("Could not coerce value #{GraphQL::Language.serialize(value)} to #{name}")
|
|
81
|
+
elsif coerced_result.is_a?(GraphQL::CoercionError)
|
|
82
|
+
result.add_problem(
|
|
83
|
+
coerced_result.message,
|
|
84
|
+
message: coerced_result.message,
|
|
85
|
+
extensions: coerced_result.extensions
|
|
86
|
+
)
|
|
129
87
|
end
|
|
130
88
|
result
|
|
131
89
|
end
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module GraphQL
|
|
4
|
+
class Schema
|
|
5
|
+
class Addition
|
|
6
|
+
attr_reader :directives, :possible_types, :types, :union_memberships, :references, :arguments_with_default_values
|
|
7
|
+
|
|
8
|
+
def initialize(schema:, own_types:, new_types:)
|
|
9
|
+
@schema = schema
|
|
10
|
+
@own_types = own_types
|
|
11
|
+
@directives = Set.new
|
|
12
|
+
@possible_types = {}
|
|
13
|
+
@types = {}
|
|
14
|
+
@union_memberships = {}
|
|
15
|
+
@references = Hash.new { |h, k| h[k] = [] }
|
|
16
|
+
@arguments_with_default_values = []
|
|
17
|
+
add_type_and_traverse(new_types)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
def references_to(thing, from:)
|
|
23
|
+
@references[thing] << from
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def get_type(name)
|
|
27
|
+
local_type = @types[name]
|
|
28
|
+
# This isn't really sophisticated, but
|
|
29
|
+
# I think it's good enough to support the current usage of LateBoundTypes
|
|
30
|
+
if local_type.is_a?(Array)
|
|
31
|
+
local_type = local_type.first
|
|
32
|
+
end
|
|
33
|
+
local_type || @schema.get_type(name)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Lookup using `own_types` here because it's ok to override
|
|
37
|
+
# inherited types by name
|
|
38
|
+
def get_local_type(name)
|
|
39
|
+
@types[name] || @own_types[name]
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def add_directives_from(owner)
|
|
43
|
+
dirs = owner.directives.map(&:class)
|
|
44
|
+
@directives.merge(dirs)
|
|
45
|
+
add_type_and_traverse(dirs)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def add_type_and_traverse(new_types)
|
|
49
|
+
late_types = []
|
|
50
|
+
new_types.each { |t| add_type(t, owner: nil, late_types: late_types, path: [t.graphql_name]) }
|
|
51
|
+
missed_late_types = 0
|
|
52
|
+
while (late_type_vals = late_types.shift)
|
|
53
|
+
type_owner, lt = late_type_vals
|
|
54
|
+
if lt.is_a?(String)
|
|
55
|
+
type = Member::BuildType.constantize(lt)
|
|
56
|
+
# Reset the counter, since we might succeed next go-round
|
|
57
|
+
missed_late_types = 0
|
|
58
|
+
update_type_owner(type_owner, type)
|
|
59
|
+
add_type(type, owner: type_owner, late_types: late_types, path: [type.graphql_name])
|
|
60
|
+
elsif lt.is_a?(LateBoundType)
|
|
61
|
+
if (type = get_type(lt.name))
|
|
62
|
+
# Reset the counter, since we might succeed next go-round
|
|
63
|
+
missed_late_types = 0
|
|
64
|
+
update_type_owner(type_owner, type)
|
|
65
|
+
add_type(type, owner: type_owner, late_types: late_types, path: [type.graphql_name])
|
|
66
|
+
else
|
|
67
|
+
missed_late_types += 1
|
|
68
|
+
# Add it back to the list, maybe we'll be able to resolve it later.
|
|
69
|
+
late_types << [type_owner, lt]
|
|
70
|
+
if missed_late_types == late_types.size
|
|
71
|
+
# We've looked at all of them and haven't resolved one.
|
|
72
|
+
raise UnresolvedLateBoundTypeError.new(type: lt)
|
|
73
|
+
else
|
|
74
|
+
# Try the next one
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
else
|
|
78
|
+
raise ArgumentError, "Unexpected late type: #{lt.inspect}"
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
nil
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def update_type_owner(owner, type)
|
|
85
|
+
case owner
|
|
86
|
+
when Module
|
|
87
|
+
if owner.kind.union?
|
|
88
|
+
# It's a union with possible_types
|
|
89
|
+
# Replace the item by class name
|
|
90
|
+
owner.assign_type_membership_object_type(type)
|
|
91
|
+
@possible_types[owner.graphql_name] = owner.possible_types
|
|
92
|
+
elsif type.kind.interface? && (owner.kind.object? || owner.kind.interface?)
|
|
93
|
+
new_interfaces = []
|
|
94
|
+
owner.interfaces.each do |int_t|
|
|
95
|
+
if int_t.is_a?(String) && int_t == type.graphql_name
|
|
96
|
+
new_interfaces << type
|
|
97
|
+
elsif int_t.is_a?(LateBoundType) && int_t.graphql_name == type.graphql_name
|
|
98
|
+
new_interfaces << type
|
|
99
|
+
else
|
|
100
|
+
# Don't re-add proper interface definitions,
|
|
101
|
+
# they were probably already added, maybe with options.
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
owner.implements(*new_interfaces)
|
|
105
|
+
new_interfaces.each do |int|
|
|
106
|
+
pt = @possible_types[int.graphql_name] ||= []
|
|
107
|
+
if !pt.include?(owner) && owner.is_a?(Class)
|
|
108
|
+
pt << owner
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
when nil
|
|
113
|
+
# It's a root type
|
|
114
|
+
@types[type.graphql_name] = type
|
|
115
|
+
when GraphQL::Schema::Field, GraphQL::Schema::Argument
|
|
116
|
+
orig_type = owner.type
|
|
117
|
+
# Apply list/non-null wrapper as needed
|
|
118
|
+
if orig_type.respond_to?(:of_type)
|
|
119
|
+
transforms = []
|
|
120
|
+
while (orig_type.respond_to?(:of_type))
|
|
121
|
+
if orig_type.kind.non_null?
|
|
122
|
+
transforms << :to_non_null_type
|
|
123
|
+
elsif orig_type.kind.list?
|
|
124
|
+
transforms << :to_list_type
|
|
125
|
+
else
|
|
126
|
+
raise "Invariant: :of_type isn't non-null or list"
|
|
127
|
+
end
|
|
128
|
+
orig_type = orig_type.of_type
|
|
129
|
+
end
|
|
130
|
+
transforms.reverse_each { |t| type = type.public_send(t) }
|
|
131
|
+
end
|
|
132
|
+
owner.type = type
|
|
133
|
+
else
|
|
134
|
+
raise "Unexpected update: #{owner.inspect} #{type.inspect}"
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def add_type(type, owner:, late_types:, path:)
|
|
139
|
+
if type.respond_to?(:metadata) && type.metadata.is_a?(Hash)
|
|
140
|
+
type_class = type.metadata[:type_class]
|
|
141
|
+
if type_class.nil?
|
|
142
|
+
raise ArgumentError, "Can't add legacy type: #{type} (#{type.class})"
|
|
143
|
+
else
|
|
144
|
+
type = type_class
|
|
145
|
+
end
|
|
146
|
+
elsif type.is_a?(String) || type.is_a?(GraphQL::Schema::LateBoundType)
|
|
147
|
+
late_types << [owner, type]
|
|
148
|
+
return
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
if owner.is_a?(Class) && owner < GraphQL::Schema::Union
|
|
152
|
+
um = @union_memberships[type.graphql_name] ||= []
|
|
153
|
+
um << owner
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
if (prev_type = get_local_type(type.graphql_name)) && prev_type == type
|
|
157
|
+
# No need to re-visit
|
|
158
|
+
elsif type.is_a?(Class) && type < GraphQL::Schema::Directive
|
|
159
|
+
@directives << type
|
|
160
|
+
type.all_argument_definitions.each do |arg|
|
|
161
|
+
arg_type = arg.type.unwrap
|
|
162
|
+
references_to(arg_type, from: arg)
|
|
163
|
+
add_type(arg_type, owner: arg, late_types: late_types, path: path + [arg.graphql_name])
|
|
164
|
+
if arg.default_value?
|
|
165
|
+
@arguments_with_default_values << arg
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
else
|
|
169
|
+
prev_type = @types[type.graphql_name]
|
|
170
|
+
if prev_type.nil?
|
|
171
|
+
@types[type.graphql_name] = type
|
|
172
|
+
elsif prev_type.is_a?(Array)
|
|
173
|
+
prev_type << type
|
|
174
|
+
else
|
|
175
|
+
@types[type.graphql_name] = [prev_type, type]
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
add_directives_from(type)
|
|
179
|
+
if type.kind.fields?
|
|
180
|
+
type.all_field_definitions.each do |field|
|
|
181
|
+
name = field.graphql_name
|
|
182
|
+
field_type = field.type.unwrap
|
|
183
|
+
references_to(field_type, from: field)
|
|
184
|
+
field_path = path + [name]
|
|
185
|
+
add_type(field_type, owner: field, late_types: late_types, path: field_path)
|
|
186
|
+
add_directives_from(field)
|
|
187
|
+
field.all_argument_definitions.each do |arg|
|
|
188
|
+
add_directives_from(arg)
|
|
189
|
+
arg_type = arg.type.unwrap
|
|
190
|
+
references_to(arg_type, from: arg)
|
|
191
|
+
add_type(arg_type, owner: arg, late_types: late_types, path: field_path + [arg.graphql_name])
|
|
192
|
+
if arg.default_value?
|
|
193
|
+
@arguments_with_default_values << arg
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
if type.kind.input_object?
|
|
199
|
+
type.all_argument_definitions.each do |arg|
|
|
200
|
+
add_directives_from(arg)
|
|
201
|
+
arg_type = arg.type.unwrap
|
|
202
|
+
references_to(arg_type, from: arg)
|
|
203
|
+
add_type(arg_type, owner: arg, late_types: late_types, path: path + [arg.graphql_name])
|
|
204
|
+
if arg.default_value?
|
|
205
|
+
@arguments_with_default_values << arg
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
if type.kind.union?
|
|
210
|
+
@possible_types[type.graphql_name] = type.all_possible_types
|
|
211
|
+
type.all_possible_types.each do |t|
|
|
212
|
+
add_type(t, owner: type, late_types: late_types, path: path + ["possible_types"])
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
if type.kind.interface?
|
|
216
|
+
type.orphan_types.each do |t|
|
|
217
|
+
add_type(t, owner: type, late_types: late_types, path: path + ["orphan_types"])
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
if type.kind.object?
|
|
221
|
+
possible_types_for_this_name = @possible_types[type.graphql_name] ||= []
|
|
222
|
+
possible_types_for_this_name << type
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
if type.kind.object? || type.kind.interface?
|
|
226
|
+
type.interface_type_memberships.each do |interface_type_membership|
|
|
227
|
+
case interface_type_membership
|
|
228
|
+
when Schema::TypeMembership
|
|
229
|
+
interface_type = interface_type_membership.abstract_type
|
|
230
|
+
# We can get these now; we'll have to get late-bound types later
|
|
231
|
+
if interface_type.is_a?(Module) && type.is_a?(Class)
|
|
232
|
+
implementers = @possible_types[interface_type.graphql_name] ||= []
|
|
233
|
+
implementers << type
|
|
234
|
+
end
|
|
235
|
+
when String, Schema::LateBoundType
|
|
236
|
+
interface_type = interface_type_membership
|
|
237
|
+
else
|
|
238
|
+
raise ArgumentError, "Invariant: unexpected type membership for #{type.graphql_name}: #{interface_type_membership.class} (#{interface_type_membership.inspect})"
|
|
239
|
+
end
|
|
240
|
+
add_type(interface_type, owner: type, late_types: late_types, path: path + ["implements"])
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
end
|