graphql 0.14.0 → 0.14.1
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/define/assign_object_field.rb +2 -1
- data/lib/graphql/directive.rb +12 -0
- data/lib/graphql/enum_type.rb +1 -0
- data/lib/graphql/introspection/directive_type.rb +3 -0
- data/lib/graphql/query.rb +9 -3
- data/lib/graphql/query/literal_input.rb +1 -1
- data/lib/graphql/schema.rb +2 -1
- data/lib/graphql/schema/catchall_middleware.rb +34 -0
- data/lib/graphql/version.rb +1 -1
- data/spec/graphql/enum_type_spec.rb +4 -0
- data/spec/graphql/introspection/directive_type_spec.rb +15 -1
- data/spec/graphql/query_spec.rb +9 -1
- data/spec/graphql/schema/catchall_middleware_spec.rb +32 -0
- data/spec/graphql/schema/printer_spec.rb +3 -0
- data/spec/support/dairy_app.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb9a61168074bd76592f38e2eced93e30a79bcbd
|
4
|
+
data.tar.gz: 4533e8af54fb08af8ec72012fb20d5be69f544e9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4c02839e76d229ac5f886544c03711a7d515209a280ac2629ecc79645182fc8e134a02a9f257c4ee3393e23e0d273fe3f2462ba1616f70d09d1ab70a147f7953
|
7
|
+
data.tar.gz: d235b4fe8ad2500e21f0da5b0a4102e916fa2575815ac7f9601c9d5febbcef91a0fa00c093b0239d982c8a60b7319a962d8026ea51ecf5f684eff0633006f17e
|
@@ -2,7 +2,7 @@ module GraphQL
|
|
2
2
|
module Define
|
3
3
|
# Turn field configs into a {GraphQL::Field} and attach it to a {GraphQL::ObjectType} or {GraphQL::InterfaceType}
|
4
4
|
module AssignObjectField
|
5
|
-
def self.call(fields_type, name, type = nil, desc = nil, field: nil, property: nil, &block)
|
5
|
+
def self.call(fields_type, name, type = nil, desc = nil, field: nil, deprecation_reason: nil, property: nil, &block)
|
6
6
|
if block_given?
|
7
7
|
field = GraphQL::Field.define(&block)
|
8
8
|
else
|
@@ -11,6 +11,7 @@ module GraphQL
|
|
11
11
|
type && field.type = type
|
12
12
|
desc && field.description = desc
|
13
13
|
property && field.property = property
|
14
|
+
deprecation_reason && field.deprecation_reason = deprecation_reason
|
14
15
|
field.name ||= name.to_s
|
15
16
|
fields_type.fields[name.to_s] = field
|
16
17
|
end
|
data/lib/graphql/directive.rb
CHANGED
@@ -30,6 +30,18 @@ module GraphQL
|
|
30
30
|
def to_s
|
31
31
|
"<GraphQL::Directive #{name}>"
|
32
32
|
end
|
33
|
+
|
34
|
+
def on_field?
|
35
|
+
locations.include?(FIELD)
|
36
|
+
end
|
37
|
+
|
38
|
+
def on_fragment?
|
39
|
+
locations.include?(FRAGMENT_SPREAD) && locations.include?(INLINE_FRAGMENT)
|
40
|
+
end
|
41
|
+
|
42
|
+
def on_operation?
|
43
|
+
locations.include?(QUERY) && locations.include?(MUTATION) && locations.include?(SUBSCRIPTION)
|
44
|
+
end
|
33
45
|
end
|
34
46
|
end
|
35
47
|
|
data/lib/graphql/enum_type.rb
CHANGED
@@ -67,6 +67,7 @@ module GraphQL
|
|
67
67
|
# @param value_name [String] the string representation of this enum value
|
68
68
|
# @return [Object] the underlying value for this enum value
|
69
69
|
def coerce_non_null_input(value_name)
|
70
|
+
return nil unless @values_by_name.key?(value_name)
|
70
71
|
@values_by_name.fetch(value_name).value
|
71
72
|
end
|
72
73
|
|
@@ -5,4 +5,7 @@ GraphQL::Introspection::DirectiveType = GraphQL::ObjectType.define do
|
|
5
5
|
field :description, types.String, "The description for this type"
|
6
6
|
field :args, field: GraphQL::Introspection::ArgumentsField
|
7
7
|
field :locations, !types[!GraphQL::Introspection::DirectiveLocationEnum]
|
8
|
+
field :onOperation, !types.Boolean, "Does this directive apply to operations?", deprecation_reason: "Moved to 'locations' field", property: :on_operation?
|
9
|
+
field :onFragment, !types.Boolean, "Does this directive apply to fragments?", deprecation_reason: "Moved to 'locations' field", property: :on_fragment?
|
10
|
+
field :onField, !types.Boolean, "Does this directive apply to fields?", deprecation_reason: "Moved to 'locations' field", property: :on_field?
|
8
11
|
end
|
data/lib/graphql/query.rb
CHANGED
@@ -15,15 +15,21 @@ module GraphQL
|
|
15
15
|
# @param query_string [String]
|
16
16
|
# @param context [#[]] an arbitrary hash of values which you can access in {GraphQL::Field#resolve}
|
17
17
|
# @param variables [Hash] values for `$variables` in the query
|
18
|
-
# @param debug [Boolean] if true, errors are raised, if false, errors are put in the `errors` key
|
18
|
+
# @param debug [Boolean] DEPRECATED if true, errors are raised, if false, errors are put in the `errors` key
|
19
19
|
# @param validate [Boolean] if true, `query_string` will be validated with {StaticValidation::Validator}
|
20
20
|
# @param operation_name [String] if the query string contains many operations, this is the one which should be executed
|
21
21
|
# @param root_value [Object] the object used to resolve fields on the root type
|
22
|
-
def initialize(schema, query_string = nil, document: nil, context: nil, variables: {}, debug:
|
22
|
+
def initialize(schema, query_string = nil, document: nil, context: nil, variables: {}, debug: nil, validate: true, operation_name: nil, root_value: nil, max_depth: nil)
|
23
23
|
fail ArgumentError, "a query string or document is required" unless query_string || document
|
24
24
|
|
25
25
|
@schema = schema
|
26
|
-
|
26
|
+
if debug == false
|
27
|
+
warn("Muffling errors with `debug: false` is deprecated and will be removed. For a similar behavior, use `MySchema.middleware << GraphQL::Schema::CatchallMiddleware`.")
|
28
|
+
elsif debug == true
|
29
|
+
warn("`debug:` will be removed from a future GraphQL version (and raising errors will be the default behavior, like `debug: true`)")
|
30
|
+
end
|
31
|
+
@debug = debug || false
|
32
|
+
|
27
33
|
@max_depth = max_depth || schema.max_depth
|
28
34
|
@context = Context.new(query: self, values: context)
|
29
35
|
@root_value = root_value
|
@@ -21,7 +21,7 @@ module GraphQL
|
|
21
21
|
arg_value = coerce(arg_defn.type, ast_arg.value, variables)
|
22
22
|
end
|
23
23
|
if arg_value.nil?
|
24
|
-
arg_value = arg_defn.default_value
|
24
|
+
arg_value = arg_defn.type.coerce_input(arg_defn.default_value)
|
25
25
|
end
|
26
26
|
values_hash[arg_name] = arg_value
|
27
27
|
end
|
data/lib/graphql/schema.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require "graphql/schema/catchall_middleware"
|
1
2
|
require "graphql/schema/invalid_type_error"
|
2
3
|
require "graphql/schema/middleware_chain"
|
3
4
|
require "graphql/schema/rescue_middleware"
|
@@ -51,7 +52,7 @@ module GraphQL
|
|
51
52
|
# @return [GraphQL::Schema::TypeMap] `{ name => type }` pairs of types in this schema
|
52
53
|
def types
|
53
54
|
@types ||= begin
|
54
|
-
all_types = @orphan_types + [query, mutation, GraphQL::Introspection::SchemaType]
|
55
|
+
all_types = @orphan_types + [query, mutation, subscription, GraphQL::Introspection::SchemaType]
|
55
56
|
GraphQL::Schema::ReduceTypes.reduce(all_types.compact)
|
56
57
|
end
|
57
58
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module GraphQL
|
2
|
+
class Schema
|
3
|
+
# In early GraphQL versions, errors would be "automatically"
|
4
|
+
# rescued and replaced with `"Internal error"`. That behavior
|
5
|
+
# was undesirable but this middleware is offered for people who
|
6
|
+
# want to preserve it.
|
7
|
+
#
|
8
|
+
# It has a couple of differences from the previous behavior:
|
9
|
+
#
|
10
|
+
# - Other parts of the query _will_ be run (previously,
|
11
|
+
# execution would stop when the error was raised and the result
|
12
|
+
# would have no `"data"` key at all)
|
13
|
+
# - The entry in {Query::Context#errors} is a {GraphQL::ExecutionError}, _not_
|
14
|
+
# the originally-raised error.
|
15
|
+
# - The entry in the `"errors"` key includes the location of the field
|
16
|
+
# which raised the errors.
|
17
|
+
#
|
18
|
+
# @example Use CatchallMiddleware with your schema
|
19
|
+
# # All errors will be suppressed and replaced with "Internal error" messages
|
20
|
+
# MySchema.middleware << GraphQL::Schema::CatchallMiddleware
|
21
|
+
#
|
22
|
+
module CatchallMiddleware
|
23
|
+
MESSAGE = "Internal error"
|
24
|
+
|
25
|
+
# Rescue any error and replace it with a {GraphQL::ExecutionError}
|
26
|
+
# whose message is {MESSAGE}
|
27
|
+
def self.call(parent_type, parent_object, field_definition, field_args, query_context, next_middleware)
|
28
|
+
next_middleware.call
|
29
|
+
rescue StandardError => err
|
30
|
+
GraphQL::ExecutionError.new(MESSAGE)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/graphql/version.rb
CHANGED
@@ -8,6 +8,10 @@ describe GraphQL::EnumType do
|
|
8
8
|
assert_equal(1, enum.coerce_input("COW"))
|
9
9
|
end
|
10
10
|
|
11
|
+
it "coerces invalid names to nil" do
|
12
|
+
assert_equal(nil, enum.coerce_input("YAKKITY"))
|
13
|
+
end
|
14
|
+
|
11
15
|
it "coerces result values to value's value" do
|
12
16
|
assert_equal("YAK", enum.coerce_result("YAK"))
|
13
17
|
assert_equal("COW", enum.coerce_result(1))
|
@@ -4,7 +4,15 @@ describe GraphQL::Introspection::DirectiveType do
|
|
4
4
|
let(:query_string) {%|
|
5
5
|
query getDirectives {
|
6
6
|
__schema {
|
7
|
-
directives {
|
7
|
+
directives {
|
8
|
+
name,
|
9
|
+
args { name, type { name, ofType { name } } },
|
10
|
+
locations
|
11
|
+
# Deprecated fields:
|
12
|
+
onField
|
13
|
+
onFragment
|
14
|
+
onOperation
|
15
|
+
}
|
8
16
|
}
|
9
17
|
}
|
10
18
|
|}
|
@@ -20,6 +28,9 @@ describe GraphQL::Introspection::DirectiveType do
|
|
20
28
|
{"name"=>"if", "type"=>{"name"=>"Non-Null", "ofType"=>{"name"=>"Boolean"}}}
|
21
29
|
],
|
22
30
|
"locations"=>["FIELD", "FRAGMENT_SPREAD", "INLINE_FRAGMENT"],
|
31
|
+
"onField" => true,
|
32
|
+
"onFragment" => true,
|
33
|
+
"onOperation" => false,
|
23
34
|
},
|
24
35
|
{
|
25
36
|
"name" => "include",
|
@@ -27,6 +38,9 @@ describe GraphQL::Introspection::DirectiveType do
|
|
27
38
|
{"name"=>"if", "type"=>{"name"=>"Non-Null", "ofType"=>{"name"=>"Boolean"}}}
|
28
39
|
],
|
29
40
|
"locations"=>["FIELD", "FRAGMENT_SPREAD", "INLINE_FRAGMENT"],
|
41
|
+
"onField" => true,
|
42
|
+
"onFragment" => true,
|
43
|
+
"onOperation" => false,
|
30
44
|
},
|
31
45
|
]
|
32
46
|
}
|
data/spec/graphql/query_spec.rb
CHANGED
@@ -217,7 +217,9 @@ describe GraphQL::Query do
|
|
217
217
|
variableDefault: searchDairy(product: $searchWithDefault) {
|
218
218
|
... cheeseFields
|
219
219
|
}
|
220
|
-
|
220
|
+
convertedDefault: fromSource {
|
221
|
+
... cheeseFields
|
222
|
+
}
|
221
223
|
}
|
222
224
|
fragment cheeseFields on Cheese { flavor }
|
223
225
|
|}
|
@@ -244,6 +246,12 @@ describe GraphQL::Query do
|
|
244
246
|
assert_equal("Brie", result["data"]["variableDefault"]["flavor"])
|
245
247
|
end
|
246
248
|
end
|
249
|
+
|
250
|
+
describe "when the variable has a default needing conversion" do
|
251
|
+
it "uses the converted variable default" do
|
252
|
+
assert_equal([{"flavor" => "Brie"}, {"flavor" => "Gouda"}], result["data"]["convertedDefault"])
|
253
|
+
end
|
254
|
+
end
|
247
255
|
end
|
248
256
|
|
249
257
|
describe "query variables" do
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe GraphQL::Schema::CatchallMiddleware do
|
4
|
+
let(:result) { DummySchema.execute(query_string) }
|
5
|
+
let(:query_string) {%| query noMilk { error }|}
|
6
|
+
|
7
|
+
before do
|
8
|
+
DummySchema.middleware << GraphQL::Schema::CatchallMiddleware
|
9
|
+
end
|
10
|
+
|
11
|
+
after do
|
12
|
+
DummySchema.middleware.delete(GraphQL::Schema::CatchallMiddleware)
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "rescuing errors" do
|
16
|
+
let(:errors) { query.context.errors }
|
17
|
+
|
18
|
+
it "turns into error messages" do
|
19
|
+
expected = {
|
20
|
+
"data" => { "error" => nil },
|
21
|
+
"errors"=> [
|
22
|
+
{
|
23
|
+
"message"=>"Internal error",
|
24
|
+
"locations"=>[{"line"=>1, "column"=>17}],
|
25
|
+
},
|
26
|
+
]
|
27
|
+
}
|
28
|
+
assert_equal(expected, result)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
data/spec/support/dairy_app.rb
CHANGED
@@ -185,7 +185,7 @@ end
|
|
185
185
|
SourceFieldDefn = Proc.new {
|
186
186
|
type GraphQL::ListType.new(of_type: CheeseType)
|
187
187
|
description "Cheese from source"
|
188
|
-
argument :source,
|
188
|
+
argument :source, DairyAnimalEnum, default_value: "COW"
|
189
189
|
resolve -> (target, arguments, context) {
|
190
190
|
CHEESES.values.select{ |c| c.source == arguments["source"] }
|
191
191
|
}
|
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: 0.14.
|
4
|
+
version: 0.14.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Mosolgo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-06-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: codeclimate-test-reporter
|
@@ -262,6 +262,7 @@ files:
|
|
262
262
|
- lib/graphql/query/variables.rb
|
263
263
|
- lib/graphql/scalar_type.rb
|
264
264
|
- lib/graphql/schema.rb
|
265
|
+
- lib/graphql/schema/catchall_middleware.rb
|
265
266
|
- lib/graphql/schema/invalid_type_error.rb
|
266
267
|
- lib/graphql/schema/middleware_chain.rb
|
267
268
|
- lib/graphql/schema/possible_types.rb
|
@@ -334,6 +335,7 @@ files:
|
|
334
335
|
- spec/graphql/query/variables_spec.rb
|
335
336
|
- spec/graphql/query_spec.rb
|
336
337
|
- spec/graphql/scalar_type_spec.rb
|
338
|
+
- spec/graphql/schema/catchall_middleware_spec.rb
|
337
339
|
- spec/graphql/schema/middleware_chain_spec.rb
|
338
340
|
- spec/graphql/schema/printer_spec.rb
|
339
341
|
- spec/graphql/schema/reduce_types_spec.rb
|
@@ -426,6 +428,7 @@ test_files:
|
|
426
428
|
- spec/graphql/query/variables_spec.rb
|
427
429
|
- spec/graphql/query_spec.rb
|
428
430
|
- spec/graphql/scalar_type_spec.rb
|
431
|
+
- spec/graphql/schema/catchall_middleware_spec.rb
|
429
432
|
- spec/graphql/schema/middleware_chain_spec.rb
|
430
433
|
- spec/graphql/schema/printer_spec.rb
|
431
434
|
- spec/graphql/schema/reduce_types_spec.rb
|