graphql 1.13.24 → 2.5.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/generators/graphql/install/mutation_root_generator.rb +2 -2
- data/lib/generators/graphql/install/templates/base_mutation.erb +2 -0
- data/lib/generators/graphql/install/templates/mutation_type.erb +2 -0
- data/lib/generators/graphql/install_generator.rb +50 -1
- data/lib/generators/graphql/mutation_delete_generator.rb +1 -1
- data/lib/generators/graphql/mutation_update_generator.rb +1 -1
- data/lib/generators/graphql/orm_mutations_base.rb +1 -1
- data/lib/generators/graphql/relay.rb +21 -18
- 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 +8 -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/graphql_controller.erb +2 -0
- data/lib/generators/graphql/templates/loader.erb +2 -0
- data/lib/generators/graphql/templates/mutation.erb +2 -0
- data/lib/generators/graphql/templates/node_type.erb +2 -0
- data/lib/generators/graphql/templates/query_type.erb +2 -0
- data/lib/generators/graphql/templates/schema.erb +8 -0
- data/lib/generators/graphql/type_generator.rb +1 -1
- data/lib/graphql/analysis/analyzer.rb +90 -0
- data/lib/graphql/analysis/field_usage.rb +65 -28
- data/lib/graphql/analysis/max_query_complexity.rb +11 -17
- data/lib/graphql/analysis/max_query_depth.rb +13 -19
- data/lib/graphql/analysis/query_complexity.rb +236 -61
- data/lib/graphql/analysis/query_depth.rb +38 -23
- data/lib/graphql/analysis/visitor.rb +280 -0
- data/lib/graphql/analysis.rb +93 -6
- data/lib/graphql/autoload.rb +38 -0
- data/lib/graphql/backtrace/table.rb +118 -73
- data/lib/graphql/backtrace.rb +2 -25
- data/lib/graphql/coercion_error.rb +1 -9
- data/lib/graphql/current.rb +57 -0
- data/lib/graphql/dashboard/detailed_traces.rb +47 -0
- data/lib/graphql/dashboard/installable.rb +22 -0
- data/lib/graphql/dashboard/limiters.rb +93 -0
- data/lib/graphql/dashboard/operation_store.rb +199 -0
- data/lib/graphql/dashboard/statics/bootstrap-5.3.3.min.css +6 -0
- data/lib/graphql/dashboard/statics/bootstrap-5.3.3.min.js +7 -0
- data/lib/graphql/dashboard/statics/charts.min.css +1 -0
- data/lib/graphql/dashboard/statics/dashboard.css +30 -0
- data/lib/graphql/dashboard/statics/dashboard.js +143 -0
- data/lib/graphql/dashboard/statics/header-icon.png +0 -0
- data/lib/graphql/dashboard/statics/icon.png +0 -0
- data/lib/graphql/dashboard/subscriptions.rb +96 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/detailed_traces/traces/index.html.erb +45 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/landings/show.html.erb +18 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/limiters/limiters/show.html.erb +62 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/not_installed.html.erb +18 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/_form.html.erb +23 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/edit.html.erb +21 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/index.html.erb +69 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/new.html.erb +7 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/index_entries/index.html.erb +39 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/index_entries/show.html.erb +32 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/operations/index.html.erb +81 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/operations/show.html.erb +71 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/subscriptions/subscriptions/show.html.erb +41 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/subscriptions/topics/index.html.erb +55 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/subscriptions/topics/show.html.erb +40 -0
- data/lib/graphql/dashboard/views/layouts/graphql/dashboard/application.html.erb +108 -0
- data/lib/graphql/dashboard.rb +158 -0
- data/lib/graphql/dataloader/active_record_association_source.rb +84 -0
- data/lib/graphql/dataloader/active_record_source.rb +47 -0
- data/lib/graphql/dataloader/async_dataloader.rb +101 -0
- data/lib/graphql/dataloader/null_dataloader.rb +11 -2
- data/lib/graphql/dataloader/request.rb +5 -0
- data/lib/graphql/dataloader/source.rb +103 -47
- data/lib/graphql/dataloader.rb +174 -148
- data/lib/graphql/dig.rb +3 -2
- data/lib/graphql/duration_encoding_error.rb +16 -0
- data/lib/graphql/execution/errors.rb +12 -82
- data/lib/graphql/execution/interpreter/argument_value.rb +5 -1
- data/lib/graphql/execution/interpreter/arguments.rb +1 -1
- data/lib/graphql/execution/interpreter/arguments_cache.rb +30 -35
- data/lib/graphql/execution/interpreter/resolve.rb +32 -2
- data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +215 -0
- data/lib/graphql/execution/interpreter/runtime.rb +525 -502
- data/lib/graphql/execution/interpreter.rb +127 -81
- data/lib/graphql/execution/lazy.rb +7 -21
- data/lib/graphql/execution/lookahead.rb +133 -55
- data/lib/graphql/execution/multiplex.rb +6 -176
- data/lib/graphql/execution.rb +11 -4
- data/lib/graphql/introspection/directive_location_enum.rb +1 -1
- data/lib/graphql/introspection/directive_type.rb +1 -1
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +10 -17
- data/lib/graphql/introspection/field_type.rb +1 -1
- data/lib/graphql/introspection/schema_type.rb +8 -11
- data/lib/graphql/introspection/type_type.rb +13 -6
- data/lib/graphql/introspection.rb +4 -3
- data/lib/graphql/invalid_name_error.rb +1 -1
- data/lib/graphql/invalid_null_error.rb +20 -17
- data/lib/graphql/language/block_string.rb +34 -18
- data/lib/graphql/language/cache.rb +13 -0
- data/lib/graphql/language/comment.rb +18 -0
- data/lib/graphql/language/definition_slice.rb +1 -1
- data/lib/graphql/language/document_from_schema_definition.rb +114 -80
- data/lib/graphql/language/lexer.rb +375 -1489
- data/lib/graphql/language/nodes.rb +189 -104
- data/lib/graphql/language/parser.rb +807 -1941
- data/lib/graphql/language/printer.rb +366 -163
- data/lib/graphql/language/sanitized_printer.rb +21 -23
- data/lib/graphql/language/static_visitor.rb +171 -0
- data/lib/graphql/language/visitor.rb +189 -138
- data/lib/graphql/language.rb +62 -1
- data/lib/graphql/load_application_object_failed_error.rb +5 -1
- data/lib/graphql/pagination/active_record_relation_connection.rb +0 -8
- data/lib/graphql/pagination/array_connection.rb +8 -6
- data/lib/graphql/pagination/connection.rb +61 -7
- data/lib/graphql/pagination/connections.rb +3 -28
- data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -2
- data/lib/graphql/pagination/relation_connection.rb +2 -0
- data/lib/graphql/query/context/scoped_context.rb +101 -0
- data/lib/graphql/query/context.rb +131 -225
- data/lib/graphql/query/input_validation_result.rb +1 -1
- data/lib/graphql/query/null_context.rb +11 -33
- data/lib/graphql/query/partial.rb +179 -0
- data/lib/graphql/query/validation_pipeline.rb +14 -37
- data/lib/graphql/query/variable_validation_error.rb +1 -1
- data/lib/graphql/query/variables.rb +6 -19
- data/lib/graphql/query.rb +162 -98
- data/lib/graphql/railtie.rb +15 -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 -20
- data/lib/graphql/relay.rb +0 -15
- data/lib/graphql/rubocop/graphql/base_cop.rb +1 -1
- data/lib/graphql/rubocop/graphql/field_type_in_block.rb +144 -0
- data/lib/graphql/rubocop/graphql/root_types_in_block.rb +38 -0
- data/lib/graphql/rubocop.rb +2 -0
- data/lib/graphql/schema/addition.rb +70 -33
- data/lib/graphql/schema/always_visible.rb +15 -0
- data/lib/graphql/schema/argument.rb +104 -59
- data/lib/graphql/schema/base_64_encoder.rb +3 -5
- data/lib/graphql/schema/build_from_definition.rb +154 -74
- data/lib/graphql/schema/directive/flagged.rb +4 -2
- data/lib/graphql/schema/directive/one_of.rb +24 -0
- data/lib/graphql/schema/directive/specified_by.rb +14 -0
- data/lib/graphql/schema/directive/transform.rb +1 -1
- data/lib/graphql/schema/directive.rb +47 -24
- data/lib/graphql/schema/enum.rb +137 -65
- data/lib/graphql/schema/enum_value.rb +11 -26
- 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 +399 -404
- data/lib/graphql/schema/field_extension.rb +2 -5
- data/lib/graphql/schema/find_inherited_value.rb +2 -7
- data/lib/graphql/schema/has_single_input_argument.rb +160 -0
- data/lib/graphql/schema/input_object.rb +144 -99
- data/lib/graphql/schema/interface.rb +34 -51
- data/lib/graphql/schema/introspection_system.rb +12 -26
- data/lib/graphql/schema/late_bound_type.rb +12 -2
- data/lib/graphql/schema/list.rb +3 -9
- data/lib/graphql/schema/loader.rb +4 -6
- data/lib/graphql/schema/member/base_dsl_methods.rb +32 -18
- data/lib/graphql/schema/member/build_type.rb +15 -9
- data/lib/graphql/schema/member/has_arguments.rb +192 -96
- data/lib/graphql/schema/member/has_ast_node.rb +12 -0
- data/lib/graphql/schema/member/has_dataloader.rb +62 -0
- data/lib/graphql/schema/member/has_deprecation_reason.rb +18 -4
- data/lib/graphql/schema/member/has_directives.rb +81 -61
- data/lib/graphql/schema/member/has_fields.rb +119 -39
- data/lib/graphql/schema/member/has_interfaces.rb +66 -23
- data/lib/graphql/schema/member/has_unresolved_type_error.rb +5 -1
- 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 +32 -2
- data/lib/graphql/schema/member/validates_input.rb +4 -4
- data/lib/graphql/schema/member.rb +1 -6
- data/lib/graphql/schema/mutation.rb +7 -9
- data/lib/graphql/schema/non_null.rb +1 -7
- data/lib/graphql/schema/object.rb +42 -49
- data/lib/graphql/schema/printer.rb +12 -8
- data/lib/graphql/schema/ractor_shareable.rb +79 -0
- data/lib/graphql/schema/relay_classic_mutation.rb +12 -124
- data/lib/graphql/schema/resolver/has_payload_type.rb +20 -10
- data/lib/graphql/schema/resolver.rb +96 -81
- data/lib/graphql/schema/scalar.rb +10 -30
- data/lib/graphql/schema/subscription.rb +60 -14
- data/lib/graphql/schema/timeout.rb +44 -31
- data/lib/graphql/schema/type_expression.rb +2 -2
- data/lib/graphql/schema/type_membership.rb +3 -0
- data/lib/graphql/schema/union.rb +12 -19
- data/lib/graphql/schema/unique_within_type.rb +1 -1
- data/lib/graphql/schema/validator/all_validator.rb +62 -0
- data/lib/graphql/schema/validator/required_validator.rb +60 -10
- data/lib/graphql/schema/validator.rb +5 -3
- data/lib/graphql/schema/visibility/migration.rb +188 -0
- data/lib/graphql/schema/visibility/profile.rb +445 -0
- data/lib/graphql/schema/visibility/visit.rb +190 -0
- data/lib/graphql/schema/visibility.rb +311 -0
- data/lib/graphql/schema/warden.rb +318 -94
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +1148 -1085
- data/lib/graphql/static_validation/all_rules.rb +4 -3
- data/lib/graphql/static_validation/base_visitor.rb +11 -27
- data/lib/graphql/static_validation/definition_dependencies.rb +7 -1
- data/lib/graphql/static_validation/error.rb +2 -2
- data/lib/graphql/static_validation/literal_validator.rb +24 -7
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +1 -1
- data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +1 -1
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +3 -2
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +13 -7
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +14 -12
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +12 -2
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +48 -6
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +90 -27
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +10 -2
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
- data/lib/graphql/static_validation/rules/fragment_types_exist.rb +12 -2
- data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +1 -1
- data/lib/graphql/static_validation/rules/mutation_root_exists.rb +1 -1
- data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +1 -1
- data/lib/graphql/static_validation/rules/not_single_subscription_error.rb +25 -0
- data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
- data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
- data/lib/graphql/static_validation/rules/query_root_exists.rb +1 -1
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +5 -5
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +5 -5
- data/lib/graphql/static_validation/rules/subscription_root_exists_and_single_subscription_selection.rb +26 -0
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +19 -9
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +18 -27
- data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +1 -1
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +2 -2
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +11 -2
- data/lib/graphql/static_validation/validation_context.rb +21 -5
- data/lib/graphql/static_validation/validator.rb +12 -26
- data/lib/graphql/static_validation.rb +0 -3
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +14 -6
- data/lib/graphql/subscriptions/broadcast_analyzer.rb +11 -5
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +40 -1
- data/lib/graphql/subscriptions/event.rb +24 -12
- data/lib/graphql/subscriptions/serialize.rb +3 -1
- data/lib/graphql/subscriptions.rb +48 -32
- data/lib/graphql/testing/helpers.rb +158 -0
- data/lib/graphql/testing.rb +2 -0
- data/lib/graphql/tracing/active_support_notifications_trace.rb +27 -0
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +1 -1
- data/lib/graphql/tracing/appoptics_trace.rb +259 -0
- data/lib/graphql/tracing/appoptics_tracing.rb +9 -2
- data/lib/graphql/tracing/appsignal_trace.rb +54 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +2 -0
- data/lib/graphql/tracing/call_legacy_tracers.rb +66 -0
- data/lib/graphql/tracing/data_dog_trace.rb +71 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +3 -0
- data/lib/graphql/tracing/detailed_trace/memory_backend.rb +60 -0
- data/lib/graphql/tracing/detailed_trace/redis_backend.rb +72 -0
- data/lib/graphql/tracing/detailed_trace.rb +93 -0
- data/lib/graphql/{execution/instrumentation.rb → tracing/legacy_hooks_trace.rb} +11 -28
- data/lib/graphql/tracing/legacy_trace.rb +12 -0
- data/lib/graphql/tracing/monitor_trace.rb +283 -0
- data/lib/graphql/tracing/new_relic_trace.rb +68 -0
- data/lib/graphql/tracing/new_relic_tracing.rb +2 -0
- data/lib/graphql/tracing/notifications_trace.rb +195 -0
- data/lib/graphql/tracing/notifications_tracing.rb +2 -0
- data/lib/graphql/tracing/null_trace.rb +9 -0
- data/lib/graphql/tracing/perfetto_trace/trace.proto +141 -0
- data/lib/graphql/tracing/perfetto_trace/trace_pb.rb +33 -0
- data/lib/graphql/tracing/perfetto_trace.rb +734 -0
- data/lib/graphql/tracing/platform_trace.rb +123 -0
- data/lib/graphql/tracing/platform_tracing.rb +28 -41
- data/lib/graphql/tracing/{prometheus_tracing → prometheus_trace}/graphql_collector.rb +6 -2
- data/lib/graphql/tracing/prometheus_trace.rb +93 -0
- data/lib/graphql/tracing/prometheus_tracing.rb +5 -3
- data/lib/graphql/tracing/scout_trace.rb +49 -0
- data/lib/graphql/tracing/scout_tracing.rb +2 -0
- data/lib/graphql/tracing/sentry_trace.rb +80 -0
- data/lib/graphql/tracing/statsd_trace.rb +48 -0
- data/lib/graphql/tracing/statsd_tracing.rb +2 -0
- data/lib/graphql/tracing/trace.rb +186 -0
- data/lib/graphql/tracing.rb +32 -52
- data/lib/graphql/type_kinds.rb +8 -4
- data/lib/graphql/types/iso_8601_date.rb +4 -1
- data/lib/graphql/types/iso_8601_date_time.rb +4 -0
- 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 +65 -23
- data/lib/graphql/types/relay/edge_behaviors.rb +33 -5
- data/lib/graphql/types/relay/node_behaviors.rb +12 -2
- data/lib/graphql/types/relay/page_info_behaviors.rb +11 -2
- data/lib/graphql/types/relay.rb +0 -3
- data/lib/graphql/types/string.rb +1 -1
- data/lib/graphql/types.rb +18 -10
- data/lib/graphql/unauthorized_enum_value_error.rb +13 -0
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +76 -123
- data/readme.md +13 -3
- metadata +225 -142
- data/lib/graphql/analysis/analyze_query.rb +0 -98
- data/lib/graphql/analysis/ast/analyzer.rb +0 -84
- data/lib/graphql/analysis/ast/field_usage.rb +0 -55
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -23
- data/lib/graphql/analysis/ast/max_query_depth.rb +0 -22
- data/lib/graphql/analysis/ast/query_complexity.rb +0 -230
- data/lib/graphql/analysis/ast/query_depth.rb +0 -56
- data/lib/graphql/analysis/ast/visitor.rb +0 -269
- data/lib/graphql/analysis/ast.rb +0 -91
- 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/inspect_result.rb +0 -50
- data/lib/graphql/backtrace/legacy_tracer.rb +0 -56
- data/lib/graphql/backtrace/tracer.rb +0 -81
- data/lib/graphql/backwards_compatibility.rb +0 -61
- data/lib/graphql/base_type.rb +0 -232
- 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 -255
- 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 -55
- data/lib/graphql/deprecation.rb +0 -9
- 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 -107
- data/lib/graphql/enum_type.rb +0 -133
- 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 -260
- data/lib/graphql/language/parser.y +0 -550
- data/lib/graphql/language/token.rb +0 -34
- 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 -54
- 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 -39
- data/lib/graphql/relay/global_id_resolve.rb +0 -17
- 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/invalid_type_error.rb +0 -7
- data/lib/graphql/schema/member/accepts_definition.rb +0 -164
- data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -58
- data/lib/graphql/schema/member/instrumentation.rb +0 -131
- data/lib/graphql/schema/middleware_chain.rb +0 -82
- data/lib/graphql/schema/null_mask.rb +0 -11
- 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/rules/subscription_root_exists.rb +0 -17
- 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 -31
- data/lib/graphql/types/relay/node_field.rb +0 -24
- data/lib/graphql/types/relay/nodes_field.rb +0 -43
- data/lib/graphql/union_type.rb +0 -115
- data/lib/graphql/upgrader/member.rb +0 -937
- data/lib/graphql/upgrader/schema.rb +0 -38
@@ -0,0 +1,186 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "graphql/tracing"
|
4
|
+
|
5
|
+
module GraphQL
|
6
|
+
module Tracing
|
7
|
+
# This is the base class for a `trace` instance whose methods are called during query execution.
|
8
|
+
# "Trace modes" are subclasses of this with custom tracing modules mixed in.
|
9
|
+
#
|
10
|
+
# A trace module may implement any of the methods on `Trace`, being sure to call `super`
|
11
|
+
# to continue any tracing hooks and call the actual runtime behavior.
|
12
|
+
#
|
13
|
+
class Trace
|
14
|
+
# @param multiplex [GraphQL::Execution::Multiplex, nil]
|
15
|
+
# @param query [GraphQL::Query, nil]
|
16
|
+
def initialize(multiplex: nil, query: nil, **_options)
|
17
|
+
@multiplex = multiplex
|
18
|
+
@query = query
|
19
|
+
end
|
20
|
+
|
21
|
+
# The Ruby parser doesn't call this method (`graphql/c_parser` does.)
|
22
|
+
def lex(query_string:)
|
23
|
+
yield
|
24
|
+
end
|
25
|
+
|
26
|
+
# @param query_string [String]
|
27
|
+
# @return [void]
|
28
|
+
def parse(query_string:)
|
29
|
+
yield
|
30
|
+
end
|
31
|
+
|
32
|
+
def validate(query:, validate:)
|
33
|
+
yield
|
34
|
+
end
|
35
|
+
|
36
|
+
def begin_validate(query, validate)
|
37
|
+
end
|
38
|
+
|
39
|
+
def end_validate(query, validate, errors)
|
40
|
+
end
|
41
|
+
|
42
|
+
# @param multiplex [GraphQL::Execution::Multiplex]
|
43
|
+
# @param analyzers [Array<Class>]
|
44
|
+
# @return [void]
|
45
|
+
def begin_analyze_multiplex(multiplex, analyzers); end
|
46
|
+
# @param multiplex [GraphQL::Execution::Multiplex]
|
47
|
+
# @param analyzers [Array<Class>]
|
48
|
+
# @return [void]
|
49
|
+
def end_analyze_multiplex(multiplex, analyzers); end
|
50
|
+
# @param multiplex [GraphQL::Execution::Multiplex]
|
51
|
+
# @return [void]
|
52
|
+
def analyze_multiplex(multiplex:)
|
53
|
+
yield
|
54
|
+
end
|
55
|
+
|
56
|
+
def analyze_query(query:)
|
57
|
+
yield
|
58
|
+
end
|
59
|
+
|
60
|
+
# This wraps an entire `.execute` call.
|
61
|
+
# @param multiplex [GraphQL::Execution::Multiplex]
|
62
|
+
# @return [void]
|
63
|
+
def execute_multiplex(multiplex:)
|
64
|
+
yield
|
65
|
+
end
|
66
|
+
|
67
|
+
def execute_query(query:)
|
68
|
+
yield
|
69
|
+
end
|
70
|
+
|
71
|
+
def execute_query_lazy(query:, multiplex:)
|
72
|
+
yield
|
73
|
+
end
|
74
|
+
|
75
|
+
# GraphQL is about to resolve this field
|
76
|
+
# @param field [GraphQL::Schema::Field]
|
77
|
+
# @param object [GraphQL::Schema::Object]
|
78
|
+
# @param arguments [Hash]
|
79
|
+
# @param query [GraphQL::Query]
|
80
|
+
def begin_execute_field(field, object, arguments, query); end
|
81
|
+
# GraphQL just finished resolving this field
|
82
|
+
# @param field [GraphQL::Schema::Field]
|
83
|
+
# @param object [GraphQL::Schema::Object]
|
84
|
+
# @param arguments [Hash]
|
85
|
+
# @param query [GraphQL::Query]
|
86
|
+
# @param result [Object]
|
87
|
+
def end_execute_field(field, object, arguments, query, result); end
|
88
|
+
|
89
|
+
def execute_field(field:, query:, ast_node:, arguments:, object:)
|
90
|
+
yield
|
91
|
+
end
|
92
|
+
|
93
|
+
def execute_field_lazy(field:, query:, ast_node:, arguments:, object:)
|
94
|
+
yield
|
95
|
+
end
|
96
|
+
|
97
|
+
def authorized(query:, type:, object:)
|
98
|
+
yield
|
99
|
+
end
|
100
|
+
|
101
|
+
# A call to `.authorized?` is starting
|
102
|
+
# @param type [Class<GraphQL::Schema::Object>]
|
103
|
+
# @param object [Object]
|
104
|
+
# @param context [GraphQL::Query::Context]
|
105
|
+
# @return [void]
|
106
|
+
def begin_authorized(type, object, context)
|
107
|
+
end
|
108
|
+
# A call to `.authorized?` just finished
|
109
|
+
# @param type [Class<GraphQL::Schema::Object>]
|
110
|
+
# @param object [Object]
|
111
|
+
# @param context [GraphQL::Query::Context]
|
112
|
+
# @param authorized_result [Boolean]
|
113
|
+
# @return [void]
|
114
|
+
def end_authorized(type, object, context, authorized_result)
|
115
|
+
end
|
116
|
+
|
117
|
+
def authorized_lazy(query:, type:, object:)
|
118
|
+
yield
|
119
|
+
end
|
120
|
+
|
121
|
+
def resolve_type(query:, type:, object:)
|
122
|
+
yield
|
123
|
+
end
|
124
|
+
|
125
|
+
def resolve_type_lazy(query:, type:, object:)
|
126
|
+
yield
|
127
|
+
end
|
128
|
+
|
129
|
+
# A call to `.resolve_type` is starting
|
130
|
+
# @param type [Class<GraphQL::Schema::Union>, Module<GraphQL::Schema::Interface>]
|
131
|
+
# @param value [Object]
|
132
|
+
# @param context [GraphQL::Query::Context]
|
133
|
+
# @return [void]
|
134
|
+
def begin_resolve_type(type, value, context)
|
135
|
+
end
|
136
|
+
|
137
|
+
# A call to `.resolve_type` just ended
|
138
|
+
# @param type [Class<GraphQL::Schema::Union>, Module<GraphQL::Schema::Interface>]
|
139
|
+
# @param value [Object]
|
140
|
+
# @param context [GraphQL::Query::Context]
|
141
|
+
# @param resolved_type [Class<GraphQL::Schema::Object>]
|
142
|
+
# @return [void]
|
143
|
+
def end_resolve_type(type, value, context, resolved_type)
|
144
|
+
end
|
145
|
+
|
146
|
+
# A dataloader run is starting
|
147
|
+
# @param dataloader [GraphQL::Dataloader]
|
148
|
+
# @return [void]
|
149
|
+
def begin_dataloader(dataloader); end
|
150
|
+
# A dataloader run has ended
|
151
|
+
# @param dataloder [GraphQL::Dataloader]
|
152
|
+
# @return [void]
|
153
|
+
def end_dataloader(dataloader); end
|
154
|
+
|
155
|
+
# A source with pending keys is about to fetch
|
156
|
+
# @param source [GraphQL::Dataloader::Source]
|
157
|
+
# @return [void]
|
158
|
+
def begin_dataloader_source(source); end
|
159
|
+
# A fetch call has just ended
|
160
|
+
# @param source [GraphQL::Dataloader::Source]
|
161
|
+
# @return [void]
|
162
|
+
def end_dataloader_source(source); end
|
163
|
+
|
164
|
+
# Called when Dataloader spins up a new fiber for GraphQL execution
|
165
|
+
# @param jobs [Array<#call>] Execution steps to run
|
166
|
+
# @return [void]
|
167
|
+
def dataloader_spawn_execution_fiber(jobs); end
|
168
|
+
# Called when Dataloader spins up a new fiber for fetching data
|
169
|
+
# @param pending_sources [GraphQL::Dataloader::Source] Instances with pending keys
|
170
|
+
# @return [void]
|
171
|
+
def dataloader_spawn_source_fiber(pending_sources); end
|
172
|
+
# Called when an execution or source fiber terminates
|
173
|
+
# @return [void]
|
174
|
+
def dataloader_fiber_exit; end
|
175
|
+
|
176
|
+
# Called when a Dataloader fiber is paused to wait for data
|
177
|
+
# @param source [GraphQL::Dataloader::Source] The Source whose `load` call initiated this `yield`
|
178
|
+
# @return [void]
|
179
|
+
def dataloader_fiber_yield(source); end
|
180
|
+
# Called when a Dataloader fiber is resumed because data has been loaded
|
181
|
+
# @param source [GraphQL::Dataloader::Source] The Source whose `load` call previously caused this Fiber to wait
|
182
|
+
# @return [void]
|
183
|
+
def dataloader_fiber_resume(source); end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
data/lib/graphql/tracing.rb
CHANGED
@@ -1,60 +1,40 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require "graphql/tracing/active_support_notifications_tracing"
|
3
|
-
require "graphql/tracing/platform_tracing"
|
4
|
-
require "graphql/tracing/appoptics_tracing"
|
5
|
-
require "graphql/tracing/appsignal_tracing"
|
6
|
-
require "graphql/tracing/data_dog_tracing"
|
7
|
-
require "graphql/tracing/new_relic_tracing"
|
8
|
-
require "graphql/tracing/scout_tracing"
|
9
|
-
require "graphql/tracing/skylight_tracing"
|
10
|
-
require "graphql/tracing/statsd_tracing"
|
11
|
-
require "graphql/tracing/prometheus_tracing"
|
12
2
|
|
13
|
-
if defined?(PrometheusExporter::Server)
|
14
|
-
require "graphql/tracing/prometheus_tracing/graphql_collector"
|
15
|
-
end
|
16
3
|
|
17
4
|
module GraphQL
|
18
|
-
# Library entry point for performance metric reporting.
|
19
|
-
#
|
20
|
-
# @example Sending custom events
|
21
|
-
# query.trace("my_custom_event", { ... }) do
|
22
|
-
# # do stuff ...
|
23
|
-
# end
|
24
|
-
#
|
25
|
-
# @example Adding a tracer to a schema
|
26
|
-
# class MySchema < GraphQL::Schema
|
27
|
-
# tracer MyTracer # <= responds to .trace(key, data, &block)
|
28
|
-
# end
|
29
|
-
#
|
30
|
-
# @example Adding a tracer to a single query
|
31
|
-
# MySchema.execute(query_str, context: { backtrace: true })
|
32
|
-
#
|
33
|
-
# Events:
|
34
|
-
#
|
35
|
-
# Key | Metadata
|
36
|
-
# ----|---------
|
37
|
-
# lex | `{ query_string: String }`
|
38
|
-
# parse | `{ query_string: String }`
|
39
|
-
# validate | `{ query: GraphQL::Query, validate: Boolean }`
|
40
|
-
# analyze_multiplex | `{ multiplex: GraphQL::Execution::Multiplex }`
|
41
|
-
# analyze_query | `{ query: GraphQL::Query }`
|
42
|
-
# execute_multiplex | `{ multiplex: GraphQL::Execution::Multiplex }`
|
43
|
-
# execute_query | `{ query: GraphQL::Query }`
|
44
|
-
# execute_query_lazy | `{ query: GraphQL::Query?, multiplex: GraphQL::Execution::Multiplex? }`
|
45
|
-
# execute_field | `{ owner: Class, field: GraphQL::Schema::Field, query: GraphQL::Query, path: Array<String, Integer>, ast_node: GraphQL::Language::Nodes::Field}`
|
46
|
-
# execute_field_lazy | `{ owner: Class, field: GraphQL::Schema::Field, query: GraphQL::Query, path: Array<String, Integer>, ast_node: GraphQL::Language::Nodes::Field}`
|
47
|
-
# authorized | `{ context: GraphQL::Query::Context, type: Class, object: Object, path: Array<String, Integer> }`
|
48
|
-
# authorized_lazy | `{ context: GraphQL::Query::Context, type: Class, object: Object, path: Array<String, Integer> }`
|
49
|
-
# resolve_type | `{ context: GraphQL::Query::Context, type: Class, object: Object, path: Array<String, Integer> }`
|
50
|
-
# resolve_type_lazy | `{ context: GraphQL::Query::Context, type: Class, object: Object, path: Array<String, Integer> }`
|
51
|
-
#
|
52
|
-
# Note that `execute_field` and `execute_field_lazy` receive different data in different settings:
|
53
|
-
#
|
54
|
-
# - When using {GraphQL::Execution::Interpreter}, they receive `{field:, path:, query:}`
|
55
|
-
# - Otherwise, they receive `{context: ...}`
|
56
|
-
#
|
57
5
|
module Tracing
|
6
|
+
autoload :Trace, "graphql/tracing/trace"
|
7
|
+
autoload :CallLegacyTracers, "graphql/tracing/call_legacy_tracers"
|
8
|
+
autoload :LegacyTrace, "graphql/tracing/legacy_trace"
|
9
|
+
autoload :LegacyHooksTrace, "graphql/tracing/legacy_hooks_trace"
|
10
|
+
autoload :NullTrace, "graphql/tracing/null_trace"
|
11
|
+
|
12
|
+
autoload :ActiveSupportNotificationsTracing, "graphql/tracing/active_support_notifications_tracing"
|
13
|
+
autoload :PlatformTracing, "graphql/tracing/platform_tracing"
|
14
|
+
autoload :AppOpticsTracing, "graphql/tracing/appoptics_tracing"
|
15
|
+
autoload :AppsignalTracing, "graphql/tracing/appsignal_tracing"
|
16
|
+
autoload :DataDogTracing, "graphql/tracing/data_dog_tracing"
|
17
|
+
autoload :NewRelicTracing, "graphql/tracing/new_relic_tracing"
|
18
|
+
autoload :NotificationsTracing, "graphql/tracing/notifications_tracing"
|
19
|
+
autoload :ScoutTracing, "graphql/tracing/scout_tracing"
|
20
|
+
autoload :StatsdTracing, "graphql/tracing/statsd_tracing"
|
21
|
+
autoload :PrometheusTracing, "graphql/tracing/prometheus_tracing"
|
22
|
+
|
23
|
+
autoload :ActiveSupportNotificationsTrace, "graphql/tracing/active_support_notifications_trace"
|
24
|
+
autoload :PlatformTrace, "graphql/tracing/platform_trace"
|
25
|
+
autoload :AppOpticsTrace, "graphql/tracing/appoptics_trace"
|
26
|
+
autoload :AppsignalTrace, "graphql/tracing/appsignal_trace"
|
27
|
+
autoload :DataDogTrace, "graphql/tracing/data_dog_trace"
|
28
|
+
autoload :MonitorTrace, "graphql/tracing/monitor_trace"
|
29
|
+
autoload :NewRelicTrace, "graphql/tracing/new_relic_trace"
|
30
|
+
autoload :NotificationsTrace, "graphql/tracing/notifications_trace"
|
31
|
+
autoload :SentryTrace, "graphql/tracing/sentry_trace"
|
32
|
+
autoload :ScoutTrace, "graphql/tracing/scout_trace"
|
33
|
+
autoload :StatsdTrace, "graphql/tracing/statsd_trace"
|
34
|
+
autoload :PrometheusTrace, "graphql/tracing/prometheus_trace"
|
35
|
+
autoload :PerfettoTrace, "graphql/tracing/perfetto_trace"
|
36
|
+
autoload :DetailedTrace, "graphql/tracing/detailed_trace"
|
37
|
+
|
58
38
|
# Objects may include traceable to gain a `.trace(...)` method.
|
59
39
|
# The object must have a `@tracers` ivar of type `Array<<#trace(k, d, &b)>>`.
|
60
40
|
# @api private
|
data/lib/graphql/type_kinds.rb
CHANGED
@@ -5,17 +5,19 @@ module GraphQL
|
|
5
5
|
# These objects are singletons, eg `GraphQL::TypeKinds::UNION`, `GraphQL::TypeKinds::SCALAR`.
|
6
6
|
class TypeKind
|
7
7
|
attr_reader :name, :description
|
8
|
-
def initialize(name, abstract: false, fields: false, wraps: false, input: false, description: nil)
|
8
|
+
def initialize(name, abstract: false, leaf: false, fields: false, wraps: false, input: false, description: nil)
|
9
9
|
@name = name
|
10
10
|
@abstract = abstract
|
11
11
|
@fields = fields
|
12
12
|
@wraps = wraps
|
13
13
|
@input = input
|
14
|
+
@leaf = leaf
|
14
15
|
@composite = fields? || abstract?
|
15
16
|
@description = description
|
17
|
+
freeze
|
16
18
|
end
|
17
19
|
|
18
|
-
# Does this TypeKind have multiple possible
|
20
|
+
# Does this TypeKind have multiple possible implementers?
|
19
21
|
# @deprecated Use `abstract?` instead of `resolves?`.
|
20
22
|
def resolves?; @abstract; end
|
21
23
|
# Is this TypeKind abstract?
|
@@ -27,6 +29,8 @@ module GraphQL
|
|
27
29
|
# Is this TypeKind a valid query input?
|
28
30
|
def input?; @input; end
|
29
31
|
def to_s; @name; end
|
32
|
+
# Is this TypeKind a primitive value?
|
33
|
+
def leaf?; @leaf; end
|
30
34
|
# Is this TypeKind composed of many values?
|
31
35
|
def composite?; @composite; end
|
32
36
|
|
@@ -64,11 +68,11 @@ module GraphQL
|
|
64
68
|
end
|
65
69
|
|
66
70
|
TYPE_KINDS = [
|
67
|
-
SCALAR = TypeKind.new("SCALAR", input: true, description: 'Indicates this type is a scalar.'),
|
71
|
+
SCALAR = TypeKind.new("SCALAR", input: true, leaf: true, description: 'Indicates this type is a scalar.'),
|
68
72
|
OBJECT = TypeKind.new("OBJECT", fields: true, description: 'Indicates this type is an object. `fields` and `interfaces` are valid fields.'),
|
69
73
|
INTERFACE = TypeKind.new("INTERFACE", abstract: true, fields: true, description: 'Indicates this type is an interface. `fields` and `possibleTypes` are valid fields.'),
|
70
74
|
UNION = TypeKind.new("UNION", abstract: true, description: 'Indicates this type is a union. `possibleTypes` is a valid field.'),
|
71
|
-
ENUM = TypeKind.new("ENUM", input: true, description: 'Indicates this type is an enum. `enumValues` is a valid field.'),
|
75
|
+
ENUM = TypeKind.new("ENUM", input: true, leaf: true, description: 'Indicates this type is an enum. `enumValues` is a valid field.'),
|
72
76
|
INPUT_OBJECT = TypeKind.new("INPUT_OBJECT", input: true, description: 'Indicates this type is an input object. `inputFields` is a valid field.'),
|
73
77
|
LIST = TypeKind.new("LIST", wraps: true, description: 'Indicates this type is a list. `ofType` is a valid field.'),
|
74
78
|
NON_NULL = TypeKind.new("NON_NULL", wraps: true, description: 'Indicates this type is a non-null. `ofType` is a valid field.'),
|
@@ -14,6 +14,7 @@ module GraphQL
|
|
14
14
|
# own Date type.
|
15
15
|
class ISO8601Date < GraphQL::Schema::Scalar
|
16
16
|
description "An ISO 8601-encoded date"
|
17
|
+
specified_by_url "https://tools.ietf.org/html/rfc3339"
|
17
18
|
|
18
19
|
# @param value [Date,Time,DateTime,String]
|
19
20
|
# @return [String]
|
@@ -22,7 +23,7 @@ module GraphQL
|
|
22
23
|
end
|
23
24
|
|
24
25
|
# @param str_value [String, Date, DateTime, Time]
|
25
|
-
# @return [Date]
|
26
|
+
# @return [Date, nil]
|
26
27
|
def self.coerce_input(value, ctx)
|
27
28
|
if value.is_a?(::Date)
|
28
29
|
value
|
@@ -30,6 +31,8 @@ module GraphQL
|
|
30
31
|
value.to_date
|
31
32
|
elsif value.is_a?(::Time)
|
32
33
|
value.to_date
|
34
|
+
elsif value.nil?
|
35
|
+
nil
|
33
36
|
else
|
34
37
|
Date.iso8601(value)
|
35
38
|
end
|
@@ -17,6 +17,7 @@ module GraphQL
|
|
17
17
|
# own DateTime type.
|
18
18
|
class ISO8601DateTime < GraphQL::Schema::Scalar
|
19
19
|
description "An ISO 8601-encoded datetime"
|
20
|
+
specified_by_url "https://tools.ietf.org/html/rfc3339"
|
20
21
|
|
21
22
|
# It's not compatible with Rails' default,
|
22
23
|
# i.e. ActiveSupport::JSON::Encoder.time_precision (3 by default)
|
@@ -59,6 +60,9 @@ module GraphQL
|
|
59
60
|
# But without this, it would zero out given any time part of `str_value` (hours and/or minutes)
|
60
61
|
if dt.iso8601.start_with?(str_value)
|
61
62
|
dt
|
63
|
+
elsif str_value.length == 8 && str_value.match?(/\A\d{8}\Z/)
|
64
|
+
# Allow dates that are missing the "-". eg. "20220404"
|
65
|
+
dt
|
62
66
|
else
|
63
67
|
nil
|
64
68
|
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
module Types
|
4
|
+
# This scalar takes `Duration`s and transmits them as strings,
|
5
|
+
# using ISO 8601 format. ActiveSupport >= 5.0 must be loaded to use
|
6
|
+
# this scalar.
|
7
|
+
#
|
8
|
+
# Use it for fields or arguments as follows:
|
9
|
+
#
|
10
|
+
# field :age, GraphQL::Types::ISO8601Duration, null: false
|
11
|
+
#
|
12
|
+
# argument :interval, GraphQL::Types::ISO8601Duration, null: false
|
13
|
+
#
|
14
|
+
# Alternatively, use this built-in scalar as inspiration for your
|
15
|
+
# own Duration type.
|
16
|
+
class ISO8601Duration < GraphQL::Schema::Scalar
|
17
|
+
description "An ISO 8601-encoded duration"
|
18
|
+
|
19
|
+
# @return [Integer, nil]
|
20
|
+
def self.seconds_precision
|
21
|
+
# ActiveSupport::Duration precision defaults to whatever input was given
|
22
|
+
@seconds_precision
|
23
|
+
end
|
24
|
+
|
25
|
+
# @param [Integer, nil] value
|
26
|
+
def self.seconds_precision=(value)
|
27
|
+
@seconds_precision = value
|
28
|
+
end
|
29
|
+
|
30
|
+
# @param value [ActiveSupport::Duration, String]
|
31
|
+
# @return [String]
|
32
|
+
# @raise [GraphQL::Error] if ActiveSupport::Duration is not defined or if an incompatible object is passed
|
33
|
+
def self.coerce_result(value, _ctx)
|
34
|
+
unless defined?(ActiveSupport::Duration)
|
35
|
+
raise GraphQL::Error, "ActiveSupport >= 5.0 must be loaded to use the built-in ISO8601Duration type."
|
36
|
+
end
|
37
|
+
|
38
|
+
begin
|
39
|
+
case value
|
40
|
+
when ActiveSupport::Duration
|
41
|
+
value.iso8601(precision: seconds_precision)
|
42
|
+
when ::String
|
43
|
+
ActiveSupport::Duration.parse(value).iso8601(precision: seconds_precision)
|
44
|
+
else
|
45
|
+
# Try calling as ActiveSupport::Duration compatible as a fallback
|
46
|
+
value.iso8601(precision: seconds_precision)
|
47
|
+
end
|
48
|
+
rescue StandardError => error
|
49
|
+
raise GraphQL::Error, "An incompatible object (#{value.class}) was given to #{self}. Make sure that only ActiveSupport::Durations and well-formatted Strings are used with this type. (#{error.message})"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# @param value [String, ActiveSupport::Duration]
|
54
|
+
# @return [ActiveSupport::Duration, nil]
|
55
|
+
# @raise [GraphQL::Error] if ActiveSupport::Duration is not defined
|
56
|
+
# @raise [GraphQL::DurationEncodingError] if duration cannot be parsed
|
57
|
+
def self.coerce_input(value, ctx)
|
58
|
+
unless defined?(ActiveSupport::Duration)
|
59
|
+
raise GraphQL::Error, "ActiveSupport >= 5.0 must be loaded to use the built-in ISO8601Duration type."
|
60
|
+
end
|
61
|
+
|
62
|
+
begin
|
63
|
+
if value.is_a?(ActiveSupport::Duration)
|
64
|
+
value
|
65
|
+
elsif value.nil?
|
66
|
+
nil
|
67
|
+
else
|
68
|
+
ActiveSupport::Duration.parse(value)
|
69
|
+
end
|
70
|
+
rescue ArgumentError, TypeError
|
71
|
+
err = GraphQL::DurationEncodingError.new(value)
|
72
|
+
ctx.schema.type_error(err, ctx)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -10,6 +10,8 @@ module GraphQL
|
|
10
10
|
# so you can extend your own `BaseObject` instead of `GraphQL::Schema::Object`.
|
11
11
|
#
|
12
12
|
# @example Implementation a connection and edge
|
13
|
+
# class BaseObject < GraphQL::Schema::Object; end
|
14
|
+
#
|
13
15
|
# # Given some object in your app ...
|
14
16
|
# class Types::Post < BaseObject
|
15
17
|
# end
|
@@ -20,14 +22,22 @@ module GraphQL
|
|
20
22
|
#
|
21
23
|
# # Then extend them for the object in your app
|
22
24
|
# class Types::PostEdge < Types::BaseEdge
|
23
|
-
# node_type
|
25
|
+
# node_type Types::Post
|
24
26
|
# end
|
27
|
+
#
|
25
28
|
# class Types::PostConnection < Types::BaseConnection
|
26
|
-
# edge_type
|
27
|
-
#
|
28
|
-
#
|
29
|
-
#
|
30
|
-
#
|
29
|
+
# edge_type Types::PostEdge,
|
30
|
+
# edges_nullable: true,
|
31
|
+
# edge_nullable: true,
|
32
|
+
# node_nullable: true,
|
33
|
+
# nodes_field: true
|
34
|
+
#
|
35
|
+
# # Alternatively, you can call the class methods followed by your edge type
|
36
|
+
# # edges_nullable true
|
37
|
+
# # edge_nullable true
|
38
|
+
# # node_nullable true
|
39
|
+
# # has_nodes_field true
|
40
|
+
# # edge_type Types::PostEdge
|
31
41
|
# end
|
32
42
|
#
|
33
43
|
# @see Relay::BaseEdge for edge types
|
@@ -9,16 +9,44 @@ module GraphQL
|
|
9
9
|
|
10
10
|
def self.included(child_class)
|
11
11
|
child_class.extend(ClassMethods)
|
12
|
-
child_class.extend(Relay::DefaultRelay)
|
13
|
-
child_class.default_relay(true)
|
14
12
|
child_class.has_nodes_field(true)
|
15
13
|
child_class.node_nullable(true)
|
16
14
|
child_class.edges_nullable(true)
|
17
15
|
child_class.edge_nullable(true)
|
16
|
+
child_class.module_exec {
|
17
|
+
self.edge_type = nil
|
18
|
+
self.node_type = nil
|
19
|
+
self.edge_class = nil
|
20
|
+
}
|
21
|
+
child_class.default_broadcastable(nil)
|
18
22
|
add_page_info_field(child_class)
|
19
23
|
end
|
20
24
|
|
21
25
|
module ClassMethods
|
26
|
+
def inherited(child_class)
|
27
|
+
super
|
28
|
+
child_class.has_nodes_field(has_nodes_field)
|
29
|
+
child_class.node_nullable(node_nullable)
|
30
|
+
child_class.edges_nullable(edges_nullable)
|
31
|
+
child_class.edge_nullable(edge_nullable)
|
32
|
+
child_class.edge_type = nil
|
33
|
+
child_class.node_type = nil
|
34
|
+
child_class.edge_class = nil
|
35
|
+
child_class.default_broadcastable(default_broadcastable?)
|
36
|
+
end
|
37
|
+
|
38
|
+
def default_relay?
|
39
|
+
true
|
40
|
+
end
|
41
|
+
|
42
|
+
def default_broadcastable?
|
43
|
+
@default_broadcastable
|
44
|
+
end
|
45
|
+
|
46
|
+
def default_broadcastable(new_value)
|
47
|
+
@default_broadcastable = new_value
|
48
|
+
end
|
49
|
+
|
22
50
|
# @return [Class]
|
23
51
|
attr_reader :node_type
|
24
52
|
|
@@ -36,7 +64,7 @@ module GraphQL
|
|
36
64
|
# class name to set defaults. You can call it again in the class definition
|
37
65
|
# to override the default (or provide a value, if the default lookup failed).
|
38
66
|
# @param field_options [Hash] Any extra keyword arguments to pass to the `field :edges, ...` and `field :nodes, ...` configurations
|
39
|
-
def edge_type(edge_type_class, edge_class: GraphQL::
|
67
|
+
def edge_type(edge_type_class, edge_class: GraphQL::Pagination::Connection::Edge, node_type: edge_type_class.node_type, nodes_field: self.has_nodes_field, node_nullable: self.node_nullable, edges_nullable: self.edges_nullable, edge_nullable: self.edge_nullable, field_options: nil)
|
40
68
|
# Set this connection's graphql name
|
41
69
|
node_type_name = node_type.graphql_name
|
42
70
|
|
@@ -49,7 +77,7 @@ module GraphQL
|
|
49
77
|
type: [edge_type_class, null: edge_nullable],
|
50
78
|
null: edges_nullable,
|
51
79
|
description: "A list of edges.",
|
52
|
-
|
80
|
+
scope: false, # Assume that the connection was already scoped.
|
53
81
|
connection: false,
|
54
82
|
}
|
55
83
|
|
@@ -69,6 +97,19 @@ module GraphQL
|
|
69
97
|
node_type.scope_items(items, context)
|
70
98
|
end
|
71
99
|
|
100
|
+
# The connection will skip auth on its nodes if the node_type is configured for that
|
101
|
+
def reauthorize_scoped_objects(new_value = nil)
|
102
|
+
if new_value.nil?
|
103
|
+
if @reauthorize_scoped_objects != nil
|
104
|
+
@reauthorize_scoped_objects
|
105
|
+
else
|
106
|
+
node_type.reauthorize_scoped_objects
|
107
|
+
end
|
108
|
+
else
|
109
|
+
@reauthorize_scoped_objects = new_value
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
72
113
|
# Add the shortcut `nodes` field to this connection and its subclasses
|
73
114
|
def nodes_field(node_nullable: self.node_nullable, field_options: nil)
|
74
115
|
define_nodes_field(node_nullable, field_options: field_options)
|
@@ -78,10 +119,6 @@ module GraphQL
|
|
78
119
|
true # Let nodes be filtered out
|
79
120
|
end
|
80
121
|
|
81
|
-
def accessible?(ctx)
|
82
|
-
node_type.accessible?(ctx)
|
83
|
-
end
|
84
|
-
|
85
122
|
def visible?(ctx)
|
86
123
|
# if this is an abstract base class, there may be no `node_type`
|
87
124
|
node_type ? node_type.visible?(ctx) : super
|
@@ -127,6 +164,10 @@ module GraphQL
|
|
127
164
|
end
|
128
165
|
end
|
129
166
|
|
167
|
+
protected
|
168
|
+
|
169
|
+
attr_writer :edge_type, :node_type, :edge_class
|
170
|
+
|
130
171
|
private
|
131
172
|
|
132
173
|
def define_nodes_field(nullable, field_options: nil)
|
@@ -136,6 +177,8 @@ module GraphQL
|
|
136
177
|
null: nullable,
|
137
178
|
description: "A list of nodes.",
|
138
179
|
connection: false,
|
180
|
+
# Assume that the connection was scoped before this step:
|
181
|
+
scope: false,
|
139
182
|
}
|
140
183
|
if field_options
|
141
184
|
base_field_options.merge!(field_options)
|
@@ -150,23 +193,22 @@ module GraphQL
|
|
150
193
|
end
|
151
194
|
end
|
152
195
|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
196
|
+
def edges
|
197
|
+
# Assume that whatever authorization needed to happen
|
198
|
+
# already happened at the connection level.
|
199
|
+
current_runtime_state = Fiber[:__graphql_runtime_info]
|
200
|
+
query_runtime_state = current_runtime_state[context.query]
|
201
|
+
query_runtime_state.was_authorized_by_scope_items = @object.was_authorized_by_scope_items?
|
202
|
+
@object.edges
|
157
203
|
end
|
158
204
|
|
159
|
-
def
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
else
|
167
|
-
# This is done by edges_instrumentation
|
168
|
-
@object.edge_nodes
|
169
|
-
end
|
205
|
+
def nodes
|
206
|
+
# Assume that whatever authorization needed to happen
|
207
|
+
# already happened at the connection level.
|
208
|
+
current_runtime_state = Fiber[:__graphql_runtime_info]
|
209
|
+
query_runtime_state = current_runtime_state[context.query]
|
210
|
+
query_runtime_state.was_authorized_by_scope_items = @object.was_authorized_by_scope_items?
|
211
|
+
@object.nodes
|
170
212
|
end
|
171
213
|
end
|
172
214
|
end
|