graphql 1.12.12 → 2.2.14
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 +3 -8
- 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 +14 -4
- data/lib/generators/graphql/interface_generator.rb +7 -7
- 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 +5 -30
- data/lib/generators/graphql/mutation_update_generator.rb +22 -0
- data/lib/generators/graphql/object_generator.rb +10 -38
- data/lib/generators/graphql/orm_mutations_base.rb +40 -0
- data/lib/generators/graphql/relay.rb +23 -12
- 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 +2 -0
- data/lib/generators/graphql/templates/base_edge.erb +2 -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_resolver.erb +6 -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 +5 -1
- data/lib/generators/graphql/templates/graphql_controller.erb +2 -0
- data/lib/generators/graphql/templates/input.erb +9 -0
- data/lib/generators/graphql/templates/interface.erb +4 -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 +2 -0
- data/lib/generators/graphql/templates/object.erb +4 -2
- data/lib/generators/graphql/templates/query_type.erb +2 -0
- data/lib/generators/graphql/templates/scalar.erb +3 -1
- data/lib/generators/graphql/templates/schema.erb +19 -2
- data/lib/generators/graphql/templates/union.erb +4 -2
- data/lib/generators/graphql/type_generator.rb +46 -10
- data/lib/generators/graphql/union_generator.rb +5 -5
- data/lib/graphql/analysis/ast/analyzer.rb +7 -0
- data/lib/graphql/analysis/ast/field_usage.rb +55 -1
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
- data/lib/graphql/analysis/ast/query_complexity.rb +88 -140
- data/lib/graphql/analysis/ast/query_depth.rb +7 -3
- data/lib/graphql/analysis/ast/visitor.rb +50 -42
- data/lib/graphql/analysis/ast.rb +26 -23
- data/lib/graphql/analysis.rb +0 -7
- data/lib/graphql/backtrace/table.rb +4 -22
- data/lib/graphql/backtrace/trace.rb +93 -0
- data/lib/graphql/backtrace/tracer.rb +8 -6
- data/lib/graphql/backtrace.rb +3 -8
- data/lib/graphql/coercion_error.rb +1 -9
- data/lib/graphql/dataloader/async_dataloader.rb +85 -0
- data/lib/graphql/dataloader/null_dataloader.rb +3 -1
- data/lib/graphql/dataloader/request.rb +5 -0
- data/lib/graphql/dataloader/source.rb +120 -31
- data/lib/graphql/dataloader.rb +168 -142
- data/lib/graphql/date_encoding_error.rb +16 -0
- data/lib/graphql/dig.rb +1 -1
- data/lib/graphql/duration_encoding_error.rb +16 -0
- data/lib/graphql/execution/errors.rb +12 -81
- data/lib/graphql/execution/interpreter/arguments.rb +2 -2
- data/lib/graphql/execution/interpreter/arguments_cache.rb +36 -34
- data/lib/graphql/execution/interpreter/resolve.rb +32 -2
- data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +170 -0
- data/lib/graphql/execution/interpreter/runtime.rb +414 -341
- data/lib/graphql/execution/interpreter.rb +122 -80
- data/lib/graphql/execution/lazy.rb +11 -21
- data/lib/graphql/execution/lookahead.rb +125 -54
- data/lib/graphql/execution/multiplex.rb +4 -172
- data/lib/graphql/execution.rb +11 -4
- data/lib/graphql/integer_encoding_error.rb +18 -2
- data/lib/graphql/introspection/directive_location_enum.rb +2 -2
- data/lib/graphql/introspection/directive_type.rb +5 -3
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +11 -18
- data/lib/graphql/introspection/enum_value_type.rb +2 -2
- data/lib/graphql/introspection/field_type.rb +3 -3
- data/lib/graphql/introspection/input_value_type.rb +10 -4
- data/lib/graphql/introspection/schema_type.rb +12 -5
- data/lib/graphql/introspection/type_type.rb +25 -12
- data/lib/graphql/introspection.rb +6 -2
- data/lib/graphql/language/block_string.rb +37 -25
- data/lib/graphql/language/definition_slice.rb +1 -1
- data/lib/graphql/language/document_from_schema_definition.rb +78 -65
- data/lib/graphql/language/lexer.rb +345 -1467
- data/lib/graphql/language/nodes.rb +145 -91
- data/lib/graphql/language/parser.rb +701 -1921
- data/lib/graphql/language/printer.rb +351 -155
- data/lib/graphql/language/sanitized_printer.rb +25 -27
- data/lib/graphql/language/static_visitor.rb +167 -0
- data/lib/graphql/language/token.rb +0 -4
- data/lib/graphql/language/visitor.rb +188 -141
- data/lib/graphql/language.rb +1 -0
- data/lib/graphql/load_application_object_failed_error.rb +5 -1
- data/lib/graphql/name_validator.rb +0 -4
- data/lib/graphql/pagination/active_record_relation_connection.rb +37 -8
- data/lib/graphql/pagination/array_connection.rb +8 -6
- data/lib/graphql/pagination/connection.rb +61 -7
- data/lib/graphql/pagination/connections.rb +22 -23
- data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -2
- data/lib/graphql/pagination/relation_connection.rb +60 -28
- data/lib/graphql/query/context/scoped_context.rb +101 -0
- data/lib/graphql/query/context.rb +109 -189
- data/lib/graphql/query/input_validation_result.rb +10 -1
- data/lib/graphql/query/null_context.rb +14 -29
- data/lib/graphql/query/validation_pipeline.rb +15 -39
- data/lib/graphql/query/variable_validation_error.rb +2 -2
- data/lib/graphql/query/variables.rb +35 -17
- data/lib/graphql/query.rb +78 -65
- data/lib/graphql/railtie.rb +8 -109
- data/lib/graphql/rake_task/validate.rb +1 -1
- data/lib/graphql/rake_task.rb +30 -11
- data/lib/graphql/relay/range_add.rb +9 -16
- 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 +78 -45
- data/lib/graphql/schema/always_visible.rb +10 -0
- data/lib/graphql/schema/argument.rb +134 -80
- data/lib/graphql/schema/base_64_encoder.rb +3 -5
- data/lib/graphql/schema/build_from_definition.rb +60 -38
- data/lib/graphql/schema/directive/feature.rb +1 -1
- data/lib/graphql/schema/directive/flagged.rb +2 -2
- data/lib/graphql/schema/directive/include.rb +1 -1
- data/lib/graphql/schema/directive/one_of.rb +24 -0
- data/lib/graphql/schema/directive/skip.rb +1 -1
- data/lib/graphql/schema/directive/specified_by.rb +14 -0
- data/lib/graphql/schema/directive/transform.rb +2 -2
- data/lib/graphql/schema/directive.rb +33 -21
- data/lib/graphql/schema/enum.rb +93 -46
- data/lib/graphql/schema/enum_value.rb +4 -21
- data/lib/graphql/schema/field/connection_extension.rb +6 -16
- data/lib/graphql/schema/field/scope_extension.rb +8 -1
- data/lib/graphql/schema/field.rb +432 -337
- data/lib/graphql/schema/field_extension.rb +86 -2
- data/lib/graphql/schema/find_inherited_value.rb +3 -7
- data/lib/graphql/schema/finder.rb +5 -5
- data/lib/graphql/schema/has_single_input_argument.rb +156 -0
- data/lib/graphql/schema/input_object.rb +88 -90
- data/lib/graphql/schema/interface.rb +19 -59
- data/lib/graphql/schema/introspection_system.rb +6 -9
- data/lib/graphql/schema/late_bound_type.rb +8 -2
- data/lib/graphql/schema/list.rb +18 -7
- data/lib/graphql/schema/loader.rb +3 -3
- data/lib/graphql/schema/member/base_dsl_methods.rb +18 -19
- data/lib/graphql/schema/member/build_type.rb +16 -13
- data/lib/graphql/schema/member/has_arguments.rb +288 -84
- data/lib/graphql/schema/member/has_ast_node.rb +12 -0
- data/lib/graphql/schema/member/has_deprecation_reason.rb +3 -4
- data/lib/graphql/schema/member/has_directives.rb +81 -61
- data/lib/graphql/schema/member/has_fields.rb +149 -31
- data/lib/graphql/schema/member/has_interfaces.rb +143 -0
- data/lib/graphql/schema/member/has_validators.rb +32 -6
- data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
- data/lib/graphql/schema/member/scoped.rb +19 -0
- data/lib/graphql/schema/member/type_system_helpers.rb +17 -0
- data/lib/graphql/schema/member/validates_input.rb +6 -6
- data/lib/graphql/schema/member.rb +1 -6
- data/lib/graphql/schema/mutation.rb +0 -9
- data/lib/graphql/schema/non_null.rb +7 -7
- data/lib/graphql/schema/object.rb +30 -119
- data/lib/graphql/schema/printer.rb +23 -25
- data/lib/graphql/schema/relay_classic_mutation.rb +13 -90
- data/lib/graphql/schema/resolver/has_payload_type.rb +46 -11
- data/lib/graphql/schema/resolver.rb +101 -102
- data/lib/graphql/schema/scalar.rb +20 -21
- data/lib/graphql/schema/subscription.rb +45 -17
- data/lib/graphql/schema/timeout.rb +25 -29
- data/lib/graphql/schema/type_expression.rb +1 -1
- data/lib/graphql/schema/type_membership.rb +21 -4
- data/lib/graphql/schema/union.rb +15 -15
- data/lib/graphql/schema/unique_within_type.rb +1 -1
- 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 +3 -1
- data/lib/graphql/schema/validator/format_validator.rb +4 -5
- data/lib/graphql/schema/validator/inclusion_validator.rb +3 -1
- data/lib/graphql/schema/validator/length_validator.rb +5 -3
- data/lib/graphql/schema/validator/numericality_validator.rb +13 -2
- data/lib/graphql/schema/validator/required_validator.rb +29 -15
- data/lib/graphql/schema/validator.rb +35 -27
- data/lib/graphql/schema/warden.rb +259 -132
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +658 -989
- data/lib/graphql/static_validation/all_rules.rb +3 -1
- data/lib/graphql/static_validation/base_visitor.rb +14 -28
- 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 +21 -4
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +1 -1
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +1 -1
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +11 -5
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +13 -13
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +12 -4
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +54 -28
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
- data/lib/graphql/static_validation/rules/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 +5 -3
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +4 -4
- 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 +1 -1
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +13 -7
- data/lib/graphql/static_validation/validation_context.rb +16 -6
- data/lib/graphql/static_validation/validator.rb +11 -27
- data/lib/graphql/static_validation.rb +0 -3
- data/lib/graphql/string_encoding_error.rb +13 -3
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +46 -9
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +38 -1
- data/lib/graphql/subscriptions/event.rb +75 -37
- data/lib/graphql/subscriptions/serialize.rb +25 -3
- data/lib/graphql/subscriptions.rb +59 -47
- data/lib/graphql/testing/helpers.rb +129 -0
- data/lib/graphql/testing.rb +2 -0
- data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +6 -20
- data/lib/graphql/tracing/appoptics_trace.rb +251 -0
- data/lib/graphql/tracing/appoptics_tracing.rb +2 -2
- data/lib/graphql/tracing/appsignal_trace.rb +77 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +15 -0
- data/lib/graphql/tracing/data_dog_trace.rb +183 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +25 -15
- data/lib/graphql/{execution/instrumentation.rb → tracing/legacy_hooks_trace.rb} +10 -28
- data/lib/graphql/tracing/legacy_trace.rb +69 -0
- data/lib/graphql/tracing/new_relic_trace.rb +75 -0
- data/lib/graphql/tracing/notifications_trace.rb +45 -0
- data/lib/graphql/tracing/notifications_tracing.rb +59 -0
- data/lib/graphql/tracing/platform_trace.rb +118 -0
- data/lib/graphql/tracing/platform_tracing.rb +46 -49
- data/lib/graphql/tracing/{prometheus_tracing → prometheus_trace}/graphql_collector.rb +4 -2
- data/lib/graphql/tracing/prometheus_trace.rb +89 -0
- data/lib/graphql/tracing/prometheus_tracing.rb +3 -3
- data/lib/graphql/tracing/scout_trace.rb +72 -0
- data/lib/graphql/tracing/sentry_trace.rb +112 -0
- data/lib/graphql/tracing/statsd_trace.rb +56 -0
- data/lib/graphql/tracing/trace.rb +76 -0
- data/lib/graphql/tracing.rb +20 -41
- data/lib/graphql/type_kinds.rb +6 -3
- data/lib/graphql/types/big_int.rb +5 -1
- data/lib/graphql/types/int.rb +1 -1
- data/lib/graphql/types/iso_8601_date.rb +17 -6
- data/lib/graphql/types/iso_8601_date_time.rb +12 -1
- data/lib/graphql/types/iso_8601_duration.rb +77 -0
- data/lib/graphql/types/relay/base_connection.rb +16 -6
- data/lib/graphql/types/relay/connection_behaviors.rb +82 -32
- data/lib/graphql/types/relay/edge_behaviors.rb +36 -7
- data/lib/graphql/types/relay/has_node_field.rb +2 -2
- data/lib/graphql/types/relay/has_nodes_field.rb +2 -2
- data/lib/graphql/types/relay/node_behaviors.rb +12 -2
- data/lib/graphql/types/relay/page_info_behaviors.rb +7 -2
- data/lib/graphql/types/relay.rb +0 -3
- data/lib/graphql/types/string.rb +2 -2
- data/lib/graphql/types.rb +1 -0
- data/lib/graphql/unauthorized_error.rb +1 -1
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +33 -95
- data/readme.md +13 -6
- metadata +102 -185
- data/lib/graphql/analysis/analyze_query.rb +0 -98
- data/lib/graphql/analysis/field_usage.rb +0 -45
- data/lib/graphql/analysis/max_query_complexity.rb +0 -26
- data/lib/graphql/analysis/max_query_depth.rb +0 -26
- data/lib/graphql/analysis/query_complexity.rb +0 -88
- data/lib/graphql/analysis/query_depth.rb +0 -43
- data/lib/graphql/analysis/reducer_state.rb +0 -48
- data/lib/graphql/argument.rb +0 -131
- data/lib/graphql/authorization.rb +0 -82
- data/lib/graphql/backtrace/legacy_tracer.rb +0 -56
- data/lib/graphql/backwards_compatibility.rb +0 -61
- data/lib/graphql/base_type.rb +0 -230
- data/lib/graphql/boolean_type.rb +0 -2
- data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
- data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
- data/lib/graphql/compatibility/execution_specification.rb +0 -436
- data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
- data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -215
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -87
- data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
- data/lib/graphql/compatibility/query_parser_specification.rb +0 -266
- data/lib/graphql/compatibility/schema_parser_specification.rb +0 -682
- 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 -240
- 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 -47
- data/lib/graphql/deprecation.rb +0 -13
- data/lib/graphql/directive/deprecated_directive.rb +0 -2
- data/lib/graphql/directive/include_directive.rb +0 -2
- data/lib/graphql/directive/skip_directive.rb +0 -2
- data/lib/graphql/directive.rb +0 -111
- data/lib/graphql/enum_type.rb +0 -129
- data/lib/graphql/execution/execute.rb +0 -333
- data/lib/graphql/execution/flatten.rb +0 -40
- 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 -226
- data/lib/graphql/filter.rb +0 -53
- data/lib/graphql/float_type.rb +0 -2
- data/lib/graphql/function.rb +0 -128
- data/lib/graphql/id_type.rb +0 -2
- data/lib/graphql/input_object_type.rb +0 -138
- data/lib/graphql/int_type.rb +0 -2
- data/lib/graphql/interface_type.rb +0 -72
- 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 -262
- data/lib/graphql/language/parser.y +0 -543
- data/lib/graphql/list_type.rb +0 -80
- data/lib/graphql/non_null_type.rb +0 -71
- data/lib/graphql/object_type.rb +0 -130
- data/lib/graphql/query/arguments.rb +0 -189
- data/lib/graphql/query/arguments_cache.rb +0 -24
- data/lib/graphql/query/executor.rb +0 -52
- data/lib/graphql/query/literal_input.rb +0 -136
- data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
- data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
- data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
- data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
- data/lib/graphql/query/serial_execution.rb +0 -40
- data/lib/graphql/relay/array_connection.rb +0 -83
- data/lib/graphql/relay/base_connection.rb +0 -189
- data/lib/graphql/relay/connection_instrumentation.rb +0 -54
- data/lib/graphql/relay/connection_resolve.rb +0 -43
- data/lib/graphql/relay/connection_type.rb +0 -41
- data/lib/graphql/relay/edge.rb +0 -27
- data/lib/graphql/relay/edge_type.rb +0 -19
- data/lib/graphql/relay/edges_instrumentation.rb +0 -40
- data/lib/graphql/relay/global_id_resolve.rb +0 -18
- data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
- data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
- data/lib/graphql/relay/mutation/resolve.rb +0 -56
- data/lib/graphql/relay/mutation/result.rb +0 -38
- data/lib/graphql/relay/mutation.rb +0 -106
- data/lib/graphql/relay/node.rb +0 -39
- data/lib/graphql/relay/page_info.rb +0 -7
- data/lib/graphql/relay/relation_connection.rb +0 -188
- data/lib/graphql/relay/type_extensions.rb +0 -32
- data/lib/graphql/scalar_type.rb +0 -91
- data/lib/graphql/schema/base_64_bp.rb +0 -26
- 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 -17
- data/lib/graphql/schema/member/accepts_definition.rb +0 -152
- data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -31
- data/lib/graphql/schema/member/instrumentation.rb +0 -131
- data/lib/graphql/schema/middleware_chain.rb +0 -82
- data/lib/graphql/schema/possible_types.rb +0 -44
- data/lib/graphql/schema/rescue_middleware.rb +0 -60
- data/lib/graphql/schema/timeout_middleware.rb +0 -88
- data/lib/graphql/schema/traversal.rb +0 -228
- data/lib/graphql/schema/validation.rb +0 -313
- data/lib/graphql/static_validation/default_visitor.rb +0 -15
- data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
- data/lib/graphql/static_validation/type_stack.rb +0 -216
- data/lib/graphql/string_type.rb +0 -2
- data/lib/graphql/subscriptions/instrumentation.rb +0 -79
- data/lib/graphql/subscriptions/subscription_root.rb +0 -76
- data/lib/graphql/tracing/skylight_tracing.rb +0 -70
- data/lib/graphql/types/relay/default_relay.rb +0 -27
- data/lib/graphql/types/relay/node_field.rb +0 -25
- data/lib/graphql/types/relay/nodes_field.rb +0 -27
- data/lib/graphql/union_type.rb +0 -115
- data/lib/graphql/upgrader/member.rb +0 -937
- data/lib/graphql/upgrader/schema.rb +0 -38
@@ -30,12 +30,9 @@ module GraphQL
|
|
30
30
|
# # Check the result
|
31
31
|
# visitor.count
|
32
32
|
# # => 3
|
33
|
+
#
|
34
|
+
# @see GraphQL::Language::StaticVisitor for a faster visitor that doesn't support modifying the document
|
33
35
|
class Visitor
|
34
|
-
# If any hook returns this value, the {Visitor} stops visiting this
|
35
|
-
# node right away
|
36
|
-
# @deprecated Use `super` to continue the visit; or don't call it to halt.
|
37
|
-
SKIP = :_skip
|
38
|
-
|
39
36
|
class DeleteNode; end
|
40
37
|
|
41
38
|
# When this is returned from a visitor method,
|
@@ -44,28 +41,18 @@ module GraphQL
|
|
44
41
|
|
45
42
|
def initialize(document)
|
46
43
|
@document = document
|
47
|
-
@visitors = {}
|
48
44
|
@result = nil
|
49
45
|
end
|
50
46
|
|
51
47
|
# @return [GraphQL::Language::Nodes::Document] The document with any modifications applied
|
52
48
|
attr_reader :result
|
53
49
|
|
54
|
-
#
|
55
|
-
# @param node_class [Class] The node class that you want to listen to
|
56
|
-
# @return [NodeVisitor]
|
57
|
-
#
|
58
|
-
# @example Run a hook whenever you enter a new Field
|
59
|
-
# visitor[GraphQL::Language::Nodes::Field] << ->(node, parent) { p "Here's a field" }
|
60
|
-
# @deprecated see `on_` methods, like {#on_field}
|
61
|
-
def [](node_class)
|
62
|
-
@visitors[node_class] ||= NodeVisitor.new
|
63
|
-
end
|
64
|
-
|
65
|
-
# Visit `document` and all children, applying hooks as you go
|
50
|
+
# Visit `document` and all children
|
66
51
|
# @return [void]
|
67
52
|
def visit
|
68
|
-
|
53
|
+
# `@document` may be any kind of node:
|
54
|
+
visit_method = :"#{@document.visit_method}_with_modifications"
|
55
|
+
result = public_send(visit_method, @document, nil)
|
69
56
|
@result = if result.is_a?(Array)
|
70
57
|
result.first
|
71
58
|
else
|
@@ -74,104 +61,204 @@ module GraphQL
|
|
74
61
|
end
|
75
62
|
end
|
76
63
|
|
77
|
-
#
|
78
|
-
def
|
79
|
-
|
80
|
-
|
64
|
+
# We don't use `alias` here because it breaks `super`
|
65
|
+
def self.make_visit_methods(ast_node_class)
|
66
|
+
node_method = ast_node_class.visit_method
|
67
|
+
children_of_type = ast_node_class.children_of_type
|
68
|
+
child_visit_method = :"#{node_method}_children"
|
81
69
|
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
70
|
+
class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
71
|
+
# The default implementation for visiting an AST node.
|
72
|
+
# It doesn't _do_ anything, but it continues to visiting the node's children.
|
73
|
+
# To customize this hook, override one of its make_visit_methods (or the base method?)
|
74
|
+
# in your subclasses.
|
75
|
+
#
|
76
|
+
# @param node [GraphQL::Language::Nodes::AbstractNode] the node being visited
|
77
|
+
# @param parent [GraphQL::Language::Nodes::AbstractNode, nil] the previously-visited node, or `nil` if this is the root node.
|
78
|
+
# @return [Array, nil] If there were modifications, it returns an array of new nodes, otherwise, it returns `nil`.
|
79
|
+
def #{node_method}(node, parent)
|
80
|
+
if node.equal?(DELETE_NODE)
|
81
|
+
# This might be passed to `super(DELETE_NODE, ...)`
|
82
|
+
# by a user hook, don't want to keep visiting in that case.
|
83
|
+
[node, parent]
|
84
|
+
else
|
85
|
+
new_node = node
|
86
|
+
#{
|
87
|
+
if method_defined?(child_visit_method)
|
88
|
+
"new_node = #{child_visit_method}(new_node)"
|
89
|
+
elsif children_of_type
|
90
|
+
children_of_type.map do |child_accessor, child_class|
|
91
|
+
"node.#{child_accessor}.each do |child_node|
|
92
|
+
new_child_and_node = #{child_class.visit_method}_with_modifications(child_node, new_node)
|
93
|
+
# Reassign `node` in case the child hook makes a modification
|
94
|
+
if new_child_and_node.is_a?(Array)
|
95
|
+
new_node = new_child_and_node[1]
|
96
|
+
end
|
97
|
+
end"
|
98
|
+
end.join("\n")
|
99
|
+
else
|
100
|
+
""
|
101
|
+
end
|
102
|
+
}
|
103
|
+
|
104
|
+
if new_node.equal?(node)
|
105
|
+
[node, parent]
|
106
|
+
else
|
107
|
+
[new_node, parent]
|
106
108
|
end
|
107
109
|
end
|
108
110
|
end
|
109
|
-
end_visit(new_node, parent) unless no_hooks
|
110
111
|
|
111
|
-
|
112
|
-
|
112
|
+
def #{node_method}_with_modifications(node, parent)
|
113
|
+
new_node_and_new_parent = #{node_method}(node, parent)
|
114
|
+
apply_modifications(node, parent, new_node_and_new_parent)
|
115
|
+
end
|
116
|
+
RUBY
|
117
|
+
end
|
118
|
+
|
119
|
+
def on_document_children(document_node)
|
120
|
+
new_node = document_node
|
121
|
+
document_node.children.each do |child_node|
|
122
|
+
visit_method = :"#{child_node.visit_method}_with_modifications"
|
123
|
+
new_child_and_node = public_send(visit_method, child_node, new_node)
|
124
|
+
# Reassign `node` in case the child hook makes a modification
|
125
|
+
if new_child_and_node.is_a?(Array)
|
126
|
+
new_node = new_child_and_node[1]
|
127
|
+
end
|
128
|
+
end
|
129
|
+
new_node
|
130
|
+
end
|
131
|
+
|
132
|
+
def on_field_children(new_node)
|
133
|
+
new_node.arguments.each do |arg_node| # rubocop:disable Development/ContextIsPassedCop
|
134
|
+
new_child_and_node = on_argument_with_modifications(arg_node, new_node)
|
135
|
+
# Reassign `node` in case the child hook makes a modification
|
136
|
+
if new_child_and_node.is_a?(Array)
|
137
|
+
new_node = new_child_and_node[1]
|
138
|
+
end
|
139
|
+
end
|
140
|
+
new_node = visit_directives(new_node)
|
141
|
+
new_node = visit_selections(new_node)
|
142
|
+
new_node
|
143
|
+
end
|
144
|
+
|
145
|
+
def visit_directives(new_node)
|
146
|
+
new_node.directives.each do |dir_node|
|
147
|
+
new_child_and_node = on_directive_with_modifications(dir_node, new_node)
|
148
|
+
# Reassign `node` in case the child hook makes a modification
|
149
|
+
if new_child_and_node.is_a?(Array)
|
150
|
+
new_node = new_child_and_node[1]
|
151
|
+
end
|
152
|
+
end
|
153
|
+
new_node
|
154
|
+
end
|
155
|
+
|
156
|
+
def visit_selections(new_node)
|
157
|
+
new_node.selections.each do |selection|
|
158
|
+
new_child_and_node = case selection
|
159
|
+
when GraphQL::Language::Nodes::Field
|
160
|
+
on_field_with_modifications(selection, new_node)
|
161
|
+
when GraphQL::Language::Nodes::InlineFragment
|
162
|
+
on_inline_fragment_with_modifications(selection, new_node)
|
163
|
+
when GraphQL::Language::Nodes::FragmentSpread
|
164
|
+
on_fragment_spread_with_modifications(selection, new_node)
|
113
165
|
else
|
114
|
-
|
166
|
+
raise ArgumentError, "Invariant: unexpected field selection #{selection.class} (#{selection.inspect})"
|
167
|
+
end
|
168
|
+
# Reassign `node` in case the child hook makes a modification
|
169
|
+
if new_child_and_node.is_a?(Array)
|
170
|
+
new_node = new_child_and_node[1]
|
115
171
|
end
|
116
172
|
end
|
173
|
+
new_node
|
117
174
|
end
|
118
175
|
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
176
|
+
def on_fragment_definition_children(new_node)
|
177
|
+
new_node = visit_directives(new_node)
|
178
|
+
new_node = visit_selections(new_node)
|
179
|
+
new_node
|
180
|
+
end
|
181
|
+
|
182
|
+
alias :on_inline_fragment_children :on_fragment_definition_children
|
183
|
+
|
184
|
+
def on_operation_definition_children(new_node)
|
185
|
+
new_node.variables.each do |arg_node|
|
186
|
+
new_child_and_node = on_variable_definition_with_modifications(arg_node, new_node)
|
187
|
+
# Reassign `node` in case the child hook makes a modification
|
188
|
+
if new_child_and_node.is_a?(Array)
|
189
|
+
new_node = new_child_and_node[1]
|
126
190
|
end
|
127
|
-
|
191
|
+
end
|
192
|
+
new_node = visit_directives(new_node)
|
193
|
+
new_node = visit_selections(new_node)
|
194
|
+
new_node
|
128
195
|
end
|
129
196
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
197
|
+
def on_argument_children(new_node)
|
198
|
+
new_node.children.each do |value_node|
|
199
|
+
new_child_and_node = case value_node
|
200
|
+
when Language::Nodes::VariableIdentifier
|
201
|
+
on_variable_identifier_with_modifications(value_node, new_node)
|
202
|
+
when Language::Nodes::InputObject
|
203
|
+
on_input_object_with_modifications(value_node, new_node)
|
204
|
+
when Language::Nodes::Enum
|
205
|
+
on_enum_with_modifications(value_node, new_node)
|
206
|
+
when Language::Nodes::NullValue
|
207
|
+
on_null_value_with_modifications(value_node, new_node)
|
208
|
+
else
|
209
|
+
raise ArgumentError, "Invariant: unexpected argument value node #{value_node.class} (#{value_node.inspect})"
|
210
|
+
end
|
211
|
+
# Reassign `node` in case the child hook makes a modification
|
212
|
+
if new_child_and_node.is_a?(Array)
|
213
|
+
new_node = new_child_and_node[1]
|
214
|
+
end
|
215
|
+
end
|
216
|
+
new_node
|
217
|
+
end
|
218
|
+
|
219
|
+
[
|
220
|
+
Language::Nodes::Argument,
|
221
|
+
Language::Nodes::Directive,
|
222
|
+
Language::Nodes::DirectiveDefinition,
|
223
|
+
Language::Nodes::DirectiveLocation,
|
224
|
+
Language::Nodes::Document,
|
225
|
+
Language::Nodes::Enum,
|
226
|
+
Language::Nodes::EnumTypeDefinition,
|
227
|
+
Language::Nodes::EnumTypeExtension,
|
228
|
+
Language::Nodes::EnumValueDefinition,
|
229
|
+
Language::Nodes::Field,
|
230
|
+
Language::Nodes::FieldDefinition,
|
231
|
+
Language::Nodes::FragmentDefinition,
|
232
|
+
Language::Nodes::FragmentSpread,
|
233
|
+
Language::Nodes::InlineFragment,
|
234
|
+
Language::Nodes::InputObject,
|
235
|
+
Language::Nodes::InputObjectTypeDefinition,
|
236
|
+
Language::Nodes::InputObjectTypeExtension,
|
237
|
+
Language::Nodes::InputValueDefinition,
|
238
|
+
Language::Nodes::InterfaceTypeDefinition,
|
239
|
+
Language::Nodes::InterfaceTypeExtension,
|
240
|
+
Language::Nodes::ListType,
|
241
|
+
Language::Nodes::NonNullType,
|
242
|
+
Language::Nodes::NullValue,
|
243
|
+
Language::Nodes::ObjectTypeDefinition,
|
244
|
+
Language::Nodes::ObjectTypeExtension,
|
245
|
+
Language::Nodes::OperationDefinition,
|
246
|
+
Language::Nodes::ScalarTypeDefinition,
|
247
|
+
Language::Nodes::ScalarTypeExtension,
|
248
|
+
Language::Nodes::SchemaDefinition,
|
249
|
+
Language::Nodes::SchemaExtension,
|
250
|
+
Language::Nodes::TypeName,
|
251
|
+
Language::Nodes::UnionTypeDefinition,
|
252
|
+
Language::Nodes::UnionTypeExtension,
|
253
|
+
Language::Nodes::VariableDefinition,
|
254
|
+
Language::Nodes::VariableIdentifier,
|
255
|
+
].each do |ast_node_class|
|
256
|
+
make_visit_methods(ast_node_class)
|
257
|
+
end
|
165
258
|
|
166
259
|
private
|
167
260
|
|
168
|
-
|
169
|
-
# copy `parent` so that it contains the copy of that node as a child,
|
170
|
-
# then return the copies
|
171
|
-
# If a non-array value is returned, consuming functions should ignore
|
172
|
-
# said value
|
173
|
-
def on_node_with_modifications(node, parent)
|
174
|
-
new_node_and_new_parent = visit_node(node, parent)
|
261
|
+
def apply_modifications(node, parent, new_node_and_new_parent)
|
175
262
|
if new_node_and_new_parent.is_a?(Array)
|
176
263
|
new_node = new_node_and_new_parent[0]
|
177
264
|
new_parent = new_node_and_new_parent[1]
|
@@ -197,46 +284,6 @@ module GraphQL
|
|
197
284
|
new_node_and_new_parent
|
198
285
|
end
|
199
286
|
end
|
200
|
-
|
201
|
-
def begin_visit(node, parent)
|
202
|
-
node_visitor = self[node.class]
|
203
|
-
self.class.apply_hooks(node_visitor.enter, node, parent)
|
204
|
-
end
|
205
|
-
|
206
|
-
# Should global `leave` visitors come first or last?
|
207
|
-
def end_visit(node, parent)
|
208
|
-
node_visitor = self[node.class]
|
209
|
-
self.class.apply_hooks(node_visitor.leave, node, parent)
|
210
|
-
end
|
211
|
-
|
212
|
-
# If one of the visitors returns SKIP, stop visiting this node
|
213
|
-
def self.apply_hooks(hooks, node, parent)
|
214
|
-
hooks.each do |proc|
|
215
|
-
return false if proc.call(node, parent) == SKIP
|
216
|
-
end
|
217
|
-
true
|
218
|
-
end
|
219
|
-
|
220
|
-
# Collect `enter` and `leave` hooks for classes in {GraphQL::Language::Nodes}
|
221
|
-
#
|
222
|
-
# Access {NodeVisitor}s via {GraphQL::Language::Visitor#[]}
|
223
|
-
class NodeVisitor
|
224
|
-
# @return [Array<Proc>] Hooks to call when entering a node of this type
|
225
|
-
attr_reader :enter
|
226
|
-
# @return [Array<Proc>] Hooks to call when leaving a node of this type
|
227
|
-
attr_reader :leave
|
228
|
-
|
229
|
-
def initialize
|
230
|
-
@enter = []
|
231
|
-
@leave = []
|
232
|
-
end
|
233
|
-
|
234
|
-
# Shorthand to add a hook to the {#enter} array
|
235
|
-
# @param hook [Proc] A hook to add
|
236
|
-
def <<(hook)
|
237
|
-
enter << hook
|
238
|
-
end
|
239
|
-
end
|
240
287
|
end
|
241
288
|
end
|
242
289
|
end
|
data/lib/graphql/language.rb
CHANGED
@@ -8,6 +8,7 @@ require "graphql/language/lexer"
|
|
8
8
|
require "graphql/language/nodes"
|
9
9
|
require "graphql/language/cache"
|
10
10
|
require "graphql/language/parser"
|
11
|
+
require "graphql/language/static_visitor"
|
11
12
|
require "graphql/language/token"
|
12
13
|
require "graphql/language/visitor"
|
13
14
|
require "graphql/language/definition_slice"
|
@@ -12,10 +12,14 @@ module GraphQL
|
|
12
12
|
attr_reader :id
|
13
13
|
# @return [Object] The value found with this ID
|
14
14
|
attr_reader :object
|
15
|
-
|
15
|
+
# @return [GraphQL::Query::Context]
|
16
|
+
attr_reader :context
|
17
|
+
|
18
|
+
def initialize(argument:, id:, object:, context:)
|
16
19
|
@id = id
|
17
20
|
@argument = argument
|
18
21
|
@object = object
|
22
|
+
@context = context
|
19
23
|
super("No object found for `#{argument.graphql_name}: #{id.inspect}`")
|
20
24
|
end
|
21
25
|
end
|
@@ -7,13 +7,10 @@ module GraphQL
|
|
7
7
|
class ActiveRecordRelationConnection < Pagination::RelationConnection
|
8
8
|
private
|
9
9
|
|
10
|
-
def relation_larger_than(relation, size)
|
11
|
-
initial_offset = relation.offset_value || 0
|
12
|
-
relation.offset(initial_offset + size).exists?
|
13
|
-
end
|
14
|
-
|
15
10
|
def relation_count(relation)
|
16
|
-
int_or_hash = if
|
11
|
+
int_or_hash = if already_loaded?(relation)
|
12
|
+
relation.size
|
13
|
+
elsif relation.respond_to?(:unscope)
|
17
14
|
relation.unscope(:order).count(:all)
|
18
15
|
else
|
19
16
|
# Rails 3
|
@@ -28,11 +25,19 @@ module GraphQL
|
|
28
25
|
end
|
29
26
|
|
30
27
|
def relation_limit(relation)
|
31
|
-
relation.
|
28
|
+
if relation.is_a?(Array)
|
29
|
+
nil
|
30
|
+
else
|
31
|
+
relation.limit_value
|
32
|
+
end
|
32
33
|
end
|
33
34
|
|
34
35
|
def relation_offset(relation)
|
35
|
-
relation.
|
36
|
+
if relation.is_a?(Array)
|
37
|
+
nil
|
38
|
+
else
|
39
|
+
relation.offset_value
|
40
|
+
end
|
36
41
|
end
|
37
42
|
|
38
43
|
def null_relation(relation)
|
@@ -43,6 +48,30 @@ module GraphQL
|
|
43
48
|
relation.where("1=2")
|
44
49
|
end
|
45
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
|
46
75
|
end
|
47
76
|
end
|
48
77
|
end
|
@@ -35,9 +35,11 @@ module GraphQL
|
|
35
35
|
def load_nodes
|
36
36
|
@nodes ||= begin
|
37
37
|
sliced_nodes = if before && after
|
38
|
-
|
38
|
+
end_idx = index_from_cursor(before) - 2
|
39
|
+
end_idx < 0 ? [] : items[index_from_cursor(after)..end_idx] || []
|
39
40
|
elsif before
|
40
|
-
|
41
|
+
end_idx = index_from_cursor(before) - 2
|
42
|
+
end_idx < 0 ? [] : items[0..end_idx] || []
|
41
43
|
elsif after
|
42
44
|
items[index_from_cursor(after)..-1] || []
|
43
45
|
else
|
@@ -54,12 +56,12 @@ module GraphQL
|
|
54
56
|
false
|
55
57
|
end
|
56
58
|
|
57
|
-
@has_next_page = if
|
58
|
-
# There are more items after these items
|
59
|
-
sliced_nodes.count > first
|
60
|
-
elsif before
|
59
|
+
@has_next_page = if before
|
61
60
|
# The original array is longer than the `before` index
|
62
61
|
index_from_cursor(before) < items.length + 1
|
62
|
+
elsif first
|
63
|
+
# There are more items after these items
|
64
|
+
sliced_nodes.count > first
|
63
65
|
else
|
64
66
|
false
|
65
67
|
end
|
@@ -19,7 +19,15 @@ module GraphQL
|
|
19
19
|
attr_reader :items
|
20
20
|
|
21
21
|
# @return [GraphQL::Query::Context]
|
22
|
-
|
22
|
+
attr_reader :context
|
23
|
+
|
24
|
+
def context=(new_ctx)
|
25
|
+
@context = new_ctx
|
26
|
+
if @was_authorized_by_scope_items.nil?
|
27
|
+
@was_authorized_by_scope_items = detect_was_authorized_by_scope_items
|
28
|
+
end
|
29
|
+
@context
|
30
|
+
end
|
23
31
|
|
24
32
|
# @return [Object] the object this collection belongs to
|
25
33
|
attr_accessor :parent
|
@@ -56,8 +64,9 @@ module GraphQL
|
|
56
64
|
# @param last [Integer, nil] Limit parameter from the client, if provided
|
57
65
|
# @param before [String, nil] A cursor for pagination, if the client provided one.
|
58
66
|
# @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.
|
60
|
-
|
67
|
+
# @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.
|
68
|
+
# @param default_page_size [Integer, nil] A configured value to determine the result size when neither first or last are given.
|
69
|
+
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)
|
61
70
|
@items = items
|
62
71
|
@parent = parent
|
63
72
|
@context = context
|
@@ -70,12 +79,23 @@ module GraphQL
|
|
70
79
|
@edge_class = edge_class || self.class::Edge
|
71
80
|
# This is only true if the object was _initialized_ with an override
|
72
81
|
# or if one is assigned later.
|
73
|
-
@has_max_page_size_override = max_page_size !=
|
74
|
-
@max_page_size = if max_page_size ==
|
82
|
+
@has_max_page_size_override = max_page_size != NOT_CONFIGURED
|
83
|
+
@max_page_size = if max_page_size == NOT_CONFIGURED
|
75
84
|
nil
|
76
85
|
else
|
77
86
|
max_page_size
|
78
87
|
end
|
88
|
+
@has_default_page_size_override = default_page_size != NOT_CONFIGURED
|
89
|
+
@default_page_size = if default_page_size == NOT_CONFIGURED
|
90
|
+
nil
|
91
|
+
else
|
92
|
+
default_page_size
|
93
|
+
end
|
94
|
+
@was_authorized_by_scope_items = detect_was_authorized_by_scope_items
|
95
|
+
end
|
96
|
+
|
97
|
+
def was_authorized_by_scope_items?
|
98
|
+
@was_authorized_by_scope_items
|
79
99
|
end
|
80
100
|
|
81
101
|
def max_page_size=(new_value)
|
@@ -95,16 +115,36 @@ module GraphQL
|
|
95
115
|
@has_max_page_size_override
|
96
116
|
end
|
97
117
|
|
118
|
+
def default_page_size=(new_value)
|
119
|
+
@has_default_page_size_override = true
|
120
|
+
@default_page_size = new_value
|
121
|
+
end
|
122
|
+
|
123
|
+
def default_page_size
|
124
|
+
if @has_default_page_size_override
|
125
|
+
@default_page_size
|
126
|
+
else
|
127
|
+
context.schema.default_page_size
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def has_default_page_size_override?
|
132
|
+
@has_default_page_size_override
|
133
|
+
end
|
134
|
+
|
98
135
|
attr_writer :first
|
99
136
|
# @return [Integer, nil]
|
100
137
|
# A clamped `first` value.
|
101
138
|
# (The underlying instance variable doesn't have limits on it.)
|
102
|
-
# If neither `first` nor `last` is given, but `
|
139
|
+
# If neither `first` nor `last` is given, but `default_page_size` is
|
140
|
+
# present, default_page_size is used for first. If `default_page_size`
|
141
|
+
# is greater than `max_page_size``, it'll be clamped down to
|
142
|
+
# `max_page_size`. If `default_page_size` is nil, use `max_page_size`.
|
103
143
|
def first
|
104
144
|
@first ||= begin
|
105
145
|
capped = limit_pagination_argument(@first_value, max_page_size)
|
106
146
|
if capped.nil? && last.nil?
|
107
|
-
capped = max_page_size
|
147
|
+
capped = limit_pagination_argument(default_page_size, max_page_size) || max_page_size
|
108
148
|
end
|
109
149
|
capped
|
110
150
|
end
|
@@ -181,6 +221,16 @@ module GraphQL
|
|
181
221
|
|
182
222
|
private
|
183
223
|
|
224
|
+
def detect_was_authorized_by_scope_items
|
225
|
+
if @context &&
|
226
|
+
(current_runtime_state = Thread.current[:__graphql_runtime_info]) &&
|
227
|
+
(query_runtime_state = current_runtime_state[@context.query])
|
228
|
+
query_runtime_state.was_authorized_by_scope_items
|
229
|
+
else
|
230
|
+
nil
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
184
234
|
# @param argument [nil, Integer] `first` or `last`, as provided by the client
|
185
235
|
# @param max_page_size [nil, Integer]
|
186
236
|
# @return [nil, Integer] `nil` if the input was `nil`, otherwise a value between `0` and `max_page_size`
|
@@ -220,6 +270,10 @@ module GraphQL
|
|
220
270
|
def cursor
|
221
271
|
@cursor ||= @connection.cursor_for(@node)
|
222
272
|
end
|
273
|
+
|
274
|
+
def was_authorized_by_scope_items?
|
275
|
+
@connection.was_authorized_by_scope_items?
|
276
|
+
end
|
223
277
|
end
|
224
278
|
end
|
225
279
|
end
|