graphql 1.13.17 → 2.0.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of graphql might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/generators/graphql/install_generator.rb +1 -1
- data/lib/generators/graphql/relay.rb +3 -17
- data/lib/generators/graphql/templates/schema.erb +3 -0
- data/lib/graphql/analysis/ast/field_usage.rb +3 -1
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
- data/lib/graphql/analysis/ast/query_complexity.rb +1 -1
- data/lib/graphql/analysis/ast/query_depth.rb +0 -1
- data/lib/graphql/analysis/ast/visitor.rb +43 -36
- data/lib/graphql/analysis/ast.rb +2 -12
- data/lib/graphql/analysis.rb +0 -7
- data/lib/graphql/backtrace/table.rb +2 -20
- data/lib/graphql/backtrace/tracer.rb +2 -3
- data/lib/graphql/backtrace.rb +2 -8
- data/lib/graphql/dataloader/null_dataloader.rb +3 -1
- data/lib/graphql/dataloader/source.rb +9 -0
- data/lib/graphql/dataloader.rb +4 -1
- data/lib/graphql/dig.rb +1 -1
- data/lib/graphql/execution/errors.rb +12 -82
- data/lib/graphql/execution/interpreter/resolve.rb +26 -0
- data/lib/graphql/execution/interpreter/runtime.rb +159 -120
- data/lib/graphql/execution/interpreter.rb +187 -78
- data/lib/graphql/execution/lazy.rb +7 -21
- data/lib/graphql/execution/lookahead.rb +44 -40
- data/lib/graphql/execution/multiplex.rb +3 -174
- data/lib/graphql/execution.rb +11 -4
- data/lib/graphql/introspection/directive_type.rb +2 -2
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +2 -15
- data/lib/graphql/introspection/field_type.rb +1 -1
- data/lib/graphql/introspection/schema_type.rb +2 -2
- data/lib/graphql/introspection/type_type.rb +13 -6
- data/lib/graphql/introspection.rb +4 -3
- data/lib/graphql/language/document_from_schema_definition.rb +18 -35
- data/lib/graphql/language/lexer.rb +216 -1488
- data/lib/graphql/language/nodes.rb +65 -39
- data/lib/graphql/language/parser.rb +376 -364
- data/lib/graphql/language/parser.y +49 -44
- data/lib/graphql/language/printer.rb +37 -21
- data/lib/graphql/language/visitor.rb +191 -83
- data/lib/graphql/pagination/active_record_relation_connection.rb +0 -8
- data/lib/graphql/pagination/array_connection.rb +4 -2
- data/lib/graphql/pagination/connection.rb +31 -4
- data/lib/graphql/pagination/connections.rb +3 -28
- data/lib/graphql/pagination/relation_connection.rb +2 -0
- data/lib/graphql/query/context.rb +155 -196
- data/lib/graphql/query/input_validation_result.rb +1 -1
- data/lib/graphql/query/null_context.rb +0 -3
- data/lib/graphql/query/validation_pipeline.rb +10 -34
- data/lib/graphql/query/variables.rb +7 -20
- data/lib/graphql/query.rb +32 -42
- data/lib/graphql/railtie.rb +0 -104
- data/lib/graphql/rake_task/validate.rb +1 -1
- data/lib/graphql/rake_task.rb +29 -1
- data/lib/graphql/relay/range_add.rb +9 -20
- data/lib/graphql/relay.rb +0 -15
- data/lib/graphql/schema/addition.rb +7 -9
- data/lib/graphql/schema/argument.rb +36 -43
- data/lib/graphql/schema/build_from_definition.rb +32 -18
- data/lib/graphql/schema/directive/one_of.rb +12 -0
- data/lib/graphql/schema/directive/transform.rb +1 -1
- data/lib/graphql/schema/directive.rb +12 -23
- data/lib/graphql/schema/enum.rb +28 -39
- data/lib/graphql/schema/enum_value.rb +5 -25
- data/lib/graphql/schema/field/connection_extension.rb +4 -0
- data/lib/graphql/schema/field.rb +237 -339
- data/lib/graphql/schema/input_object.rb +56 -67
- data/lib/graphql/schema/interface.rb +0 -35
- data/lib/graphql/schema/introspection_system.rb +3 -8
- data/lib/graphql/schema/late_bound_type.rb +8 -2
- data/lib/graphql/schema/list.rb +0 -6
- data/lib/graphql/schema/loader.rb +1 -2
- data/lib/graphql/schema/member/base_dsl_methods.rb +17 -19
- data/lib/graphql/schema/member/build_type.rb +5 -7
- data/lib/graphql/schema/member/has_arguments.rb +146 -55
- data/lib/graphql/schema/member/has_ast_node.rb +12 -0
- data/lib/graphql/schema/member/has_deprecation_reason.rb +3 -4
- data/lib/graphql/schema/member/has_directives.rb +81 -59
- data/lib/graphql/schema/member/has_fields.rb +17 -4
- data/lib/graphql/schema/member/has_interfaces.rb +49 -10
- data/lib/graphql/schema/member/has_validators.rb +31 -5
- data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
- data/lib/graphql/schema/member/type_system_helpers.rb +17 -0
- data/lib/graphql/schema/member/validates_input.rb +1 -1
- data/lib/graphql/schema/member.rb +0 -6
- data/lib/graphql/schema/mutation.rb +0 -9
- data/lib/graphql/schema/non_null.rb +1 -7
- data/lib/graphql/schema/object.rb +15 -52
- data/lib/graphql/schema/relay_classic_mutation.rb +53 -42
- data/lib/graphql/schema/resolver/has_payload_type.rb +20 -10
- data/lib/graphql/schema/resolver.rb +41 -42
- data/lib/graphql/schema/scalar.rb +7 -22
- data/lib/graphql/schema/subscription.rb +0 -7
- data/lib/graphql/schema/timeout.rb +24 -28
- data/lib/graphql/schema/type_membership.rb +3 -0
- data/lib/graphql/schema/union.rb +10 -17
- data/lib/graphql/schema/warden.rb +34 -8
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +241 -973
- data/lib/graphql/static_validation/all_rules.rb +1 -0
- data/lib/graphql/static_validation/base_visitor.rb +4 -21
- 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 +19 -1
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +11 -5
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +12 -12
- 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/unique_directives_per_location.rb +12 -6
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +1 -1
- data/lib/graphql/static_validation/validator.rb +3 -25
- data/lib/graphql/static_validation.rb +0 -2
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +7 -1
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +38 -1
- data/lib/graphql/subscriptions/event.rb +3 -8
- data/lib/graphql/subscriptions/instrumentation.rb +0 -51
- data/lib/graphql/subscriptions.rb +32 -20
- data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
- data/lib/graphql/tracing/appoptics_trace.rb +231 -0
- data/lib/graphql/tracing/appsignal_trace.rb +71 -0
- data/lib/graphql/tracing/data_dog_trace.rb +148 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +2 -0
- data/lib/graphql/tracing/new_relic_trace.rb +75 -0
- data/lib/graphql/tracing/notifications_trace.rb +41 -0
- data/lib/graphql/tracing/platform_trace.rb +107 -0
- data/lib/graphql/tracing/platform_tracing.rb +26 -40
- data/lib/graphql/tracing/prometheus_trace.rb +89 -0
- data/lib/graphql/tracing/prometheus_tracing.rb +3 -3
- data/lib/graphql/tracing/scout_trace.rb +72 -0
- data/lib/graphql/tracing/statsd_trace.rb +56 -0
- data/lib/graphql/tracing.rb +136 -40
- data/lib/graphql/type_kinds.rb +6 -3
- 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/relay/base_connection.rb +16 -6
- data/lib/graphql/types/relay/connection_behaviors.rb +29 -27
- data/lib/graphql/types/relay/edge_behaviors.rb +16 -5
- data/lib/graphql/types/relay/node_behaviors.rb +12 -2
- data/lib/graphql/types/relay/page_info_behaviors.rb +7 -2
- data/lib/graphql/types/relay.rb +0 -3
- data/lib/graphql/types/string.rb +1 -1
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +13 -74
- metadata +30 -133
- data/lib/graphql/analysis/analyze_query.rb +0 -98
- data/lib/graphql/analysis/field_usage.rb +0 -45
- data/lib/graphql/analysis/max_query_complexity.rb +0 -26
- data/lib/graphql/analysis/max_query_depth.rb +0 -26
- data/lib/graphql/analysis/query_complexity.rb +0 -88
- data/lib/graphql/analysis/query_depth.rb +0 -43
- data/lib/graphql/analysis/reducer_state.rb +0 -48
- data/lib/graphql/argument.rb +0 -131
- data/lib/graphql/authorization.rb +0 -82
- data/lib/graphql/backtrace/legacy_tracer.rb +0 -56
- data/lib/graphql/backwards_compatibility.rb +0 -61
- data/lib/graphql/base_type.rb +0 -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/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/instrumentation.rb +0 -92
- 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/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/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/catchall_middleware.rb +0 -35
- data/lib/graphql/schema/default_parse_error.rb +0 -10
- data/lib/graphql/schema/default_type_error.rb +0 -17
- data/lib/graphql/schema/member/accepts_definition.rb +0 -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/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/string_type.rb +0 -2
- 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
data/lib/graphql/tracing.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
# Legacy tracing:
|
2
3
|
require "graphql/tracing/active_support_notifications_tracing"
|
3
4
|
require "graphql/tracing/platform_tracing"
|
4
5
|
require "graphql/tracing/appoptics_tracing"
|
@@ -6,55 +7,150 @@ require "graphql/tracing/appsignal_tracing"
|
|
6
7
|
require "graphql/tracing/data_dog_tracing"
|
7
8
|
require "graphql/tracing/new_relic_tracing"
|
8
9
|
require "graphql/tracing/scout_tracing"
|
9
|
-
require "graphql/tracing/skylight_tracing"
|
10
10
|
require "graphql/tracing/statsd_tracing"
|
11
11
|
require "graphql/tracing/prometheus_tracing"
|
12
12
|
|
13
|
+
# New Tracing:
|
14
|
+
require "graphql/tracing/platform_trace"
|
15
|
+
require "graphql/tracing/appoptics_trace"
|
16
|
+
require "graphql/tracing/appsignal_trace"
|
17
|
+
require "graphql/tracing/data_dog_trace"
|
18
|
+
require "graphql/tracing/new_relic_trace"
|
19
|
+
require "graphql/tracing/notifications_trace"
|
20
|
+
require "graphql/tracing/scout_trace"
|
21
|
+
require "graphql/tracing/statsd_trace"
|
22
|
+
require "graphql/tracing/prometheus_trace"
|
13
23
|
if defined?(PrometheusExporter::Server)
|
14
24
|
require "graphql/tracing/prometheus_tracing/graphql_collector"
|
15
25
|
end
|
16
26
|
|
17
27
|
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
28
|
module Tracing
|
29
|
+
class Trace
|
30
|
+
# @param multiplex [GraphQL::Execution::Multiplex, nil]
|
31
|
+
# @param query [GraphQL::Query, nil]
|
32
|
+
def initialize(multiplex: nil, query: nil, **_options)
|
33
|
+
@multiplex = multiplex
|
34
|
+
@query = query
|
35
|
+
end
|
36
|
+
|
37
|
+
def lex(query_string:)
|
38
|
+
yield
|
39
|
+
end
|
40
|
+
|
41
|
+
def parse(query_string:)
|
42
|
+
yield
|
43
|
+
end
|
44
|
+
|
45
|
+
def validate(query:, validate:)
|
46
|
+
yield
|
47
|
+
end
|
48
|
+
|
49
|
+
def analyze_multiplex(multiplex:)
|
50
|
+
yield
|
51
|
+
end
|
52
|
+
|
53
|
+
def analyze_query(query:)
|
54
|
+
yield
|
55
|
+
end
|
56
|
+
|
57
|
+
def execute_multiplex(multiplex:)
|
58
|
+
yield
|
59
|
+
end
|
60
|
+
|
61
|
+
def execute_query(query:)
|
62
|
+
yield
|
63
|
+
end
|
64
|
+
|
65
|
+
def execute_query_lazy(query:, multiplex:)
|
66
|
+
yield
|
67
|
+
end
|
68
|
+
|
69
|
+
def execute_field(field:, query:, ast_node:, arguments:, object:)
|
70
|
+
yield
|
71
|
+
end
|
72
|
+
|
73
|
+
def execute_field_lazy(field:, query:, ast_node:, arguments:, object:)
|
74
|
+
yield
|
75
|
+
end
|
76
|
+
|
77
|
+
def authorized(query:, type:, object:)
|
78
|
+
yield
|
79
|
+
end
|
80
|
+
|
81
|
+
def authorized_lazy(query:, type:, object:)
|
82
|
+
yield
|
83
|
+
end
|
84
|
+
|
85
|
+
def resolve_type(query:, type:, object:)
|
86
|
+
yield
|
87
|
+
end
|
88
|
+
|
89
|
+
def resolve_type_lazy(query:, type:, object:)
|
90
|
+
yield
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
NullTrace = Trace.new
|
95
|
+
|
96
|
+
class LegacyTrace < Trace
|
97
|
+
def lex(query_string:, &block)
|
98
|
+
(@multiplex || @query).trace("lex", { query_string: query_string }, &block)
|
99
|
+
end
|
100
|
+
|
101
|
+
def parse(query_string:, &block)
|
102
|
+
(@multiplex || @query).trace("parse", { query_string: query_string }, &block)
|
103
|
+
end
|
104
|
+
|
105
|
+
def validate(query:, validate:, &block)
|
106
|
+
query.trace("validate", { validate: validate, query: query }, &block)
|
107
|
+
end
|
108
|
+
|
109
|
+
def analyze_multiplex(multiplex:, &block)
|
110
|
+
multiplex.trace("analyze_multiplex", { multiplex: multiplex }, &block)
|
111
|
+
end
|
112
|
+
|
113
|
+
def analyze_query(query:, &block)
|
114
|
+
query.trace("analyze_query", { query: query }, &block)
|
115
|
+
end
|
116
|
+
|
117
|
+
def execute_multiplex(multiplex:, &block)
|
118
|
+
multiplex.trace("execute_multiplex", { multiplex: multiplex }, &block)
|
119
|
+
end
|
120
|
+
|
121
|
+
def execute_query(query:, &block)
|
122
|
+
query.trace("execute_query", { query: query }, &block)
|
123
|
+
end
|
124
|
+
|
125
|
+
def execute_query_lazy(query:, multiplex:, &block)
|
126
|
+
multiplex.trace("execute_query_lazy", { multiplex: multiplex, query: query }, &block)
|
127
|
+
end
|
128
|
+
|
129
|
+
def execute_field(field:, query:, ast_node:, arguments:, object:, &block)
|
130
|
+
query.trace("execute_field", { field: field, query: query, ast_node: ast_node, arguments: arguments, object: object, owner: field.owner, path: query.context[:current_path] }, &block)
|
131
|
+
end
|
132
|
+
|
133
|
+
def execute_field_lazy(field:, query:, ast_node:, arguments:, object:, &block)
|
134
|
+
query.trace("execute_field_lazy", { field: field, query: query, ast_node: ast_node, arguments: arguments, object: object, owner: field.owner, path: query.context[:current_path] }, &block)
|
135
|
+
end
|
136
|
+
|
137
|
+
def authorized(query:, type:, object:, &block)
|
138
|
+
query.trace("authorized", { context: query.context, type: type, object: object, path: query.context[:current_path] }, &block)
|
139
|
+
end
|
140
|
+
|
141
|
+
def authorized_lazy(query:, type:, object:, &block)
|
142
|
+
query.trace("authorized_lazy", { context: query.context, type: type, object: object, path: query.context[:current_path] }, &block)
|
143
|
+
end
|
144
|
+
|
145
|
+
def resolve_type(query:, type:, object:, &block)
|
146
|
+
query.trace("resolve_type", { context: query.context, type: type, object: object, path: query.context[:current_path] }, &block)
|
147
|
+
end
|
148
|
+
|
149
|
+
def resolve_type_lazy(query:, type:, object:, &block)
|
150
|
+
query.trace("resolve_type_lazy", { context: query.context, type: type, object: object, path: query.context[:current_path] }, &block)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
58
154
|
# Objects may include traceable to gain a `.trace(...)` method.
|
59
155
|
# The object must have a `@tracers` ivar of type `Array<<#trace(k, d, &b)>>`.
|
60
156
|
# @api private
|
data/lib/graphql/type_kinds.rb
CHANGED
@@ -5,12 +5,13 @@ 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
|
16
17
|
end
|
@@ -27,6 +28,8 @@ module GraphQL
|
|
27
28
|
# Is this TypeKind a valid query input?
|
28
29
|
def input?; @input; end
|
29
30
|
def to_s; @name; end
|
31
|
+
# Is this TypeKind a primitive value?
|
32
|
+
def leaf?; @leaf; end
|
30
33
|
# Is this TypeKind composed of many values?
|
31
34
|
def composite?; @composite; end
|
32
35
|
|
@@ -64,11 +67,11 @@ module GraphQL
|
|
64
67
|
end
|
65
68
|
|
66
69
|
TYPE_KINDS = [
|
67
|
-
SCALAR = TypeKind.new("SCALAR", input: true, description: 'Indicates this type is a scalar.'),
|
70
|
+
SCALAR = TypeKind.new("SCALAR", input: true, leaf: true, description: 'Indicates this type is a scalar.'),
|
68
71
|
OBJECT = TypeKind.new("OBJECT", fields: true, description: 'Indicates this type is an object. `fields` and `interfaces` are valid fields.'),
|
69
72
|
INTERFACE = TypeKind.new("INTERFACE", abstract: true, fields: true, description: 'Indicates this type is an interface. `fields` and `possibleTypes` are valid fields.'),
|
70
73
|
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.'),
|
74
|
+
ENUM = TypeKind.new("ENUM", input: true, leaf: true, description: 'Indicates this type is an enum. `enumValues` is a valid field.'),
|
72
75
|
INPUT_OBJECT = TypeKind.new("INPUT_OBJECT", input: true, description: 'Indicates this type is an input object. `inputFields` is a valid field.'),
|
73
76
|
LIST = TypeKind.new("LIST", wraps: true, description: 'Indicates this type is a list. `ofType` is a valid field.'),
|
74
77
|
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
|
@@ -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,34 @@ 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_eval {
|
17
|
+
self.edge_type = nil
|
18
|
+
self.node_type = nil
|
19
|
+
self.edge_class = nil
|
20
|
+
}
|
18
21
|
add_page_info_field(child_class)
|
19
22
|
end
|
20
23
|
|
21
24
|
module ClassMethods
|
25
|
+
def inherited(child_class)
|
26
|
+
super
|
27
|
+
child_class.has_nodes_field(has_nodes_field)
|
28
|
+
child_class.node_nullable(node_nullable)
|
29
|
+
child_class.edges_nullable(edges_nullable)
|
30
|
+
child_class.edge_nullable(edge_nullable)
|
31
|
+
child_class.edge_type = nil
|
32
|
+
child_class.node_type = nil
|
33
|
+
child_class.edge_class = nil
|
34
|
+
end
|
35
|
+
|
36
|
+
def default_relay?
|
37
|
+
true
|
38
|
+
end
|
39
|
+
|
22
40
|
# @return [Class]
|
23
41
|
attr_reader :node_type
|
24
42
|
|
@@ -36,7 +54,7 @@ module GraphQL
|
|
36
54
|
# class name to set defaults. You can call it again in the class definition
|
37
55
|
# to override the default (or provide a value, if the default lookup failed).
|
38
56
|
# @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::
|
57
|
+
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
58
|
# Set this connection's graphql name
|
41
59
|
node_type_name = node_type.graphql_name
|
42
60
|
|
@@ -49,8 +67,9 @@ module GraphQL
|
|
49
67
|
type: [edge_type_class, null: edge_nullable],
|
50
68
|
null: edges_nullable,
|
51
69
|
description: "A list of edges.",
|
52
|
-
legacy_edge_class: edge_class, # This is used by the old runtime only, for EdgesInstrumentation
|
53
70
|
connection: false,
|
71
|
+
# Assume that the connection was scoped before this step:
|
72
|
+
scope: false,
|
54
73
|
}
|
55
74
|
|
56
75
|
if field_options
|
@@ -78,10 +97,6 @@ module GraphQL
|
|
78
97
|
true # Let nodes be filtered out
|
79
98
|
end
|
80
99
|
|
81
|
-
def accessible?(ctx)
|
82
|
-
node_type.accessible?(ctx)
|
83
|
-
end
|
84
|
-
|
85
100
|
def visible?(ctx)
|
86
101
|
# if this is an abstract base class, there may be no `node_type`
|
87
102
|
node_type ? node_type.visible?(ctx) : super
|
@@ -127,6 +142,10 @@ module GraphQL
|
|
127
142
|
end
|
128
143
|
end
|
129
144
|
|
145
|
+
protected
|
146
|
+
|
147
|
+
attr_writer :edge_type, :node_type, :edge_class
|
148
|
+
|
130
149
|
private
|
131
150
|
|
132
151
|
def define_nodes_field(nullable, field_options: nil)
|
@@ -136,6 +155,8 @@ module GraphQL
|
|
136
155
|
null: nullable,
|
137
156
|
description: "A list of nodes.",
|
138
157
|
connection: false,
|
158
|
+
# Assume that the connection was scoped before this step:
|
159
|
+
scope: false,
|
139
160
|
}
|
140
161
|
if field_options
|
141
162
|
base_field_options.merge!(field_options)
|
@@ -149,25 +170,6 @@ module GraphQL
|
|
149
170
|
obj_type.field :page_info, GraphQL::Types::Relay::PageInfo, null: false, description: "Information to aid in pagination."
|
150
171
|
end
|
151
172
|
end
|
152
|
-
|
153
|
-
# By default this calls through to the ConnectionWrapper's edge nodes method,
|
154
|
-
# but sometimes you need to override it to support the `nodes` field
|
155
|
-
def nodes
|
156
|
-
@object.edge_nodes
|
157
|
-
end
|
158
|
-
|
159
|
-
def edges
|
160
|
-
if @object.is_a?(GraphQL::Pagination::Connection)
|
161
|
-
@object.edges
|
162
|
-
elsif context.interpreter?
|
163
|
-
context.schema.after_lazy(object.edge_nodes) do |nodes|
|
164
|
-
nodes.map { |n| self.class.edge_class.new(n, object) }
|
165
|
-
end
|
166
|
-
else
|
167
|
-
# This is done by edges_instrumentation
|
168
|
-
@object.edge_nodes
|
169
|
-
end
|
170
|
-
end
|
171
173
|
end
|
172
174
|
end
|
173
175
|
end
|
@@ -8,10 +8,21 @@ module GraphQL
|
|
8
8
|
child_class.description("An edge in a connection.")
|
9
9
|
child_class.field(:cursor, String, null: false, description: "A cursor for use in pagination.")
|
10
10
|
child_class.extend(ClassMethods)
|
11
|
+
child_class.class_eval { self.node_type = nil }
|
11
12
|
child_class.node_nullable(true)
|
12
13
|
end
|
13
14
|
|
14
15
|
module ClassMethods
|
16
|
+
def inherited(child_class)
|
17
|
+
super
|
18
|
+
child_class.node_type = nil
|
19
|
+
child_class.node_nullable = nil
|
20
|
+
end
|
21
|
+
|
22
|
+
def default_relay?
|
23
|
+
true
|
24
|
+
end
|
25
|
+
|
15
26
|
# Get or set the Object type that this edge wraps.
|
16
27
|
#
|
17
28
|
# @param node_type [Class] A `Schema::Object` subclass
|
@@ -40,10 +51,6 @@ module GraphQL
|
|
40
51
|
true
|
41
52
|
end
|
42
53
|
|
43
|
-
def accessible?(ctx)
|
44
|
-
node_type.accessible?(ctx)
|
45
|
-
end
|
46
|
-
|
47
54
|
def visible?(ctx)
|
48
55
|
node_type.visible?(ctx)
|
49
56
|
end
|
@@ -52,11 +59,15 @@ module GraphQL
|
|
52
59
|
# Use `node_nullable(false)` in your base class to make non-null `node` field.
|
53
60
|
def node_nullable(new_value = nil)
|
54
61
|
if new_value.nil?
|
55
|
-
|
62
|
+
@node_nullable != nil ? @node_nullable : superclass.node_nullable
|
56
63
|
else
|
57
64
|
@node_nullable = new_value
|
58
65
|
end
|
59
66
|
end
|
67
|
+
|
68
|
+
protected
|
69
|
+
|
70
|
+
attr_writer :node_type, :node_nullable
|
60
71
|
end
|
61
72
|
end
|
62
73
|
end
|
@@ -5,9 +5,19 @@ module GraphQL
|
|
5
5
|
module Relay
|
6
6
|
module NodeBehaviors
|
7
7
|
def self.included(child_module)
|
8
|
-
child_module.extend(
|
8
|
+
child_module.extend(ClassMethods)
|
9
9
|
child_module.description("An object with an ID.")
|
10
|
-
child_module.field(:id, ID, null: false, description: "ID of the object.")
|
10
|
+
child_module.field(:id, ID, null: false, description: "ID of the object.", resolver_method: :default_global_id)
|
11
|
+
end
|
12
|
+
|
13
|
+
def default_global_id
|
14
|
+
context.schema.id_from_object(object, self.class, context)
|
15
|
+
end
|
16
|
+
|
17
|
+
module ClassMethods
|
18
|
+
def default_relay?
|
19
|
+
true
|
20
|
+
end
|
11
21
|
end
|
12
22
|
end
|
13
23
|
end
|
@@ -4,8 +4,7 @@ module GraphQL
|
|
4
4
|
module Relay
|
5
5
|
module PageInfoBehaviors
|
6
6
|
def self.included(child_class)
|
7
|
-
child_class.extend
|
8
|
-
|
7
|
+
child_class.extend ClassMethods
|
9
8
|
child_class.description "Information about pagination in a connection."
|
10
9
|
child_class.field :has_next_page, Boolean, null: false,
|
11
10
|
description: "When paginating forwards, are there more items?"
|
@@ -20,6 +19,12 @@ module GraphQL
|
|
20
19
|
description: "When paginating forwards, the cursor to continue."
|
21
20
|
end
|
22
21
|
end
|
22
|
+
|
23
|
+
module ClassMethods
|
24
|
+
def default_relay?
|
25
|
+
true
|
26
|
+
end
|
27
|
+
end
|
23
28
|
end
|
24
29
|
end
|
25
30
|
end
|
data/lib/graphql/types/relay.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
# behavior modules:
|
4
|
-
require "graphql/types/relay/default_relay"
|
5
4
|
require "graphql/types/relay/connection_behaviors"
|
6
5
|
require "graphql/types/relay/edge_behaviors"
|
7
6
|
require "graphql/types/relay/node_behaviors"
|
@@ -14,8 +13,6 @@ require "graphql/types/relay/page_info"
|
|
14
13
|
require "graphql/types/relay/base_connection"
|
15
14
|
require "graphql/types/relay/base_edge"
|
16
15
|
require "graphql/types/relay/node"
|
17
|
-
require "graphql/types/relay/node_field"
|
18
|
-
require "graphql/types/relay/nodes_field"
|
19
16
|
|
20
17
|
module GraphQL
|
21
18
|
module Types
|
data/lib/graphql/types/string.rb
CHANGED
data/lib/graphql/version.rb
CHANGED