graphql 1.7.14 → 1.8.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (149) hide show
  1. checksums.yaml +5 -5
  2. data/lib/generators/graphql/function_generator.rb +1 -1
  3. data/lib/generators/graphql/loader_generator.rb +1 -1
  4. data/lib/generators/graphql/mutation_generator.rb +1 -6
  5. data/lib/generators/graphql/templates/function.erb +2 -2
  6. data/lib/generators/graphql/templates/loader.erb +2 -2
  7. data/lib/graphql.rb +2 -0
  8. data/lib/graphql/argument.rb +0 -1
  9. data/lib/graphql/backwards_compatibility.rb +2 -3
  10. data/lib/graphql/base_type.rb +18 -16
  11. data/lib/graphql/compatibility/query_parser_specification.rb +0 -117
  12. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -14
  13. data/lib/graphql/define/assign_object_field.rb +5 -12
  14. data/lib/graphql/deprecated_dsl.rb +28 -0
  15. data/lib/graphql/directive.rb +0 -1
  16. data/lib/graphql/enum_type.rb +1 -3
  17. data/lib/graphql/execution.rb +0 -1
  18. data/lib/graphql/execution/multiplex.rb +29 -12
  19. data/lib/graphql/field.rb +5 -20
  20. data/lib/graphql/function.rb +12 -0
  21. data/lib/graphql/input_object_type.rb +1 -3
  22. data/lib/graphql/internal_representation/node.rb +14 -26
  23. data/lib/graphql/internal_representation/visit.rb +6 -3
  24. data/lib/graphql/introspection/arguments_field.rb +0 -1
  25. data/lib/graphql/introspection/enum_values_field.rb +0 -1
  26. data/lib/graphql/introspection/fields_field.rb +0 -1
  27. data/lib/graphql/introspection/input_fields_field.rb +0 -1
  28. data/lib/graphql/introspection/interfaces_field.rb +0 -1
  29. data/lib/graphql/introspection/of_type_field.rb +0 -1
  30. data/lib/graphql/introspection/possible_types_field.rb +0 -1
  31. data/lib/graphql/introspection/schema_field.rb +0 -1
  32. data/lib/graphql/introspection/type_by_name_field.rb +0 -1
  33. data/lib/graphql/introspection/typename_field.rb +0 -1
  34. data/lib/graphql/language.rb +0 -3
  35. data/lib/graphql/language/generation.rb +182 -3
  36. data/lib/graphql/language/lexer.rb +69 -144
  37. data/lib/graphql/language/lexer.rl +4 -15
  38. data/lib/graphql/language/nodes.rb +76 -136
  39. data/lib/graphql/language/parser.rb +621 -668
  40. data/lib/graphql/language/parser.y +11 -17
  41. data/lib/graphql/language/token.rb +3 -10
  42. data/lib/graphql/object_type.rb +6 -1
  43. data/lib/graphql/query.rb +13 -8
  44. data/lib/graphql/query/arguments.rb +33 -48
  45. data/lib/graphql/query/context.rb +1 -0
  46. data/lib/graphql/query/literal_input.rb +1 -4
  47. data/lib/graphql/relay/connection_resolve.rb +3 -0
  48. data/lib/graphql/relay/global_id_resolve.rb +5 -1
  49. data/lib/graphql/relay/relation_connection.rb +19 -14
  50. data/lib/graphql/schema.rb +219 -12
  51. data/lib/graphql/schema/argument.rb +33 -0
  52. data/lib/graphql/schema/build_from_definition.rb +18 -64
  53. data/lib/graphql/schema/enum.rb +76 -0
  54. data/lib/graphql/schema/field.rb +127 -0
  55. data/lib/graphql/schema/field/dynamic_resolve.rb +63 -0
  56. data/lib/graphql/schema/field/unwrapped_resolve.rb +20 -0
  57. data/lib/graphql/schema/input_object.rb +61 -0
  58. data/lib/graphql/schema/interface.rb +32 -0
  59. data/lib/graphql/schema/loader.rb +2 -2
  60. data/lib/graphql/schema/member.rb +97 -0
  61. data/lib/graphql/schema/member/build_type.rb +106 -0
  62. data/lib/graphql/schema/member/has_fields.rb +56 -0
  63. data/lib/graphql/schema/member/instrumentation.rb +113 -0
  64. data/lib/graphql/schema/member/list_type_proxy.rb +21 -0
  65. data/lib/graphql/schema/member/non_null_type_proxy.rb +21 -0
  66. data/lib/graphql/schema/object.rb +65 -0
  67. data/lib/graphql/schema/printer.rb +266 -33
  68. data/lib/graphql/schema/scalar.rb +25 -0
  69. data/lib/graphql/schema/traversal.rb +26 -17
  70. data/lib/graphql/schema/union.rb +48 -0
  71. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +1 -5
  72. data/lib/graphql/static_validation/rules/fields_will_merge.rb +8 -15
  73. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +1 -11
  74. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +5 -7
  75. data/lib/graphql/tracing.rb +0 -1
  76. data/lib/graphql/tracing/platform_tracing.rb +7 -20
  77. data/lib/graphql/tracing/scout_tracing.rb +2 -2
  78. data/lib/graphql/unresolved_type_error.rb +2 -3
  79. data/lib/graphql/version.rb +1 -1
  80. data/readme.md +1 -1
  81. data/spec/dummy/app/channels/graphql_channel.rb +1 -22
  82. data/spec/dummy/log/development.log +0 -239
  83. data/spec/dummy/log/test.log +0 -204
  84. data/spec/dummy/test/system/action_cable_subscription_test.rb +0 -4
  85. data/spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png +0 -0
  86. data/spec/generators/graphql/function_generator_spec.rb +0 -26
  87. data/spec/generators/graphql/loader_generator_spec.rb +0 -24
  88. data/spec/graphql/analysis/max_query_complexity_spec.rb +3 -3
  89. data/spec/graphql/analysis/max_query_depth_spec.rb +3 -3
  90. data/spec/graphql/backtrace_spec.rb +0 -10
  91. data/spec/graphql/base_type_spec.rb +5 -19
  92. data/spec/graphql/boolean_type_spec.rb +3 -3
  93. data/spec/graphql/directive_spec.rb +1 -3
  94. data/spec/graphql/enum_type_spec.rb +5 -18
  95. data/spec/graphql/execution/execute_spec.rb +1 -1
  96. data/spec/graphql/execution/multiplex_spec.rb +2 -2
  97. data/spec/graphql/float_type_spec.rb +2 -2
  98. data/spec/graphql/id_type_spec.rb +1 -1
  99. data/spec/graphql/input_object_type_spec.rb +2 -15
  100. data/spec/graphql/int_type_spec.rb +2 -2
  101. data/spec/graphql/internal_representation/rewrite_spec.rb +2 -2
  102. data/spec/graphql/introspection/schema_type_spec.rb +0 -1
  103. data/spec/graphql/language/generation_spec.rb +186 -21
  104. data/spec/graphql/language/lexer_spec.rb +1 -21
  105. data/spec/graphql/language/nodes_spec.rb +12 -21
  106. data/spec/graphql/language/parser_spec.rb +1 -1
  107. data/spec/graphql/query/arguments_spec.rb +15 -37
  108. data/spec/graphql/query/serial_execution/value_resolution_spec.rb +2 -2
  109. data/spec/graphql/query/variables_spec.rb +1 -1
  110. data/spec/graphql/query_spec.rb +5 -31
  111. data/spec/graphql/rake_task_spec.rb +1 -3
  112. data/spec/graphql/relay/base_connection_spec.rb +1 -1
  113. data/spec/graphql/relay/connection_instrumentation_spec.rb +2 -2
  114. data/spec/graphql/relay/connection_resolve_spec.rb +1 -1
  115. data/spec/graphql/relay/connection_type_spec.rb +1 -1
  116. data/spec/graphql/relay/mutation_spec.rb +3 -3
  117. data/spec/graphql/relay/relation_connection_spec.rb +1 -65
  118. data/spec/graphql/schema/build_from_definition_spec.rb +4 -86
  119. data/spec/graphql/schema/enum_spec.rb +60 -0
  120. data/spec/graphql/schema/field_spec.rb +14 -0
  121. data/spec/graphql/schema/input_object_spec.rb +43 -0
  122. data/spec/graphql/schema/interface_spec.rb +98 -0
  123. data/spec/graphql/schema/object_spec.rb +119 -0
  124. data/spec/graphql/schema/printer_spec.rb +15 -92
  125. data/spec/graphql/schema/scalar_spec.rb +40 -0
  126. data/spec/graphql/schema/union_spec.rb +35 -0
  127. data/spec/graphql/schema/validation_spec.rb +1 -1
  128. data/spec/graphql/schema/warden_spec.rb +11 -11
  129. data/spec/graphql/schema_spec.rb +25 -23
  130. data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +2 -10
  131. data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +2 -2
  132. data/spec/graphql/string_type_spec.rb +3 -3
  133. data/spec/graphql/subscriptions_spec.rb +1 -1
  134. data/spec/graphql/tracing/platform_tracing_spec.rb +1 -60
  135. data/spec/support/dummy/schema.rb +25 -39
  136. data/spec/support/jazz.rb +334 -0
  137. data/spec/support/lazy_helpers.rb +21 -23
  138. data/spec/support/star_wars/data.rb +7 -6
  139. data/spec/support/star_wars/schema.rb +109 -142
  140. metadata +39 -33
  141. data/lib/graphql/execution/instrumentation.rb +0 -82
  142. data/lib/graphql/language/block_string.rb +0 -47
  143. data/lib/graphql/language/document_from_schema_definition.rb +0 -277
  144. data/lib/graphql/language/printer.rb +0 -351
  145. data/lib/graphql/tracing/data_dog_tracing.rb +0 -49
  146. data/spec/graphql/execution/instrumentation_spec.rb +0 -165
  147. data/spec/graphql/language/block_string_spec.rb +0 -70
  148. data/spec/graphql/language/document_from_schema_definition_spec.rb +0 -770
  149. data/spec/graphql/language/printer_spec.rb +0 -203
