graphql 1.12.23 → 1.13.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of graphql might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/generators/graphql/core.rb +3 -1
- data/lib/generators/graphql/install_generator.rb +9 -2
- data/lib/generators/graphql/mutation_generator.rb +1 -1
- data/lib/generators/graphql/type_generator.rb +0 -1
- data/lib/graphql/analysis/ast/field_usage.rb +2 -2
- data/lib/graphql/analysis/ast/query_complexity.rb +10 -14
- data/lib/graphql/analysis/ast/visitor.rb +4 -4
- data/lib/graphql/backtrace/table.rb +1 -1
- data/lib/graphql/base_type.rb +4 -2
- data/lib/graphql/boolean_type.rb +1 -1
- data/lib/graphql/dataloader.rb +55 -22
- data/lib/graphql/directive/deprecated_directive.rb +1 -1
- data/lib/graphql/directive/include_directive.rb +1 -1
- data/lib/graphql/directive/skip_directive.rb +1 -1
- data/lib/graphql/directive.rb +0 -4
- data/lib/graphql/enum_type.rb +5 -1
- data/lib/graphql/execution/errors.rb +1 -0
- data/lib/graphql/execution/interpreter/arguments.rb +1 -1
- data/lib/graphql/execution/interpreter/arguments_cache.rb +2 -2
- data/lib/graphql/execution/interpreter/runtime.rb +31 -19
- data/lib/graphql/execution/lookahead.rb +2 -2
- data/lib/graphql/execution/multiplex.rb +4 -1
- data/lib/graphql/float_type.rb +1 -1
- data/lib/graphql/id_type.rb +1 -1
- data/lib/graphql/int_type.rb +1 -1
- data/lib/graphql/introspection/directive_type.rb +1 -1
- data/lib/graphql/introspection/entry_points.rb +2 -2
- data/lib/graphql/introspection/enum_value_type.rb +2 -2
- data/lib/graphql/introspection/field_type.rb +2 -2
- data/lib/graphql/introspection/input_value_type.rb +4 -4
- data/lib/graphql/introspection/schema_type.rb +2 -2
- data/lib/graphql/introspection/type_type.rb +10 -10
- data/lib/graphql/language/block_string.rb +2 -6
- data/lib/graphql/language/document_from_schema_definition.rb +10 -4
- data/lib/graphql/language/lexer.rb +0 -3
- data/lib/graphql/language/lexer.rl +0 -4
- data/lib/graphql/language/nodes.rb +3 -2
- data/lib/graphql/language/parser.rb +442 -434
- data/lib/graphql/language/parser.y +5 -4
- data/lib/graphql/language/printer.rb +6 -1
- data/lib/graphql/language/sanitized_printer.rb +5 -5
- data/lib/graphql/language/token.rb +0 -4
- data/lib/graphql/name_validator.rb +0 -4
- data/lib/graphql/pagination/active_record_relation_connection.rb +43 -6
- data/lib/graphql/pagination/relation_connection.rb +55 -28
- data/lib/graphql/query/arguments.rb +1 -1
- data/lib/graphql/query/arguments_cache.rb +1 -1
- data/lib/graphql/query/context.rb +15 -2
- data/lib/graphql/query/literal_input.rb +1 -1
- data/lib/graphql/query/null_context.rb +12 -7
- data/lib/graphql/query/serial_execution/field_resolution.rb +1 -1
- data/lib/graphql/query/variables.rb +5 -1
- data/lib/graphql/relay/edges_instrumentation.rb +0 -1
- data/lib/graphql/relay/global_id_resolve.rb +1 -1
- data/lib/graphql/relay/page_info.rb +1 -1
- data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
- data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
- data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
- data/lib/graphql/rubocop.rb +4 -0
- data/lib/graphql/schema/addition.rb +37 -28
- data/lib/graphql/schema/argument.rb +13 -15
- data/lib/graphql/schema/build_from_definition.rb +5 -5
- data/lib/graphql/schema/directive/feature.rb +1 -1
- data/lib/graphql/schema/directive/flagged.rb +2 -2
- data/lib/graphql/schema/directive/include.rb +1 -1
- data/lib/graphql/schema/directive/skip.rb +1 -1
- data/lib/graphql/schema/directive/transform.rb +1 -1
- data/lib/graphql/schema/directive.rb +7 -3
- data/lib/graphql/schema/enum.rb +60 -10
- data/lib/graphql/schema/enum_value.rb +6 -0
- data/lib/graphql/schema/field/connection_extension.rb +1 -1
- data/lib/graphql/schema/field.rb +229 -77
- data/lib/graphql/schema/field_extension.rb +89 -2
- data/lib/graphql/schema/find_inherited_value.rb +1 -0
- data/lib/graphql/schema/finder.rb +5 -5
- data/lib/graphql/schema/input_object.rb +23 -5
- data/lib/graphql/schema/interface.rb +11 -20
- data/lib/graphql/schema/introspection_system.rb +1 -1
- data/lib/graphql/schema/list.rb +3 -1
- data/lib/graphql/schema/member/accepts_definition.rb +15 -3
- data/lib/graphql/schema/member/build_type.rb +0 -4
- data/lib/graphql/schema/member/cached_graphql_definition.rb +29 -2
- data/lib/graphql/schema/member/has_arguments.rb +55 -13
- data/lib/graphql/schema/member/has_deprecation_reason.rb +1 -1
- data/lib/graphql/schema/member/has_fields.rb +76 -18
- data/lib/graphql/schema/member/has_interfaces.rb +90 -0
- data/lib/graphql/schema/member.rb +1 -0
- data/lib/graphql/schema/non_null.rb +7 -1
- data/lib/graphql/schema/object.rb +10 -75
- data/lib/graphql/schema/printer.rb +1 -1
- data/lib/graphql/schema/relay_classic_mutation.rb +37 -3
- data/lib/graphql/schema/resolver/has_payload_type.rb +27 -2
- data/lib/graphql/schema/resolver.rb +37 -17
- data/lib/graphql/schema/scalar.rb +2 -0
- data/lib/graphql/schema/subscription.rb +11 -1
- data/lib/graphql/schema/traversal.rb +1 -1
- data/lib/graphql/schema/type_expression.rb +1 -1
- data/lib/graphql/schema/type_membership.rb +18 -4
- data/lib/graphql/schema/union.rb +8 -1
- data/lib/graphql/schema/validator/format_validator.rb +0 -4
- data/lib/graphql/schema/validator/numericality_validator.rb +1 -0
- data/lib/graphql/schema/validator/required_validator.rb +29 -15
- data/lib/graphql/schema/validator.rb +4 -7
- data/lib/graphql/schema/warden.rb +116 -52
- data/lib/graphql/schema.rb +111 -23
- data/lib/graphql/static_validation/all_rules.rb +1 -0
- data/lib/graphql/static_validation/base_visitor.rb +5 -5
- data/lib/graphql/static_validation/definition_dependencies.rb +0 -1
- data/lib/graphql/static_validation/literal_validator.rb +1 -1
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +1 -1
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +1 -1
- data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
- data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +2 -2
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +4 -4
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +13 -7
- data/lib/graphql/string_type.rb +1 -1
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +8 -4
- data/lib/graphql/subscriptions/event.rb +20 -12
- data/lib/graphql/subscriptions/serialize.rb +22 -2
- data/lib/graphql/subscriptions.rb +17 -19
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +6 -20
- data/lib/graphql/tracing/notifications_tracing.rb +59 -0
- data/lib/graphql/types/relay/connection_behaviors.rb +26 -9
- data/lib/graphql/types/relay/default_relay.rb +5 -1
- data/lib/graphql/types/relay/edge_behaviors.rb +13 -2
- data/lib/graphql/types/relay/has_node_field.rb +1 -1
- data/lib/graphql/types/relay/has_nodes_field.rb +1 -1
- data/lib/graphql/types/relay/node_field.rb +14 -3
- data/lib/graphql/types/relay/nodes_field.rb +13 -3
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +10 -32
- metadata +13 -5
@@ -24,7 +24,13 @@ module GraphQL
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def get_type(name)
|
27
|
-
@types[name]
|
27
|
+
local_type = @types[name]
|
28
|
+
# This isn't really sophisticated, but
|
29
|
+
# I think it's good enough to support the current usage of LateBoundTypes
|
30
|
+
if local_type.is_a?(Array)
|
31
|
+
local_type = local_type.first
|
32
|
+
end
|
33
|
+
local_type || @schema.get_type(name)
|
28
34
|
end
|
29
35
|
|
30
36
|
# Lookup using `own_types` here because it's ok to override
|
@@ -77,13 +83,13 @@ module GraphQL
|
|
77
83
|
|
78
84
|
def update_type_owner(owner, type)
|
79
85
|
case owner
|
80
|
-
when
|
86
|
+
when Module
|
81
87
|
if owner.kind.union?
|
82
88
|
# It's a union with possible_types
|
83
89
|
# Replace the item by class name
|
84
90
|
owner.assign_type_membership_object_type(type)
|
85
91
|
@possible_types[owner.graphql_name] = owner.possible_types
|
86
|
-
elsif type.kind.interface? && owner.kind.object?
|
92
|
+
elsif type.kind.interface? && (owner.kind.object? || owner.kind.interface?)
|
87
93
|
new_interfaces = []
|
88
94
|
owner.interfaces.each do |int_t|
|
89
95
|
if int_t.is_a?(String) && int_t == type.graphql_name
|
@@ -98,12 +104,11 @@ module GraphQL
|
|
98
104
|
owner.implements(*new_interfaces)
|
99
105
|
new_interfaces.each do |int|
|
100
106
|
pt = @possible_types[int.graphql_name] ||= []
|
101
|
-
if !pt.include?(owner)
|
107
|
+
if !pt.include?(owner) && owner.is_a?(Class)
|
102
108
|
pt << owner
|
103
109
|
end
|
104
110
|
end
|
105
111
|
end
|
106
|
-
|
107
112
|
when nil
|
108
113
|
# It's a root type
|
109
114
|
@types[type.graphql_name] = type
|
@@ -148,42 +153,42 @@ module GraphQL
|
|
148
153
|
um << owner
|
149
154
|
end
|
150
155
|
|
151
|
-
if (prev_type = get_local_type(type.graphql_name))
|
152
|
-
|
153
|
-
raise DuplicateTypeNamesError.new(
|
154
|
-
type_name: type.graphql_name,
|
155
|
-
first_definition: prev_type,
|
156
|
-
second_definition: type,
|
157
|
-
path: path,
|
158
|
-
)
|
159
|
-
else
|
160
|
-
# This type was already added
|
161
|
-
end
|
156
|
+
if (prev_type = get_local_type(type.graphql_name)) && prev_type == type
|
157
|
+
# No need to re-visit
|
162
158
|
elsif type.is_a?(Class) && type < GraphQL::Schema::Directive
|
163
159
|
@directives << type
|
164
|
-
type.
|
160
|
+
type.all_argument_definitions.each do |arg|
|
165
161
|
arg_type = arg.type.unwrap
|
166
162
|
references_to(arg_type, from: arg)
|
167
|
-
add_type(arg_type, owner: arg, late_types: late_types, path: path + [
|
163
|
+
add_type(arg_type, owner: arg, late_types: late_types, path: path + [arg.graphql_name])
|
168
164
|
if arg.default_value?
|
169
165
|
@arguments_with_default_values << arg
|
170
166
|
end
|
171
167
|
end
|
172
168
|
else
|
173
|
-
@types[type.graphql_name]
|
169
|
+
prev_type = @types[type.graphql_name]
|
170
|
+
if prev_type.nil?
|
171
|
+
@types[type.graphql_name] = type
|
172
|
+
elsif prev_type.is_a?(Array)
|
173
|
+
prev_type << type
|
174
|
+
else
|
175
|
+
@types[type.graphql_name] = [prev_type, type]
|
176
|
+
end
|
177
|
+
|
174
178
|
add_directives_from(type)
|
175
179
|
if type.kind.fields?
|
176
|
-
type.
|
180
|
+
type.all_field_definitions.each do |field|
|
181
|
+
name = field.graphql_name
|
177
182
|
field_type = field.type.unwrap
|
178
183
|
references_to(field_type, from: field)
|
179
184
|
field_path = path + [name]
|
180
185
|
add_type(field_type, owner: field, late_types: late_types, path: field_path)
|
181
186
|
add_directives_from(field)
|
182
|
-
field.
|
187
|
+
field.all_argument_definitions.each do |arg|
|
183
188
|
add_directives_from(arg)
|
184
189
|
arg_type = arg.type.unwrap
|
185
190
|
references_to(arg_type, from: arg)
|
186
|
-
add_type(arg_type, owner: arg, late_types: late_types, path: field_path + [
|
191
|
+
add_type(arg_type, owner: arg, late_types: late_types, path: field_path + [arg.graphql_name])
|
187
192
|
if arg.default_value?
|
188
193
|
@arguments_with_default_values << arg
|
189
194
|
end
|
@@ -191,19 +196,19 @@ module GraphQL
|
|
191
196
|
end
|
192
197
|
end
|
193
198
|
if type.kind.input_object?
|
194
|
-
type.
|
199
|
+
type.all_argument_definitions.each do |arg|
|
195
200
|
add_directives_from(arg)
|
196
201
|
arg_type = arg.type.unwrap
|
197
202
|
references_to(arg_type, from: arg)
|
198
|
-
add_type(arg_type, owner: arg, late_types: late_types, path: path + [
|
203
|
+
add_type(arg_type, owner: arg, late_types: late_types, path: path + [arg.graphql_name])
|
199
204
|
if arg.default_value?
|
200
205
|
@arguments_with_default_values << arg
|
201
206
|
end
|
202
207
|
end
|
203
208
|
end
|
204
209
|
if type.kind.union?
|
205
|
-
@possible_types[type.graphql_name] = type.
|
206
|
-
type.
|
210
|
+
@possible_types[type.graphql_name] = type.all_possible_types
|
211
|
+
type.all_possible_types.each do |t|
|
207
212
|
add_type(t, owner: type, late_types: late_types, path: path + ["possible_types"])
|
208
213
|
end
|
209
214
|
end
|
@@ -213,13 +218,17 @@ module GraphQL
|
|
213
218
|
end
|
214
219
|
end
|
215
220
|
if type.kind.object?
|
216
|
-
@possible_types[type.graphql_name]
|
221
|
+
possible_types_for_this_name = @possible_types[type.graphql_name] ||= []
|
222
|
+
possible_types_for_this_name << type
|
223
|
+
end
|
224
|
+
|
225
|
+
if type.kind.object? || type.kind.interface?
|
217
226
|
type.interface_type_memberships.each do |interface_type_membership|
|
218
227
|
case interface_type_membership
|
219
228
|
when Schema::TypeMembership
|
220
229
|
interface_type = interface_type_membership.abstract_type
|
221
230
|
# We can get these now; we'll have to get late-bound types later
|
222
|
-
if interface_type.is_a?(Module)
|
231
|
+
if interface_type.is_a?(Module) && type.is_a?(Class)
|
223
232
|
implementers = @possible_types[interface_type.graphql_name] ||= []
|
224
233
|
implementers << type
|
225
234
|
end
|
@@ -2,10 +2,6 @@
|
|
2
2
|
module GraphQL
|
3
3
|
class Schema
|
4
4
|
class Argument
|
5
|
-
if !String.method_defined?(:-@)
|
6
|
-
using GraphQL::StringDedupBackport
|
7
|
-
end
|
8
|
-
|
9
5
|
include GraphQL::Schema::Member::CachedGraphQLDefinition
|
10
6
|
include GraphQL::Schema::Member::AcceptsDefinition
|
11
7
|
include GraphQL::Schema::Member::HasPath
|
@@ -41,7 +37,7 @@ module GraphQL
|
|
41
37
|
# @param arg_name [Symbol]
|
42
38
|
# @param type_expr
|
43
39
|
# @param desc [String]
|
44
|
-
# @param required [Boolean] if true, this argument is non-null; if false, this argument is nullable
|
40
|
+
# @param required [Boolean, :nullable] if true, this argument is non-null; if false, this argument is nullable. If `:nullable`, then the argument must be provided, though it may be `null`.
|
45
41
|
# @param description [String]
|
46
42
|
# @param default_value [Object]
|
47
43
|
# @param as [Symbol] Override the keyword name when passed to a method
|
@@ -52,12 +48,12 @@ module GraphQL
|
|
52
48
|
# @param directives [Hash{Class => Hash}]
|
53
49
|
# @param deprecation_reason [String]
|
54
50
|
# @param validates [Hash, nil] Options for building validators, if any should be applied
|
55
|
-
def initialize(arg_name = nil, type_expr = nil, desc = nil, required
|
51
|
+
def initialize(arg_name = nil, type_expr = nil, desc = nil, required: true, type: nil, name: nil, loads: nil, description: nil, ast_node: nil, default_value: NO_DEFAULT, as: nil, from_resolver: false, camelize: true, prepare: nil, method_access: true, owner:, validates: nil, directives: nil, deprecation_reason: nil, &definition_block)
|
56
52
|
arg_name ||= name
|
57
53
|
@name = -(camelize ? Member::BuildType.camelize(arg_name.to_s) : arg_name.to_s)
|
58
54
|
@type_expr = type_expr || type
|
59
55
|
@description = desc || description
|
60
|
-
@null =
|
56
|
+
@null = required != true
|
61
57
|
@default_value = default_value
|
62
58
|
@owner = owner
|
63
59
|
@as = as
|
@@ -76,6 +72,9 @@ module GraphQL
|
|
76
72
|
end
|
77
73
|
|
78
74
|
self.validates(validates)
|
75
|
+
if required == :nullable
|
76
|
+
self.owner.validates(required: { argument: arg_name })
|
77
|
+
end
|
79
78
|
|
80
79
|
if definition_block
|
81
80
|
if definition_block.arity == 1
|
@@ -86,6 +85,10 @@ module GraphQL
|
|
86
85
|
end
|
87
86
|
end
|
88
87
|
|
88
|
+
def inspect
|
89
|
+
"#<#{self.class} #{path}: #{type.to_type_signature}#{description ? " @description=#{description.inspect}" : ""}>"
|
90
|
+
end
|
91
|
+
|
89
92
|
# @return [Object] the value used when the client doesn't provide a value for this argument
|
90
93
|
attr_reader :default_value
|
91
94
|
|
@@ -147,20 +150,15 @@ module GraphQL
|
|
147
150
|
end
|
148
151
|
end
|
149
152
|
elsif as_type.kind.input_object?
|
150
|
-
as_type.
|
151
|
-
input_obj_arg = input_obj_arg.type_class
|
152
|
-
# TODO: this skips input objects whose values were alread replaced with application objects.
|
153
|
-
# See: https://github.com/rmosolgo/graphql-ruby/issues/2633
|
154
|
-
if value.is_a?(InputObject) && value.key?(input_obj_arg.keyword) && !input_obj_arg.authorized?(obj, value[input_obj_arg.keyword], ctx)
|
155
|
-
return false
|
156
|
-
end
|
157
|
-
end
|
153
|
+
return as_type.authorized?(obj, value, ctx)
|
158
154
|
end
|
159
155
|
# None of the early-return conditions were activated,
|
160
156
|
# so this is authorized.
|
161
157
|
true
|
162
158
|
end
|
163
159
|
|
160
|
+
prepend Schema::Member::CachedGraphQLDefinition::DeprecatedToGraphQL
|
161
|
+
|
164
162
|
def to_graphql
|
165
163
|
argument = GraphQL::Argument.new
|
166
164
|
argument.name = @name
|
@@ -3,12 +3,7 @@ require "graphql/schema/build_from_definition/resolve_map"
|
|
3
3
|
|
4
4
|
module GraphQL
|
5
5
|
class Schema
|
6
|
-
# TODO Populate `.directive(...)` from here
|
7
6
|
module BuildFromDefinition
|
8
|
-
if !String.method_defined?(:-@)
|
9
|
-
using GraphQL::StringDedupBackport
|
10
|
-
end
|
11
|
-
|
12
7
|
class << self
|
13
8
|
# @see {Schema.from_definition}
|
14
9
|
def from_definition(definition_string, parser: GraphQL.default_parser, **kwargs)
|
@@ -394,6 +389,11 @@ module GraphQL
|
|
394
389
|
include GraphQL::Schema::Interface
|
395
390
|
graphql_name(interface_type_definition.name)
|
396
391
|
description(interface_type_definition.description)
|
392
|
+
interface_type_definition.interfaces.each do |interface_name|
|
393
|
+
"Implements: #{interface_type_definition} -> #{interface_name}"
|
394
|
+
interface_defn = type_resolver.call(interface_name)
|
395
|
+
implements(interface_defn)
|
396
|
+
end
|
397
397
|
ast_node(interface_type_definition)
|
398
398
|
builder.build_directives(self, interface_type_definition, type_resolver)
|
399
399
|
|
@@ -35,7 +35,7 @@ module GraphQL
|
|
35
35
|
GraphQL::Schema::Directive::INPUT_FIELD_DEFINITION,
|
36
36
|
)
|
37
37
|
|
38
|
-
argument :by, [String], "Flags to check for this schema member"
|
38
|
+
argument :by, [String], "Flags to check for this schema member"
|
39
39
|
|
40
40
|
module VisibleByFlag
|
41
41
|
def self.included(schema_class)
|
@@ -44,7 +44,7 @@ module GraphQL
|
|
44
44
|
|
45
45
|
def visible?(context)
|
46
46
|
if dir = self.directives.find { |d| d.is_a?(Flagged) }
|
47
|
-
relevant_flags = (f = context[:flags]) && dir.arguments[:by] & f
|
47
|
+
relevant_flags = (f = context[:flags]) && dir.arguments[:by] & f # rubocop:disable Development/ContextIsPassedCop -- definition-related
|
48
48
|
relevant_flags && relevant_flags.any? && super
|
49
49
|
else
|
50
50
|
super
|
@@ -8,6 +8,8 @@ module GraphQL
|
|
8
8
|
# - {.resolve}: Wraps field resolution (so it should call `yield` to continue)
|
9
9
|
class Directive < GraphQL::Schema::Member
|
10
10
|
extend GraphQL::Schema::Member::HasArguments
|
11
|
+
extend GraphQL::Schema::Member::AcceptsDefinition
|
12
|
+
|
11
13
|
class << self
|
12
14
|
# Directives aren't types, they don't have kinds.
|
13
15
|
undef_method :kind
|
@@ -53,6 +55,8 @@ module GraphQL
|
|
53
55
|
default_directive
|
54
56
|
end
|
55
57
|
|
58
|
+
prepend Schema::Member::CachedGraphQLDefinition::DeprecatedToGraphQL
|
59
|
+
|
56
60
|
def to_graphql
|
57
61
|
defn = GraphQL::Directive.new
|
58
62
|
defn.name = self.graphql_name
|
@@ -61,9 +65,9 @@ module GraphQL
|
|
61
65
|
defn.default_directive = self.default_directive
|
62
66
|
defn.ast_node = ast_node
|
63
67
|
defn.metadata[:type_class] = self
|
64
|
-
|
65
|
-
arg_graphql = arg_defn.to_graphql
|
66
|
-
defn.arguments[arg_graphql.name] = arg_graphql
|
68
|
+
all_argument_definitions.each do |arg_defn|
|
69
|
+
arg_graphql = arg_defn.to_graphql(silence_deprecation_warning: true)
|
70
|
+
defn.arguments[arg_graphql.name] = arg_graphql # rubocop:disable Development/ContextIsPassedCop -- legacy-related
|
67
71
|
end
|
68
72
|
# Make a reference to a classic-style Arguments class
|
69
73
|
defn.arguments_class = GraphQL::Query::Arguments.construct_arguments_class(defn)
|
data/lib/graphql/schema/enum.rb
CHANGED
@@ -46,20 +46,70 @@ module GraphQL
|
|
46
46
|
def value(*args, **kwargs, &block)
|
47
47
|
kwargs[:owner] = self
|
48
48
|
value = enum_value_class.new(*args, **kwargs, &block)
|
49
|
-
|
50
|
-
|
49
|
+
key = value.graphql_name
|
50
|
+
prev_value = own_values[key]
|
51
|
+
case prev_value
|
52
|
+
when nil
|
53
|
+
own_values[key] = value
|
54
|
+
when GraphQL::Schema::EnumValue
|
55
|
+
own_values[key] = [prev_value, value]
|
56
|
+
when Array
|
57
|
+
prev_value << value
|
58
|
+
else
|
59
|
+
raise "Invariant: Unexpected enum value for #{key.inspect}: #{prev_value.inspect}"
|
51
60
|
end
|
52
|
-
|
53
|
-
nil
|
61
|
+
value
|
54
62
|
end
|
55
63
|
|
56
|
-
# @return [
|
57
|
-
def
|
58
|
-
inherited_values = superclass
|
59
|
-
|
60
|
-
|
64
|
+
# @return [Array<GraphQL::Schema::EnumValue>] Possible values of this enum
|
65
|
+
def enum_values(context = GraphQL::Query::NullContext)
|
66
|
+
inherited_values = superclass.respond_to?(:enum_values) ? superclass.enum_values(context) : nil
|
67
|
+
visible_values = []
|
68
|
+
warden = Warden.from_context(context)
|
69
|
+
own_values.each do |key, values_entry|
|
70
|
+
if (v = Warden.visible_entry?(:visible_enum_value?, values_entry, context, warden))
|
71
|
+
visible_values << v
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
if inherited_values
|
76
|
+
# Local values take precedence over inherited ones
|
77
|
+
inherited_values.each do |i_val|
|
78
|
+
if !visible_values.any? { |v| v.graphql_name == i_val.graphql_name }
|
79
|
+
visible_values << i_val
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
visible_values
|
61
85
|
end
|
62
86
|
|
87
|
+
# @return [Array<Schema::EnumValue>] An unfiltered list of all definitions
|
88
|
+
def all_enum_value_definitions
|
89
|
+
all_defns = if superclass.respond_to?(:all_enum_value_definitions)
|
90
|
+
superclass.all_enum_value_definitions
|
91
|
+
else
|
92
|
+
[]
|
93
|
+
end
|
94
|
+
|
95
|
+
@own_values && @own_values.each do |_key, value|
|
96
|
+
if value.is_a?(Array)
|
97
|
+
all_defns.concat(value)
|
98
|
+
else
|
99
|
+
all_defns << value
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
all_defns
|
104
|
+
end
|
105
|
+
|
106
|
+
# @return [Hash<String => GraphQL::Schema::EnumValue>] Possible values of this enum, keyed by name.
|
107
|
+
def values(context = GraphQL::Query::NullContext)
|
108
|
+
enum_values(context).each_with_object({}) { |val, obj| obj[val.graphql_name] = val }
|
109
|
+
end
|
110
|
+
|
111
|
+
prepend Schema::Member::CachedGraphQLDefinition::DeprecatedToGraphQL
|
112
|
+
|
63
113
|
# @return [GraphQL::EnumType]
|
64
114
|
def to_graphql
|
65
115
|
enum_type = GraphQL::EnumType.new
|
@@ -68,7 +118,7 @@ module GraphQL
|
|
68
118
|
enum_type.introspection = introspection
|
69
119
|
enum_type.ast_node = ast_node
|
70
120
|
values.each do |name, val|
|
71
|
-
enum_type.add_value(val.
|
121
|
+
enum_type.add_value(val.deprecated_to_graphql)
|
72
122
|
end
|
73
123
|
enum_type.metadata[:type_class] = self
|
74
124
|
enum_type
|
@@ -73,6 +73,8 @@ module GraphQL
|
|
73
73
|
@value
|
74
74
|
end
|
75
75
|
|
76
|
+
prepend Schema::Member::CachedGraphQLDefinition::DeprecatedToGraphQL
|
77
|
+
|
76
78
|
# @return [GraphQL::EnumType::EnumValue] A runtime-ready object derived from this object
|
77
79
|
def to_graphql
|
78
80
|
enum_value = GraphQL::EnumType::EnumValue.new
|
@@ -85,6 +87,10 @@ module GraphQL
|
|
85
87
|
enum_value
|
86
88
|
end
|
87
89
|
|
90
|
+
def inspect
|
91
|
+
"#<#{self.class} #{path} @value=#{@value.inspect}#{description ? " @description=#{description.inspect}" : ""}>"
|
92
|
+
end
|
93
|
+
|
88
94
|
def visible?(_ctx); true; end
|
89
95
|
def accessible?(_ctx); true; end
|
90
96
|
def authorized?(_ctx); true; end
|
@@ -42,7 +42,7 @@ module GraphQL
|
|
42
42
|
value.after_value ||= original_arguments[:after]
|
43
43
|
value.last_value ||= original_arguments[:last]
|
44
44
|
value.before_value ||= original_arguments[:before]
|
45
|
-
value.arguments ||= original_arguments
|
45
|
+
value.arguments ||= original_arguments # rubocop:disable Development/ContextIsPassedCop -- unrelated .arguments method
|
46
46
|
value.field ||= field
|
47
47
|
if field.has_max_page_size? && !value.has_max_page_size_override?
|
48
48
|
value.max_page_size = field.max_page_size
|