graphql 1.9.17 → 2.0.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of graphql might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/generators/graphql/core.rb +21 -10
- data/lib/generators/graphql/enum_generator.rb +4 -10
- data/lib/generators/graphql/field_extractor.rb +31 -0
- data/lib/generators/graphql/input_generator.rb +50 -0
- data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
- data/lib/generators/graphql/{templates → install/templates}/base_mutation.erb +2 -0
- data/lib/generators/graphql/{templates → install/templates}/mutation_type.erb +2 -0
- data/lib/generators/graphql/install_generator.rb +45 -8
- data/lib/generators/graphql/interface_generator.rb +7 -7
- data/lib/generators/graphql/loader_generator.rb +1 -0
- data/lib/generators/graphql/mutation_create_generator.rb +22 -0
- data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
- data/lib/generators/graphql/mutation_generator.rb +6 -30
- data/lib/generators/graphql/mutation_update_generator.rb +22 -0
- data/lib/generators/graphql/object_generator.rb +28 -12
- data/lib/generators/graphql/orm_mutations_base.rb +40 -0
- data/lib/generators/graphql/relay.rb +49 -0
- data/lib/generators/graphql/relay_generator.rb +21 -0
- data/lib/generators/graphql/scalar_generator.rb +4 -2
- data/lib/generators/graphql/templates/base_argument.erb +2 -0
- data/lib/generators/graphql/templates/base_connection.erb +8 -0
- data/lib/generators/graphql/templates/base_edge.erb +8 -0
- data/lib/generators/graphql/templates/base_enum.erb +2 -0
- data/lib/generators/graphql/templates/base_field.erb +2 -0
- data/lib/generators/graphql/templates/base_input_object.erb +2 -0
- data/lib/generators/graphql/templates/base_interface.erb +2 -0
- data/lib/generators/graphql/templates/base_object.erb +2 -0
- data/lib/generators/graphql/templates/base_scalar.erb +2 -0
- data/lib/generators/graphql/templates/base_union.erb +2 -0
- data/lib/generators/graphql/templates/enum.erb +7 -1
- data/lib/generators/graphql/templates/graphql_controller.erb +16 -12
- data/lib/generators/graphql/templates/input.erb +9 -0
- data/lib/generators/graphql/templates/interface.erb +6 -2
- data/lib/generators/graphql/templates/loader.erb +2 -0
- data/lib/generators/graphql/templates/mutation.erb +3 -1
- data/lib/generators/graphql/templates/mutation_create.erb +20 -0
- data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
- data/lib/generators/graphql/templates/mutation_update.erb +21 -0
- data/lib/generators/graphql/templates/node_type.erb +9 -0
- data/lib/generators/graphql/templates/object.erb +7 -3
- data/lib/generators/graphql/templates/query_type.erb +3 -3
- data/lib/generators/graphql/templates/scalar.erb +5 -1
- data/lib/generators/graphql/templates/schema.erb +25 -27
- data/lib/generators/graphql/templates/union.erb +6 -2
- data/lib/generators/graphql/type_generator.rb +47 -10
- data/lib/generators/graphql/union_generator.rb +5 -5
- data/lib/graphql/analysis/ast/field_usage.rb +31 -2
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
- data/lib/graphql/analysis/ast/query_complexity.rb +175 -68
- data/lib/graphql/analysis/ast/query_depth.rb +0 -1
- data/lib/graphql/analysis/ast/visitor.rb +54 -38
- data/lib/graphql/analysis/ast.rb +16 -16
- data/lib/graphql/analysis.rb +0 -7
- data/lib/graphql/backtrace/inspect_result.rb +0 -1
- data/lib/graphql/backtrace/table.rb +37 -16
- data/lib/graphql/backtrace/trace.rb +96 -0
- data/lib/graphql/backtrace/traced_error.rb +0 -1
- data/lib/graphql/backtrace/tracer.rb +39 -9
- data/lib/graphql/backtrace.rb +26 -18
- data/lib/graphql/dataloader/null_dataloader.rb +24 -0
- data/lib/graphql/dataloader/request.rb +19 -0
- data/lib/graphql/dataloader/request_all.rb +19 -0
- data/lib/graphql/dataloader/source.rb +164 -0
- data/lib/graphql/dataloader.rb +311 -0
- data/lib/graphql/date_encoding_error.rb +16 -0
- data/lib/graphql/deprecation.rb +9 -0
- data/lib/graphql/dig.rb +1 -1
- data/lib/graphql/execution/directive_checks.rb +2 -2
- data/lib/graphql/execution/errors.rb +77 -45
- data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
- data/lib/graphql/execution/interpreter/arguments.rb +88 -0
- data/lib/graphql/execution/interpreter/arguments_cache.rb +104 -0
- data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
- data/lib/graphql/execution/interpreter/resolve.rb +62 -24
- data/lib/graphql/execution/interpreter/runtime.rb +830 -417
- data/lib/graphql/execution/interpreter.rb +206 -74
- data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
- data/lib/graphql/execution/lazy.rb +11 -21
- data/lib/graphql/execution/lookahead.rb +65 -136
- data/lib/graphql/execution/multiplex.rb +6 -152
- data/lib/graphql/execution.rb +11 -4
- data/lib/graphql/filter.rb +8 -3
- data/lib/graphql/integer_decoding_error.rb +17 -0
- data/lib/graphql/integer_encoding_error.rb +18 -2
- data/lib/graphql/introspection/base_object.rb +2 -5
- data/lib/graphql/introspection/directive_location_enum.rb +2 -2
- data/lib/graphql/introspection/directive_type.rb +12 -6
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +5 -18
- data/lib/graphql/introspection/enum_value_type.rb +2 -2
- data/lib/graphql/introspection/field_type.rb +9 -5
- data/lib/graphql/introspection/input_value_type.rb +41 -11
- data/lib/graphql/introspection/introspection_query.rb +6 -92
- data/lib/graphql/introspection/schema_type.rb +12 -12
- data/lib/graphql/introspection/type_type.rb +34 -17
- data/lib/graphql/introspection.rb +100 -0
- data/lib/graphql/invalid_null_error.rb +18 -0
- data/lib/graphql/language/block_string.rb +20 -5
- data/lib/graphql/language/cache.rb +37 -0
- data/lib/graphql/language/definition_slice.rb +21 -10
- data/lib/graphql/language/document_from_schema_definition.rb +136 -78
- data/lib/graphql/language/lexer.rb +216 -1462
- data/lib/graphql/language/nodes.rb +129 -132
- data/lib/graphql/language/parser.rb +994 -932
- data/lib/graphql/language/parser.y +152 -120
- data/lib/graphql/language/printer.rb +48 -23
- data/lib/graphql/language/sanitized_printer.rb +222 -0
- data/lib/graphql/language/token.rb +0 -4
- data/lib/graphql/language/visitor.rb +192 -84
- data/lib/graphql/language.rb +3 -1
- data/lib/graphql/name_validator.rb +2 -7
- data/lib/graphql/pagination/active_record_relation_connection.rb +77 -0
- data/lib/graphql/pagination/array_connection.rb +79 -0
- data/lib/graphql/pagination/connection.rb +253 -0
- data/lib/graphql/pagination/connections.rb +135 -0
- data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
- data/lib/graphql/pagination/relation_connection.rb +228 -0
- data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
- data/lib/graphql/pagination.rb +6 -0
- data/lib/graphql/parse_error.rb +0 -1
- data/lib/graphql/query/context.rb +205 -203
- data/lib/graphql/query/fingerprint.rb +26 -0
- data/lib/graphql/query/input_validation_result.rb +33 -7
- data/lib/graphql/query/null_context.rb +22 -9
- data/lib/graphql/query/validation_pipeline.rb +16 -38
- data/lib/graphql/query/variable_validation_error.rb +3 -3
- data/lib/graphql/query/variables.rb +39 -12
- data/lib/graphql/query.rb +95 -43
- data/lib/graphql/railtie.rb +6 -102
- data/lib/graphql/rake_task/validate.rb +4 -1
- data/lib/graphql/rake_task.rb +41 -10
- data/lib/graphql/relay/range_add.rb +17 -10
- data/lib/graphql/relay.rb +0 -15
- data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
- data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
- data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
- data/lib/graphql/rubocop.rb +4 -0
- data/lib/graphql/schema/addition.rb +245 -0
- data/lib/graphql/schema/argument.rb +285 -36
- data/lib/graphql/schema/base_64_encoder.rb +2 -0
- data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
- data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
- data/lib/graphql/schema/build_from_definition.rb +348 -205
- data/lib/graphql/schema/built_in_types.rb +5 -5
- data/lib/graphql/schema/directive/deprecated.rb +18 -0
- data/lib/graphql/schema/directive/feature.rb +1 -1
- data/lib/graphql/schema/directive/flagged.rb +57 -0
- data/lib/graphql/schema/directive/include.rb +2 -2
- data/lib/graphql/schema/directive/one_of.rb +12 -0
- data/lib/graphql/schema/directive/skip.rb +2 -2
- data/lib/graphql/schema/directive/transform.rb +14 -2
- data/lib/graphql/schema/directive.rb +134 -15
- data/lib/graphql/schema/enum.rb +137 -39
- data/lib/graphql/schema/enum_value.rb +17 -23
- data/lib/graphql/schema/field/connection_extension.rb +50 -20
- data/lib/graphql/schema/field/scope_extension.rb +1 -1
- data/lib/graphql/schema/field.rb +504 -331
- data/lib/graphql/schema/field_extension.rb +86 -2
- data/lib/graphql/schema/find_inherited_value.rb +12 -1
- data/lib/graphql/schema/finder.rb +16 -14
- data/lib/graphql/schema/input_object.rb +182 -60
- data/lib/graphql/schema/interface.rb +24 -49
- data/lib/graphql/schema/introspection_system.rb +103 -37
- data/lib/graphql/schema/late_bound_type.rb +9 -2
- data/lib/graphql/schema/list.rb +61 -3
- data/lib/graphql/schema/loader.rb +144 -96
- data/lib/graphql/schema/member/base_dsl_methods.rb +41 -37
- data/lib/graphql/schema/member/build_type.rb +24 -15
- data/lib/graphql/schema/member/has_arguments.rb +310 -26
- data/lib/graphql/schema/member/has_ast_node.rb +32 -0
- data/lib/graphql/schema/member/has_deprecation_reason.rb +24 -0
- data/lib/graphql/schema/member/has_directives.rb +118 -0
- data/lib/graphql/schema/member/has_fields.rb +166 -44
- data/lib/graphql/schema/member/has_interfaces.rb +129 -0
- data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
- data/lib/graphql/schema/member/has_validators.rb +57 -0
- data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
- data/lib/graphql/schema/member/type_system_helpers.rb +20 -3
- data/lib/graphql/schema/member/validates_input.rb +33 -0
- data/lib/graphql/schema/member.rb +11 -6
- data/lib/graphql/schema/mutation.rb +4 -9
- data/lib/graphql/schema/non_null.rb +34 -4
- data/lib/graphql/schema/object.rb +36 -60
- data/lib/graphql/schema/printer.rb +16 -35
- data/lib/graphql/schema/relay_classic_mutation.rb +91 -44
- data/lib/graphql/schema/resolver/has_payload_type.rb +51 -11
- data/lib/graphql/schema/resolver.rb +147 -94
- data/lib/graphql/schema/scalar.rb +40 -15
- data/lib/graphql/schema/subscription.rb +60 -31
- data/lib/graphql/schema/timeout.rb +45 -35
- data/lib/graphql/schema/type_expression.rb +21 -13
- data/lib/graphql/schema/type_membership.rb +23 -6
- data/lib/graphql/schema/union.rb +49 -15
- data/lib/graphql/schema/unique_within_type.rb +1 -2
- data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
- data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
- data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
- data/lib/graphql/schema/validator/format_validator.rb +48 -0
- data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
- data/lib/graphql/schema/validator/length_validator.rb +59 -0
- data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
- data/lib/graphql/schema/validator/required_validator.rb +82 -0
- data/lib/graphql/schema/validator.rb +171 -0
- data/lib/graphql/schema/warden.rb +213 -35
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +857 -884
- data/lib/graphql/static_validation/all_rules.rb +3 -0
- data/lib/graphql/static_validation/base_visitor.rb +21 -31
- data/lib/graphql/static_validation/definition_dependencies.rb +7 -2
- data/lib/graphql/static_validation/error.rb +3 -1
- data/lib/graphql/static_validation/literal_validator.rb +69 -26
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +45 -83
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +35 -26
- data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +12 -6
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +14 -14
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +15 -7
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +96 -53
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
- data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
- data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
- data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
- data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
- data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
- data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +4 -2
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +9 -10
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +13 -7
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +19 -14
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
- data/lib/graphql/static_validation/type_stack.rb +2 -2
- data/lib/graphql/static_validation/validation_context.rb +13 -3
- data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
- data/lib/graphql/static_validation/validator.rb +32 -20
- data/lib/graphql/static_validation.rb +1 -2
- data/lib/graphql/string_encoding_error.rb +13 -3
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +129 -22
- data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
- data/lib/graphql/subscriptions/event.rb +84 -35
- data/lib/graphql/subscriptions/instrumentation.rb +0 -47
- data/lib/graphql/subscriptions/serialize.rb +53 -6
- data/lib/graphql/subscriptions.rb +137 -57
- data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
- data/lib/graphql/tracing/appoptics_trace.rb +231 -0
- data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
- data/lib/graphql/tracing/appsignal_trace.rb +77 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
- data/lib/graphql/tracing/data_dog_trace.rb +148 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +34 -2
- data/lib/graphql/tracing/legacy_trace.rb +65 -0
- data/lib/graphql/tracing/new_relic_trace.rb +75 -0
- data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
- data/lib/graphql/tracing/notifications_trace.rb +42 -0
- data/lib/graphql/tracing/notifications_tracing.rb +59 -0
- data/lib/graphql/tracing/platform_trace.rb +109 -0
- data/lib/graphql/tracing/platform_tracing.rb +76 -35
- data/lib/graphql/tracing/prometheus_trace.rb +89 -0
- data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +5 -2
- data/lib/graphql/tracing/prometheus_tracing.rb +11 -3
- data/lib/graphql/tracing/scout_trace.rb +72 -0
- data/lib/graphql/tracing/scout_tracing.rb +19 -0
- data/lib/graphql/tracing/statsd_trace.rb +56 -0
- data/lib/graphql/tracing/statsd_tracing.rb +42 -0
- data/lib/graphql/tracing/trace.rb +75 -0
- data/lib/graphql/tracing.rb +23 -67
- data/lib/graphql/type_kinds.rb +6 -3
- data/lib/graphql/types/big_int.rb +5 -1
- data/lib/graphql/types/int.rb +10 -3
- data/lib/graphql/types/iso_8601_date.rb +20 -9
- data/lib/graphql/types/iso_8601_date_time.rb +36 -10
- data/lib/graphql/types/relay/base_connection.rb +18 -90
- data/lib/graphql/types/relay/base_edge.rb +2 -34
- data/lib/graphql/types/relay/connection_behaviors.rb +176 -0
- data/lib/graphql/types/relay/edge_behaviors.rb +75 -0
- data/lib/graphql/types/relay/has_node_field.rb +41 -0
- data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
- data/lib/graphql/types/relay/node.rb +2 -4
- data/lib/graphql/types/relay/node_behaviors.rb +25 -0
- data/lib/graphql/types/relay/page_info.rb +2 -14
- data/lib/graphql/types/relay/page_info_behaviors.rb +30 -0
- data/lib/graphql/types/relay.rb +10 -5
- data/lib/graphql/types/string.rb +8 -2
- data/lib/graphql/unauthorized_error.rb +2 -2
- data/lib/graphql/unresolved_type_error.rb +2 -2
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +63 -65
- data/readme.md +3 -6
- metadata +127 -236
- data/lib/graphql/analysis/analyze_query.rb +0 -91
- data/lib/graphql/analysis/field_usage.rb +0 -45
- data/lib/graphql/analysis/max_query_complexity.rb +0 -26
- data/lib/graphql/analysis/max_query_depth.rb +0 -26
- data/lib/graphql/analysis/query_complexity.rb +0 -88
- data/lib/graphql/analysis/query_depth.rb +0 -43
- data/lib/graphql/analysis/reducer_state.rb +0 -48
- data/lib/graphql/argument.rb +0 -159
- data/lib/graphql/authorization.rb +0 -82
- data/lib/graphql/backwards_compatibility.rb +0 -60
- data/lib/graphql/base_type.rb +0 -226
- data/lib/graphql/boolean_type.rb +0 -2
- data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
- data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
- data/lib/graphql/compatibility/execution_specification.rb +0 -435
- data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
- data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -213
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -91
- data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
- data/lib/graphql/compatibility/query_parser_specification.rb +0 -264
- data/lib/graphql/compatibility/schema_parser_specification.rb +0 -680
- data/lib/graphql/compatibility.rb +0 -5
- data/lib/graphql/define/assign_argument.rb +0 -12
- data/lib/graphql/define/assign_connection.rb +0 -13
- data/lib/graphql/define/assign_enum_value.rb +0 -18
- data/lib/graphql/define/assign_global_id_field.rb +0 -11
- data/lib/graphql/define/assign_mutation_function.rb +0 -34
- data/lib/graphql/define/assign_object_field.rb +0 -42
- data/lib/graphql/define/defined_object_proxy.rb +0 -50
- data/lib/graphql/define/instance_definable.rb +0 -300
- data/lib/graphql/define/no_definition_error.rb +0 -7
- data/lib/graphql/define/non_null_with_bang.rb +0 -16
- data/lib/graphql/define/type_definer.rb +0 -31
- data/lib/graphql/define.rb +0 -31
- data/lib/graphql/deprecated_dsl.rb +0 -42
- data/lib/graphql/directive/deprecated_directive.rb +0 -13
- data/lib/graphql/directive/include_directive.rb +0 -2
- data/lib/graphql/directive/skip_directive.rb +0 -2
- data/lib/graphql/directive.rb +0 -104
- data/lib/graphql/enum_type.rb +0 -193
- data/lib/graphql/execution/execute.rb +0 -326
- data/lib/graphql/execution/flatten.rb +0 -40
- data/lib/graphql/execution/instrumentation.rb +0 -92
- data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
- data/lib/graphql/execution/lazy/resolve.rb +0 -91
- data/lib/graphql/execution/typecast.rb +0 -50
- data/lib/graphql/field/resolve.rb +0 -59
- data/lib/graphql/field.rb +0 -330
- data/lib/graphql/float_type.rb +0 -2
- data/lib/graphql/function.rb +0 -153
- data/lib/graphql/id_type.rb +0 -2
- data/lib/graphql/input_object_type.rb +0 -154
- data/lib/graphql/int_type.rb +0 -2
- data/lib/graphql/interface_type.rb +0 -86
- data/lib/graphql/internal_representation/document.rb +0 -27
- data/lib/graphql/internal_representation/node.rb +0 -206
- data/lib/graphql/internal_representation/print.rb +0 -51
- data/lib/graphql/internal_representation/rewrite.rb +0 -184
- data/lib/graphql/internal_representation/scope.rb +0 -88
- data/lib/graphql/internal_representation/visit.rb +0 -36
- data/lib/graphql/internal_representation.rb +0 -7
- data/lib/graphql/language/lexer.rl +0 -258
- data/lib/graphql/list_type.rb +0 -80
- data/lib/graphql/literal_validation_error.rb +0 -6
- data/lib/graphql/non_null_type.rb +0 -81
- data/lib/graphql/object_type.rb +0 -141
- data/lib/graphql/query/arguments.rb +0 -187
- data/lib/graphql/query/arguments_cache.rb +0 -25
- data/lib/graphql/query/executor.rb +0 -53
- data/lib/graphql/query/literal_input.rb +0 -116
- data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
- data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
- data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
- data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
- data/lib/graphql/query/serial_execution.rb +0 -39
- data/lib/graphql/relay/array_connection.rb +0 -85
- data/lib/graphql/relay/base_connection.rb +0 -172
- data/lib/graphql/relay/connection_instrumentation.rb +0 -54
- data/lib/graphql/relay/connection_resolve.rb +0 -43
- data/lib/graphql/relay/connection_type.rb +0 -40
- data/lib/graphql/relay/edge.rb +0 -27
- data/lib/graphql/relay/edge_type.rb +0 -18
- data/lib/graphql/relay/edges_instrumentation.rb +0 -40
- data/lib/graphql/relay/global_id_resolve.rb +0 -18
- data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
- data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
- data/lib/graphql/relay/mutation/resolve.rb +0 -56
- data/lib/graphql/relay/mutation/result.rb +0 -38
- data/lib/graphql/relay/mutation.rb +0 -190
- data/lib/graphql/relay/node.rb +0 -36
- data/lib/graphql/relay/page_info.rb +0 -7
- data/lib/graphql/relay/relation_connection.rb +0 -190
- data/lib/graphql/relay/type_extensions.rb +0 -30
- data/lib/graphql/scalar_type.rb +0 -133
- data/lib/graphql/schema/catchall_middleware.rb +0 -35
- data/lib/graphql/schema/default_parse_error.rb +0 -10
- data/lib/graphql/schema/default_type_error.rb +0 -15
- data/lib/graphql/schema/member/accepts_definition.rb +0 -152
- data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -26
- data/lib/graphql/schema/member/instrumentation.rb +0 -132
- data/lib/graphql/schema/middleware_chain.rb +0 -82
- data/lib/graphql/schema/possible_types.rb +0 -39
- data/lib/graphql/schema/rescue_middleware.rb +0 -60
- data/lib/graphql/schema/timeout_middleware.rb +0 -86
- data/lib/graphql/schema/traversal.rb +0 -228
- data/lib/graphql/schema/validation.rb +0 -303
- data/lib/graphql/static_validation/default_visitor.rb +0 -15
- data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
- data/lib/graphql/string_type.rb +0 -2
- data/lib/graphql/subscriptions/subscription_root.rb +0 -66
- data/lib/graphql/tracing/skylight_tracing.rb +0 -62
- data/lib/graphql/types/relay/base_field.rb +0 -22
- data/lib/graphql/types/relay/base_interface.rb +0 -29
- data/lib/graphql/types/relay/base_object.rb +0 -26
- data/lib/graphql/types/relay/node_field.rb +0 -43
- data/lib/graphql/types/relay/nodes_field.rb +0 -45
- data/lib/graphql/union_type.rb +0 -128
- data/lib/graphql/upgrader/member.rb +0 -936
- data/lib/graphql/upgrader/schema.rb +0 -37
data/lib/graphql/language.rb
CHANGED
@@ -1,14 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require "graphql/language/block_string"
|
3
3
|
require "graphql/language/printer"
|
4
|
-
require "graphql/language/
|
4
|
+
require "graphql/language/sanitized_printer"
|
5
5
|
require "graphql/language/document_from_schema_definition"
|
6
6
|
require "graphql/language/generation"
|
7
7
|
require "graphql/language/lexer"
|
8
8
|
require "graphql/language/nodes"
|
9
|
+
require "graphql/language/cache"
|
9
10
|
require "graphql/language/parser"
|
10
11
|
require "graphql/language/token"
|
11
12
|
require "graphql/language/visitor"
|
13
|
+
require "graphql/language/definition_slice"
|
12
14
|
|
13
15
|
module GraphQL
|
14
16
|
module Language
|
@@ -4,13 +4,8 @@ module GraphQL
|
|
4
4
|
VALID_NAME_REGEX = /^[_a-zA-Z][_a-zA-Z0-9]*$/
|
5
5
|
|
6
6
|
def self.validate!(name)
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
private
|
11
|
-
|
12
|
-
def self.valid?(name)
|
13
|
-
name =~ VALID_NAME_REGEX
|
7
|
+
name = name.is_a?(String) ? name : name.to_s
|
8
|
+
raise GraphQL::InvalidNameError.new(name, VALID_NAME_REGEX) unless name.match?(VALID_NAME_REGEX)
|
14
9
|
end
|
15
10
|
end
|
16
11
|
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "graphql/pagination/relation_connection"
|
3
|
+
|
4
|
+
module GraphQL
|
5
|
+
module Pagination
|
6
|
+
# Customizes `RelationConnection` to work with `ActiveRecord::Relation`s.
|
7
|
+
class ActiveRecordRelationConnection < Pagination::RelationConnection
|
8
|
+
private
|
9
|
+
|
10
|
+
def relation_count(relation)
|
11
|
+
int_or_hash = if already_loaded?(relation)
|
12
|
+
relation.size
|
13
|
+
elsif relation.respond_to?(:unscope)
|
14
|
+
relation.unscope(:order).count(:all)
|
15
|
+
else
|
16
|
+
# Rails 3
|
17
|
+
relation.count
|
18
|
+
end
|
19
|
+
if int_or_hash.is_a?(Integer)
|
20
|
+
int_or_hash
|
21
|
+
else
|
22
|
+
# Grouped relations return count-by-group hashes
|
23
|
+
int_or_hash.length
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def relation_limit(relation)
|
28
|
+
if relation.is_a?(Array)
|
29
|
+
nil
|
30
|
+
else
|
31
|
+
relation.limit_value
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def relation_offset(relation)
|
36
|
+
if relation.is_a?(Array)
|
37
|
+
nil
|
38
|
+
else
|
39
|
+
relation.offset_value
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def null_relation(relation)
|
44
|
+
if relation.respond_to?(:none)
|
45
|
+
relation.none
|
46
|
+
else
|
47
|
+
# Rails 3
|
48
|
+
relation.where("1=2")
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def set_limit(nodes, limit)
|
53
|
+
if already_loaded?(nodes)
|
54
|
+
nodes.take(limit)
|
55
|
+
else
|
56
|
+
super
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def set_offset(nodes, offset)
|
61
|
+
if already_loaded?(nodes)
|
62
|
+
# If the client sent a bogus cursor beyond the size of the relation,
|
63
|
+
# it might get `nil` from `#[...]`, so return an empty array in that case
|
64
|
+
nodes[offset..-1] || []
|
65
|
+
else
|
66
|
+
super
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def already_loaded?(relation)
|
73
|
+
relation.is_a?(Array) || relation.loaded?
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "graphql/pagination/connection"
|
3
|
+
|
4
|
+
module GraphQL
|
5
|
+
module Pagination
|
6
|
+
class ArrayConnection < Pagination::Connection
|
7
|
+
def nodes
|
8
|
+
load_nodes
|
9
|
+
@nodes
|
10
|
+
end
|
11
|
+
|
12
|
+
def has_previous_page
|
13
|
+
load_nodes
|
14
|
+
@has_previous_page
|
15
|
+
end
|
16
|
+
|
17
|
+
def has_next_page
|
18
|
+
load_nodes
|
19
|
+
@has_next_page
|
20
|
+
end
|
21
|
+
|
22
|
+
def cursor_for(item)
|
23
|
+
idx = items.find_index(item) + 1
|
24
|
+
encode(idx.to_s)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def index_from_cursor(cursor)
|
30
|
+
decode(cursor).to_i
|
31
|
+
end
|
32
|
+
|
33
|
+
# Populate all the pagination info _once_,
|
34
|
+
# It doesn't do anything on subsequent calls.
|
35
|
+
def load_nodes
|
36
|
+
@nodes ||= begin
|
37
|
+
sliced_nodes = if before && after
|
38
|
+
end_idx = index_from_cursor(before)-1
|
39
|
+
end_idx < 0 ? [] : items[index_from_cursor(after)..end_idx] || []
|
40
|
+
elsif before
|
41
|
+
end_idx = index_from_cursor(before)-2
|
42
|
+
end_idx < 0 ? [] : items[0..end_idx] || []
|
43
|
+
elsif after
|
44
|
+
items[index_from_cursor(after)..-1] || []
|
45
|
+
else
|
46
|
+
items
|
47
|
+
end
|
48
|
+
|
49
|
+
@has_previous_page = if last
|
50
|
+
# There are items preceding the ones in this result
|
51
|
+
sliced_nodes.count > last
|
52
|
+
elsif after
|
53
|
+
# We've paginated into the Array a bit, there are some behind us
|
54
|
+
index_from_cursor(after) > 0
|
55
|
+
else
|
56
|
+
false
|
57
|
+
end
|
58
|
+
|
59
|
+
@has_next_page = if first
|
60
|
+
# There are more items after these items
|
61
|
+
sliced_nodes.count > first
|
62
|
+
elsif before
|
63
|
+
# The original array is longer than the `before` index
|
64
|
+
index_from_cursor(before) < items.length + 1
|
65
|
+
else
|
66
|
+
false
|
67
|
+
end
|
68
|
+
|
69
|
+
limited_nodes = sliced_nodes
|
70
|
+
|
71
|
+
limited_nodes = limited_nodes.first(first) if first
|
72
|
+
limited_nodes = limited_nodes.last(last) if last
|
73
|
+
|
74
|
+
limited_nodes
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,253 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GraphQL
|
4
|
+
module Pagination
|
5
|
+
# A Connection wraps a list of items and provides cursor-based pagination over it.
|
6
|
+
#
|
7
|
+
# Connections were introduced by Facebook's `Relay` front-end framework, but
|
8
|
+
# proved to be generally useful for GraphQL APIs. When in doubt, use connections
|
9
|
+
# to serve lists (like Arrays, ActiveRecord::Relations) via GraphQL.
|
10
|
+
#
|
11
|
+
# Unlike the previous connection implementation, these default to bidirectional pagination.
|
12
|
+
#
|
13
|
+
# Pagination arguments and context may be provided at initialization or assigned later (see {Schema::Field::ConnectionExtension}).
|
14
|
+
class Connection
|
15
|
+
class PaginationImplementationMissingError < GraphQL::Error
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [Object] A list object, from the application. This is the unpaginated value passed into the connection.
|
19
|
+
attr_reader :items
|
20
|
+
|
21
|
+
# @return [GraphQL::Query::Context]
|
22
|
+
attr_accessor :context
|
23
|
+
|
24
|
+
# @return [Object] the object this collection belongs to
|
25
|
+
attr_accessor :parent
|
26
|
+
|
27
|
+
# Raw access to client-provided values. (`max_page_size` not applied to first or last.)
|
28
|
+
attr_accessor :before_value, :after_value, :first_value, :last_value
|
29
|
+
|
30
|
+
# @return [String, nil] the client-provided cursor. `""` is treated as `nil`.
|
31
|
+
def before
|
32
|
+
if defined?(@before)
|
33
|
+
@before
|
34
|
+
else
|
35
|
+
@before = @before_value == "" ? nil : @before_value
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# @return [String, nil] the client-provided cursor. `""` is treated as `nil`.
|
40
|
+
def after
|
41
|
+
if defined?(@after)
|
42
|
+
@after
|
43
|
+
else
|
44
|
+
@after = @after_value == "" ? nil : @after_value
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# @return [Hash<Symbol => Object>] The field arguments from the field that returned this connection
|
49
|
+
attr_accessor :arguments
|
50
|
+
|
51
|
+
# @param items [Object] some unpaginated collection item, like an `Array` or `ActiveRecord::Relation`
|
52
|
+
# @param context [Query::Context]
|
53
|
+
# @param parent [Object] The object this collection belongs to
|
54
|
+
# @param first [Integer, nil] The limit parameter from the client, if it provided one
|
55
|
+
# @param after [String, nil] A cursor for pagination, if the client provided one
|
56
|
+
# @param last [Integer, nil] Limit parameter from the client, if provided
|
57
|
+
# @param before [String, nil] A cursor for pagination, if the client provided one.
|
58
|
+
# @param arguments [Hash] The arguments to the field that returned the collection wrapped by this connection
|
59
|
+
# @param max_page_size [Integer, nil] A configured value to cap the result size. Applied as `first` if neither first or last are given and no `default_page_size` is set.
|
60
|
+
# @param default_page_size [Integer, nil] A configured value to determine the result size when neither first or last are given.
|
61
|
+
def initialize(items, parent: nil, field: nil, context: nil, first: nil, after: nil, max_page_size: NOT_CONFIGURED, default_page_size: NOT_CONFIGURED, last: nil, before: nil, edge_class: nil, arguments: nil)
|
62
|
+
@items = items
|
63
|
+
@parent = parent
|
64
|
+
@context = context
|
65
|
+
@field = field
|
66
|
+
@first_value = first
|
67
|
+
@after_value = after
|
68
|
+
@last_value = last
|
69
|
+
@before_value = before
|
70
|
+
@arguments = arguments
|
71
|
+
@edge_class = edge_class || self.class::Edge
|
72
|
+
# This is only true if the object was _initialized_ with an override
|
73
|
+
# or if one is assigned later.
|
74
|
+
@has_max_page_size_override = max_page_size != NOT_CONFIGURED
|
75
|
+
@max_page_size = if max_page_size == NOT_CONFIGURED
|
76
|
+
nil
|
77
|
+
else
|
78
|
+
max_page_size
|
79
|
+
end
|
80
|
+
@has_default_page_size_override = default_page_size != NOT_CONFIGURED
|
81
|
+
@default_page_size = if default_page_size == NOT_CONFIGURED
|
82
|
+
nil
|
83
|
+
else
|
84
|
+
default_page_size
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def max_page_size=(new_value)
|
89
|
+
@has_max_page_size_override = true
|
90
|
+
@max_page_size = new_value
|
91
|
+
end
|
92
|
+
|
93
|
+
def max_page_size
|
94
|
+
if @has_max_page_size_override
|
95
|
+
@max_page_size
|
96
|
+
else
|
97
|
+
context.schema.default_max_page_size
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def has_max_page_size_override?
|
102
|
+
@has_max_page_size_override
|
103
|
+
end
|
104
|
+
|
105
|
+
def default_page_size=(new_value)
|
106
|
+
@has_default_page_size_override = true
|
107
|
+
@default_page_size = new_value
|
108
|
+
end
|
109
|
+
|
110
|
+
def default_page_size
|
111
|
+
if @has_default_page_size_override
|
112
|
+
@default_page_size
|
113
|
+
else
|
114
|
+
context.schema.default_page_size
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def has_default_page_size_override?
|
119
|
+
@has_default_page_size_override
|
120
|
+
end
|
121
|
+
|
122
|
+
attr_writer :first
|
123
|
+
# @return [Integer, nil]
|
124
|
+
# A clamped `first` value.
|
125
|
+
# (The underlying instance variable doesn't have limits on it.)
|
126
|
+
# If neither `first` nor `last` is given, but `default_page_size` is
|
127
|
+
# present, default_page_size is used for first. If `default_page_size`
|
128
|
+
# is greater than `max_page_size``, it'll be clamped down to
|
129
|
+
# `max_page_size`. If `default_page_size` is nil, use `max_page_size`.
|
130
|
+
def first
|
131
|
+
@first ||= begin
|
132
|
+
capped = limit_pagination_argument(@first_value, max_page_size)
|
133
|
+
if capped.nil? && last.nil?
|
134
|
+
capped = limit_pagination_argument(default_page_size, max_page_size) || max_page_size
|
135
|
+
end
|
136
|
+
capped
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
# This is called by `Relay::RangeAdd` -- it can be overridden
|
141
|
+
# when `item` needs some modifications based on this connection's state.
|
142
|
+
#
|
143
|
+
# @param item [Object] An item newly added to `items`
|
144
|
+
# @return [Edge]
|
145
|
+
def range_add_edge(item)
|
146
|
+
edge_class.new(item, self)
|
147
|
+
end
|
148
|
+
|
149
|
+
attr_writer :last
|
150
|
+
# @return [Integer, nil] A clamped `last` value. (The underlying instance variable doesn't have limits on it)
|
151
|
+
def last
|
152
|
+
@last ||= limit_pagination_argument(@last_value, max_page_size)
|
153
|
+
end
|
154
|
+
|
155
|
+
# @return [Array<Edge>] {nodes}, but wrapped with Edge instances
|
156
|
+
def edges
|
157
|
+
@edges ||= nodes.map { |n| @edge_class.new(n, self) }
|
158
|
+
end
|
159
|
+
|
160
|
+
# @return [Class] A wrapper class for edges of this connection
|
161
|
+
attr_accessor :edge_class
|
162
|
+
|
163
|
+
# @return [GraphQL::Schema::Field] The field this connection was returned by
|
164
|
+
attr_accessor :field
|
165
|
+
|
166
|
+
# @return [Array<Object>] A slice of {items}, constrained by {@first_value}/{@after_value}/{@last_value}/{@before_value}
|
167
|
+
def nodes
|
168
|
+
raise PaginationImplementationMissingError, "Implement #{self.class}#nodes to paginate `@items`"
|
169
|
+
end
|
170
|
+
|
171
|
+
# A dynamic alias for compatibility with {Relay::BaseConnection}.
|
172
|
+
# @deprecated use {#nodes} instead
|
173
|
+
def edge_nodes
|
174
|
+
nodes
|
175
|
+
end
|
176
|
+
|
177
|
+
# The connection object itself implements `PageInfo` fields
|
178
|
+
def page_info
|
179
|
+
self
|
180
|
+
end
|
181
|
+
|
182
|
+
# @return [Boolean] True if there are more items after this page
|
183
|
+
def has_next_page
|
184
|
+
raise PaginationImplementationMissingError, "Implement #{self.class}#has_next_page to return the next-page check"
|
185
|
+
end
|
186
|
+
|
187
|
+
# @return [Boolean] True if there were items before these items
|
188
|
+
def has_previous_page
|
189
|
+
raise PaginationImplementationMissingError, "Implement #{self.class}#has_previous_page to return the previous-page check"
|
190
|
+
end
|
191
|
+
|
192
|
+
# @return [String] The cursor of the first item in {nodes}
|
193
|
+
def start_cursor
|
194
|
+
nodes.first && cursor_for(nodes.first)
|
195
|
+
end
|
196
|
+
|
197
|
+
# @return [String] The cursor of the last item in {nodes}
|
198
|
+
def end_cursor
|
199
|
+
nodes.last && cursor_for(nodes.last)
|
200
|
+
end
|
201
|
+
|
202
|
+
# Return a cursor for this item.
|
203
|
+
# @param item [Object] one of the passed in {items}, taken from {nodes}
|
204
|
+
# @return [String]
|
205
|
+
def cursor_for(item)
|
206
|
+
raise PaginationImplementationMissingError, "Implement #{self.class}#cursor_for(item) to return the cursor for #{item.inspect}"
|
207
|
+
end
|
208
|
+
|
209
|
+
private
|
210
|
+
|
211
|
+
# @param argument [nil, Integer] `first` or `last`, as provided by the client
|
212
|
+
# @param max_page_size [nil, Integer]
|
213
|
+
# @return [nil, Integer] `nil` if the input was `nil`, otherwise a value between `0` and `max_page_size`
|
214
|
+
def limit_pagination_argument(argument, max_page_size)
|
215
|
+
if argument
|
216
|
+
if argument < 0
|
217
|
+
argument = 0
|
218
|
+
elsif max_page_size && argument > max_page_size
|
219
|
+
argument = max_page_size
|
220
|
+
end
|
221
|
+
end
|
222
|
+
argument
|
223
|
+
end
|
224
|
+
|
225
|
+
def decode(cursor)
|
226
|
+
context.schema.cursor_encoder.decode(cursor, nonce: true)
|
227
|
+
end
|
228
|
+
|
229
|
+
def encode(cursor)
|
230
|
+
context.schema.cursor_encoder.encode(cursor, nonce: true)
|
231
|
+
end
|
232
|
+
|
233
|
+
# A wrapper around paginated items. It includes a {cursor} for pagination
|
234
|
+
# and could be extended with custom relationship-level data.
|
235
|
+
class Edge
|
236
|
+
attr_reader :node
|
237
|
+
|
238
|
+
def initialize(node, connection)
|
239
|
+
@connection = connection
|
240
|
+
@node = node
|
241
|
+
end
|
242
|
+
|
243
|
+
def parent
|
244
|
+
@connection.parent
|
245
|
+
end
|
246
|
+
|
247
|
+
def cursor
|
248
|
+
@cursor ||= @connection.cursor_for(@node)
|
249
|
+
end
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
@@ -0,0 +1,135 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GraphQL
|
4
|
+
module Pagination
|
5
|
+
# A schema-level connection wrapper manager.
|
6
|
+
#
|
7
|
+
# Attach as a plugin.
|
8
|
+
#
|
9
|
+
# @example Adding a custom wrapper
|
10
|
+
# class MySchema < GraphQL::Schema
|
11
|
+
# connections.add(MyApp::SearchResults, MyApp::SearchResultsConnection)
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# @example Removing default connection support for arrays (they can still be manually wrapped)
|
15
|
+
# class MySchema < GraphQL::Schema
|
16
|
+
# connections.delete(Array)
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# @see {Schema.connections}
|
20
|
+
class Connections
|
21
|
+
class ImplementationMissingError < GraphQL::Error
|
22
|
+
end
|
23
|
+
|
24
|
+
def initialize(schema:)
|
25
|
+
@schema = schema
|
26
|
+
@wrappers = {}
|
27
|
+
add_default
|
28
|
+
end
|
29
|
+
|
30
|
+
def add(nodes_class, implementation)
|
31
|
+
@wrappers[nodes_class] = implementation
|
32
|
+
end
|
33
|
+
|
34
|
+
def delete(nodes_class)
|
35
|
+
@wrappers.delete(nodes_class)
|
36
|
+
end
|
37
|
+
|
38
|
+
def all_wrappers
|
39
|
+
all_wrappers = {}
|
40
|
+
@schema.ancestors.reverse_each do |schema_class|
|
41
|
+
if schema_class.respond_to?(:connections) && (c = schema_class.connections)
|
42
|
+
all_wrappers.merge!(c.wrappers)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
all_wrappers
|
46
|
+
end
|
47
|
+
|
48
|
+
def wrapper_for(items, wrappers: all_wrappers)
|
49
|
+
impl = nil
|
50
|
+
|
51
|
+
items.class.ancestors.each { |cls|
|
52
|
+
impl = wrappers[cls]
|
53
|
+
break if impl
|
54
|
+
}
|
55
|
+
|
56
|
+
impl
|
57
|
+
end
|
58
|
+
|
59
|
+
# Used by the runtime to wrap values in connection wrappers.
|
60
|
+
# @api Private
|
61
|
+
def wrap(field, parent, items, arguments, context)
|
62
|
+
return items if GraphQL::Execution::Interpreter::RawValue === items
|
63
|
+
wrappers = context ? context.namespace(:connections)[:all_wrappers] : all_wrappers
|
64
|
+
impl = wrapper_for(items, wrappers: wrappers)
|
65
|
+
|
66
|
+
if impl
|
67
|
+
impl.new(
|
68
|
+
items,
|
69
|
+
context: context,
|
70
|
+
parent: parent,
|
71
|
+
field: field,
|
72
|
+
max_page_size: field.has_max_page_size? ? field.max_page_size : context.schema.default_max_page_size,
|
73
|
+
default_page_size: field.has_default_page_size? ? field.default_page_size : context.schema.default_page_size,
|
74
|
+
first: arguments[:first],
|
75
|
+
after: arguments[:after],
|
76
|
+
last: arguments[:last],
|
77
|
+
before: arguments[:before],
|
78
|
+
arguments: arguments,
|
79
|
+
edge_class: edge_class_for_field(field),
|
80
|
+
)
|
81
|
+
else
|
82
|
+
raise ImplementationMissingError, "Couldn't find a connection wrapper for #{items.class} during #{field.path} (#{items.inspect})"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# use an override if there is one
|
87
|
+
# @api private
|
88
|
+
def edge_class_for_field(field)
|
89
|
+
conn_type = field.type.unwrap
|
90
|
+
conn_type_edge_type = conn_type.respond_to?(:edge_class) && conn_type.edge_class
|
91
|
+
if conn_type_edge_type && conn_type_edge_type != Pagination::Connection::Edge
|
92
|
+
conn_type_edge_type
|
93
|
+
else
|
94
|
+
nil
|
95
|
+
end
|
96
|
+
end
|
97
|
+
protected
|
98
|
+
|
99
|
+
attr_reader :wrappers
|
100
|
+
|
101
|
+
private
|
102
|
+
|
103
|
+
def add_default
|
104
|
+
add(Array, Pagination::ArrayConnection)
|
105
|
+
|
106
|
+
if defined?(ActiveRecord::Relation)
|
107
|
+
add(ActiveRecord::Relation, Pagination::ActiveRecordRelationConnection)
|
108
|
+
end
|
109
|
+
|
110
|
+
if defined?(Sequel::Dataset)
|
111
|
+
add(Sequel::Dataset, Pagination::SequelDatasetConnection)
|
112
|
+
end
|
113
|
+
|
114
|
+
if defined?(Mongoid::Criteria)
|
115
|
+
add(Mongoid::Criteria, Pagination::MongoidRelationConnection)
|
116
|
+
end
|
117
|
+
|
118
|
+
# Mongoid 5 and 6
|
119
|
+
if defined?(Mongoid::Relations::Targets::Enumerable)
|
120
|
+
add(Mongoid::Relations::Targets::Enumerable, Pagination::MongoidRelationConnection)
|
121
|
+
end
|
122
|
+
|
123
|
+
# Mongoid 7
|
124
|
+
if defined?(Mongoid::Association::Referenced::HasMany::Targets::Enumerable)
|
125
|
+
add(Mongoid::Association::Referenced::HasMany::Targets::Enumerable, Pagination::MongoidRelationConnection)
|
126
|
+
end
|
127
|
+
|
128
|
+
# Mongoid 7.3+
|
129
|
+
if defined?(Mongoid::Association::Referenced::HasMany::Enumerable)
|
130
|
+
add(Mongoid::Association::Referenced::HasMany::Enumerable, Pagination::MongoidRelationConnection)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "graphql/pagination/relation_connection"
|
3
|
+
|
4
|
+
module GraphQL
|
5
|
+
module Pagination
|
6
|
+
class MongoidRelationConnection < Pagination::RelationConnection
|
7
|
+
def relation_offset(relation)
|
8
|
+
relation.options.skip
|
9
|
+
end
|
10
|
+
|
11
|
+
def relation_limit(relation)
|
12
|
+
relation.options.limit
|
13
|
+
end
|
14
|
+
|
15
|
+
def relation_count(relation)
|
16
|
+
# Mongo's `.count` doesn't apply limit or skip, which we need. So we have to load _everything_!
|
17
|
+
relation.to_a.count
|
18
|
+
end
|
19
|
+
|
20
|
+
def null_relation(relation)
|
21
|
+
relation.without_options.none
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|