graphql 1.8.0.pre4 → 1.8.0.pre5
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/graphql/base_type.rb +10 -27
- data/lib/graphql/compatibility/query_parser_specification.rb +7 -0
- data/lib/graphql/field.rb +3 -3
- data/lib/graphql/internal_representation/node.rb +32 -13
- data/lib/graphql/internal_representation/visit.rb +3 -6
- data/lib/graphql/language.rb +1 -0
- data/lib/graphql/language/block_string.rb +47 -0
- data/lib/graphql/language/lexer.rb +129 -68
- data/lib/graphql/language/lexer.rl +13 -4
- data/lib/graphql/language/nodes.rb +6 -3
- data/lib/graphql/language/printer.rb +1 -1
- data/lib/graphql/language/token.rb +1 -1
- data/lib/graphql/query.rb +1 -1
- data/lib/graphql/relay.rb +1 -0
- data/lib/graphql/relay/connection_type.rb +5 -3
- data/lib/graphql/relay/edge_type.rb +2 -1
- data/lib/graphql/relay/type_extensions.rb +30 -0
- data/lib/graphql/schema.rb +25 -0
- data/lib/graphql/schema/build_from_definition.rb +2 -0
- data/lib/graphql/schema/field.rb +3 -0
- data/lib/graphql/schema/finder.rb +153 -0
- data/lib/graphql/schema/member.rb +3 -1
- data/lib/graphql/schema/printer.rb +1 -1
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +15 -8
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +11 -1
- data/lib/graphql/tracing/data_dog_tracing.rb +13 -9
- data/lib/graphql/upgrader/member.rb +19 -8
- data/lib/graphql/version.rb +1 -1
- data/spec/graphql/backtrace_spec.rb +10 -0
- data/spec/graphql/directive_spec.rb +3 -1
- data/spec/graphql/language/block_string_spec.rb +70 -0
- data/spec/graphql/language/lexer_spec.rb +9 -0
- data/spec/graphql/query_spec.rb +1 -1
- data/spec/graphql/schema/field_spec.rb +8 -0
- data/spec/graphql/schema/finder_spec.rb +135 -0
- data/spec/graphql/schema/printer_spec.rb +48 -5
- data/spec/graphql/schema_spec.rb +7 -0
- data/spec/graphql/upgrader/member_spec.rb +25 -0
- metadata +23 -2
@@ -102,7 +102,17 @@ module GraphQL
|
|
102
102
|
def follow_spreads(node, parent_variables, spreads_for_context, fragment_definitions, visited_fragments)
|
103
103
|
spreads = spreads_for_context[node] - visited_fragments
|
104
104
|
spreads.each do |spread_name|
|
105
|
-
def_node
|
105
|
+
def_node = nil
|
106
|
+
variables = nil
|
107
|
+
# Implement `.find` by hand to avoid Ruby's internal allocations
|
108
|
+
fragment_definitions.each do |frag_def_node, vars|
|
109
|
+
if frag_def_node.name == spread_name
|
110
|
+
def_node = frag_def_node
|
111
|
+
variables = vars
|
112
|
+
break
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
106
116
|
next if !def_node
|
107
117
|
visited_fragments << spread_name
|
108
118
|
variables.each do |name, child_usage|
|
@@ -15,17 +15,12 @@ module GraphQL
|
|
15
15
|
}
|
16
16
|
|
17
17
|
def platform_trace(platform_key, key, data)
|
18
|
-
|
18
|
+
tracer.trace(platform_key, service: service_name) do |span|
|
19
|
+
span.span_type = 'custom'
|
19
20
|
|
20
|
-
pin = Datadog::Pin.get_from(self)
|
21
|
-
unless pin
|
22
|
-
pin = Datadog::Pin.new(service)
|
23
|
-
pin.onto(self)
|
24
|
-
end
|
25
|
-
|
26
|
-
pin.tracer.trace(platform_key, service: pin.service) do |span|
|
27
21
|
if key == 'execute_multiplex'
|
28
|
-
|
22
|
+
operations = data[:multiplex].queries.map(&:selected_operation_name).join(', ')
|
23
|
+
span.resource = operations unless operations.empty?
|
29
24
|
end
|
30
25
|
|
31
26
|
if key == 'execute_query'
|
@@ -33,10 +28,19 @@ module GraphQL
|
|
33
28
|
span.set_tag(:selected_operation_type, data[:query].selected_operation.operation_type)
|
34
29
|
span.set_tag(:query_string, data[:query].query_string)
|
35
30
|
end
|
31
|
+
|
36
32
|
yield
|
37
33
|
end
|
38
34
|
end
|
39
35
|
|
36
|
+
def service_name
|
37
|
+
options.fetch(:service, 'ruby-graphql')
|
38
|
+
end
|
39
|
+
|
40
|
+
def tracer
|
41
|
+
options.fetch(:tracer, Datadog.tracer)
|
42
|
+
end
|
43
|
+
|
40
44
|
def platform_field_key(type, field)
|
41
45
|
"#{type.name}.#{field.name}"
|
42
46
|
end
|
@@ -52,6 +52,13 @@ module GraphQL
|
|
52
52
|
type_expr
|
53
53
|
end
|
54
54
|
end
|
55
|
+
|
56
|
+
def underscorize(str)
|
57
|
+
str
|
58
|
+
.gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2') # URLDecoder -> URL_Decoder
|
59
|
+
.gsub(/([a-z\d])([A-Z])/,'\1_\2') # someThing -> some_Thing
|
60
|
+
.downcase
|
61
|
+
end
|
55
62
|
end
|
56
63
|
|
57
64
|
# Turns `{X} = GraphQL::{Y}Type.define do` into `class {X} < Types::Base{Y}`.
|
@@ -187,20 +194,13 @@ module GraphQL
|
|
187
194
|
# (They'll be automatically camelized later.)
|
188
195
|
class UnderscoreizeFieldNameTransform < Transform
|
189
196
|
def apply(input_text)
|
190
|
-
input_text.
|
197
|
+
input_text.gsub /(?<field_type>input_field|field|connection|argument) :(?<name>[a-zA-Z_0-9_]*)/ do
|
191
198
|
field_type = $~[:field_type]
|
192
199
|
camelized_name = $~[:name]
|
193
200
|
underscored_name = underscorize(camelized_name)
|
194
201
|
"#{field_type} :#{underscored_name}"
|
195
202
|
end
|
196
203
|
end
|
197
|
-
|
198
|
-
def underscorize(str)
|
199
|
-
str
|
200
|
-
.gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2') # URLDecoder -> URL_Decoder
|
201
|
-
.gsub(/([a-z\d])([A-Z])/,'\1_\2') # someThing -> some_Thing
|
202
|
-
.downcase
|
203
|
-
end
|
204
204
|
end
|
205
205
|
|
206
206
|
class ResolveProcToMethodTransform < Transform
|
@@ -215,6 +215,8 @@ module GraphQL
|
|
215
215
|
# - Args is trickier:
|
216
216
|
# - If it's not used, remove it
|
217
217
|
# - If it's used, abandon ship and make it `**args`
|
218
|
+
# - Convert string args access to symbol access, since it's a Ruby **splat
|
219
|
+
# - Convert camelized arg names to underscored arg names
|
218
220
|
# - (It would be nice to correctly become Ruby kwargs, but that might be too hard)
|
219
221
|
# - Add a `# TODO` comment to the method source?
|
220
222
|
# - Rebuild the method:
|
@@ -260,6 +262,15 @@ module GraphQL
|
|
260
262
|
lines.unshift("\n#{method_def_indent}#{method_def}")
|
261
263
|
lines << "#{method_def_indent}end\n"
|
262
264
|
method_body = lines.join("\n")
|
265
|
+
# Update Argument access to be underscore and symbols
|
266
|
+
# Update `args[...]` and `args.key?`
|
267
|
+
method_body = method_body.gsub(/#{args_arg_name}(?<method_begin>\.key\?\(?|\[)["':](?<arg_name>[a-zA-Z0-9_]+)["']?(?<method_end>\]|\))?/) do
|
268
|
+
method_begin = $~[:method_begin]
|
269
|
+
arg_name = underscorize($~[:arg_name])
|
270
|
+
method_end = $~[:method_end]
|
271
|
+
"#{args_arg_name}#{method_begin}:#{arg_name}#{method_end}"
|
272
|
+
end
|
273
|
+
|
263
274
|
# Replace the resolve proc with the method
|
264
275
|
input_text[processor.resolve_start..processor.resolve_end] = ""
|
265
276
|
# The replacement above might have left some preceeding whitespace,
|
data/lib/graphql/version.rb
CHANGED
@@ -126,6 +126,16 @@ describe GraphQL::Backtrace do
|
|
126
126
|
assert_includes err.message, "more lines"
|
127
127
|
end
|
128
128
|
|
129
|
+
it "annotates errors from Query#result" do
|
130
|
+
query_str = "query StrField { field2 { strField } __typename }"
|
131
|
+
context = { backtrace: true }
|
132
|
+
query = GraphQL::Query.new(schema, query_str, context: context)
|
133
|
+
err = assert_raises(GraphQL::Backtrace::TracedError) {
|
134
|
+
query.result
|
135
|
+
}
|
136
|
+
assert_instance_of RuntimeError, err.cause
|
137
|
+
end
|
138
|
+
|
129
139
|
it "annotates errors inside lazy resolution" do
|
130
140
|
# Test context-based flag
|
131
141
|
err = assert_raises(GraphQL::Backtrace::TracedError) {
|
@@ -0,0 +1,70 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
describe GraphQL::Language::BlockString do
|
5
|
+
describe "trimming whitespace" do
|
6
|
+
def trim_whitespace(str)
|
7
|
+
GraphQL::Language::BlockString.trim_whitespace(str)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "matches the examples in graphql-js" do
|
11
|
+
# these are taken from:
|
12
|
+
# https://github.com/graphql/graphql-js/blob/36ec0e9d34666362ff0e2b2b18edeb98e3c9abee/src/language/__tests__/blockStringValue-test.js#L12
|
13
|
+
# A set of [before, after] pairs:
|
14
|
+
examples = [
|
15
|
+
[
|
16
|
+
# Removes common whitespace:
|
17
|
+
"
|
18
|
+
Hello,
|
19
|
+
World!
|
20
|
+
|
21
|
+
Yours,
|
22
|
+
GraphQL.
|
23
|
+
",
|
24
|
+
"Hello,\n World!\n\nYours,\n GraphQL."
|
25
|
+
],
|
26
|
+
[
|
27
|
+
# Removes leading and trailing newlines:
|
28
|
+
"
|
29
|
+
|
30
|
+
Hello,
|
31
|
+
World!
|
32
|
+
|
33
|
+
Yours,
|
34
|
+
GraphQL.
|
35
|
+
|
36
|
+
",
|
37
|
+
"Hello,\n World!\n\nYours,\n GraphQL."
|
38
|
+
],
|
39
|
+
[
|
40
|
+
# Removes blank lines (with whitespace _and_ newlines:)
|
41
|
+
"\n \n
|
42
|
+
Hello,
|
43
|
+
World!
|
44
|
+
|
45
|
+
Yours,
|
46
|
+
GraphQL.
|
47
|
+
|
48
|
+
\n \n",
|
49
|
+
"Hello,\n World!\n\nYours,\n GraphQL."
|
50
|
+
],
|
51
|
+
[
|
52
|
+
# Retains indentation from the first line
|
53
|
+
" Hello,\n World!\n\n Yours,\n GraphQL.",
|
54
|
+
" Hello,\n World!\n\nYours,\n GraphQL.",
|
55
|
+
],
|
56
|
+
[
|
57
|
+
# Doesn't alter trailing spaces
|
58
|
+
"\n \n Hello, \n World! \n\n Yours, \n GraphQL. ",
|
59
|
+
"Hello, \n World! \n\nYours, \n GraphQL. ",
|
60
|
+
|
61
|
+
],
|
62
|
+
]
|
63
|
+
|
64
|
+
examples.each_with_index do |(before, after), idx|
|
65
|
+
transformed_str = trim_whitespace(before)
|
66
|
+
assert_equal(after, transformed_str, "Example ##{idx + 1}")
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -26,6 +26,15 @@ describe GraphQL::Language::Lexer do
|
|
26
26
|
assert_equal tokens[0], tokens[1].prev_token
|
27
27
|
end
|
28
28
|
|
29
|
+
describe "block strings" do
|
30
|
+
let(:query_string) { %|{ a(b: """\nc\n d\n""")}|}
|
31
|
+
|
32
|
+
it "tokenizes them" do
|
33
|
+
str_token = tokens[5]
|
34
|
+
assert_equal "c\n d", str_token.value
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
29
38
|
it "unescapes escaped characters" do
|
30
39
|
assert_equal "\" \\ / \b \f \n \r \t", subject.tokenize('"\\" \\\\ \\/ \\b \\f \\n \\r \\t"').first.to_s
|
31
40
|
end
|
data/spec/graphql/query_spec.rb
CHANGED
@@ -85,7 +85,7 @@ describe GraphQL::Query do
|
|
85
85
|
operation_name: operation_name,
|
86
86
|
max_depth: max_depth,
|
87
87
|
)
|
88
|
-
query.query_string = '{ __type(name: "Cheese") { name } }'
|
88
|
+
query.query_string = '{ __type(name: """Cheese""") { name } }'
|
89
89
|
assert_equal "Cheese", query.result["data"] ["__type"]["name"]
|
90
90
|
end
|
91
91
|
end
|
@@ -15,6 +15,14 @@ describe GraphQL::Schema::Field do
|
|
15
15
|
assert_equal 'inspectInput', field.graphql_definition.name
|
16
16
|
end
|
17
17
|
|
18
|
+
it "exposes the method override" do
|
19
|
+
assert_nil field.method
|
20
|
+
object = Class.new(Jazz::BaseObject) do
|
21
|
+
field :t, String, method: :tt, null: true
|
22
|
+
end
|
23
|
+
assert_equal :tt, object.fields["t"].method
|
24
|
+
end
|
25
|
+
|
18
26
|
it "accepts a block for definition" do
|
19
27
|
object = Class.new(Jazz::BaseObject) do
|
20
28
|
graphql_name "JustAName"
|
@@ -0,0 +1,135 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
describe GraphQL::Schema::Finder do
|
5
|
+
let(:finder) { GraphQL::Schema::Finder.new(Jazz::Schema) }
|
6
|
+
|
7
|
+
describe "#find" do
|
8
|
+
it "finds a valid object type" do
|
9
|
+
type = finder.find("Ensemble")
|
10
|
+
assert_equal "Ensemble", type.name
|
11
|
+
end
|
12
|
+
|
13
|
+
it "raises when finding an invalid object type" do
|
14
|
+
exception = assert_raises GraphQL::Schema::Finder::MemberNotFoundError do
|
15
|
+
finder.find("DoesNotExist")
|
16
|
+
end
|
17
|
+
|
18
|
+
assert_match /Could not find type `DoesNotExist` in schema./, exception.message
|
19
|
+
end
|
20
|
+
|
21
|
+
it "finds a valid directive" do
|
22
|
+
directive = finder.find("@include")
|
23
|
+
assert_equal "include", directive.name
|
24
|
+
end
|
25
|
+
|
26
|
+
it "raises when finding an invalid directive" do
|
27
|
+
exception = assert_raises GraphQL::Schema::Finder::MemberNotFoundError do
|
28
|
+
finder.find("@yolo")
|
29
|
+
end
|
30
|
+
|
31
|
+
assert_match /Could not find directive `@yolo` in schema./, exception.message
|
32
|
+
end
|
33
|
+
|
34
|
+
it "finds a valid field" do
|
35
|
+
field = finder.find("Ensemble.musicians")
|
36
|
+
assert_equal "musicians", field.name
|
37
|
+
end
|
38
|
+
|
39
|
+
it "finds a meta field" do
|
40
|
+
field = finder.find("Ensemble.__typename")
|
41
|
+
assert_equal "__typename", field.name
|
42
|
+
end
|
43
|
+
|
44
|
+
it "raises when finding an in valid field" do
|
45
|
+
exception = assert_raises GraphQL::Schema::Finder::MemberNotFoundError do
|
46
|
+
finder.find("Ensemble.nope")
|
47
|
+
end
|
48
|
+
|
49
|
+
assert_match /Could not find field `nope` on object type `Ensemble`./, exception.message
|
50
|
+
end
|
51
|
+
|
52
|
+
it "finds a valid argument" do
|
53
|
+
arg = finder.find("Query.find.id")
|
54
|
+
assert_equal "id", arg.name
|
55
|
+
end
|
56
|
+
|
57
|
+
it "raises when finding an invalid argument" do
|
58
|
+
exception = assert_raises GraphQL::Schema::Finder::MemberNotFoundError do
|
59
|
+
finder.find("Query.find.thisArgumentIsInvalid")
|
60
|
+
end
|
61
|
+
|
62
|
+
assert_match /Could not find argument `thisArgumentIsInvalid` on field `find`./, exception.message
|
63
|
+
end
|
64
|
+
|
65
|
+
it "raises when selecting on an argument" do
|
66
|
+
exception = assert_raises GraphQL::Schema::Finder::MemberNotFoundError do
|
67
|
+
finder.find("Query.find.id.whyYouDoThis")
|
68
|
+
end
|
69
|
+
|
70
|
+
assert_match /Cannot select member `whyYouDoThis` on a field./, exception.message
|
71
|
+
end
|
72
|
+
|
73
|
+
it "finds a valid interface" do
|
74
|
+
type = finder.find("NamedEntity")
|
75
|
+
assert_equal "NamedEntity", type.name
|
76
|
+
end
|
77
|
+
|
78
|
+
it "finds a valid input type" do
|
79
|
+
type = finder.find("LegacyInput")
|
80
|
+
assert_equal "LegacyInput", type.name
|
81
|
+
end
|
82
|
+
|
83
|
+
it "finds a valid input field" do
|
84
|
+
input_field = finder.find("LegacyInput.intValue")
|
85
|
+
assert_equal "intValue", input_field.name
|
86
|
+
end
|
87
|
+
|
88
|
+
it "raises when finding an invalid input field" do
|
89
|
+
exception = assert_raises GraphQL::Schema::Finder::MemberNotFoundError do
|
90
|
+
finder.find("LegacyInput.wat")
|
91
|
+
end
|
92
|
+
|
93
|
+
assert_match /Could not find input field `wat` on input object type `LegacyInput`./, exception.message
|
94
|
+
end
|
95
|
+
|
96
|
+
it "finds a valid union type" do
|
97
|
+
type = finder.find("PerformingAct")
|
98
|
+
assert_equal "PerformingAct", type.name
|
99
|
+
end
|
100
|
+
|
101
|
+
it "raises when selecting a possible type" do
|
102
|
+
exception = assert_raises GraphQL::Schema::Finder::MemberNotFoundError do
|
103
|
+
finder.find("PerformingAct.Musician")
|
104
|
+
end
|
105
|
+
|
106
|
+
assert_match /Cannot select union possible type `Musician`. Select the type directly instead./, exception.message
|
107
|
+
end
|
108
|
+
|
109
|
+
it "finds a valid enum type" do
|
110
|
+
type = finder.find("Family")
|
111
|
+
assert_equal "Family", type.name
|
112
|
+
end
|
113
|
+
|
114
|
+
it "finds a valid enum value" do
|
115
|
+
value = finder.find("Family.BRASS")
|
116
|
+
assert_equal "BRASS", value.name
|
117
|
+
end
|
118
|
+
|
119
|
+
it "raises when finding an invalid enum value" do
|
120
|
+
exception = assert_raises GraphQL::Schema::Finder::MemberNotFoundError do
|
121
|
+
finder.find("Family.THISISNOTASTATUS")
|
122
|
+
end
|
123
|
+
|
124
|
+
assert_match /Could not find enum value `THISISNOTASTATUS` on enum type `Family`./, exception.message
|
125
|
+
end
|
126
|
+
|
127
|
+
it "raises when selecting on an enum value" do
|
128
|
+
exception = assert_raises GraphQL::Schema::Finder::MemberNotFoundError do
|
129
|
+
finder.find("Family.BRASS.wat")
|
130
|
+
end
|
131
|
+
|
132
|
+
assert_match /Cannot select member `wat` on an enum value./, exception.message
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
@@ -14,7 +14,11 @@ describe GraphQL::Schema::Printer do
|
|
14
14
|
|
15
15
|
value "FOO", value: :foo
|
16
16
|
value "BAR", value: :bar
|
17
|
-
value "BAZ", deprecation_reason:
|
17
|
+
value "BAZ", deprecation_reason: <<-REASON
|
18
|
+
Use "BAR" instead.
|
19
|
+
|
20
|
+
It's the replacement for this value.
|
21
|
+
REASON
|
18
22
|
value "WOZ", deprecation_reason: GraphQL::Directive::DEFAULT_DEPRECATION_REASON
|
19
23
|
end
|
20
24
|
|
@@ -352,7 +356,6 @@ SCHEMA
|
|
352
356
|
custom_mutation = schema.mutation.redefine(name: "MyMutationRoot")
|
353
357
|
custom_schema = schema.redefine(mutation: custom_mutation)
|
354
358
|
|
355
|
-
|
356
359
|
expected = <<SCHEMA
|
357
360
|
schema {
|
358
361
|
query: Query
|
@@ -389,7 +392,7 @@ type Audio {
|
|
389
392
|
|
390
393
|
enum Choice {
|
391
394
|
BAR
|
392
|
-
BAZ @deprecated(reason: "Use "BAR"
|
395
|
+
BAZ @deprecated(reason: "Use \\\"BAR\\\" instead.\\n\\nIt's the replacement for this value.\\n")
|
393
396
|
FOO
|
394
397
|
WOZ @deprecated
|
395
398
|
}
|
@@ -438,7 +441,7 @@ interface Node {
|
|
438
441
|
type Post {
|
439
442
|
body: String!
|
440
443
|
comments: [Comment!]
|
441
|
-
comments_count: Int! @deprecated(reason: "Use "comments".")
|
444
|
+
comments_count: Int! @deprecated(reason: "Use \\\"comments\\\".")
|
442
445
|
id: ID!
|
443
446
|
title: String!
|
444
447
|
}
|
@@ -600,7 +603,7 @@ SCHEMA
|
|
600
603
|
type Post {
|
601
604
|
body: String!
|
602
605
|
comments: [Comment!]
|
603
|
-
comments_count: Int! @deprecated(reason: "Use "comments".")
|
606
|
+
comments_count: Int! @deprecated(reason: "Use \\\"comments\\\".")
|
604
607
|
id: ID!
|
605
608
|
title: String!
|
606
609
|
}
|
@@ -608,4 +611,44 @@ SCHEMA
|
|
608
611
|
assert_equal expected.chomp, GraphQL::Schema::Printer.new(schema).print_type(schema.types['Post'])
|
609
612
|
end
|
610
613
|
end
|
614
|
+
|
615
|
+
describe "#print_directive" do
|
616
|
+
it "prints the deprecation reason in a single line escaped string including line breaks" do
|
617
|
+
expected = <<SCHEMA
|
618
|
+
enum Choice {
|
619
|
+
BAR
|
620
|
+
BAZ @deprecated(reason: "Use \\\"BAR\\\" instead.\\n\\nIt's the replacement for this value.\\n")
|
621
|
+
FOO
|
622
|
+
WOZ @deprecated
|
623
|
+
}
|
624
|
+
|
625
|
+
type Subscription {
|
626
|
+
}
|
627
|
+
|
628
|
+
input Varied {
|
629
|
+
bool: Boolean
|
630
|
+
enum: Choice = FOO
|
631
|
+
float: Float
|
632
|
+
int: Int
|
633
|
+
}
|
634
|
+
SCHEMA
|
635
|
+
|
636
|
+
only_filter = ->(member, ctx) {
|
637
|
+
case member
|
638
|
+
when GraphQL::ScalarType
|
639
|
+
true
|
640
|
+
when GraphQL::BaseType
|
641
|
+
ctx[:names].include?(member.name)
|
642
|
+
when GraphQL::Argument
|
643
|
+
member.name != "id"
|
644
|
+
else
|
645
|
+
true
|
646
|
+
end
|
647
|
+
}
|
648
|
+
|
649
|
+
context = { names: ["Varied", "Choice", "Subscription"] }
|
650
|
+
|
651
|
+
assert_equal expected.chomp, GraphQL::Schema::Printer.new(schema, context: context, only: only_filter).print_schema
|
652
|
+
end
|
653
|
+
end
|
611
654
|
end
|