graphql 0.19.3 → 0.19.4
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/analysis/max_query_complexity.rb +1 -1
- data/lib/graphql/analysis/max_query_depth.rb +1 -1
- data/lib/graphql/boolean_type.rb +2 -2
- data/lib/graphql/define/instance_definable.rb +2 -2
- data/lib/graphql/enum_type.rb +3 -3
- data/lib/graphql/field.rb +6 -6
- data/lib/graphql/float_type.rb +2 -2
- data/lib/graphql/id_type.rb +2 -2
- data/lib/graphql/input_object_type.rb +1 -1
- data/lib/graphql/int_type.rb +2 -2
- data/lib/graphql/internal_representation/rewrite.rb +12 -12
- data/lib/graphql/introspection/arguments_field.rb +1 -1
- data/lib/graphql/introspection/enum_value_type.rb +1 -1
- data/lib/graphql/introspection/enum_values_field.rb +1 -1
- data/lib/graphql/introspection/field_type.rb +1 -1
- data/lib/graphql/introspection/fields_field.rb +1 -1
- data/lib/graphql/introspection/input_fields_field.rb +1 -1
- data/lib/graphql/introspection/input_value_type.rb +2 -2
- data/lib/graphql/introspection/interfaces_field.rb +1 -1
- data/lib/graphql/introspection/of_type_field.rb +1 -1
- data/lib/graphql/introspection/possible_types_field.rb +1 -1
- data/lib/graphql/introspection/schema_field.rb +1 -1
- data/lib/graphql/introspection/schema_type.rb +5 -5
- data/lib/graphql/introspection/type_by_name_field.rb +1 -1
- data/lib/graphql/introspection/type_type.rb +6 -6
- data/lib/graphql/introspection/typename_field.rb +1 -1
- data/lib/graphql/language.rb +1 -0
- data/lib/graphql/language/comments.rb +44 -0
- data/lib/graphql/language/definition_slice.rb +1 -1
- data/lib/graphql/language/generation.rb +35 -12
- data/lib/graphql/language/lexer.rb +29 -10
- data/lib/graphql/language/lexer.rl +25 -6
- data/lib/graphql/language/nodes.rb +30 -23
- data/lib/graphql/language/parser.rb +33 -14
- data/lib/graphql/language/parser.y +33 -14
- data/lib/graphql/language/parser_tests.rb +86 -2
- data/lib/graphql/language/token.rb +3 -2
- data/lib/graphql/language/visitor.rb +3 -3
- data/lib/graphql/object_type.rb +1 -1
- data/lib/graphql/query/arguments.rb +23 -2
- data/lib/graphql/query/serial_execution/field_resolution.rb +31 -14
- data/lib/graphql/relay/base_connection.rb +1 -3
- data/lib/graphql/relay/connection_type.rb +1 -1
- data/lib/graphql/relay/mutation.rb +1 -1
- data/lib/graphql/relay/relation_connection.rb +7 -3
- data/lib/graphql/scalar_type.rb +1 -1
- data/lib/graphql/schema.rb +19 -8
- data/lib/graphql/schema/loader.rb +2 -2
- data/lib/graphql/schema/printer.rb +63 -8
- data/lib/graphql/schema/timeout_middleware.rb +11 -11
- data/lib/graphql/schema/validation.rb +12 -12
- data/lib/graphql/static_validation/arguments_validator.rb +1 -1
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +1 -1
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +1 -1
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +1 -1
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +1 -1
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +3 -2
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
- data/lib/graphql/static_validation/rules/fragment_types_exist.rb +1 -1
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +9 -4
- data/lib/graphql/static_validation/rules/fragments_are_named.rb +1 -1
- data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +1 -1
- data/lib/graphql/static_validation/rules/fragments_are_used.rb +3 -3
- data/lib/graphql/static_validation/rules/mutation_root_exists.rb +1 -1
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +2 -2
- data/lib/graphql/static_validation/rules/subscription_root_exists.rb +1 -1
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +1 -1
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +2 -2
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +6 -6
- data/lib/graphql/static_validation/type_stack.rb +2 -2
- data/lib/graphql/string_type.rb +2 -2
- data/lib/graphql/version.rb +1 -1
- data/readme.md +1 -1
- data/spec/graphql/analysis/analyze_query_spec.rb +3 -3
- data/spec/graphql/analysis/query_complexity_spec.rb +7 -7
- data/spec/graphql/introspection/directive_type_spec.rb +2 -2
- data/spec/graphql/introspection/introspection_query_spec.rb +26 -26
- data/spec/graphql/language/generation_spec.rb +137 -53
- data/spec/graphql/language/lexer_spec.rb +22 -0
- data/spec/graphql/language/visitor_spec.rb +6 -6
- data/spec/graphql/query/arguments_spec.rb +45 -1
- data/spec/graphql/query/context_spec.rb +4 -4
- data/spec/graphql/query/executor_spec.rb +1 -1
- data/spec/graphql/query/serial_execution/value_resolution_spec.rb +1 -1
- data/spec/graphql/relay/mutation_spec.rb +2 -2
- data/spec/graphql/relay/node_spec.rb +2 -2
- data/spec/graphql/relay/relation_connection_spec.rb +16 -0
- data/spec/graphql/schema/loader_spec.rb +2 -2
- data/spec/graphql/schema/middleware_chain_spec.rb +6 -6
- data/spec/graphql/schema/printer_spec.rb +268 -18
- data/spec/graphql/schema/rescue_middleware_spec.rb +1 -1
- data/spec/graphql/schema/timeout_middleware_spec.rb +2 -2
- data/spec/graphql/schema_spec.rb +2 -2
- data/spec/graphql/static_validation/rules/fragments_are_finite_spec.rb +13 -0
- data/spec/graphql/static_validation/rules/fragments_are_used_spec.rb +1 -1
- data/spec/graphql/static_validation/type_stack_spec.rb +1 -1
- data/spec/support/dairy_app.rb +25 -25
- data/spec/support/dairy_data.rb +2 -0
- data/spec/support/star_wars_data.rb +2 -1
- data/spec/support/star_wars_schema.rb +18 -18
- metadata +19 -2
@@ -19,7 +19,9 @@ describe GraphQL::Schema::Printer do
|
|
19
19
|
|
20
20
|
sub_input_type = GraphQL::InputObjectType.define do
|
21
21
|
name "Sub"
|
22
|
-
|
22
|
+
description "Test"
|
23
|
+
input_field :string, types.String, 'Something'
|
24
|
+
input_field :int, types.Int, 'Something'
|
23
25
|
end
|
24
26
|
|
25
27
|
variant_input_type = GraphQL::InputObjectType.define do
|
@@ -51,6 +53,30 @@ describe GraphQL::Schema::Printer do
|
|
51
53
|
field :comments_count, !types.Int, deprecation_reason: 'Use "comments".'
|
52
54
|
end
|
53
55
|
|
56
|
+
audio_type = GraphQL::ObjectType.define do
|
57
|
+
name "Audio"
|
58
|
+
|
59
|
+
field :id, !types.ID
|
60
|
+
field :name, !types.String
|
61
|
+
field :duration, !types.Int
|
62
|
+
end
|
63
|
+
|
64
|
+
image_type = GraphQL::ObjectType.define do
|
65
|
+
name "Image"
|
66
|
+
|
67
|
+
field :id, !types.ID
|
68
|
+
field :name, !types.String
|
69
|
+
field :width, !types.Int
|
70
|
+
field :height, !types.Int
|
71
|
+
end
|
72
|
+
|
73
|
+
media_union_type = GraphQL::UnionType.define do
|
74
|
+
name "Media"
|
75
|
+
description "Media objects"
|
76
|
+
|
77
|
+
possible_types [image_type, audio_type]
|
78
|
+
end
|
79
|
+
|
54
80
|
query_root = GraphQL::ObjectType.define do
|
55
81
|
name "Query"
|
56
82
|
description "The query root of this schema"
|
@@ -59,57 +85,152 @@ describe GraphQL::Schema::Printer do
|
|
59
85
|
type post_type
|
60
86
|
argument :id, !types.ID
|
61
87
|
argument :varied, variant_input_type, default_value: { id: "123", int: 234, float: 2.3, enum: :foo, sub: [{ string: "str" }] }
|
62
|
-
resolve ->
|
88
|
+
resolve ->(obj, args, ctx) { Post.find(args["id"]) }
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
create_post_mutation = GraphQL::Relay::Mutation.define do
|
93
|
+
name "CreatePost"
|
94
|
+
description "Create a blog post"
|
95
|
+
|
96
|
+
input_field :title, !types.String
|
97
|
+
input_field :body, !types.String
|
98
|
+
|
99
|
+
return_field :post, post_type
|
100
|
+
|
101
|
+
resolve ->(_, _, _) { }
|
102
|
+
end
|
103
|
+
|
104
|
+
mutation_root = GraphQL::ObjectType.define do
|
105
|
+
name "Mutation"
|
106
|
+
|
107
|
+
field :createPost, field: create_post_mutation.field
|
108
|
+
end
|
109
|
+
|
110
|
+
subscription_root = GraphQL::ObjectType.define do
|
111
|
+
name "Subscription"
|
112
|
+
|
113
|
+
field :post do
|
114
|
+
type post_type
|
115
|
+
argument :id, !types.ID
|
116
|
+
resolve ->(_, _, _) { }
|
63
117
|
end
|
64
118
|
end
|
65
119
|
|
66
|
-
GraphQL::Schema.define(
|
120
|
+
GraphQL::Schema.define(
|
121
|
+
query: query_root,
|
122
|
+
mutation: mutation_root,
|
123
|
+
subscription: subscription_root,
|
124
|
+
resolve_type: :pass,
|
125
|
+
orphan_types: [media_union_type]
|
126
|
+
)
|
67
127
|
}
|
68
128
|
|
69
129
|
describe ".print_introspection_schema" do
|
70
130
|
it "returns the schema as a string for the introspection types" do
|
131
|
+
# From https://github.com/graphql/graphql-js/blob/6a0e00fe46951767287f2cc62e1a10b167b2eaa6/src/utilities/__tests__/schemaPrinter-test.js#L599
|
71
132
|
expected = <<SCHEMA
|
72
133
|
schema {
|
73
|
-
query:
|
134
|
+
query: Root
|
74
135
|
}
|
75
136
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
137
|
+
# Directs the executor to include this field or fragment only when the \`if\` argument is true.
|
138
|
+
directive @include(
|
139
|
+
# Included when true.
|
140
|
+
if: Boolean!
|
141
|
+
) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
|
142
|
+
|
143
|
+
# Directs the executor to skip this field or fragment when the \`if\` argument is true.
|
144
|
+
directive @skip(
|
145
|
+
# Skipped when true.
|
146
|
+
if: Boolean!
|
147
|
+
) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT
|
148
|
+
|
149
|
+
# Marks an element of a GraphQL schema as no longer supported.
|
150
|
+
directive @deprecated(
|
151
|
+
# Explains why this element was deprecated, usually also including a suggestion
|
152
|
+
# for how to access supported similar data. Formatted in
|
153
|
+
# [Markdown](https://daringfireball.net/projects/markdown/).
|
154
|
+
reason: String = "No longer supported"
|
155
|
+
) on FIELD_DEFINITION | ENUM_VALUE
|
156
|
+
|
157
|
+
# A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.
|
158
|
+
#
|
159
|
+
# In some cases, you need to provide options to alter GraphQL's execution behavior
|
160
|
+
# in ways field arguments will not suffice, such as conditionally including or
|
161
|
+
# skipping a field. Directives provide this by describing additional information
|
162
|
+
# to the executor.
|
82
163
|
type __Directive {
|
83
164
|
name: String!
|
84
165
|
description: String
|
85
166
|
locations: [__DirectiveLocation!]!
|
86
167
|
args: [__InputValue!]!
|
87
|
-
onOperation: Boolean! @deprecated(reason:
|
88
|
-
onFragment: Boolean! @deprecated(reason:
|
89
|
-
onField: Boolean! @deprecated(reason:
|
168
|
+
onOperation: Boolean! @deprecated(reason: "Use \`locations\`.")
|
169
|
+
onFragment: Boolean! @deprecated(reason: "Use \`locations\`.")
|
170
|
+
onField: Boolean! @deprecated(reason: "Use \`locations\`.")
|
90
171
|
}
|
91
172
|
|
173
|
+
# A Directive can be adjacent to many parts of the GraphQL language, a
|
174
|
+
# __DirectiveLocation describes one such possible adjacencies.
|
92
175
|
enum __DirectiveLocation {
|
176
|
+
# Location adjacent to a query operation.
|
93
177
|
QUERY
|
178
|
+
|
179
|
+
# Location adjacent to a mutation operation.
|
94
180
|
MUTATION
|
181
|
+
|
182
|
+
# Location adjacent to a subscription operation.
|
95
183
|
SUBSCRIPTION
|
184
|
+
|
185
|
+
# Location adjacent to a field.
|
96
186
|
FIELD
|
187
|
+
|
188
|
+
# Location adjacent to a fragment definition.
|
97
189
|
FRAGMENT_DEFINITION
|
190
|
+
|
191
|
+
# Location adjacent to a fragment spread.
|
98
192
|
FRAGMENT_SPREAD
|
193
|
+
|
194
|
+
# Location adjacent to an inline fragment.
|
99
195
|
INLINE_FRAGMENT
|
196
|
+
|
197
|
+
# Location adjacent to a schema definition.
|
100
198
|
SCHEMA
|
199
|
+
|
200
|
+
# Location adjacent to a scalar definition.
|
101
201
|
SCALAR
|
202
|
+
|
203
|
+
# Location adjacent to an object type definition.
|
102
204
|
OBJECT
|
205
|
+
|
206
|
+
# Location adjacent to a field definition.
|
103
207
|
FIELD_DEFINITION
|
208
|
+
|
209
|
+
# Location adjacent to an argument definition.
|
104
210
|
ARGUMENT_DEFINITION
|
211
|
+
|
212
|
+
# Location adjacent to an interface definition.
|
105
213
|
INTERFACE
|
214
|
+
|
215
|
+
# Location adjacent to a union definition.
|
106
216
|
UNION
|
217
|
+
|
218
|
+
# Location adjacent to an enum definition.
|
107
219
|
ENUM
|
220
|
+
|
221
|
+
# Location adjacent to an enum value definition.
|
108
222
|
ENUM_VALUE
|
223
|
+
|
224
|
+
# Location adjacent to an input object type definition.
|
109
225
|
INPUT_OBJECT
|
226
|
+
|
227
|
+
# Location adjacent to an input object field definition.
|
110
228
|
INPUT_FIELD_DEFINITION
|
111
229
|
}
|
112
230
|
|
231
|
+
# One possible value for a given Enum. Enum values are unique values, not a
|
232
|
+
# placeholder for a string or numeric value. However an Enum value is returned in
|
233
|
+
# a JSON response as a string.
|
113
234
|
type __EnumValue {
|
114
235
|
name: String!
|
115
236
|
description: String
|
@@ -117,6 +238,8 @@ type __EnumValue {
|
|
117
238
|
deprecationReason: String
|
118
239
|
}
|
119
240
|
|
241
|
+
# Object and Interface types are described by a list of Fields, each of which has
|
242
|
+
# a name, potentially a list of arguments, and a return type.
|
120
243
|
type __Field {
|
121
244
|
name: String!
|
122
245
|
description: String
|
@@ -126,41 +249,82 @@ type __Field {
|
|
126
249
|
deprecationReason: String
|
127
250
|
}
|
128
251
|
|
252
|
+
# Arguments provided to Fields or Directives and the input fields of an
|
253
|
+
# InputObject are represented as Input Values which describe their type and
|
254
|
+
# optionally a default value.
|
129
255
|
type __InputValue {
|
130
256
|
name: String!
|
131
257
|
description: String
|
132
258
|
type: __Type!
|
259
|
+
|
260
|
+
# A GraphQL-formatted string representing the default value for this input value.
|
133
261
|
defaultValue: String
|
134
262
|
}
|
135
263
|
|
264
|
+
# A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all
|
265
|
+
# available types and directives on the server, as well as the entry points for
|
266
|
+
# query, mutation, and subscription operations.
|
136
267
|
type __Schema {
|
268
|
+
# A list of all types supported by this server.
|
137
269
|
types: [__Type!]!
|
270
|
+
|
271
|
+
# The type that query operations will be rooted at.
|
138
272
|
queryType: __Type!
|
273
|
+
|
274
|
+
# If this server supports mutation, the type that mutation operations will be rooted at.
|
139
275
|
mutationType: __Type
|
276
|
+
|
277
|
+
# If this server support subscription, the type that subscription operations will be rooted at.
|
140
278
|
subscriptionType: __Type
|
279
|
+
|
280
|
+
# A list of all directives supported by this server.
|
141
281
|
directives: [__Directive!]!
|
142
282
|
}
|
143
283
|
|
284
|
+
# The fundamental unit of any GraphQL Schema is the type. There are many kinds of
|
285
|
+
# types in GraphQL as represented by the \`__TypeKind\` enum.
|
286
|
+
#
|
287
|
+
# Depending on the kind of a type, certain fields describe information about that
|
288
|
+
# type. Scalar types provide no information beyond a name and description, while
|
289
|
+
# Enum types provide their values. Object and Interface types provide the fields
|
290
|
+
# they describe. Abstract types, Union and Interface, provide the Object types
|
291
|
+
# possible at runtime. List and NonNull types compose other types.
|
144
292
|
type __Type {
|
293
|
+
kind: __TypeKind!
|
145
294
|
name: String
|
146
295
|
description: String
|
147
|
-
kind: __TypeKind!
|
148
296
|
fields(includeDeprecated: Boolean = false): [__Field!]
|
149
|
-
|
150
|
-
inputFields: [__InputValue!]
|
297
|
+
interfaces: [__Type!]
|
151
298
|
possibleTypes: [__Type!]
|
152
299
|
enumValues(includeDeprecated: Boolean = false): [__EnumValue!]
|
153
|
-
|
300
|
+
inputFields: [__InputValue!]
|
301
|
+
ofType: __Type
|
154
302
|
}
|
155
303
|
|
304
|
+
# An enum describing what kind of type a given \`__Type\` is.
|
156
305
|
enum __TypeKind {
|
306
|
+
# Indicates this type is a scalar.
|
157
307
|
SCALAR
|
308
|
+
|
309
|
+
# Indicates this type is an object. \`fields\` and \`interfaces\` are valid fields.
|
158
310
|
OBJECT
|
311
|
+
|
312
|
+
# Indicates this type is an interface. \`fields\` and \`possibleTypes\` are valid fields.
|
159
313
|
INTERFACE
|
314
|
+
|
315
|
+
# Indicates this type is a union. \`possibleTypes\` is a valid field.
|
160
316
|
UNION
|
317
|
+
|
318
|
+
# Indicates this type is an enum. \`enumValues\` is a valid field.
|
161
319
|
ENUM
|
320
|
+
|
321
|
+
# Indicates this type is an input object. \`inputFields\` is a valid field.
|
162
322
|
INPUT_OBJECT
|
323
|
+
|
324
|
+
# Indicates this type is a list. \`ofType\` is a valid field.
|
163
325
|
LIST
|
326
|
+
|
327
|
+
# Indicates this type is a non-null. \`ofType\` is a valid field.
|
164
328
|
NON_NULL
|
165
329
|
}
|
166
330
|
SCHEMA
|
@@ -169,10 +333,54 @@ SCHEMA
|
|
169
333
|
end
|
170
334
|
|
171
335
|
describe ".print_schema" do
|
172
|
-
it "
|
336
|
+
it "includes schema definition when query root name doesn't match convention" do
|
337
|
+
schema.query.name = 'MyQueryRoot'
|
338
|
+
|
339
|
+
expected = <<SCHEMA
|
340
|
+
schema {
|
341
|
+
query: MyQueryRoot
|
342
|
+
mutation: Mutation
|
343
|
+
subscription: Subscription
|
344
|
+
}
|
345
|
+
SCHEMA
|
346
|
+
|
347
|
+
assert_match expected, GraphQL::Schema::Printer.print_schema(schema)
|
348
|
+
end
|
349
|
+
|
350
|
+
it "includes schema definition when mutation root name doesn't match convention" do
|
351
|
+
schema.mutation.name = 'MyMutationRoot'
|
352
|
+
|
353
|
+
expected = <<SCHEMA
|
354
|
+
schema {
|
355
|
+
query: Query
|
356
|
+
mutation: MyMutationRoot
|
357
|
+
subscription: Subscription
|
358
|
+
}
|
359
|
+
SCHEMA
|
360
|
+
|
361
|
+
assert_match expected, GraphQL::Schema::Printer.print_schema(schema)
|
362
|
+
end
|
363
|
+
|
364
|
+
it "includes schema definition when subscription root name doesn't match convention" do
|
365
|
+
schema.subscription.name = 'MySubscriptionRoot'
|
366
|
+
|
173
367
|
expected = <<SCHEMA
|
174
368
|
schema {
|
175
369
|
query: Query
|
370
|
+
mutation: Mutation
|
371
|
+
subscription: MySubscriptionRoot
|
372
|
+
}
|
373
|
+
SCHEMA
|
374
|
+
|
375
|
+
assert_match expected, GraphQL::Schema::Printer.print_schema(schema)
|
376
|
+
end
|
377
|
+
|
378
|
+
it "returns the schema as a string for the defined types" do
|
379
|
+
expected = <<SCHEMA
|
380
|
+
type Audio {
|
381
|
+
id: ID!
|
382
|
+
name: String!
|
383
|
+
duration: Int!
|
176
384
|
}
|
177
385
|
|
178
386
|
enum Choice {
|
@@ -182,14 +390,46 @@ enum Choice {
|
|
182
390
|
WOZ @deprecated
|
183
391
|
}
|
184
392
|
|
393
|
+
# A blog comment
|
185
394
|
type Comment implements Node {
|
186
395
|
id: ID!
|
187
396
|
}
|
188
397
|
|
398
|
+
# Autogenerated input type of CreatePost
|
399
|
+
input CreatePostInput {
|
400
|
+
# A unique identifier for the client performing the mutation.
|
401
|
+
clientMutationId: String
|
402
|
+
title: String!
|
403
|
+
body: String!
|
404
|
+
}
|
405
|
+
|
406
|
+
# Autogenerated return type of CreatePost
|
407
|
+
type CreatePostPayload {
|
408
|
+
# A unique identifier for the client performing the mutation.
|
409
|
+
clientMutationId: String
|
410
|
+
post: Post
|
411
|
+
}
|
412
|
+
|
413
|
+
type Image {
|
414
|
+
id: ID!
|
415
|
+
name: String!
|
416
|
+
width: Int!
|
417
|
+
height: Int!
|
418
|
+
}
|
419
|
+
|
420
|
+
# Media objects
|
421
|
+
union Media = Image | Audio
|
422
|
+
|
423
|
+
type Mutation {
|
424
|
+
# Create a blog post
|
425
|
+
createPost(input: CreatePostInput!): CreatePostPayload
|
426
|
+
}
|
427
|
+
|
189
428
|
interface Node {
|
190
429
|
id: ID!
|
191
430
|
}
|
192
431
|
|
432
|
+
# A blog post
|
193
433
|
type Post {
|
194
434
|
id: ID!
|
195
435
|
title: String!
|
@@ -198,12 +438,22 @@ type Post {
|
|
198
438
|
comments_count: Int! @deprecated(reason: \"Use \\\"comments\\\".\")
|
199
439
|
}
|
200
440
|
|
441
|
+
# The query root of this schema
|
201
442
|
type Query {
|
202
443
|
post(id: ID!, varied: Varied = {id: \"123\", int: 234, float: 2.3, enum: FOO, sub: [{string: \"str\"}]}): Post
|
203
444
|
}
|
204
445
|
|
446
|
+
# Test
|
205
447
|
input Sub {
|
448
|
+
# Something
|
206
449
|
string: String
|
450
|
+
|
451
|
+
# Something
|
452
|
+
int: Int
|
453
|
+
}
|
454
|
+
|
455
|
+
type Subscription {
|
456
|
+
post(id: ID!): Post
|
207
457
|
}
|
208
458
|
|
209
459
|
input Varied {
|
@@ -3,7 +3,7 @@ require "spec_helper"
|
|
3
3
|
class SpecExampleError < StandardError; end
|
4
4
|
|
5
5
|
describe GraphQL::Schema::RescueMiddleware do
|
6
|
-
let(:error_middleware) { ->
|
6
|
+
let(:error_middleware) { ->(next_middleware) { raise(error_class) } }
|
7
7
|
|
8
8
|
let(:rescue_middleware) do
|
9
9
|
middleware = GraphQL::Schema::RescueMiddleware.new
|
@@ -5,7 +5,7 @@ describe GraphQL::Schema::TimeoutMiddleware do
|
|
5
5
|
let(:timeout_middleware) { GraphQL::Schema::TimeoutMiddleware.new(max_seconds: max_seconds) }
|
6
6
|
let(:timeout_schema) {
|
7
7
|
|
8
|
-
sleep_for_seconds_resolve = ->
|
8
|
+
sleep_for_seconds_resolve = ->(obj, args, ctx) {
|
9
9
|
sleep(args[:seconds])
|
10
10
|
args[:seconds]
|
11
11
|
}
|
@@ -13,7 +13,7 @@ describe GraphQL::Schema::TimeoutMiddleware do
|
|
13
13
|
nested_sleep_type = GraphQL::ObjectType.define do
|
14
14
|
name "NestedSleep"
|
15
15
|
field :seconds, types.Float do
|
16
|
-
resolve ->
|
16
|
+
resolve ->(obj, args, ctx) { obj }
|
17
17
|
end
|
18
18
|
|
19
19
|
field :nestedSleep, -> { nested_sleep_type } do
|