graphql 1.6.1 → 1.6.2
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/execution/multiplex.rb +38 -2
- data/lib/graphql/query.rb +6 -1
- data/lib/graphql/query/executor.rb +0 -1
- data/lib/graphql/relay/base_connection.rb +2 -2
- data/lib/graphql/relay/relation_connection.rb +4 -6
- data/lib/graphql/schema.rb +16 -5
- data/lib/graphql/schema/rescue_middleware.rb +7 -7
- data/lib/graphql/version.rb +1 -1
- data/spec/graphql/query_spec.rb +44 -0
- data/spec/graphql/relay/array_connection_spec.rb +60 -0
- data/spec/graphql/relay/relation_connection_spec.rb +59 -0
- data/spec/graphql/schema/rescue_middleware_spec.rb +29 -0
- data/spec/graphql/schema_spec.rb +9 -0
- data/spec/support/star_wars/schema.rb +11 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dcc96523b4e6938e39aeae90c15728985618c95b
|
4
|
+
data.tar.gz: da73ad353f7891bf9f4146e8941200747a928c39
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b709b3b6833dd60102f6bfa7ebc7efd7a1a36ef7af8b0aa5723b1b421cc4c14516ef2480d058c885d9fb9de34013c0e3d0e6d0bbaa22850df7ff2bf9c50535c8
|
7
|
+
data.tar.gz: 0a4b99378090cfbce6916a725ccadb8b91238cbeaf8a00c28e0fcbcedc43d1b8c238b3f2c502ece948e5379a2d33cb2265e8210c2e44ae466d570f177fb44059
|
@@ -40,7 +40,27 @@ module GraphQL
|
|
40
40
|
run_queries(schema, queries, *rest)
|
41
41
|
end
|
42
42
|
|
43
|
+
# @param schema [GraphQL::Schema]
|
44
|
+
# @param queries [Array<GraphQL::Query>]
|
45
|
+
# @param context [Hash]
|
46
|
+
# @param max_complexity [Integer]
|
47
|
+
# @return [Array<Hash>] One result per query
|
43
48
|
def run_queries(schema, queries, context: {}, max_complexity: nil)
|
49
|
+
has_custom_strategy = schema.query_execution_strategy || schema.mutation_execution_strategy || schema.subscription_execution_strategy
|
50
|
+
if has_custom_strategy
|
51
|
+
if queries.length == 1
|
52
|
+
return [run_one_legacy(schema, queries.first)]
|
53
|
+
else
|
54
|
+
raise ArgumentError, "Multiplexing doesn't support custom execution strategies, run one query at a time instead"
|
55
|
+
end
|
56
|
+
else
|
57
|
+
run_as_multiplex(schema, queries, context: context, max_complexity: max_complexity)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def run_as_multiplex(schema, queries, context:, max_complexity:)
|
44
64
|
query_instrumenters = schema.instrumenters[:query]
|
45
65
|
multiplex_instrumenters = schema.instrumenters[:multiplex]
|
46
66
|
multiplex = self.new(schema: schema, queries: queries, context: context)
|
@@ -80,8 +100,6 @@ module GraphQL
|
|
80
100
|
multiplex_instrumenters.reverse_each { |i| i.after_multiplex(multiplex) }
|
81
101
|
end
|
82
102
|
|
83
|
-
private
|
84
|
-
|
85
103
|
# @param query [GraphQL::Query]
|
86
104
|
# @return [Hash] The initial result (may not be finished if there are lazy values)
|
87
105
|
def begin_query(query)
|
@@ -128,6 +146,24 @@ module GraphQL
|
|
128
146
|
result
|
129
147
|
end
|
130
148
|
end
|
149
|
+
|
150
|
+
# use the old `query_execution_strategy` etc to run this query
|
151
|
+
def run_one_legacy(schema, query)
|
152
|
+
instrumenters = schema.instrumenters[:query]
|
153
|
+
instrumenters.each { |i| i.before_query(query) }
|
154
|
+
query.result = if !query.valid?
|
155
|
+
all_errors = query.validation_errors + query.analysis_errors + query.context.errors
|
156
|
+
if all_errors.any?
|
157
|
+
{ "errors" => all_errors.map(&:to_h) }
|
158
|
+
else
|
159
|
+
nil
|
160
|
+
end
|
161
|
+
else
|
162
|
+
GraphQL::Query::Executor.new(query).result
|
163
|
+
end
|
164
|
+
ensure
|
165
|
+
instrumenters.reverse_each { |i| i.after_query(query) }
|
166
|
+
end
|
131
167
|
end
|
132
168
|
end
|
133
169
|
end
|
data/lib/graphql/query.rb
CHANGED
@@ -188,7 +188,11 @@ module GraphQL
|
|
188
188
|
end
|
189
189
|
|
190
190
|
def mutation?
|
191
|
-
@mutation
|
191
|
+
with_prepared_ast { @mutation }
|
192
|
+
end
|
193
|
+
|
194
|
+
def query?
|
195
|
+
with_prepared_ast { @query }
|
192
196
|
end
|
193
197
|
|
194
198
|
# @return [void]
|
@@ -260,6 +264,7 @@ module GraphQL
|
|
260
264
|
end
|
261
265
|
@ast_variables = @selected_operation.variables
|
262
266
|
@mutation = @selected_operation.operation_type == "mutation"
|
267
|
+
@query = @selected_operation.operation_type == "query"
|
263
268
|
end
|
264
269
|
end
|
265
270
|
|
@@ -57,13 +57,13 @@ module GraphQL
|
|
57
57
|
# @param parent [Object] The object which this collection belongs to
|
58
58
|
# @param context [GraphQL::Query::Context] The context from the field being resolved
|
59
59
|
def initialize(nodes, arguments, field: nil, max_page_size: nil, parent: nil, context: nil)
|
60
|
+
@context = context
|
60
61
|
@nodes = nodes
|
61
62
|
@arguments = arguments
|
62
|
-
@max_page_size = max_page_size
|
63
63
|
@field = field
|
64
64
|
@parent = parent
|
65
|
-
@context = context
|
66
65
|
@encoder = context ? @context.schema.cursor_encoder : GraphQL::Schema::Base64Encoder
|
66
|
+
@max_page_size = max_page_size.nil? && context ? @context.schema.default_max_page_size : max_page_size
|
67
67
|
end
|
68
68
|
|
69
69
|
def encode(data)
|
@@ -83,19 +83,17 @@ module GraphQL
|
|
83
83
|
end
|
84
84
|
|
85
85
|
def relation_offset(relation)
|
86
|
-
|
87
|
-
when ActiveRecord::Relation
|
86
|
+
if relation.respond_to?(:offset_value)
|
88
87
|
relation.offset_value
|
89
|
-
|
88
|
+
else
|
90
89
|
relation.opts[:offset]
|
91
90
|
end
|
92
91
|
end
|
93
92
|
|
94
93
|
def relation_limit(relation)
|
95
|
-
|
96
|
-
when ActiveRecord::Relation
|
94
|
+
if relation.respond_to?(:limit_value)
|
97
95
|
relation.limit_value
|
98
|
-
|
96
|
+
else
|
99
97
|
relation.opts[:limit]
|
100
98
|
end
|
101
99
|
end
|
data/lib/graphql/schema.rb
CHANGED
@@ -55,7 +55,7 @@ module GraphQL
|
|
55
55
|
accepts_definitions \
|
56
56
|
:query, :mutation, :subscription,
|
57
57
|
:query_execution_strategy, :mutation_execution_strategy, :subscription_execution_strategy,
|
58
|
-
:max_depth, :max_complexity,
|
58
|
+
:max_depth, :max_complexity, :default_max_page_size,
|
59
59
|
:orphan_types, :resolve_type, :type_error, :parse_error,
|
60
60
|
:raise_definition_error,
|
61
61
|
:object_from_id, :id_from_object,
|
@@ -77,7 +77,7 @@ module GraphQL
|
|
77
77
|
attr_accessor \
|
78
78
|
:query, :mutation, :subscription,
|
79
79
|
:query_execution_strategy, :mutation_execution_strategy, :subscription_execution_strategy,
|
80
|
-
:max_depth, :max_complexity,
|
80
|
+
:max_depth, :max_complexity, :default_max_page_size,
|
81
81
|
:orphan_types, :directives,
|
82
82
|
:query_analyzers, :multiplex_analyzers, :instrumenters, :lazy_methods,
|
83
83
|
:cursor_encoder,
|
@@ -98,7 +98,7 @@ module GraphQL
|
|
98
98
|
GraphQL::Filter.new(except: default_mask)
|
99
99
|
end
|
100
100
|
|
101
|
-
self.default_execution_strategy =
|
101
|
+
self.default_execution_strategy = nil
|
102
102
|
|
103
103
|
BUILT_IN_TYPES = Hash[[INT_TYPE, STRING_TYPE, FLOAT_TYPE, BOOLEAN_TYPE, ID_TYPE].map{ |type| [type.name, type] }]
|
104
104
|
DIRECTIVES = [GraphQL::Directive::IncludeDirective, GraphQL::Directive::SkipDirective, GraphQL::Directive::DeprecatedDirective]
|
@@ -256,11 +256,22 @@ module GraphQL
|
|
256
256
|
|
257
257
|
# Resolve field named `field_name` for type `parent_type`.
|
258
258
|
# Handles dynamic fields `__typename`, `__type` and `__schema`, too
|
259
|
-
# @
|
259
|
+
# @param parent_type [String, GraphQL::BaseType]
|
260
|
+
# @param field_name [String]
|
260
261
|
# @return [GraphQL::Field, nil] The field named `field_name` on `parent_type`
|
262
|
+
# @see [GraphQL::Schema::Warden] Restricted access to members of a schema
|
261
263
|
def get_field(parent_type, field_name)
|
262
264
|
with_definition_error_check do
|
263
|
-
|
265
|
+
parent_type_name = case parent_type
|
266
|
+
when GraphQL::BaseType
|
267
|
+
parent_type.name
|
268
|
+
when String
|
269
|
+
parent_type
|
270
|
+
else
|
271
|
+
raise "Unexpected parent_type: #{parent_type}"
|
272
|
+
end
|
273
|
+
|
274
|
+
defined_field = @instrumented_field_map.get(parent_type_name, field_name)
|
264
275
|
if defined_field
|
265
276
|
defined_field
|
266
277
|
elsif field_name == "__typename"
|
@@ -15,18 +15,18 @@ module GraphQL
|
|
15
15
|
# @example Rescue from not-found by telling the user
|
16
16
|
# MySchema.rescue_from(ActiveRecord::RecordNotFound) { "An item could not be found" }
|
17
17
|
#
|
18
|
-
# @param
|
19
|
-
# @yield [err] A handler to return a message for
|
18
|
+
# @param error_classes [Class] one or more classes of errors to rescue from
|
19
|
+
# @yield [err] A handler to return a message for these error instances
|
20
20
|
# @yieldparam [Exception] an error that was rescued
|
21
21
|
# @yieldreturn [String] message to put in GraphQL response
|
22
|
-
def rescue_from(
|
23
|
-
rescue_table[error_class] = block
|
22
|
+
def rescue_from(*error_classes, &block)
|
23
|
+
error_classes.map{ |error_class| rescue_table[error_class] = block }
|
24
24
|
end
|
25
25
|
|
26
|
-
# Remove the handler for `
|
26
|
+
# Remove the handler for `error_classs`
|
27
27
|
# @param error_class [Class] the error class whose handler should be removed
|
28
|
-
def remove_handler(
|
29
|
-
rescue_table.delete(error_class)
|
28
|
+
def remove_handler(*error_classes)
|
29
|
+
error_classes.map{ |error_class| rescue_table.delete(error_class) }
|
30
30
|
end
|
31
31
|
|
32
32
|
# Implement the requirement for {GraphQL::Schema::MiddlewareChain}
|
data/lib/graphql/version.rb
CHANGED
data/spec/graphql/query_spec.rb
CHANGED
@@ -500,6 +500,24 @@ describe GraphQL::Query do
|
|
500
500
|
end
|
501
501
|
end
|
502
502
|
|
503
|
+
describe "#mutation?" do
|
504
|
+
let(:query_string) { <<-GRAPHQL
|
505
|
+
query Q { __typename }
|
506
|
+
mutation M { pushValue(value: 1) }
|
507
|
+
GRAPHQL
|
508
|
+
}
|
509
|
+
|
510
|
+
it "returns true if the selected operation is a mutation" do
|
511
|
+
query_query = GraphQL::Query.new(schema, query_string, operation_name: "Q")
|
512
|
+
assert_equal false, query_query.mutation?
|
513
|
+
assert_equal true, query_query.query?
|
514
|
+
|
515
|
+
mutation_query = GraphQL::Query.new(schema, query_string, operation_name: "M")
|
516
|
+
assert_equal true, mutation_query.mutation?
|
517
|
+
assert_equal false, mutation_query.query?
|
518
|
+
end
|
519
|
+
end
|
520
|
+
|
503
521
|
describe 'NullValue type arguments' do
|
504
522
|
let(:schema_definition) {
|
505
523
|
<<-GRAPHQL
|
@@ -578,4 +596,30 @@ describe GraphQL::Query do
|
|
578
596
|
assert_kind_of GraphQL::InternalRepresentation::Node, query.internal_representation.fragment_definitions["dairyFields"]
|
579
597
|
end
|
580
598
|
end
|
599
|
+
|
600
|
+
describe "query_execution_strategy" do
|
601
|
+
let(:custom_execution_schema) { schema.redefine(query_execution_strategy: DummyStrategy) }
|
602
|
+
|
603
|
+
class DummyStrategy
|
604
|
+
def execute(ast_operation, root_type, query_object)
|
605
|
+
{ "dummy" => true }
|
606
|
+
end
|
607
|
+
end
|
608
|
+
|
609
|
+
it "is used for running a query, if it's present and not the default" do
|
610
|
+
result = custom_execution_schema.execute(" { __typename }")
|
611
|
+
assert_equal({"data"=>{"dummy"=>true}}, result)
|
612
|
+
end
|
613
|
+
|
614
|
+
it "can't run a multiplex" do
|
615
|
+
err = assert_raises ArgumentError do
|
616
|
+
custom_execution_schema.multiplex([
|
617
|
+
{query: " { __typename }"},
|
618
|
+
{query: " { __typename }"},
|
619
|
+
])
|
620
|
+
end
|
621
|
+
msg = "Multiplexing doesn't support custom execution strategies, run one query at a time instead"
|
622
|
+
assert_equal msg, err.message
|
623
|
+
end
|
624
|
+
end
|
581
625
|
end
|
@@ -196,5 +196,65 @@ describe GraphQL::Relay::ArrayConnection do
|
|
196
196
|
assert_equal(first_and_second_names, get_names(result))
|
197
197
|
end
|
198
198
|
end
|
199
|
+
|
200
|
+
describe "applying default_max_page_size" do
|
201
|
+
def get_names(result)
|
202
|
+
result["data"]["rebels"]["bases"]["edges"].map { |e| e["node"]["name"] }
|
203
|
+
end
|
204
|
+
|
205
|
+
def get_page_info(result)
|
206
|
+
result["data"]["rebels"]["bases"]["pageInfo"]
|
207
|
+
end
|
208
|
+
|
209
|
+
let(:query_string) {%|
|
210
|
+
query getShips($first: Int, $after: String, $last: Int, $before: String){
|
211
|
+
rebels {
|
212
|
+
bases: basesWithDefaultMaxLimitArray(first: $first, after: $after, last: $last, before: $before) {
|
213
|
+
edges {
|
214
|
+
cursor
|
215
|
+
node {
|
216
|
+
name
|
217
|
+
}
|
218
|
+
}
|
219
|
+
pageInfo {
|
220
|
+
hasNextPage
|
221
|
+
hasPreviousPage
|
222
|
+
}
|
223
|
+
}
|
224
|
+
}
|
225
|
+
}
|
226
|
+
|}
|
227
|
+
|
228
|
+
it "applies to queries by `first`" do
|
229
|
+
result = star_wars_query(query_string, "first" => 100)
|
230
|
+
assert_equal(["Yavin", "Echo Base", "Secret Hideout"], get_names(result))
|
231
|
+
assert_equal(true, get_page_info(result)["hasNextPage"])
|
232
|
+
|
233
|
+
# Max page size is applied _without_ `first`, also
|
234
|
+
result = star_wars_query(query_string)
|
235
|
+
assert_equal(["Yavin", "Echo Base", "Secret Hideout"], get_names(result))
|
236
|
+
assert_equal(false, get_page_info(result)["hasNextPage"], "hasNextPage is false when first is not specified")
|
237
|
+
end
|
238
|
+
|
239
|
+
it "applies to queries by `last`" do
|
240
|
+
last_cursor = "Ng=="
|
241
|
+
|
242
|
+
result = star_wars_query(query_string, "last" => 100, "before" => last_cursor)
|
243
|
+
assert_equal(["Secret Hideout", "Death Star", "Shield Generator"], get_names(result))
|
244
|
+
assert_equal(true, get_page_info(result)["hasPreviousPage"])
|
245
|
+
|
246
|
+
result = star_wars_query(query_string, "before" => last_cursor)
|
247
|
+
assert_equal(["Yavin", "Echo Base", "Secret Hideout"], get_names(result))
|
248
|
+
assert_equal(false, get_page_info(result)["hasPreviousPage"], "hasPreviousPage is false when last is not specified")
|
249
|
+
|
250
|
+
fourth_cursor = "NA=="
|
251
|
+
first_second_and_third_names = ["Yavin", "Echo Base", "Secret Hideout"]
|
252
|
+
result = star_wars_query(query_string, "last" => 100, "before" => fourth_cursor)
|
253
|
+
assert_equal(first_second_and_third_names, get_names(result))
|
254
|
+
|
255
|
+
result = star_wars_query(query_string, "before" => fourth_cursor)
|
256
|
+
assert_equal(first_second_and_third_names, get_names(result))
|
257
|
+
end
|
258
|
+
end
|
199
259
|
end
|
200
260
|
end
|
@@ -225,6 +225,65 @@ describe GraphQL::Relay::RelationConnection do
|
|
225
225
|
assert_equal(first_and_second_names, get_names(result))
|
226
226
|
end
|
227
227
|
end
|
228
|
+
|
229
|
+
describe "applying default_max_page_size" do
|
230
|
+
let(:query_string) {%|
|
231
|
+
query getBases($first: Int, $after: String, $last: Int, $before: String){
|
232
|
+
empire {
|
233
|
+
bases: basesWithDefaultMaxLimitRelation(first: $first, after: $after, last: $last, before: $before) {
|
234
|
+
... basesConnection
|
235
|
+
}
|
236
|
+
}
|
237
|
+
}
|
238
|
+
|
239
|
+
fragment basesConnection on BaseConnection {
|
240
|
+
edges {
|
241
|
+
cursor
|
242
|
+
node {
|
243
|
+
name
|
244
|
+
}
|
245
|
+
},
|
246
|
+
pageInfo {
|
247
|
+
hasNextPage
|
248
|
+
hasPreviousPage
|
249
|
+
startCursor
|
250
|
+
endCursor
|
251
|
+
}
|
252
|
+
}
|
253
|
+
|}
|
254
|
+
|
255
|
+
it "applies to queries by `first`" do
|
256
|
+
result = star_wars_query(query_string, "first" => 100)
|
257
|
+
assert_equal(3, result["data"]["empire"]["bases"]["edges"].size)
|
258
|
+
assert_equal(true, result["data"]["empire"]["bases"]["pageInfo"]["hasNextPage"])
|
259
|
+
|
260
|
+
# Max page size is applied _without_ `first`, also
|
261
|
+
result = star_wars_query(query_string)
|
262
|
+
assert_equal(3, result["data"]["empire"]["bases"]["edges"].size)
|
263
|
+
assert_equal(false, result["data"]["empire"]["bases"]["pageInfo"]["hasNextPage"], "hasNextPage is false when first is not specified")
|
264
|
+
end
|
265
|
+
|
266
|
+
it "applies to queries by `last`" do
|
267
|
+
second_to_last_three_names = ["Secret Hideout", "Death Star", "Shield Generator"]
|
268
|
+
first_second_and_third_names = ["Yavin", "Echo Base", "Secret Hideout"]
|
269
|
+
|
270
|
+
last_cursor = "Ng=="
|
271
|
+
result = star_wars_query(query_string, "last" => 100, "before" => last_cursor)
|
272
|
+
assert_equal(second_to_last_three_names, get_names(result))
|
273
|
+
assert_equal(true, result["data"]["empire"]["bases"]["pageInfo"]["hasPreviousPage"])
|
274
|
+
|
275
|
+
result = star_wars_query(query_string, "before" => last_cursor)
|
276
|
+
assert_equal(first_second_and_third_names, get_names(result))
|
277
|
+
assert_equal(false, result["data"]["empire"]["bases"]["pageInfo"]["hasPreviousPage"], "hasPreviousPage is false when last is not specified")
|
278
|
+
|
279
|
+
fourth_cursor = "NA=="
|
280
|
+
result = star_wars_query(query_string, "last" => 100, "before" => fourth_cursor)
|
281
|
+
assert_equal(first_second_and_third_names, get_names(result))
|
282
|
+
|
283
|
+
result = star_wars_query(query_string, "before" => fourth_cursor)
|
284
|
+
assert_equal(first_second_and_third_names, get_names(result))
|
285
|
+
end
|
286
|
+
end
|
228
287
|
end
|
229
288
|
|
230
289
|
describe "without a block" do
|
@@ -2,6 +2,7 @@
|
|
2
2
|
require "spec_helper"
|
3
3
|
|
4
4
|
class SpecExampleError < StandardError; end
|
5
|
+
class SecondSpecExampleError < StandardError; end
|
5
6
|
|
6
7
|
describe GraphQL::Schema::RescueMiddleware do
|
7
8
|
let(:error_middleware) { ->{ raise(error_class) } }
|
@@ -23,6 +24,20 @@ describe GraphQL::Schema::RescueMiddleware do
|
|
23
24
|
assert_equal("there was an example error: SpecExampleError", result.message)
|
24
25
|
assert_equal(GraphQL::ExecutionError, result.class)
|
25
26
|
end
|
27
|
+
|
28
|
+
describe "with multiple error classes" do
|
29
|
+
let(:error_class) { SecondSpecExampleError }
|
30
|
+
let(:rescue_middleware) do
|
31
|
+
middleware = GraphQL::Schema::RescueMiddleware.new
|
32
|
+
middleware.rescue_from(SpecExampleError, SecondSpecExampleError) { |err| "there was an example error: #{err.class.name}" }
|
33
|
+
middleware
|
34
|
+
end
|
35
|
+
|
36
|
+
it "handles errors for all of the classes" do
|
37
|
+
result = middleware_chain.invoke([])
|
38
|
+
assert_equal("there was an example error: SecondSpecExampleError", result.message)
|
39
|
+
end
|
40
|
+
end
|
26
41
|
end
|
27
42
|
|
28
43
|
describe "unknown errors" do
|
@@ -31,4 +46,18 @@ describe GraphQL::Schema::RescueMiddleware do
|
|
31
46
|
assert_raises(RuntimeError) { middleware_chain.invoke([]) }
|
32
47
|
end
|
33
48
|
end
|
49
|
+
|
50
|
+
describe "removing multiple error handlers" do
|
51
|
+
let(:error_class) { SpecExampleError }
|
52
|
+
let(:rescue_middleware) do
|
53
|
+
middleware = GraphQL::Schema::RescueMiddleware.new
|
54
|
+
middleware.rescue_from(SpecExampleError, SecondSpecExampleError) { |err| "there was an example error: #{err.class.name}" }
|
55
|
+
middleware.remove_handler(SpecExampleError, SecondSpecExampleError)
|
56
|
+
middleware
|
57
|
+
end
|
58
|
+
|
59
|
+
it "no longer handles those errors" do
|
60
|
+
assert_raises(SpecExampleError) { middleware_chain.invoke([]) }
|
61
|
+
end
|
62
|
+
end
|
34
63
|
end
|
data/spec/graphql/schema_spec.rb
CHANGED
@@ -360,4 +360,13 @@ type Query {
|
|
360
360
|
assert_equal result, JSON.parse(schema.to_json)
|
361
361
|
end
|
362
362
|
end
|
363
|
+
|
364
|
+
describe "#get_field" do
|
365
|
+
it "returns fields by type or type name" do
|
366
|
+
field = schema.get_field("Cheese", "id")
|
367
|
+
assert_instance_of GraphQL::Field, field
|
368
|
+
field_2 = schema.get_field(Dummy::CheeseType, "id")
|
369
|
+
assert_equal field, field_2
|
370
|
+
end
|
371
|
+
end
|
363
372
|
end
|
@@ -96,7 +96,7 @@ module StarWars
|
|
96
96
|
|
97
97
|
field :id, !types.ID, resolve: GraphQL::Relay::GlobalIdResolve.new(type: Faction)
|
98
98
|
field :name, types.String
|
99
|
-
connection :ships, ShipConnectionWithParentType do
|
99
|
+
connection :ships, ShipConnectionWithParentType, max_page_size: 1000 do
|
100
100
|
resolve ->(obj, args, ctx) {
|
101
101
|
all_ships = obj.ships.map {|ship_id| StarWars::DATA["Ship"][ship_id] }
|
102
102
|
if args[:nameIncludes]
|
@@ -159,7 +159,15 @@ module StarWars
|
|
159
159
|
resolve ->(object, args, context) { Base.all.to_a }
|
160
160
|
end
|
161
161
|
|
162
|
-
connection :
|
162
|
+
connection :basesWithDefaultMaxLimitRelation, BaseType.connection_type do
|
163
|
+
resolve ->(object, args, context) { Base.all }
|
164
|
+
end
|
165
|
+
|
166
|
+
connection :basesWithDefaultMaxLimitArray, BaseType.connection_type do
|
167
|
+
resolve ->(object, args, context) { Base.all.to_a }
|
168
|
+
end
|
169
|
+
|
170
|
+
connection :basesAsSequelDataset, BaseConnectionWithTotalCountType, max_page_size: 1000 do
|
163
171
|
argument :nameIncludes, types.String
|
164
172
|
resolve ->(obj, args, ctx) {
|
165
173
|
all_bases = SequelBase.where(faction_id: obj.id)
|
@@ -332,6 +340,7 @@ module StarWars
|
|
332
340
|
Schema = GraphQL::Schema.define do
|
333
341
|
query(QueryType)
|
334
342
|
mutation(MutationType)
|
343
|
+
default_max_page_size 3
|
335
344
|
|
336
345
|
resolve_type ->(object, ctx) {
|
337
346
|
if object == :test_error
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.6.
|
4
|
+
version: 1.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Mosolgo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-06-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: benchmark-ips
|