graphql 2.0.28 → 2.2.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/templates/base_mutation.erb +2 -0
- data/lib/generators/graphql/install/templates/mutation_type.erb +2 -0
- data/lib/generators/graphql/install_generator.rb +3 -0
- data/lib/generators/graphql/templates/base_argument.erb +2 -0
- data/lib/generators/graphql/templates/base_connection.erb +2 -0
- data/lib/generators/graphql/templates/base_edge.erb +2 -0
- data/lib/generators/graphql/templates/base_enum.erb +2 -0
- data/lib/generators/graphql/templates/base_field.erb +2 -0
- data/lib/generators/graphql/templates/base_input_object.erb +2 -0
- data/lib/generators/graphql/templates/base_interface.erb +2 -0
- data/lib/generators/graphql/templates/base_object.erb +2 -0
- data/lib/generators/graphql/templates/base_resolver.erb +6 -0
- data/lib/generators/graphql/templates/base_scalar.erb +2 -0
- data/lib/generators/graphql/templates/base_union.erb +2 -0
- data/lib/generators/graphql/templates/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 +2 -0
- data/lib/graphql/analysis/ast/analyzer.rb +7 -0
- data/lib/graphql/analysis/ast/field_usage.rb +32 -7
- data/lib/graphql/analysis/ast/query_complexity.rb +80 -128
- data/lib/graphql/analysis/ast/query_depth.rb +7 -2
- data/lib/graphql/analysis/ast/visitor.rb +2 -2
- data/lib/graphql/analysis/ast.rb +21 -11
- data/lib/graphql/backtrace/trace.rb +12 -15
- data/lib/graphql/coercion_error.rb +1 -9
- data/lib/graphql/dataloader/async_dataloader.rb +85 -0
- data/lib/graphql/dataloader/request.rb +5 -0
- data/lib/graphql/dataloader/source.rb +11 -3
- data/lib/graphql/dataloader.rb +109 -142
- data/lib/graphql/duration_encoding_error.rb +16 -0
- data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +170 -0
- data/lib/graphql/execution/interpreter/runtime.rb +79 -248
- data/lib/graphql/execution/interpreter.rb +91 -157
- data/lib/graphql/execution/lookahead.rb +88 -21
- data/lib/graphql/introspection/dynamic_fields.rb +1 -1
- data/lib/graphql/introspection/entry_points.rb +11 -5
- data/lib/graphql/introspection/schema_type.rb +3 -1
- data/lib/graphql/language/block_string.rb +34 -18
- data/lib/graphql/language/definition_slice.rb +1 -1
- data/lib/graphql/language/document_from_schema_definition.rb +37 -37
- data/lib/graphql/language/lexer.rb +271 -177
- data/lib/graphql/language/nodes.rb +75 -57
- data/lib/graphql/language/parser.rb +707 -1986
- data/lib/graphql/language/printer.rb +303 -146
- data/lib/graphql/language/sanitized_printer.rb +20 -22
- data/lib/graphql/language/static_visitor.rb +167 -0
- data/lib/graphql/language/visitor.rb +20 -81
- data/lib/graphql/language.rb +1 -0
- data/lib/graphql/load_application_object_failed_error.rb +5 -1
- data/lib/graphql/pagination/array_connection.rb +3 -3
- data/lib/graphql/pagination/connection.rb +28 -1
- data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -2
- data/lib/graphql/pagination/relation_connection.rb +3 -3
- data/lib/graphql/query/context/scoped_context.rb +101 -0
- data/lib/graphql/query/context.rb +36 -98
- data/lib/graphql/query/null_context.rb +4 -11
- data/lib/graphql/query/validation_pipeline.rb +2 -2
- data/lib/graphql/query/variables.rb +3 -3
- data/lib/graphql/query.rb +13 -22
- data/lib/graphql/railtie.rb +9 -6
- data/lib/graphql/rake_task.rb +3 -12
- data/lib/graphql/schema/argument.rb +6 -1
- data/lib/graphql/schema/base_64_encoder.rb +3 -5
- data/lib/graphql/schema/build_from_definition.rb +0 -11
- data/lib/graphql/schema/directive/one_of.rb +12 -0
- data/lib/graphql/schema/directive/specified_by.rb +14 -0
- data/lib/graphql/schema/directive.rb +1 -1
- data/lib/graphql/schema/enum.rb +3 -3
- data/lib/graphql/schema/field/connection_extension.rb +1 -15
- data/lib/graphql/schema/field/scope_extension.rb +8 -1
- data/lib/graphql/schema/field.rb +39 -35
- data/lib/graphql/schema/has_single_input_argument.rb +156 -0
- data/lib/graphql/schema/input_object.rb +2 -2
- data/lib/graphql/schema/interface.rb +15 -11
- data/lib/graphql/schema/introspection_system.rb +2 -0
- data/lib/graphql/schema/loader.rb +0 -2
- data/lib/graphql/schema/member/base_dsl_methods.rb +2 -1
- data/lib/graphql/schema/member/has_arguments.rb +61 -38
- data/lib/graphql/schema/member/has_fields.rb +8 -5
- data/lib/graphql/schema/member/has_interfaces.rb +23 -9
- data/lib/graphql/schema/member/scoped.rb +19 -0
- data/lib/graphql/schema/member/validates_input.rb +3 -3
- data/lib/graphql/schema/object.rb +8 -0
- data/lib/graphql/schema/printer.rb +8 -7
- data/lib/graphql/schema/relay_classic_mutation.rb +6 -128
- data/lib/graphql/schema/resolver.rb +16 -8
- data/lib/graphql/schema/scalar.rb +3 -3
- data/lib/graphql/schema/subscription.rb +11 -4
- data/lib/graphql/schema/union.rb +1 -1
- data/lib/graphql/schema/unique_within_type.rb +1 -1
- data/lib/graphql/schema/warden.rb +96 -94
- data/lib/graphql/schema.rb +252 -78
- data/lib/graphql/static_validation/all_rules.rb +1 -1
- data/lib/graphql/static_validation/base_visitor.rb +1 -1
- data/lib/graphql/static_validation/literal_validator.rb +2 -3
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +1 -1
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +1 -1
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +2 -2
- data/lib/graphql/static_validation/validation_context.rb +5 -5
- data/lib/graphql/static_validation/validator.rb +3 -0
- data/lib/graphql/static_validation.rb +0 -1
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +3 -2
- data/lib/graphql/subscriptions/event.rb +8 -2
- data/lib/graphql/subscriptions/serialize.rb +2 -0
- data/lib/graphql/subscriptions.rb +14 -12
- data/lib/graphql/testing/helpers.rb +129 -0
- data/lib/graphql/testing.rb +2 -0
- data/lib/graphql/tracing/appoptics_trace.rb +2 -2
- data/lib/graphql/tracing/appoptics_tracing.rb +2 -2
- data/lib/graphql/tracing/legacy_hooks_trace.rb +74 -0
- data/lib/graphql/tracing/platform_tracing.rb +2 -0
- data/lib/graphql/tracing/{prometheus_tracing → prometheus_trace}/graphql_collector.rb +3 -1
- data/lib/graphql/tracing/sentry_trace.rb +112 -0
- data/lib/graphql/tracing/trace.rb +1 -0
- data/lib/graphql/tracing.rb +3 -1
- data/lib/graphql/types/iso_8601_duration.rb +77 -0
- data/lib/graphql/types/relay/connection_behaviors.rb +32 -2
- data/lib/graphql/types/relay/edge_behaviors.rb +7 -0
- data/lib/graphql/types.rb +1 -0
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +6 -5
- data/readme.md +12 -2
- metadata +46 -38
- data/lib/graphql/deprecation.rb +0 -9
- data/lib/graphql/filter.rb +0 -59
- data/lib/graphql/language/parser.y +0 -560
- data/lib/graphql/schema/base_64_bp.rb +0 -26
- data/lib/graphql/static_validation/type_stack.rb +0 -216
- data/lib/graphql/subscriptions/instrumentation.rb +0 -28
|
@@ -70,11 +70,20 @@ module GraphQL
|
|
|
70
70
|
end
|
|
71
71
|
|
|
72
72
|
module InheritedInterfaces
|
|
73
|
-
def interfaces(context = GraphQL::Query::NullContext)
|
|
73
|
+
def interfaces(context = GraphQL::Query::NullContext.instance)
|
|
74
74
|
visible_interfaces = super
|
|
75
|
-
|
|
76
|
-
visible_interfaces.
|
|
77
|
-
|
|
75
|
+
inherited_interfaces = superclass.interfaces(context)
|
|
76
|
+
if visible_interfaces.any?
|
|
77
|
+
if inherited_interfaces.any?
|
|
78
|
+
visible_interfaces.concat(inherited_interfaces)
|
|
79
|
+
visible_interfaces.uniq!
|
|
80
|
+
end
|
|
81
|
+
visible_interfaces
|
|
82
|
+
elsif inherited_interfaces.any?
|
|
83
|
+
inherited_interfaces
|
|
84
|
+
else
|
|
85
|
+
EmptyObjects::EMPTY_ARRAY
|
|
86
|
+
end
|
|
78
87
|
end
|
|
79
88
|
|
|
80
89
|
def interface_type_memberships
|
|
@@ -90,25 +99,30 @@ module GraphQL
|
|
|
90
99
|
end
|
|
91
100
|
|
|
92
101
|
# param context [Query::Context] If omitted, skip filtering.
|
|
93
|
-
def interfaces(context = GraphQL::Query::NullContext)
|
|
102
|
+
def interfaces(context = GraphQL::Query::NullContext.instance)
|
|
94
103
|
warden = Warden.from_context(context)
|
|
95
|
-
visible_interfaces =
|
|
104
|
+
visible_interfaces = nil
|
|
96
105
|
own_interface_type_memberships.each do |type_membership|
|
|
97
106
|
case type_membership
|
|
98
107
|
when Schema::TypeMembership
|
|
99
108
|
if warden.visible_type_membership?(type_membership, context)
|
|
109
|
+
visible_interfaces ||= []
|
|
100
110
|
visible_interfaces << type_membership.abstract_type
|
|
101
111
|
end
|
|
102
112
|
when String, Schema::LateBoundType
|
|
103
113
|
# During initialization, `type_memberships` can hold late-bound types
|
|
114
|
+
visible_interfaces ||= []
|
|
104
115
|
visible_interfaces << type_membership
|
|
105
116
|
else
|
|
106
117
|
raise "Invariant: Unexpected type_membership #{type_membership.class}: #{type_membership.inspect}"
|
|
107
118
|
end
|
|
108
119
|
end
|
|
109
|
-
visible_interfaces
|
|
110
|
-
|
|
111
|
-
|
|
120
|
+
if visible_interfaces
|
|
121
|
+
visible_interfaces.uniq!
|
|
122
|
+
visible_interfaces
|
|
123
|
+
else
|
|
124
|
+
EmptyObjects::EMPTY_ARRAY
|
|
125
|
+
end
|
|
112
126
|
end
|
|
113
127
|
|
|
114
128
|
private
|
|
@@ -15,6 +15,25 @@ module GraphQL
|
|
|
15
15
|
def scope_items(items, context)
|
|
16
16
|
items
|
|
17
17
|
end
|
|
18
|
+
|
|
19
|
+
def reauthorize_scoped_objects(new_value = nil)
|
|
20
|
+
if new_value.nil?
|
|
21
|
+
if @reauthorize_scoped_objects != nil
|
|
22
|
+
@reauthorize_scoped_objects
|
|
23
|
+
else
|
|
24
|
+
find_inherited_value(:reauthorize_scoped_objects, true)
|
|
25
|
+
end
|
|
26
|
+
else
|
|
27
|
+
@reauthorize_scoped_objects = new_value
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def inherited(subclass)
|
|
32
|
+
super
|
|
33
|
+
subclass.class_eval do
|
|
34
|
+
@reauthorize_scoped_objects = nil
|
|
35
|
+
end
|
|
36
|
+
end
|
|
18
37
|
end
|
|
19
38
|
end
|
|
20
39
|
end
|
|
@@ -17,15 +17,15 @@ module GraphQL
|
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def valid_isolated_input?(v)
|
|
20
|
-
valid_input?(v, GraphQL::Query::NullContext)
|
|
20
|
+
valid_input?(v, GraphQL::Query::NullContext.instance)
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
def coerce_isolated_input(v)
|
|
24
|
-
coerce_input(v, GraphQL::Query::NullContext)
|
|
24
|
+
coerce_input(v, GraphQL::Query::NullContext.instance)
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
def coerce_isolated_result(v)
|
|
28
|
-
coerce_result(v, GraphQL::Query::NullContext)
|
|
28
|
+
coerce_result(v, GraphQL::Query::NullContext.instance)
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
31
|
end
|
|
@@ -30,6 +30,10 @@ module GraphQL
|
|
|
30
30
|
# @see authorized_new to make instances
|
|
31
31
|
protected :new
|
|
32
32
|
|
|
33
|
+
def wrap_scoped(object, context)
|
|
34
|
+
scoped_new(object, context)
|
|
35
|
+
end
|
|
36
|
+
|
|
33
37
|
# This is called by the runtime to return an object to call methods on.
|
|
34
38
|
def wrap(object, context)
|
|
35
39
|
authorized_new(object, context)
|
|
@@ -91,6 +95,10 @@ module GraphQL
|
|
|
91
95
|
end
|
|
92
96
|
end
|
|
93
97
|
end
|
|
98
|
+
|
|
99
|
+
def scoped_new(object, context)
|
|
100
|
+
self.new(object, context)
|
|
101
|
+
end
|
|
94
102
|
end
|
|
95
103
|
|
|
96
104
|
def initialize(object, context)
|
|
@@ -36,15 +36,11 @@ module GraphQL
|
|
|
36
36
|
|
|
37
37
|
# @param schema [GraphQL::Schema]
|
|
38
38
|
# @param context [Hash]
|
|
39
|
-
# @param only [<#call(member, ctx)>]
|
|
40
|
-
# @param except [<#call(member, ctx)>]
|
|
41
39
|
# @param introspection [Boolean] Should include the introspection types in the string?
|
|
42
|
-
def initialize(schema, context: nil,
|
|
40
|
+
def initialize(schema, context: nil, introspection: false)
|
|
43
41
|
@document_from_schema = GraphQL::Language::DocumentFromSchemaDefinition.new(
|
|
44
42
|
schema,
|
|
45
43
|
context: context,
|
|
46
|
-
only: only,
|
|
47
|
-
except: except,
|
|
48
44
|
include_introspection_types: introspection,
|
|
49
45
|
)
|
|
50
46
|
|
|
@@ -61,7 +57,12 @@ module GraphQL
|
|
|
61
57
|
false
|
|
62
58
|
end
|
|
63
59
|
end
|
|
64
|
-
schema = Class.new(GraphQL::Schema) {
|
|
60
|
+
schema = Class.new(GraphQL::Schema) {
|
|
61
|
+
query(query_root)
|
|
62
|
+
def self.visible?(member, _ctx)
|
|
63
|
+
member.graphql_name != "Root"
|
|
64
|
+
end
|
|
65
|
+
}
|
|
65
66
|
|
|
66
67
|
introspection_schema_ast = GraphQL::Language::DocumentFromSchemaDefinition.new(
|
|
67
68
|
schema,
|
|
@@ -94,7 +95,7 @@ module GraphQL
|
|
|
94
95
|
|
|
95
96
|
class IntrospectionPrinter < GraphQL::Language::Printer
|
|
96
97
|
def print_schema_definition(schema)
|
|
97
|
-
"schema {\n query: Root\n}"
|
|
98
|
+
print_string("schema {\n query: Root\n}")
|
|
98
99
|
end
|
|
99
100
|
end
|
|
100
101
|
end
|
|
@@ -21,6 +21,10 @@ module GraphQL
|
|
|
21
21
|
# @see {GraphQL::Schema::Mutation} for an example, it's basically the same.
|
|
22
22
|
#
|
|
23
23
|
class RelayClassicMutation < GraphQL::Schema::Mutation
|
|
24
|
+
include GraphQL::Schema::HasSingleInputArgument
|
|
25
|
+
|
|
26
|
+
argument :client_mutation_id, String, "A unique identifier for the client performing the mutation.", required: false
|
|
27
|
+
|
|
24
28
|
# The payload should always include this field
|
|
25
29
|
field(:client_mutation_id, String, "A unique identifier for the client performing the mutation.")
|
|
26
30
|
# Relay classic default:
|
|
@@ -31,34 +35,14 @@ module GraphQL
|
|
|
31
35
|
def resolve_with_support(**inputs)
|
|
32
36
|
input = inputs[:input].to_kwargs
|
|
33
37
|
|
|
34
|
-
new_extras = field ? field.extras : []
|
|
35
|
-
all_extras = self.class.extras + new_extras
|
|
36
|
-
|
|
37
|
-
# Transfer these from the top-level hash to the
|
|
38
|
-
# shortcutted `input:` object
|
|
39
|
-
all_extras.each do |ext|
|
|
40
|
-
# It's possible that the `extra` was not passed along by this point,
|
|
41
|
-
# don't re-add it if it wasn't given here.
|
|
42
|
-
if inputs.key?(ext)
|
|
43
|
-
input[ext] = inputs[ext]
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
38
|
if input
|
|
48
39
|
# This is handled by Relay::Mutation::Resolve, a bit hacky, but here we are.
|
|
49
40
|
input_kwargs = input.to_h
|
|
50
41
|
client_mutation_id = input_kwargs.delete(:client_mutation_id)
|
|
51
|
-
|
|
52
|
-
# Relay Classic Mutations with no `argument`s
|
|
53
|
-
# don't require `input:`
|
|
54
|
-
input_kwargs = {}
|
|
42
|
+
inputs[:input] = input_kwargs
|
|
55
43
|
end
|
|
56
44
|
|
|
57
|
-
return_value =
|
|
58
|
-
super(**input_kwargs)
|
|
59
|
-
else
|
|
60
|
-
super()
|
|
61
|
-
end
|
|
45
|
+
return_value = super(**inputs)
|
|
62
46
|
|
|
63
47
|
context.query.after_lazy(return_value) do |return_hash|
|
|
64
48
|
# It might be an error
|
|
@@ -68,112 +52,6 @@ module GraphQL
|
|
|
68
52
|
return_hash
|
|
69
53
|
end
|
|
70
54
|
end
|
|
71
|
-
|
|
72
|
-
class << self
|
|
73
|
-
def dummy
|
|
74
|
-
@dummy ||= begin
|
|
75
|
-
d = Class.new(GraphQL::Schema::Resolver)
|
|
76
|
-
d.argument_class(self.argument_class)
|
|
77
|
-
# TODO make this lazier?
|
|
78
|
-
d.argument(:input, input_type, description: "Parameters for #{self.graphql_name}")
|
|
79
|
-
d
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
def field_arguments(context = GraphQL::Query::NullContext)
|
|
84
|
-
dummy.arguments(context)
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def get_field_argument(name, context = GraphQL::Query::NullContext)
|
|
88
|
-
dummy.get_argument(name, context)
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
def own_field_arguments
|
|
92
|
-
dummy.own_arguments
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
def all_field_argument_definitions
|
|
96
|
-
dummy.all_argument_definitions
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
# Also apply this argument to the input type:
|
|
100
|
-
def argument(*args, own_argument: false, **kwargs, &block)
|
|
101
|
-
it = input_type # make sure any inherited arguments are already added to it
|
|
102
|
-
arg = super(*args, **kwargs, &block)
|
|
103
|
-
|
|
104
|
-
# This definition might be overriding something inherited;
|
|
105
|
-
# if it is, remove the inherited definition so it's not confused at runtime as having multiple definitions
|
|
106
|
-
prev_args = it.own_arguments[arg.graphql_name]
|
|
107
|
-
case prev_args
|
|
108
|
-
when GraphQL::Schema::Argument
|
|
109
|
-
if prev_args.owner != self
|
|
110
|
-
it.own_arguments.delete(arg.graphql_name)
|
|
111
|
-
end
|
|
112
|
-
when Array
|
|
113
|
-
prev_args.reject! { |a| a.owner != self }
|
|
114
|
-
if prev_args.empty?
|
|
115
|
-
it.own_arguments.delete(arg.graphql_name)
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
it.add_argument(arg)
|
|
120
|
-
arg
|
|
121
|
-
end
|
|
122
|
-
|
|
123
|
-
# The base class for generated input object types
|
|
124
|
-
# @param new_class [Class] The base class to use for generating input object definitions
|
|
125
|
-
# @return [Class] The base class for this mutation's generated input object (default is {GraphQL::Schema::InputObject})
|
|
126
|
-
def input_object_class(new_class = nil)
|
|
127
|
-
if new_class
|
|
128
|
-
@input_object_class = new_class
|
|
129
|
-
end
|
|
130
|
-
@input_object_class || (superclass.respond_to?(:input_object_class) ? superclass.input_object_class : GraphQL::Schema::InputObject)
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
# @param new_input_type [Class, nil] If provided, it configures this mutation to accept `new_input_type` instead of generating an input type
|
|
134
|
-
# @return [Class] The generated {Schema::InputObject} class for this mutation's `input`
|
|
135
|
-
def input_type(new_input_type = nil)
|
|
136
|
-
if new_input_type
|
|
137
|
-
@input_type = new_input_type
|
|
138
|
-
end
|
|
139
|
-
@input_type ||= generate_input_type
|
|
140
|
-
end
|
|
141
|
-
|
|
142
|
-
private
|
|
143
|
-
|
|
144
|
-
# Generate the input type for the `input:` argument
|
|
145
|
-
# To customize how input objects are generated, override this method
|
|
146
|
-
# @return [Class] a subclass of {.input_object_class}
|
|
147
|
-
def generate_input_type
|
|
148
|
-
mutation_args = all_argument_definitions
|
|
149
|
-
mutation_class = self
|
|
150
|
-
Class.new(input_object_class) do
|
|
151
|
-
class << self
|
|
152
|
-
def default_graphql_name
|
|
153
|
-
"#{self.mutation.graphql_name}Input"
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
def description(new_desc = nil)
|
|
157
|
-
super || "Autogenerated input type of #{self.mutation.graphql_name}"
|
|
158
|
-
end
|
|
159
|
-
end
|
|
160
|
-
mutation(mutation_class)
|
|
161
|
-
# these might be inherited:
|
|
162
|
-
mutation_args.each do |arg|
|
|
163
|
-
add_argument(arg)
|
|
164
|
-
end
|
|
165
|
-
argument :client_mutation_id, String, "A unique identifier for the client performing the mutation.", required: false
|
|
166
|
-
end
|
|
167
|
-
end
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
private
|
|
171
|
-
|
|
172
|
-
def authorize_arguments(args, values)
|
|
173
|
-
# remove the `input` wrapper to match values
|
|
174
|
-
input_args = args["input"].type.unwrap.arguments(context)
|
|
175
|
-
super(input_args, values)
|
|
176
|
-
end
|
|
177
55
|
end
|
|
178
56
|
end
|
|
179
57
|
end
|
|
@@ -166,11 +166,15 @@ module GraphQL
|
|
|
166
166
|
args.each_value do |argument|
|
|
167
167
|
arg_keyword = argument.keyword
|
|
168
168
|
if inputs.key?(arg_keyword) && !(arg_value = inputs[arg_keyword]).nil? && (arg_value != argument.default_value)
|
|
169
|
-
|
|
170
|
-
if
|
|
171
|
-
return
|
|
172
|
-
|
|
173
|
-
|
|
169
|
+
auth_result = argument.authorized?(self, arg_value, context)
|
|
170
|
+
if auth_result.is_a?(Array)
|
|
171
|
+
# only return this second value if the application returned a second value
|
|
172
|
+
arg_auth, err = auth_result
|
|
173
|
+
if !arg_auth
|
|
174
|
+
return arg_auth, err
|
|
175
|
+
end
|
|
176
|
+
elsif auth_result == false
|
|
177
|
+
return auth_result
|
|
174
178
|
end
|
|
175
179
|
else
|
|
176
180
|
true
|
|
@@ -205,16 +209,20 @@ module GraphQL
|
|
|
205
209
|
end
|
|
206
210
|
end
|
|
207
211
|
|
|
208
|
-
def get_argument(name, context = GraphQL::Query::NullContext)
|
|
212
|
+
def get_argument(name, context = GraphQL::Query::NullContext.instance)
|
|
209
213
|
self.class.get_argument(name, context)
|
|
210
214
|
end
|
|
211
215
|
|
|
212
216
|
class << self
|
|
213
|
-
def field_arguments(context = GraphQL::Query::NullContext)
|
|
217
|
+
def field_arguments(context = GraphQL::Query::NullContext.instance)
|
|
214
218
|
arguments(context)
|
|
215
219
|
end
|
|
216
220
|
|
|
217
|
-
def
|
|
221
|
+
def any_field_arguments?
|
|
222
|
+
any_arguments?
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
def get_field_argument(name, context = GraphQL::Query::NullContext.instance)
|
|
218
226
|
get_argument(name, context)
|
|
219
227
|
end
|
|
220
228
|
|
|
@@ -19,9 +19,9 @@ module GraphQL
|
|
|
19
19
|
|
|
20
20
|
def specified_by_url(new_url = nil)
|
|
21
21
|
if new_url
|
|
22
|
-
|
|
23
|
-
elsif
|
|
24
|
-
|
|
22
|
+
directive(GraphQL::Schema::Directive::SpecifiedBy, url: new_url)
|
|
23
|
+
elsif (directive = directives.find { |dir| dir.graphql_name == "specifiedBy" })
|
|
24
|
+
directive.arguments[:url] # rubocop:disable Development/ContextIsPassedCop
|
|
25
25
|
elsif superclass.respond_to?(:specified_by_url)
|
|
26
26
|
superclass.specified_by_url
|
|
27
27
|
else
|
|
@@ -28,14 +28,19 @@ module GraphQL
|
|
|
28
28
|
def resolve_with_support(**args)
|
|
29
29
|
result = nil
|
|
30
30
|
unsubscribed = true
|
|
31
|
-
catch :graphql_subscription_unsubscribed do
|
|
31
|
+
unsubscribed_result = catch :graphql_subscription_unsubscribed do
|
|
32
32
|
result = super
|
|
33
33
|
unsubscribed = false
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
|
|
37
37
|
if unsubscribed
|
|
38
|
-
|
|
38
|
+
if unsubscribed_result
|
|
39
|
+
context.namespace(:subscriptions)[:final_update] = true
|
|
40
|
+
unsubscribed_result
|
|
41
|
+
else
|
|
42
|
+
context.skip
|
|
43
|
+
end
|
|
39
44
|
else
|
|
40
45
|
result
|
|
41
46
|
end
|
|
@@ -94,9 +99,11 @@ module GraphQL
|
|
|
94
99
|
end
|
|
95
100
|
|
|
96
101
|
# Call this to halt execution and remove this subscription from the system
|
|
97
|
-
|
|
102
|
+
# @param update_value [Object] if present, deliver this update before unsubscribing
|
|
103
|
+
# @return [void]
|
|
104
|
+
def unsubscribe(update_value = nil)
|
|
98
105
|
context.namespace(:subscriptions)[:unsubscribed] = true
|
|
99
|
-
throw :graphql_subscription_unsubscribed
|
|
106
|
+
throw :graphql_subscription_unsubscribed, update_value
|
|
100
107
|
end
|
|
101
108
|
|
|
102
109
|
READING_SCOPE = ::Object.new
|
data/lib/graphql/schema/union.rb
CHANGED
|
@@ -10,7 +10,7 @@ module GraphQL
|
|
|
10
10
|
super
|
|
11
11
|
end
|
|
12
12
|
|
|
13
|
-
def possible_types(*types, context: GraphQL::Query::NullContext, **options)
|
|
13
|
+
def possible_types(*types, context: GraphQL::Query::NullContext.instance, **options)
|
|
14
14
|
if types.any?
|
|
15
15
|
types.each do |t|
|
|
16
16
|
assert_valid_union_member(t)
|