graphql_cody 1.13.0
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 +7 -0
- data/.yardopts +5 -0
- data/MIT-LICENSE +20 -0
- data/lib/generators/graphql/core.rb +74 -0
- data/lib/generators/graphql/enum_generator.rb +33 -0
- data/lib/generators/graphql/install_generator.rb +190 -0
- data/lib/generators/graphql/interface_generator.rb +27 -0
- data/lib/generators/graphql/loader_generator.rb +21 -0
- data/lib/generators/graphql/mutation_generator.rb +55 -0
- data/lib/generators/graphql/object_generator.rb +79 -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 +20 -0
- data/lib/generators/graphql/templates/base_argument.erb +6 -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 +6 -0
- data/lib/generators/graphql/templates/base_field.erb +7 -0
- data/lib/generators/graphql/templates/base_input_object.erb +7 -0
- data/lib/generators/graphql/templates/base_interface.erb +9 -0
- data/lib/generators/graphql/templates/base_mutation.erb +10 -0
- data/lib/generators/graphql/templates/base_object.erb +7 -0
- data/lib/generators/graphql/templates/base_scalar.erb +6 -0
- data/lib/generators/graphql/templates/base_union.erb +6 -0
- data/lib/generators/graphql/templates/enum.erb +7 -0
- data/lib/generators/graphql/templates/graphql_controller.erb +52 -0
- data/lib/generators/graphql/templates/interface.erb +8 -0
- data/lib/generators/graphql/templates/loader.erb +19 -0
- data/lib/generators/graphql/templates/mutation.erb +16 -0
- data/lib/generators/graphql/templates/mutation_type.erb +12 -0
- data/lib/generators/graphql/templates/node_type.erb +9 -0
- data/lib/generators/graphql/templates/object.erb +8 -0
- data/lib/generators/graphql/templates/query_type.erb +15 -0
- data/lib/generators/graphql/templates/scalar.erb +15 -0
- data/lib/generators/graphql/templates/schema.erb +27 -0
- data/lib/generators/graphql/templates/union.erb +7 -0
- data/lib/generators/graphql/type_generator.rb +98 -0
- data/lib/generators/graphql/union_generator.rb +33 -0
- data/lib/graphql/analysis/analyze_query.rb +98 -0
- data/lib/graphql/analysis/ast/analyzer.rb +84 -0
- data/lib/graphql/analysis/ast/field_usage.rb +51 -0
- data/lib/graphql/analysis/ast/max_query_complexity.rb +23 -0
- data/lib/graphql/analysis/ast/max_query_depth.rb +22 -0
- data/lib/graphql/analysis/ast/query_complexity.rb +230 -0
- data/lib/graphql/analysis/ast/query_depth.rb +56 -0
- data/lib/graphql/analysis/ast/visitor.rb +268 -0
- data/lib/graphql/analysis/ast.rb +91 -0
- data/lib/graphql/analysis/field_usage.rb +45 -0
- data/lib/graphql/analysis/max_query_complexity.rb +26 -0
- data/lib/graphql/analysis/max_query_depth.rb +26 -0
- data/lib/graphql/analysis/query_complexity.rb +88 -0
- data/lib/graphql/analysis/query_depth.rb +43 -0
- data/lib/graphql/analysis/reducer_state.rb +48 -0
- data/lib/graphql/analysis.rb +9 -0
- data/lib/graphql/analysis_error.rb +5 -0
- data/lib/graphql/argument.rb +131 -0
- data/lib/graphql/authorization.rb +82 -0
- data/lib/graphql/backtrace/inspect_result.rb +50 -0
- data/lib/graphql/backtrace/legacy_tracer.rb +56 -0
- data/lib/graphql/backtrace/table.rb +159 -0
- data/lib/graphql/backtrace/traced_error.rb +54 -0
- data/lib/graphql/backtrace/tracer.rb +81 -0
- data/lib/graphql/backtrace.rb +64 -0
- data/lib/graphql/backwards_compatibility.rb +61 -0
- data/lib/graphql/base_type.rb +230 -0
- data/lib/graphql/boolean_type.rb +2 -0
- data/lib/graphql/coercion_error.rb +13 -0
- data/lib/graphql/compatibility/execution_specification/counter_schema.rb +53 -0
- data/lib/graphql/compatibility/execution_specification/specification_schema.rb +200 -0
- data/lib/graphql/compatibility/execution_specification.rb +436 -0
- data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +111 -0
- data/lib/graphql/compatibility/lazy_execution_specification.rb +215 -0
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +87 -0
- data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +79 -0
- data/lib/graphql/compatibility/query_parser_specification.rb +266 -0
- data/lib/graphql/compatibility/schema_parser_specification.rb +682 -0
- data/lib/graphql/compatibility.rb +5 -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/define/assign_argument.rb +12 -0
- data/lib/graphql/define/assign_connection.rb +13 -0
- data/lib/graphql/define/assign_enum_value.rb +18 -0
- data/lib/graphql/define/assign_global_id_field.rb +11 -0
- data/lib/graphql/define/assign_mutation_function.rb +34 -0
- data/lib/graphql/define/assign_object_field.rb +42 -0
- data/lib/graphql/define/defined_object_proxy.rb +53 -0
- data/lib/graphql/define/instance_definable.rb +240 -0
- data/lib/graphql/define/no_definition_error.rb +7 -0
- data/lib/graphql/define/non_null_with_bang.rb +16 -0
- data/lib/graphql/define/type_definer.rb +31 -0
- data/lib/graphql/define.rb +31 -0
- data/lib/graphql/deprecated_dsl.rb +55 -0
- data/lib/graphql/deprecation.rb +9 -0
- data/lib/graphql/dig.rb +19 -0
- data/lib/graphql/directive/deprecated_directive.rb +2 -0
- data/lib/graphql/directive/include_directive.rb +2 -0
- data/lib/graphql/directive/skip_directive.rb +2 -0
- data/lib/graphql/directive.rb +107 -0
- data/lib/graphql/enum_type.rb +133 -0
- data/lib/graphql/execution/directive_checks.rb +37 -0
- data/lib/graphql/execution/errors.rb +163 -0
- data/lib/graphql/execution/execute.rb +333 -0
- data/lib/graphql/execution/flatten.rb +40 -0
- data/lib/graphql/execution/instrumentation.rb +92 -0
- 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 +103 -0
- data/lib/graphql/execution/interpreter/execution_errors.rb +29 -0
- data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
- data/lib/graphql/execution/interpreter/resolve.rb +70 -0
- data/lib/graphql/execution/interpreter/runtime.rb +949 -0
- data/lib/graphql/execution/interpreter.rb +122 -0
- data/lib/graphql/execution/lazy/lazy_method_map.rb +98 -0
- data/lib/graphql/execution/lazy/resolve.rb +91 -0
- data/lib/graphql/execution/lazy.rb +83 -0
- data/lib/graphql/execution/lookahead.rb +307 -0
- data/lib/graphql/execution/multiplex.rb +214 -0
- data/lib/graphql/execution/typecast.rb +50 -0
- data/lib/graphql/execution.rb +11 -0
- data/lib/graphql/execution_error.rb +58 -0
- data/lib/graphql/field/resolve.rb +59 -0
- data/lib/graphql/field.rb +226 -0
- data/lib/graphql/filter.rb +53 -0
- data/lib/graphql/float_type.rb +2 -0
- data/lib/graphql/function.rb +128 -0
- data/lib/graphql/id_type.rb +2 -0
- data/lib/graphql/input_object_type.rb +138 -0
- data/lib/graphql/int_type.rb +2 -0
- data/lib/graphql/integer_decoding_error.rb +17 -0
- data/lib/graphql/integer_encoding_error.rb +36 -0
- data/lib/graphql/interface_type.rb +72 -0
- data/lib/graphql/internal_representation/document.rb +27 -0
- data/lib/graphql/internal_representation/node.rb +206 -0
- data/lib/graphql/internal_representation/print.rb +51 -0
- data/lib/graphql/internal_representation/rewrite.rb +184 -0
- data/lib/graphql/internal_representation/scope.rb +88 -0
- data/lib/graphql/internal_representation/visit.rb +36 -0
- data/lib/graphql/internal_representation.rb +7 -0
- data/lib/graphql/introspection/base_object.rb +13 -0
- data/lib/graphql/introspection/directive_location_enum.rb +15 -0
- data/lib/graphql/introspection/directive_type.rb +29 -0
- data/lib/graphql/introspection/dynamic_fields.rb +17 -0
- data/lib/graphql/introspection/entry_points.rb +35 -0
- data/lib/graphql/introspection/enum_value_type.rb +23 -0
- data/lib/graphql/introspection/field_type.rb +28 -0
- data/lib/graphql/introspection/input_value_type.rb +67 -0
- data/lib/graphql/introspection/introspection_query.rb +7 -0
- data/lib/graphql/introspection/schema_type.rb +44 -0
- data/lib/graphql/introspection/type_kind_enum.rb +13 -0
- data/lib/graphql/introspection/type_type.rb +95 -0
- data/lib/graphql/introspection.rb +114 -0
- data/lib/graphql/invalid_name_error.rb +11 -0
- data/lib/graphql/invalid_null_error.rb +50 -0
- data/lib/graphql/language/block_string.rb +99 -0
- data/lib/graphql/language/cache.rb +37 -0
- data/lib/graphql/language/definition_slice.rb +41 -0
- data/lib/graphql/language/document_from_schema_definition.rb +347 -0
- data/lib/graphql/language/generation.rb +24 -0
- data/lib/graphql/language/lexer.rb +1467 -0
- data/lib/graphql/language/lexer.rl +258 -0
- data/lib/graphql/language/nodes.rb +707 -0
- data/lib/graphql/language/parser.rb +1974 -0
- data/lib/graphql/language/parser.y +544 -0
- data/lib/graphql/language/printer.rb +366 -0
- data/lib/graphql/language/sanitized_printer.rb +222 -0
- data/lib/graphql/language/token.rb +34 -0
- data/lib/graphql/language/visitor.rb +242 -0
- data/lib/graphql/language.rb +36 -0
- data/lib/graphql/list_type.rb +80 -0
- data/lib/graphql/load_application_object_failed_error.rb +22 -0
- data/lib/graphql/name_validator.rb +11 -0
- data/lib/graphql/non_null_type.rb +71 -0
- data/lib/graphql/object_type.rb +130 -0
- data/lib/graphql/pagination/active_record_relation_connection.rb +48 -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 +196 -0
- data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
- data/lib/graphql/pagination.rb +6 -0
- data/lib/graphql/parse_error.rb +24 -0
- data/lib/graphql/query/arguments.rb +189 -0
- data/lib/graphql/query/arguments_cache.rb +24 -0
- data/lib/graphql/query/context.rb +371 -0
- data/lib/graphql/query/executor.rb +52 -0
- data/lib/graphql/query/fingerprint.rb +26 -0
- data/lib/graphql/query/input_validation_result.rb +43 -0
- data/lib/graphql/query/literal_input.rb +136 -0
- data/lib/graphql/query/null_context.rb +55 -0
- data/lib/graphql/query/result.rb +63 -0
- data/lib/graphql/query/serial_execution/field_resolution.rb +92 -0
- data/lib/graphql/query/serial_execution/operation_resolution.rb +19 -0
- data/lib/graphql/query/serial_execution/selection_resolution.rb +23 -0
- data/lib/graphql/query/serial_execution/value_resolution.rb +87 -0
- data/lib/graphql/query/serial_execution.rb +40 -0
- data/lib/graphql/query/validation_pipeline.rb +139 -0
- data/lib/graphql/query/variable_validation_error.rb +44 -0
- data/lib/graphql/query/variables.rb +78 -0
- data/lib/graphql/query.rb +454 -0
- data/lib/graphql/railtie.rb +117 -0
- data/lib/graphql/rake_task/validate.rb +63 -0
- data/lib/graphql/rake_task.rb +145 -0
- data/lib/graphql/relay/array_connection.rb +83 -0
- data/lib/graphql/relay/base_connection.rb +189 -0
- data/lib/graphql/relay/connection_instrumentation.rb +54 -0
- data/lib/graphql/relay/connection_resolve.rb +43 -0
- data/lib/graphql/relay/connection_type.rb +41 -0
- data/lib/graphql/relay/edge.rb +27 -0
- data/lib/graphql/relay/edge_type.rb +19 -0
- data/lib/graphql/relay/edges_instrumentation.rb +39 -0
- data/lib/graphql/relay/global_id_resolve.rb +18 -0
- data/lib/graphql/relay/mongo_relation_connection.rb +50 -0
- data/lib/graphql/relay/mutation/instrumentation.rb +23 -0
- data/lib/graphql/relay/mutation/resolve.rb +56 -0
- data/lib/graphql/relay/mutation/result.rb +38 -0
- data/lib/graphql/relay/mutation.rb +106 -0
- data/lib/graphql/relay/node.rb +39 -0
- data/lib/graphql/relay/page_info.rb +7 -0
- data/lib/graphql/relay/range_add.rb +59 -0
- data/lib/graphql/relay/relation_connection.rb +188 -0
- data/lib/graphql/relay/type_extensions.rb +32 -0
- data/lib/graphql/relay.rb +18 -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/runtime_type_error.rb +5 -0
- data/lib/graphql/scalar_type.rb +91 -0
- data/lib/graphql/schema/addition.rb +247 -0
- data/lib/graphql/schema/argument.rb +383 -0
- data/lib/graphql/schema/base_64_bp.rb +26 -0
- data/lib/graphql/schema/base_64_encoder.rb +21 -0
- data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +47 -0
- data/lib/graphql/schema/build_from_definition/resolve_map.rb +78 -0
- data/lib/graphql/schema/build_from_definition.rb +477 -0
- data/lib/graphql/schema/built_in_types.rb +12 -0
- data/lib/graphql/schema/catchall_middleware.rb +35 -0
- data/lib/graphql/schema/default_parse_error.rb +10 -0
- data/lib/graphql/schema/default_type_error.rb +17 -0
- data/lib/graphql/schema/directive/deprecated.rb +18 -0
- data/lib/graphql/schema/directive/feature.rb +66 -0
- data/lib/graphql/schema/directive/flagged.rb +57 -0
- data/lib/graphql/schema/directive/include.rb +25 -0
- data/lib/graphql/schema/directive/skip.rb +25 -0
- data/lib/graphql/schema/directive/transform.rb +60 -0
- data/lib/graphql/schema/directive.rb +210 -0
- data/lib/graphql/schema/enum.rb +193 -0
- data/lib/graphql/schema/enum_value.rb +97 -0
- data/lib/graphql/schema/field/connection_extension.rb +76 -0
- data/lib/graphql/schema/field/scope_extension.rb +22 -0
- data/lib/graphql/schema/field.rb +880 -0
- data/lib/graphql/schema/field_extension.rb +69 -0
- data/lib/graphql/schema/find_inherited_value.rb +36 -0
- data/lib/graphql/schema/finder.rb +155 -0
- data/lib/graphql/schema/input_object.rb +253 -0
- data/lib/graphql/schema/interface.rb +136 -0
- data/lib/graphql/schema/introspection_system.rb +169 -0
- data/lib/graphql/schema/invalid_type_error.rb +7 -0
- data/lib/graphql/schema/late_bound_type.rb +33 -0
- data/lib/graphql/schema/list.rb +75 -0
- data/lib/graphql/schema/loader.rb +226 -0
- data/lib/graphql/schema/member/accepts_definition.rb +159 -0
- data/lib/graphql/schema/member/base_dsl_methods.rb +129 -0
- data/lib/graphql/schema/member/build_type.rb +180 -0
- data/lib/graphql/schema/member/cached_graphql_definition.rb +31 -0
- data/lib/graphql/schema/member/graphql_type_names.rb +21 -0
- data/lib/graphql/schema/member/has_arguments.rb +332 -0
- 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 +163 -0
- data/lib/graphql/schema/member/has_interfaces.rb +90 -0
- data/lib/graphql/schema/member/has_path.rb +25 -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 +131 -0
- data/lib/graphql/schema/member/relay_shortcuts.rb +47 -0
- data/lib/graphql/schema/member/scoped.rb +21 -0
- data/lib/graphql/schema/member/type_system_helpers.rb +38 -0
- data/lib/graphql/schema/member/validates_input.rb +33 -0
- data/lib/graphql/schema/member.rb +161 -0
- data/lib/graphql/schema/middleware_chain.rb +82 -0
- data/lib/graphql/schema/mutation.rb +94 -0
- data/lib/graphql/schema/non_null.rb +67 -0
- data/lib/graphql/schema/null_mask.rb +11 -0
- data/lib/graphql/schema/object.rb +150 -0
- data/lib/graphql/schema/possible_types.rb +44 -0
- data/lib/graphql/schema/printer.rb +100 -0
- data/lib/graphql/schema/relay_classic_mutation.rb +160 -0
- data/lib/graphql/schema/rescue_middleware.rb +60 -0
- data/lib/graphql/schema/resolver/has_payload_type.rb +96 -0
- data/lib/graphql/schema/resolver.rb +397 -0
- data/lib/graphql/schema/scalar.rb +69 -0
- data/lib/graphql/schema/subscription.rb +155 -0
- data/lib/graphql/schema/timeout.rb +123 -0
- data/lib/graphql/schema/timeout_middleware.rb +88 -0
- data/lib/graphql/schema/traversal.rb +228 -0
- data/lib/graphql/schema/type_expression.rb +43 -0
- data/lib/graphql/schema/type_membership.rb +48 -0
- data/lib/graphql/schema/union.rb +95 -0
- data/lib/graphql/schema/unique_within_type.rb +34 -0
- data/lib/graphql/schema/validation.rb +313 -0
- 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 +68 -0
- data/lib/graphql/schema/validator.rb +174 -0
- data/lib/graphql/schema/warden.rb +409 -0
- data/lib/graphql/schema/wrapper.rb +29 -0
- data/lib/graphql/schema.rb +1945 -0
- data/lib/graphql/static_validation/all_rules.rb +40 -0
- data/lib/graphql/static_validation/base_visitor.rb +217 -0
- data/lib/graphql/static_validation/default_visitor.rb +15 -0
- data/lib/graphql/static_validation/definition_dependencies.rb +198 -0
- data/lib/graphql/static_validation/error.rb +46 -0
- data/lib/graphql/static_validation/interpreter_visitor.rb +14 -0
- data/lib/graphql/static_validation/literal_validator.rb +139 -0
- data/lib/graphql/static_validation/no_validate_visitor.rb +10 -0
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +66 -0
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +48 -0
- data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +31 -0
- data/lib/graphql/static_validation/rules/argument_names_are_unique_error.rb +30 -0
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +71 -0
- data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +37 -0
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +23 -0
- data/lib/graphql/static_validation/rules/directives_are_defined_error.rb +29 -0
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +65 -0
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations_error.rb +31 -0
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +30 -0
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type_error.rb +32 -0
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +73 -0
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections_error.rb +31 -0
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +418 -0
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +53 -0
- data/lib/graphql/static_validation/rules/fragment_names_are_unique.rb +30 -0
- data/lib/graphql/static_validation/rules/fragment_names_are_unique_error.rb +29 -0
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +73 -0
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible_error.rb +35 -0
- data/lib/graphql/static_validation/rules/fragment_types_exist.rb +39 -0
- data/lib/graphql/static_validation/rules/fragment_types_exist_error.rb +29 -0
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +21 -0
- data/lib/graphql/static_validation/rules/fragments_are_finite_error.rb +29 -0
- data/lib/graphql/static_validation/rules/fragments_are_named.rb +16 -0
- data/lib/graphql/static_validation/rules/fragments_are_named_error.rb +26 -0
- data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +37 -0
- data/lib/graphql/static_validation/rules/fragments_are_on_composite_types_error.rb +30 -0
- data/lib/graphql/static_validation/rules/fragments_are_used.rb +32 -0
- data/lib/graphql/static_validation/rules/fragments_are_used_error.rb +29 -0
- 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/mutation_root_exists.rb +17 -0
- data/lib/graphql/static_validation/rules/mutation_root_exists_error.rb +26 -0
- data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +41 -0
- data/lib/graphql/static_validation/rules/no_definitions_are_present_error.rb +25 -0
- data/lib/graphql/static_validation/rules/operation_names_are_valid.rb +36 -0
- data/lib/graphql/static_validation/rules/operation_names_are_valid_error.rb +28 -0
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +37 -0
- data/lib/graphql/static_validation/rules/required_arguments_are_present_error.rb +35 -0
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +59 -0
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present_error.rb +35 -0
- data/lib/graphql/static_validation/rules/subscription_root_exists.rb +17 -0
- data/lib/graphql/static_validation/rules/subscription_root_exists_error.rb +26 -0
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +50 -0
- data/lib/graphql/static_validation/rules/unique_directives_per_location_error.rb +29 -0
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +46 -0
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed_error.rb +39 -0
- data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +24 -0
- data/lib/graphql/static_validation/rules/variable_names_are_unique_error.rb +29 -0
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +153 -0
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed_error.rb +38 -0
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +39 -0
- data/lib/graphql/static_validation/rules/variables_are_input_types_error.rb +32 -0
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +155 -0
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined_error.rb +37 -0
- data/lib/graphql/static_validation/type_stack.rb +216 -0
- data/lib/graphql/static_validation/validation_context.rb +49 -0
- data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
- data/lib/graphql/static_validation/validator.rb +96 -0
- data/lib/graphql/static_validation.rb +19 -0
- data/lib/graphql/string_encoding_error.rb +20 -0
- data/lib/graphql/string_type.rb +2 -0
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +245 -0
- 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 +144 -0
- data/lib/graphql/subscriptions/instrumentation.rb +79 -0
- data/lib/graphql/subscriptions/serialize.rb +138 -0
- data/lib/graphql/subscriptions/subscription_root.rb +76 -0
- data/lib/graphql/subscriptions.rb +299 -0
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +35 -0
- data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +51 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +76 -0
- data/lib/graphql/tracing/new_relic_tracing.rb +51 -0
- data/lib/graphql/tracing/platform_tracing.rb +139 -0
- data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +32 -0
- data/lib/graphql/tracing/prometheus_tracing.rb +67 -0
- data/lib/graphql/tracing/scout_tracing.rb +54 -0
- data/lib/graphql/tracing/skylight_tracing.rb +70 -0
- data/lib/graphql/tracing/statsd_tracing.rb +42 -0
- data/lib/graphql/tracing.rb +95 -0
- data/lib/graphql/type_kinds.rb +77 -0
- data/lib/graphql/types/big_int.rb +23 -0
- data/lib/graphql/types/boolean.rb +18 -0
- data/lib/graphql/types/float.rb +19 -0
- data/lib/graphql/types/id.rb +24 -0
- data/lib/graphql/types/int.rb +36 -0
- data/lib/graphql/types/iso_8601_date.rb +34 -0
- data/lib/graphql/types/iso_8601_date_time.rb +65 -0
- data/lib/graphql/types/json.rb +25 -0
- data/lib/graphql/types/relay/base_connection.rb +39 -0
- data/lib/graphql/types/relay/base_edge.rb +29 -0
- data/lib/graphql/types/relay/connection_behaviors.rb +156 -0
- data/lib/graphql/types/relay/default_relay.rb +27 -0
- data/lib/graphql/types/relay/edge_behaviors.rb +53 -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 +15 -0
- data/lib/graphql/types/relay/node_behaviors.rb +15 -0
- data/lib/graphql/types/relay/node_field.rb +25 -0
- data/lib/graphql/types/relay/nodes_field.rb +27 -0
- data/lib/graphql/types/relay/page_info.rb +11 -0
- data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
- data/lib/graphql/types/relay.rb +41 -0
- data/lib/graphql/types/string.rb +29 -0
- data/lib/graphql/types.rb +11 -0
- data/lib/graphql/unauthorized_error.rb +29 -0
- data/lib/graphql/unauthorized_field_error.rb +23 -0
- data/lib/graphql/union_type.rb +115 -0
- data/lib/graphql/unresolved_type_error.rb +35 -0
- data/lib/graphql/upgrader/member.rb +937 -0
- data/lib/graphql/upgrader/schema.rb +38 -0
- data/lib/graphql/version.rb +4 -0
- data/lib/graphql.rb +168 -0
- data/readme.md +49 -0
- metadata +714 -0
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
module Relay
|
4
|
+
# A connection implementation to expose MongoDB collection objects.
|
5
|
+
# It works for:
|
6
|
+
# - `Mongoid::Criteria`
|
7
|
+
class MongoRelationConnection < RelationConnection
|
8
|
+
private
|
9
|
+
|
10
|
+
def relation_offset(relation)
|
11
|
+
relation.options.skip
|
12
|
+
end
|
13
|
+
|
14
|
+
def relation_limit(relation)
|
15
|
+
relation.options.limit
|
16
|
+
end
|
17
|
+
|
18
|
+
def relation_count(relation)
|
19
|
+
# Must perform query (hence #to_a) to count results https://jira.mongodb.org/browse/MONGOID-2325
|
20
|
+
relation.to_a.count
|
21
|
+
end
|
22
|
+
|
23
|
+
def limit_nodes(sliced_nodes, limit)
|
24
|
+
if limit == 0
|
25
|
+
if sliced_nodes.respond_to?(:none) # added in Mongoid 4.0
|
26
|
+
sliced_nodes.without_options.none
|
27
|
+
else
|
28
|
+
sliced_nodes.where(id: nil) # trying to simulate #none for 3.1.7
|
29
|
+
end
|
30
|
+
else
|
31
|
+
sliced_nodes.limit(limit)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
if defined?(Mongoid::Criteria)
|
37
|
+
BaseConnection.register_connection_implementation(Mongoid::Criteria, MongoRelationConnection)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Mongoid 5 and 6
|
41
|
+
if defined?(Mongoid::Relations::Targets::Enumerable)
|
42
|
+
BaseConnection.register_connection_implementation(Mongoid::Relations::Targets::Enumerable, MongoRelationConnection)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Mongoid 7
|
46
|
+
if defined?(Mongoid::Association::Referenced::HasMany::Targets::Enumerable)
|
47
|
+
BaseConnection.register_connection_implementation(Mongoid::Association::Referenced::HasMany::Targets::Enumerable, MongoRelationConnection)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
module Relay
|
4
|
+
class Mutation
|
5
|
+
# @api private
|
6
|
+
module Instrumentation
|
7
|
+
# Modify mutation `return_field` resolves by wrapping the returned object
|
8
|
+
# in a {Mutation::Result}.
|
9
|
+
#
|
10
|
+
# By using an instrumention, we can apply our wrapper _last_,
|
11
|
+
# giving users access to the original resolve function in earlier instrumentation.
|
12
|
+
def self.instrument(type, field)
|
13
|
+
if field.mutation.is_a?(GraphQL::Relay::Mutation) || (field.mutation.is_a?(Class) && field.mutation < GraphQL::Schema::RelayClassicMutation)
|
14
|
+
new_resolve = Mutation::Resolve.new(field.mutation, field.resolve_proc)
|
15
|
+
field.redefine(resolve: new_resolve)
|
16
|
+
else
|
17
|
+
field
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
module Relay
|
4
|
+
class Mutation
|
5
|
+
# Wrap a user-provided resolve function,
|
6
|
+
# wrapping the returned value in a {Mutation::Result}.
|
7
|
+
# Also, pass the `clientMutationId` to that result object.
|
8
|
+
# @api private
|
9
|
+
class Resolve
|
10
|
+
def initialize(mutation, resolve)
|
11
|
+
@mutation = mutation
|
12
|
+
@resolve = resolve
|
13
|
+
@wrap_result = mutation.is_a?(GraphQL::Relay::Mutation) && mutation.has_generated_return_type?
|
14
|
+
@class_based = mutation.is_a?(Class)
|
15
|
+
end
|
16
|
+
|
17
|
+
def call(obj, args, ctx)
|
18
|
+
mutation_result = begin
|
19
|
+
@resolve.call(obj, args[:input], ctx)
|
20
|
+
rescue GraphQL::ExecutionError => err
|
21
|
+
err
|
22
|
+
end
|
23
|
+
|
24
|
+
ctx.schema.after_lazy(mutation_result) do |res|
|
25
|
+
build_result(res, args, ctx)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
def build_result(mutation_result, args, ctx)
|
32
|
+
if mutation_result.is_a?(GraphQL::ExecutionError)
|
33
|
+
ctx.add_error(mutation_result)
|
34
|
+
mutation_result = nil
|
35
|
+
end
|
36
|
+
|
37
|
+
if mutation_result.nil?
|
38
|
+
nil
|
39
|
+
elsif @wrap_result
|
40
|
+
if mutation_result && !mutation_result.is_a?(Hash)
|
41
|
+
raise StandardError, "Expected `#{mutation_result}` to be a Hash."\
|
42
|
+
" Return a hash when using `return_field` or specify a custom `return_type`."
|
43
|
+
end
|
44
|
+
|
45
|
+
@mutation.result_class.new(client_mutation_id: args[:input][:clientMutationId], result: mutation_result)
|
46
|
+
elsif @class_based
|
47
|
+
mutation_result[:client_mutation_id] = args[:input][:client_mutation_id]
|
48
|
+
mutation_result
|
49
|
+
else
|
50
|
+
mutation_result
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
module Relay
|
4
|
+
class Mutation
|
5
|
+
# Use this when the mutation's return type was generated from `return_field`s.
|
6
|
+
# It delegates field lookups to the hash returned from `resolve`.
|
7
|
+
# @api private
|
8
|
+
class Result
|
9
|
+
attr_reader :client_mutation_id
|
10
|
+
def initialize(client_mutation_id:, result:)
|
11
|
+
@client_mutation_id = client_mutation_id
|
12
|
+
result && result.each do |key, value|
|
13
|
+
self.public_send("#{key}=", value)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class << self
|
18
|
+
attr_accessor :mutation
|
19
|
+
end
|
20
|
+
|
21
|
+
# Build a subclass whose instances have a method
|
22
|
+
# for each of `mutation_defn`'s `return_field`s
|
23
|
+
# @param mutation_defn [GraphQL::Relay::Mutation]
|
24
|
+
# @return [Class]
|
25
|
+
def self.define_subclass(mutation_defn)
|
26
|
+
subclass = Class.new(self) do
|
27
|
+
mutation_result_methods = mutation_defn.return_type.all_fields.map do |f|
|
28
|
+
f.property || f.name
|
29
|
+
end
|
30
|
+
attr_accessor(*mutation_result_methods)
|
31
|
+
self.mutation = mutation_defn
|
32
|
+
end
|
33
|
+
subclass
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "graphql/relay/mutation/instrumentation"
|
3
|
+
require "graphql/relay/mutation/resolve"
|
4
|
+
require "graphql/relay/mutation/result"
|
5
|
+
|
6
|
+
module GraphQL
|
7
|
+
module Relay
|
8
|
+
# @api deprecated
|
9
|
+
class Mutation
|
10
|
+
include GraphQL::Define::InstanceDefinable
|
11
|
+
accepts_definitions(
|
12
|
+
:name, :description, :resolve,
|
13
|
+
:return_type,
|
14
|
+
:return_interfaces,
|
15
|
+
input_field: GraphQL::Define::AssignArgument,
|
16
|
+
return_field: GraphQL::Define::AssignObjectField,
|
17
|
+
function: GraphQL::Define::AssignMutationFunction,
|
18
|
+
)
|
19
|
+
attr_accessor :name, :description, :fields, :arguments
|
20
|
+
attr_writer :return_type, :return_interfaces
|
21
|
+
|
22
|
+
ensure_defined(
|
23
|
+
:input_fields, :return_fields, :name, :description,
|
24
|
+
:fields, :arguments, :return_type,
|
25
|
+
:return_interfaces, :resolve=,
|
26
|
+
:field, :result_class, :input_type
|
27
|
+
)
|
28
|
+
# For backwards compat, but do we need this separate API?
|
29
|
+
alias :return_fields :fields
|
30
|
+
alias :input_fields :arguments
|
31
|
+
|
32
|
+
def initialize
|
33
|
+
GraphQL::Deprecation.warn "GraphQL::Relay::Mutation will be removed from GraphQL-Ruby 2.0, use GraphQL::Schema::RelayClassicMutation instead: https://graphql-ruby.org/mutations/mutation_classes"
|
34
|
+
@fields = {}
|
35
|
+
@arguments = {}
|
36
|
+
@has_generated_return_type = false
|
37
|
+
end
|
38
|
+
|
39
|
+
def has_generated_return_type?
|
40
|
+
# Trigger the generation of the return type, if it is dynamically generated:
|
41
|
+
return_type
|
42
|
+
@has_generated_return_type
|
43
|
+
end
|
44
|
+
|
45
|
+
def resolve=(new_resolve_proc)
|
46
|
+
@resolve_proc = new_resolve_proc
|
47
|
+
end
|
48
|
+
|
49
|
+
def field
|
50
|
+
@field ||= begin
|
51
|
+
relay_mutation = self
|
52
|
+
field_resolve_proc = @resolve_proc
|
53
|
+
GraphQL::Field.define do
|
54
|
+
type(relay_mutation.return_type)
|
55
|
+
description(relay_mutation.description)
|
56
|
+
argument :input, !relay_mutation.input_type
|
57
|
+
resolve(field_resolve_proc)
|
58
|
+
mutation(relay_mutation)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def return_interfaces
|
64
|
+
@return_interfaces ||= []
|
65
|
+
end
|
66
|
+
|
67
|
+
def return_type
|
68
|
+
@return_type ||= begin
|
69
|
+
@has_generated_return_type = true
|
70
|
+
relay_mutation = self
|
71
|
+
GraphQL::ObjectType.define do
|
72
|
+
name("#{relay_mutation.name}Payload")
|
73
|
+
description("Autogenerated return type of #{relay_mutation.name}")
|
74
|
+
field :clientMutationId, types.String, "A unique identifier for the client performing the mutation.", property: :client_mutation_id
|
75
|
+
interfaces relay_mutation.return_interfaces
|
76
|
+
relay_mutation.return_fields.each do |name, field_obj|
|
77
|
+
field name, field: field_obj
|
78
|
+
end
|
79
|
+
mutation(relay_mutation)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def input_type
|
85
|
+
@input_type ||= begin
|
86
|
+
relay_mutation = self
|
87
|
+
input_object_type = GraphQL::InputObjectType.define do
|
88
|
+
name("#{relay_mutation.name}Input")
|
89
|
+
description("Autogenerated input type of #{relay_mutation.name}")
|
90
|
+
input_field :clientMutationId, types.String, "A unique identifier for the client performing the mutation."
|
91
|
+
mutation(relay_mutation)
|
92
|
+
end
|
93
|
+
input_fields.each do |name, arg|
|
94
|
+
input_object_type.arguments[name] = arg
|
95
|
+
end
|
96
|
+
|
97
|
+
input_object_type
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def result_class
|
102
|
+
@result_class ||= Result.define_subclass(self)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
module Relay
|
4
|
+
# Helpers for working with Relay-specific Node objects.
|
5
|
+
module Node
|
6
|
+
# @return [GraphQL::Field] a field for finding objects by their global ID.
|
7
|
+
def self.field(**kwargs, &block)
|
8
|
+
GraphQL::Deprecation.warn "GraphQL::Relay::Node.field will be removed from GraphQL-Ruby 2.0, use GraphQL::Types::Relay::NodeField instead"
|
9
|
+
# We have to define it fresh each time because
|
10
|
+
# its name will be modified and its description
|
11
|
+
# _may_ be modified.
|
12
|
+
field = GraphQL::Types::Relay::NodeField.graphql_definition
|
13
|
+
|
14
|
+
if kwargs.any? || block
|
15
|
+
field = field.redefine(**kwargs, &block)
|
16
|
+
end
|
17
|
+
|
18
|
+
field
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.plural_field(**kwargs, &block)
|
22
|
+
GraphQL::Deprecation.warn "GraphQL::Relay::Nodes.field will be removed from GraphQL-Ruby 2.0, use GraphQL::Types::Relay::NodesField instead"
|
23
|
+
field = GraphQL::Types::Relay::NodesField.graphql_definition
|
24
|
+
|
25
|
+
if kwargs.any? || block
|
26
|
+
field = field.redefine(**kwargs, &block)
|
27
|
+
end
|
28
|
+
|
29
|
+
field
|
30
|
+
end
|
31
|
+
|
32
|
+
# @return [GraphQL::InterfaceType] The interface which all Relay types must implement
|
33
|
+
def self.interface
|
34
|
+
GraphQL::Deprecation.warn "GraphQL::Relay::Node.interface will be removed from GraphQL-Ruby 2.0, use GraphQL::Types::Relay::Node instead"
|
35
|
+
@interface ||= GraphQL::Types::Relay::Node.graphql_definition
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
module Relay
|
4
|
+
# This provides some isolation from `GraphQL::Relay` internals.
|
5
|
+
#
|
6
|
+
# Given a list of items and a new item, it will provide a connection and an edge.
|
7
|
+
#
|
8
|
+
# The connection doesn't receive outside arguments, so the list of items
|
9
|
+
# should be ordered and paginated before providing it here.
|
10
|
+
#
|
11
|
+
# @example Adding a comment to list of comments
|
12
|
+
# post = Post.find(args[:post_id])
|
13
|
+
# comments = post.comments
|
14
|
+
# new_comment = comments.build(body: args[:body])
|
15
|
+
# new_comment.save!
|
16
|
+
#
|
17
|
+
# range_add = GraphQL::Relay::RangeAdd.new(
|
18
|
+
# parent: post,
|
19
|
+
# collection: comments,
|
20
|
+
# item: new_comment,
|
21
|
+
# context: context,
|
22
|
+
# )
|
23
|
+
#
|
24
|
+
# response = {
|
25
|
+
# post: post,
|
26
|
+
# comments_connection: range_add.connection,
|
27
|
+
# new_comment_edge: range_add.edge,
|
28
|
+
# }
|
29
|
+
class RangeAdd
|
30
|
+
attr_reader :edge, :connection, :parent
|
31
|
+
|
32
|
+
# @param collection [Object] The list of items to wrap in a connection
|
33
|
+
# @param item [Object] The newly-added item (will be wrapped in `edge_class`)
|
34
|
+
# @param parent [Object] The owner of `collection`, will be passed to the connection if provided
|
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 (defaults to the connection's edge class)
|
37
|
+
def initialize(collection:, item:, parent: nil, context: nil, edge_class: nil)
|
38
|
+
if context && context.schema.new_connections?
|
39
|
+
conn_class = context.schema.connections.wrapper_for(collection)
|
40
|
+
# The rest will be added by ConnectionExtension
|
41
|
+
@connection = conn_class.new(collection, parent: parent, context: context, edge_class: edge_class)
|
42
|
+
# Check if this connection supports it, to support old versions of GraphQL-Pro
|
43
|
+
@edge = if @connection.respond_to?(:range_add_edge)
|
44
|
+
@connection.range_add_edge(item)
|
45
|
+
else
|
46
|
+
@connection.edge_class.new(item, @connection)
|
47
|
+
end
|
48
|
+
else
|
49
|
+
connection_class = BaseConnection.connection_for_nodes(collection)
|
50
|
+
@connection = connection_class.new(collection, {}, parent: parent, context: context)
|
51
|
+
edge_class ||= Relay::Edge
|
52
|
+
@edge = edge_class.new(item, @connection)
|
53
|
+
end
|
54
|
+
|
55
|
+
@parent = parent
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,188 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
module Relay
|
4
|
+
# A connection implementation to expose SQL collection objects.
|
5
|
+
# It works for:
|
6
|
+
# - `ActiveRecord::Relation`
|
7
|
+
# - `Sequel::Dataset`
|
8
|
+
class RelationConnection < BaseConnection
|
9
|
+
def cursor_from_node(item)
|
10
|
+
item_index = paged_nodes.index(item)
|
11
|
+
if item_index.nil?
|
12
|
+
raise("Can't generate cursor, item not found in connection: #{item}")
|
13
|
+
else
|
14
|
+
offset = item_index + 1 + ((paged_nodes_offset || 0) - (relation_offset(sliced_nodes) || 0))
|
15
|
+
|
16
|
+
if after
|
17
|
+
offset += offset_from_cursor(after)
|
18
|
+
elsif before
|
19
|
+
offset += offset_from_cursor(before) - 1 - sliced_nodes_count
|
20
|
+
end
|
21
|
+
|
22
|
+
encode(offset.to_s)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def has_next_page
|
27
|
+
if first
|
28
|
+
if defined?(ActiveRecord::Relation) && nodes.is_a?(ActiveRecord::Relation)
|
29
|
+
initial_offset = after ? offset_from_cursor(after) : 0
|
30
|
+
return paged_nodes.length >= first && nodes.offset(first + initial_offset).exists?
|
31
|
+
end
|
32
|
+
return paged_nodes.length >= first && sliced_nodes_count > first
|
33
|
+
end
|
34
|
+
if GraphQL::Relay::ConnectionType.bidirectional_pagination && last
|
35
|
+
return sliced_nodes_count >= last
|
36
|
+
end
|
37
|
+
false
|
38
|
+
end
|
39
|
+
|
40
|
+
def has_previous_page
|
41
|
+
if last
|
42
|
+
paged_nodes.length >= last && sliced_nodes_count > last
|
43
|
+
elsif GraphQL::Relay::ConnectionType.bidirectional_pagination && after
|
44
|
+
# We've already paginated through the collection a bit,
|
45
|
+
# there are nodes behind us
|
46
|
+
offset_from_cursor(after) > 0
|
47
|
+
else
|
48
|
+
false
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def first
|
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
|
60
|
+
end
|
61
|
+
|
62
|
+
def last
|
63
|
+
@last ||= limit_pagination_argument(arguments[:last], max_page_size)
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
# apply first / last limit results
|
69
|
+
# @return [Array]
|
70
|
+
def paged_nodes
|
71
|
+
return @paged_nodes if defined? @paged_nodes
|
72
|
+
|
73
|
+
items = sliced_nodes
|
74
|
+
|
75
|
+
if first
|
76
|
+
if relation_limit(items).nil? || relation_limit(items) > first
|
77
|
+
items = items.limit(first)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
if last
|
82
|
+
if relation_limit(items)
|
83
|
+
if last <= relation_limit(items)
|
84
|
+
offset = (relation_offset(items) || 0) + (relation_limit(items) - last)
|
85
|
+
items = items.offset(offset).limit(last)
|
86
|
+
end
|
87
|
+
else
|
88
|
+
slice_count = relation_count(items)
|
89
|
+
offset = (relation_offset(items) || 0) + slice_count - [last, slice_count].min
|
90
|
+
items = items.offset(offset).limit(last)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
if max_page_size && !first && !last
|
95
|
+
if relation_limit(items).nil? || relation_limit(items) > max_page_size
|
96
|
+
items = items.limit(max_page_size)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# Store this here so we can convert the relation to an Array
|
101
|
+
# (this avoids an extra DB call on Sequel)
|
102
|
+
@paged_nodes_offset = relation_offset(items)
|
103
|
+
@paged_nodes = items.to_a
|
104
|
+
end
|
105
|
+
|
106
|
+
def paged_nodes_offset
|
107
|
+
paged_nodes && @paged_nodes_offset
|
108
|
+
end
|
109
|
+
|
110
|
+
def relation_offset(relation)
|
111
|
+
if relation.respond_to?(:offset_value)
|
112
|
+
relation.offset_value
|
113
|
+
else
|
114
|
+
relation.opts[:offset]
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
def relation_limit(relation)
|
119
|
+
if relation.respond_to?(:limit_value)
|
120
|
+
relation.limit_value
|
121
|
+
else
|
122
|
+
relation.opts[:limit]
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
# If a relation contains a `.group` clause, a `.count` will return a Hash.
|
127
|
+
def relation_count(relation)
|
128
|
+
count_or_hash = if(defined?(ActiveRecord::Relation) && relation.is_a?(ActiveRecord::Relation))
|
129
|
+
relation.respond_to?(:unscope)? relation.unscope(:order).count(:all) : relation.count(:all)
|
130
|
+
else # eg, Sequel::Dataset, don't mess up others
|
131
|
+
relation.count
|
132
|
+
end
|
133
|
+
count_or_hash.is_a?(Integer) ? count_or_hash : count_or_hash.length
|
134
|
+
end
|
135
|
+
|
136
|
+
# Apply cursors to edges
|
137
|
+
def sliced_nodes
|
138
|
+
return @sliced_nodes if defined? @sliced_nodes
|
139
|
+
|
140
|
+
@sliced_nodes = nodes
|
141
|
+
|
142
|
+
if after
|
143
|
+
offset = (relation_offset(@sliced_nodes) || 0) + offset_from_cursor(after)
|
144
|
+
@sliced_nodes = @sliced_nodes.offset(offset)
|
145
|
+
end
|
146
|
+
|
147
|
+
if before && after
|
148
|
+
if offset_from_cursor(after) < offset_from_cursor(before)
|
149
|
+
@sliced_nodes = limit_nodes(@sliced_nodes, offset_from_cursor(before) - offset_from_cursor(after) - 1)
|
150
|
+
else
|
151
|
+
@sliced_nodes = limit_nodes(@sliced_nodes, 0)
|
152
|
+
end
|
153
|
+
|
154
|
+
elsif before
|
155
|
+
@sliced_nodes = limit_nodes(@sliced_nodes, offset_from_cursor(before) - 1)
|
156
|
+
end
|
157
|
+
|
158
|
+
@sliced_nodes
|
159
|
+
end
|
160
|
+
|
161
|
+
def limit_nodes(sliced_nodes, limit)
|
162
|
+
if limit > 0 || defined?(ActiveRecord::Relation) && sliced_nodes.is_a?(ActiveRecord::Relation)
|
163
|
+
sliced_nodes.limit(limit)
|
164
|
+
else
|
165
|
+
sliced_nodes.where(false)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
def sliced_nodes_count
|
170
|
+
return @sliced_nodes_count if defined? @sliced_nodes_count
|
171
|
+
|
172
|
+
# If a relation contains a `.group` clause, a `.count` will return a Hash.
|
173
|
+
@sliced_nodes_count = relation_count(sliced_nodes)
|
174
|
+
end
|
175
|
+
|
176
|
+
def offset_from_cursor(cursor)
|
177
|
+
decode(cursor).to_i
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
if defined?(ActiveRecord::Relation)
|
182
|
+
BaseConnection.register_connection_implementation(ActiveRecord::Relation, RelationConnection)
|
183
|
+
end
|
184
|
+
if defined?(Sequel::Dataset)
|
185
|
+
BaseConnection.register_connection_implementation(Sequel::Dataset, RelationConnection)
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
module Relay
|
4
|
+
# Mixin for Relay-related methods in type objects
|
5
|
+
# (used by BaseType and Schema::Member).
|
6
|
+
module TypeExtensions
|
7
|
+
# @return [GraphQL::ObjectType] The default connection type for this object type
|
8
|
+
def connection_type
|
9
|
+
@connection_type ||= define_connection
|
10
|
+
end
|
11
|
+
|
12
|
+
# Define a custom connection type for this object type
|
13
|
+
# @return [GraphQL::ObjectType]
|
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"
|
16
|
+
GraphQL::Relay::ConnectionType.create_type(self, **kwargs, &block)
|
17
|
+
end
|
18
|
+
|
19
|
+
# @return [GraphQL::ObjectType] The default edge type for this object type
|
20
|
+
def edge_type
|
21
|
+
@edge_type ||= define_edge
|
22
|
+
end
|
23
|
+
|
24
|
+
# Define a custom edge type for this object type
|
25
|
+
# @return [GraphQL::ObjectType]
|
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"
|
28
|
+
GraphQL::Relay::EdgeType.create_type(self, **kwargs, &block)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'graphql/relay/page_info'
|
4
|
+
require 'graphql/relay/edge'
|
5
|
+
require 'graphql/relay/edge_type'
|
6
|
+
require 'graphql/relay/edges_instrumentation'
|
7
|
+
require 'graphql/relay/base_connection'
|
8
|
+
require 'graphql/relay/array_connection'
|
9
|
+
require 'graphql/relay/range_add'
|
10
|
+
require 'graphql/relay/relation_connection'
|
11
|
+
require 'graphql/relay/mongo_relation_connection'
|
12
|
+
require 'graphql/relay/global_id_resolve'
|
13
|
+
require 'graphql/relay/mutation'
|
14
|
+
require 'graphql/relay/node'
|
15
|
+
require 'graphql/relay/connection_instrumentation'
|
16
|
+
require 'graphql/relay/connection_resolve'
|
17
|
+
require 'graphql/relay/connection_type'
|
18
|
+
require 'graphql/relay/type_extensions'
|
@@ -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
|