@@ -1,70 +0,0 @@
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
@@ -1,770 +0,0 @@
1
- # frozen_string_literal: true
2
- require "spec_helper"
3
-
4
- describe GraphQL::Language::DocumentFromSchemaDefinition do
5
- let(:subject) { GraphQL::Language::DocumentFromSchemaDefinition }
6
-
7
- describe "#document" do
8
- let(:schema_idl) { <<-GRAPHQL
9
- type QueryType {
10
- foo: Foo
11
- }
12
-
13
- type Foo implements Bar {
14
- one: Type
15
- two(argument: InputType!): Site
16
- three(argument: InputType, other: String): CustomScalar
17
- four(argument: String = "string"): String
18
- five(argument: [String] = ["string", "string"]): String
19
- six(argument: String): Type
20
- }
21
-
22
- interface Bar {
23
- one: Type
24
- four(argument: String = "string"): String
25
- }
26
-
27
- type Type {
28
- a: String
29
- }
30
-
31
- input InputType {
32
- key: String!
33
- answer: Int = 42
34
- }
35
-
36
- type MutationType {
37
- a(input: InputType): String
38
- }
39
-
40
- # Scalar description
41
- scalar CustomScalar
42
-
43
- enum Site {
44
- DESKTOP
45
- MOBILE
46
- }
47
-
48
- union Union = Type | QueryType
49
-
50
- schema {
51
- query: QueryType
52
- mutation: MutationType
53
- }
54
- GRAPHQL
55
- }
56
-
57
- let(:schema) { GraphQL::Schema.from_definition(schema_idl) }
58
-
59
- let(:expected_document) { GraphQL.parse(expected_idl) }
60
-
61
- describe "when printing and schema respects root name conventions" do
62
- let(:schema_idl) { <<-GRAPHQL
63
- type Query {
64
- foo: Foo
65
- }
66
-
67
- type Foo implements Bar {
68
- one: Type
69
- two(argument: InputType!): Site
70
- three(argument: InputType, other: String): CustomScalar
71
- four(argument: String = "string"): String
72
- five(argument: [String] = ["string", "string"]): String
73
- six(argument: String): Type
74
- }
75
-
76
- interface Bar {
77
- one: Type
78
- four(argument: String = "string"): String
79
- }
80
-
81
- type Type {
82
- a: String
83
- }
84
-
85
- input InputType {
86
- key: String!
87
- answer: Int = 42
88
- }
89
-
90
- type Mutation {
91
- a(input: InputType): String
92
- }
93
-
94
- # Scalar description
95
- scalar CustomScalar
96
-
97
- enum Site {
98
- DESKTOP
99
- MOBILE
100
- }
101
-
102
- union Union = Type | Query
103
-
104
- schema {
105
- query: Query
106
- mutation: Mutation
107
- }
108
- GRAPHQL
109
- }
110
-
111
- let(:expected_idl) { <<-GRAPHQL
112
- type QueryType {
113
- foo: Foo
114
- }
115
-
116
- type Foo implements Bar {
117
- one: Type
118
- two(argument: InputType!): Site
119
- three(argument: InputType, other: String): CustomScalar
120
- four(argument: String = "string"): String
121
- five(argument: [String] = ["string", "string"]): String
122
- six(argument: String): Type
123
- }
124
-
125
- interface Bar {
126
- one: Type
127
- four(argument: String = "string"): String
128
- }
129
-
130
- type Type {
131
- a: String
132
- }
133
-
134
- input InputType {
135
- key: String!
136
- answer: Int = 42
137
- }
138
-
139
- type MutationType {
140
- a(input: InputType): String
141
- }
142
-
143
- # Scalar description
144
- scalar CustomScalar
145
-
146
- enum Site {
147
- DESKTOP
148
- MOBILE
149
- }
150
-
151
- union Union = Type | QueryType
152
- GRAPHQL
153
- }
154
-
155
- let(:document) {
156
- subject.new(
157
- schema
158
- ).document
159
- }
160
-
161
- it "returns the IDL without introspection, built ins and schema root" do
162
- assert equivalent_node?(expected_document, document)
163
- end
164
- end
165
-
166
- describe "with defaults" do
167
- let(:expected_idl) { <<-GRAPHQL
168
- type QueryType {
169
- foo: Foo
170
- }
171
-
172
- type Foo implements Bar {
173
- one: Type
174
- two(argument: InputType!): Site
175
- three(argument: InputType, other: String): CustomScalar
176
- four(argument: String = "string"): String
177
- five(argument: [String] = ["string", "string"]): String
178
- six(argument: String): Type
179
- }
180
-
181
- interface Bar {
182
- one: Type
183
- four(argument: String = "string"): String
184
- }
185
-
186
- type Type {
187
- a: String
188
- }
189
-
190
- input InputType {
191
- key: String!
192
- answer: Int = 42
193
- }
194
-
195
- type MutationType {
196
- a(input: InputType): String
197
- }
198
-
199
- # Scalar description
200
- scalar CustomScalar
201
-
202
- enum Site {
203
- DESKTOP
204
- MOBILE
205
- }
206
-
207
- union Union = Type | QueryType
208
-
209
- schema {
210
- query: QueryType
211
- mutation: MutationType
212
- }
213
- GRAPHQL
214
- }
215
-
216
- let(:document) {
217
- subject.new(
218
- schema
219
- ).document
220
- }
221
-
222
- it "returns the IDL without introspection, built ins and schema if it doesnt respect name conventions" do
223
- assert equivalent_node?(expected_document, document)
224
- end
225
- end
226
-
227
- describe "with an except filter" do
228
- let(:expected_idl) { <<-GRAPHQL
229
- type QueryType {
230
- foo: Foo
231
- }
232
-
233
- type Foo implements Bar {
234
- three(argument: InputType, other: String): CustomScalar
235
- four(argument: String = "string"): String
236
- five(argument: [String] = ["string", "string"]): Site
237
- }
238
-
239
- interface Bar {
240
- one: Type
241
- four(argument: String = "string"): String
242
- }
243
-
244
- input InputType {
245
- key: String!
246
- answer: Int = 42
247
- }
248
-
249
- type MutationType {
250
- a(input: InputType): String
251
- }
252
-
253
- # Scalar description
254
- scalar CustomScalar
255
-
256
- enum Site {
257
- DESKTOP
258
- MOBILE
259
- }
260
-
261
- schema {
262
- query: QueryType
263
- mutation: MutationType
264
- }
265
- GRAPHQL
266
- }
267
-
268
- let(:document) {
269
- subject.new(
270
- schema,
271
- except: ->(m, _ctx) { m.is_a?(GraphQL::BaseType) && m.name == "Type" }
272
- ).document
273
- }
274
-
275
- it "returns the IDL minus the filtered members" do
276
- assert equivalent_node?(expected_document, document)
277
- end
278
- end
279
-
280
- describe "with an only filter" do
281
- let(:expected_idl) { <<-GRAPHQL
282
- type QueryType {
283
- foo: Foo
284
- }
285
-
286
- type Foo implements Bar {
287
- three(argument: InputType, other: String): CustomScalar
288
- four(argument: String = "string"): String
289
- five(argument: [String] = ["string", "string"]): Site
290
- }
291
-
292
- interface Bar {
293
- one: Type
294
- four(argument: String = "string"): String
295
- }
296
-
297
- input InputType {
298
- key: String!
299
- answer: Int = 42
300
- }
301
-
302
- type MutationType {
303
- a(input: InputType): String
304
- }
305
-
306
- enum Site {
307
- DESKTOP
308
- MOBILE
309
- }
310
-
311
- schema {
312
- query: QueryType
313
- mutation: MutationType
314
- }
315
- GRAPHQL
316
- }
317
-
318
- let(:document) {
319
- subject.new(
320
- schema,
321
- only: ->(m, _ctx) { !(m.is_a?(GraphQL::ScalarType) && m.name == "CustomScalar") }
322
- ).document
323
- }
324
-
325
- it "returns the IDL minus the filtered members" do
326
- assert equivalent_node?(expected_document, document)
327
- end
328
- end
329
-
330
- describe "when excluding built ins and introspection types" do
331
- let(:expected_idl) { <<-GRAPHQL
332
- type QueryType {
333
- foo: Foo
334
- }
335
-
336
- type Foo implements Bar {
337
- one: Type
338
- two(argument: InputType!): Site
339
- three(argument: InputType, other: String): CustomScalar
340
- four(argument: String = "string"): String
341
- five(argument: [String] = ["string", "string"]): String
342
- six(argument: String): Type
343
- }
344
-
345
- interface Bar {
346
- one: Type
347
- four(argument: String = "string"): String
348
- }
349
-
350
- type Type {
351
- a: String
352
- }
353
-
354
- input InputType {
355
- key: String!
356
- answer: Int = 42
357
- }
358
-
359
- type MutationType {
360
- a(input: InputType): String
361
- }
362
-
363
- # Scalar description
364
- scalar CustomScalar
365
-
366
- enum Site {
367
- DESKTOP
368
- MOBILE
369
- }
370
-
371
- union Union = Type | QueryType
372
-
373
- schema {
374
- query: QueryType
375
- mutation: MutationType
376
- }
377
- GRAPHQL
378
- }
379
-
380
- let(:document) {
381
- subject.new(
382
- schema,
383
- always_include_schema: true
384
- ).document
385
- }
386
-
387
- it "returns the schema idl besides introspection types and built ins" do
388
- assert equivalent_node?(expected_document, document)
389
- end
390
- end
391
-
392
- describe "when printing excluding only introspection types" do
393
- let(:expected_idl) { <<-GRAPHQL
394
- # Represents `true` or `false` values.
395
- scalar Boolean
396
-
397
- # Represents textual data as UTF-8 character sequences. This type is most often
398
- # used by GraphQL to represent free-form human-readable text.
399
- scalar String
400
-
401
- type QueryType {
402
- foo: Foo
403
- }
404
-
405
- type Foo implements Bar {
406
- one: Type
407
- two(argument: InputType!): Type
408
- three(argument: InputType, other: String): CustomScalar
409
- four(argument: String = "string"): String
410
- five(argument: [String] = ["string", "string"]): String
411
- six(argument: String): Type
412
- }
413
-
414
- interface Bar {
415
- one: Type
416
- four(argument: String = "string"): String
417
- }
418
-
419
- type Type {
420
- a: String
421
- }
422
-
423
- input InputType {
424
- key: String!
425
- answer: Int = 42
426
- }
427
-
428
- # Represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.
429
- scalar Int
430
-
431
- type MutationType {
432
- a(input: InputType): String
433
- }
434
-
435
- # Represents signed double-precision fractional values as specified by [IEEE
436
- # 754](http://en.wikipedia.org/wiki/IEEE_floating_point).
437
- scalar Float
438
-
439
- # Represents a unique identifier that is Base64 obfuscated. It is often used to
440
- # refetch an object or as key for a cache. The ID type appears in a JSON response
441
- # as a String; however, it is not intended to be human-readable. When expected as
442
- # an input type, any string (such as `"VXNlci0xMA=="`) or integer (such as `4`)
443
- # input value will be accepted as an ID.
444
- scalar ID
445
-
446
- # Scalar description
447
- scalar CustomScalar
448
-
449
- enum Site {
450
- DESKTOP
451
- MOBILE
452
- }
453
-
454
- union Union = Type | QueryType
455
-
456
- directive @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
457
-
458
- directive @include(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
459
-
460
- # Marks an element of a GraphQL schema as no longer supported.
461
- directive @deprecated(reason: String = "No longer supported") on FIELD_DEFINITION | ENUM_VALUE
462
-
463
- schema {
464
- query: QueryType
465
- mutation: MutationType
466
- }
467
- GRAPHQL
468
- }
469
-
470
- let(:document) {
471
- subject.new(
472
- schema,
473
- include_built_in_scalars: true,
474
- include_built_in_directives: true,
475
- ).document
476
- }
477
-
478
- it "returns the the schema IDL including only the built ins and not introspection types" do
479
- assert equivalent_node?(expected_document, document)
480
- end
481
- end
482
-
483
- describe "when printing the full schema" do
484
- let(:expected_idl) { <<-GRAPHQL
485
- # Represents `true` or `false` values.
486
- scalar Boolean
487
-
488
- # Represents textual data as UTF-8 character sequences. This type is most often
489
- # used by GraphQL to represent free-form human-readable text.
490
- scalar String
491
-
492
- # The fundamental unit of any GraphQL Schema is the type. There are many kinds of
493
- # types in GraphQL as represented by the `__TypeKind` enum.
494
- #
495
- # Depending on the kind of a type, certain fields describe information about that
496
- # type. Scalar types provide no information beyond a name and description, while
497
- # Enum types provide their values. Object and Interface types provide the fields
498
- # they describe. Abstract types, Union and Interface, provide the Object types
499
- # possible at runtime. List and NonNull types compose other types.
500
- type __Type {
501
- kind: __TypeKind!
502
- name: String
503
- description: String
504
- fields(includeDeprecated: Boolean = false): [__Field!]
505
- interfaces: [__Type!]
506
- possibleTypes: [__Type!]
507
- enumValues(includeDeprecated: Boolean = false): [__EnumValue!]
508
- inputFields: [__InputValue!]
509
- ofType: __Type
510
- }
511
-
512
- # An enum describing what kind of type a given `__Type` is.
513
- enum __TypeKind {
514
- # Indicates this type is a scalar.
515
- SCALAR
516
-
517
- # Indicates this type is an object. `fields` and `interfaces` are valid fields.
518
- OBJECT
519
-
520
- # Indicates this type is an interface. `fields` and `possibleTypes` are valid fields.
521
- INTERFACE
522
-
523
- # Indicates this type is a union. `possibleTypes` is a valid field.
524
- UNION
525
-
526
- # Indicates this type is an enum. `enumValues` is a valid field.
527
- ENUM
528
-
529
- # Indicates this type is an input object. `inputFields` is a valid field.
530
- INPUT_OBJECT
531
-
532
- # Indicates this type is a list. `ofType` is a valid field.
533
- LIST
534
-
535
- # Indicates this type is a non-null. `ofType` is a valid field.
536
- NON_NULL
537
- }
538
-
539
- # Object and Interface types are described by a list of Fields, each of which has
540
- # a name, potentially a list of arguments, and a return type.
541
- type __Field {
542
- name: String!
543
- description: String
544
- args: [__InputValue!]!
545
- type: __Type!
546
- isDeprecated: Boolean!
547
- deprecationReason: String
548
- }
549
-
550
- # Arguments provided to Fields or Directives and the input fields of an
551
- # InputObject are represented as Input Values which describe their type and
552
- # optionally a default value.
553
- type __InputValue {
554
- name: String!
555
- description: String
556
- type: __Type!
557
-
558
- # A GraphQL-formatted string representing the default value for this input value.
559
- defaultValue: String
560
- }
561
-
562
- # One possible value for a given Enum. Enum values are unique values, not a
563
- # placeholder for a string or numeric value. However an Enum value is returned in
564
- # a JSON response as a string.
565
- type __EnumValue {
566
- name: String!
567
- description: String
568
- isDeprecated: Boolean!
569
- deprecationReason: String
570
- }
571
-
572
- type QueryType {
573
- foo: Foo
574
- }
575
-
576
- type Foo implements Bar {
577
- one: Type
578
- two(argument: InputType!): Type
579
- three(argument: InputType, other: String): Int
580
- four(argument: String = "string"): String
581
- five(argument: [String] = ["string", "string"]): String
582
- six(argument: String): Type
583
- }
584
-
585
- interface Bar {
586
- one: Type
587
- four(argument: String = "string"): String
588
- }
589
-
590
- type Type {
591
- a: String
592
- }
593
-
594
- input InputType {
595
- key: String!
596
- answer: Int = 42
597
- }
598
-
599
- # Represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.
600
- scalar Int
601
-
602
- type MutationType {
603
- a(input: InputType): String
604
- }
605
-
606
- # A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all
607
- # available types and directives on the server, as well as the entry points for
608
- # query, mutation, and subscription operations.
609
- type __Schema {
610
- # A list of all types supported by this server.
611
- types: [__Type!]!
612
-
613
- # The type that query operations will be rooted at.
614
- queryType: __Type!
615
-
616
- # If this server supports mutation, the type that mutation operations will be rooted at.
617
- mutationType: __Type
618
-
619
- # If this server support subscription, the type that subscription operations will be rooted at.
620
- subscriptionType: __Type
621
-
622
- # A list of all directives supported by this server.
623
- directives: [__Directive!]!
624
- }
625
-
626
- # A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.
627
- #
628
- # In some cases, you need to provide options to alter GraphQL's execution behavior
629
- # in ways field arguments will not suffice, such as conditionally including or
630
- # skipping a field. Directives provide this by describing additional information
631
- # to the executor.
632
- type __Directive {
633
- name: String!
634
- description: String
635
- locations: [__DirectiveLocation!]!
636
- args: [__InputValue!]!
637
- onOperation: Boolean!
638
- onFragment: Boolean!
639
- onField: Boolean!
640
- }
641
-
642
- # A Directive can be adjacent to many parts of the GraphQL language, a
643
- # __DirectiveLocation describes one such possible adjacencies.
644
- enum __DirectiveLocation {
645
- # Location adjacent to a query operation.
646
- QUERY
647
-
648
- # Location adjacent to a mutation operation.
649
- MUTATION
650
-
651
- # Location adjacent to a subscription operation.
652
- SUBSCRIPTION
653
-
654
- # Location adjacent to a field.
655
- FIELD
656
-
657
- # Location adjacent to a fragment definition.
658
- FRAGMENT_DEFINITION
659
-
660
- # Location adjacent to a fragment spread.
661
- FRAGMENT_SPREAD
662
-
663
- # Location adjacent to an inline fragment.
664
- INLINE_FRAGMENT
665
-
666
- # Location adjacent to a schema definition.
667
- SCHEMA
668
-
669
- # Location adjacent to a scalar definition.
670
- SCALAR
671
-
672
- # Location adjacent to an object type definition.
673
- OBJECT
674
-
675
- # Location adjacent to a field definition.
676
- FIELD_DEFINITION
677
-
678
- # Location adjacent to an argument definition.
679
- ARGUMENT_DEFINITION
680
-
681
- # Location adjacent to an interface definition.
682
- INTERFACE
683
-
684
- # Location adjacent to a union definition.
685
- UNION
686
-
687
- # Location adjacent to an enum definition.
688
- ENUM
689
-
690
- # Location adjacent to an enum value definition.
691
- ENUM_VALUE
692
-
693
- # Location adjacent to an input object type definition.
694
- INPUT_OBJECT
695
-
696
- # Location adjacent to an input object field definition.
697
- INPUT_FIELD_DEFINITION
698
- }
699
-
700
- # Represents signed double-precision fractional values as specified by [IEEE
701
- # 754](http://en.wikipedia.org/wiki/IEEE_floating_point).
702
- scalar Float
703
-
704
- # Represents a unique identifier that is Base64 obfuscated. It is often used to
705
- # refetch an object or as key for a cache. The ID type appears in a JSON response
706
- # as a String; however, it is not intended to be human-readable. When expected as
707
- # an input type, any string (such as `"VXNlci0xMA=="`) or integer (such as `4`)
708
- # input value will be accepted as an ID.
709
- scalar ID
710
-
711
- # Scalar description
712
- scalar CustomScalar
713
-
714
- enum Site {
715
- DESKTOP
716
- MOBILE
717
- }
718
-
719
- union Union = Type | QueryType
720
-
721
- directive @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
722
-
723
- directive @include(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
724
-
725
- # Marks an element of a GraphQL schema as no longer supported.
726
- directive @deprecated(reason: String = "No longer supported") on FIELD_DEFINITION | ENUM_VALUE
727
-
728
- schema {
729
- query: QueryType
730
- mutation: MutationType
731
- }
732
- GRAPHQL
733
- }
734
-
735
- let(:document) {
736
- subject.new(
737
- schema,
738
- include_introspection_types: true,
739
- include_built_in_directives: true,
740
- include_built_in_scalars: true,
741
- always_include_schema: true,
742
- ).document
743
- }
744
-
745
- it "returns the full document AST from the given schema including built ins and introspection" do
746
- assert equivalent_node?(expected_document, document)
747
- end
748
- end
749
- end
750
-
751
- private
752
-
753
- def equivalent_node?(expected, node)
754
- return false unless expected.is_a?(node.class)
755
-
756
- if expected.respond_to?(:children) && expected.respond_to?(:scalars)
757
- children_equal = expected.children.all? do |expected_child|
758
- node.children.find { |child| equivalent_node?(expected_child, child) }
759
- end
760
-
761
- scalars_equal = expected.children.all? do |expected_child|
762
- node.children.find { |child| equivalent_node?(expected_child, child) }
763
- end
764
-
765
- children_equal && scalars_equal
766
- else
767
- expected == node
768
- end
769
- end
770
- end