graphql 0.18.14 → 0.18.15
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/query_complexity.rb +15 -6
- data/lib/graphql/analysis/query_depth.rb +11 -10
- data/lib/graphql/directive.rb +2 -6
- data/lib/graphql/directive/include_directive.rb +0 -4
- data/lib/graphql/directive/skip_directive.rb +0 -4
- data/lib/graphql/execution/directive_checks.rb +22 -13
- data/lib/graphql/execution_error.rb +7 -0
- data/lib/graphql/internal_representation/node.rb +20 -2
- data/lib/graphql/internal_representation/rewrite.rb +66 -20
- data/lib/graphql/language/generation.rb +22 -8
- data/lib/graphql/language/nodes.rb +48 -20
- data/lib/graphql/language/parser.rb +436 -423
- data/lib/graphql/language/parser.y +22 -19
- data/lib/graphql/language/parser_tests.rb +131 -2
- data/lib/graphql/query/serial_execution/field_resolution.rb +1 -0
- data/lib/graphql/query/serial_execution/selection_resolution.rb +1 -1
- data/lib/graphql/query/serial_execution/value_resolution.rb +4 -1
- data/lib/graphql/schema/printer.rb +1 -1
- data/lib/graphql/static_validation/message.rb +1 -1
- data/lib/graphql/version.rb +1 -1
- data/readme.md +10 -12
- data/spec/graphql/directive_spec.rb +139 -1
- data/spec/graphql/execution_error_spec.rb +63 -3
- data/spec/graphql/introspection/type_type_spec.rb +2 -0
- data/spec/graphql/language/generation_spec.rb +55 -7
- data/spec/graphql/query/executor_spec.rb +4 -2
- data/spec/graphql/schema/catchall_middleware_spec.rb +1 -0
- data/spec/graphql/schema/printer_spec.rb +1 -1
- data/spec/graphql/schema/timeout_middleware_spec.rb +10 -5
- data/spec/graphql/static_validation/rules/argument_literals_are_compatible_spec.rb +6 -6
- data/spec/graphql/static_validation/rules/arguments_are_defined_spec.rb +4 -4
- data/spec/graphql/static_validation/rules/directives_are_defined_spec.rb +2 -2
- data/spec/graphql/static_validation/rules/directives_are_in_valid_locations_spec.rb +2 -2
- data/spec/graphql/static_validation/rules/fields_are_defined_on_type_spec.rb +3 -3
- data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +2 -2
- data/spec/graphql/static_validation/rules/fragment_spreads_are_possible_spec.rb +3 -3
- data/spec/graphql/static_validation/rules/fragment_types_exist_spec.rb +2 -2
- data/spec/graphql/static_validation/rules/fragments_are_finite_spec.rb +2 -2
- data/spec/graphql/static_validation/rules/fragments_are_named_spec.rb +1 -1
- data/spec/graphql/static_validation/rules/fragments_are_on_composite_types_spec.rb +3 -3
- data/spec/graphql/static_validation/rules/fragments_are_used_spec.rb +2 -2
- data/spec/graphql/static_validation/rules/mutation_root_exists_spec.rb +1 -1
- data/spec/graphql/static_validation/rules/required_arguments_are_present_spec.rb +3 -3
- data/spec/graphql/static_validation/rules/subscription_root_exists_spec.rb +1 -1
- data/spec/graphql/static_validation/rules/variable_default_values_are_correctly_typed_spec.rb +4 -4
- data/spec/graphql/static_validation/rules/variable_usages_are_allowed_spec.rb +4 -4
- data/spec/graphql/static_validation/rules/variables_are_input_types_spec.rb +3 -3
- data/spec/graphql/static_validation/rules/variables_are_used_and_defined_spec.rb +3 -3
- data/spec/graphql/static_validation/validator_spec.rb +1 -1
- data/spec/support/dairy_app.rb +8 -0
- metadata +30 -2
@@ -28,13 +28,13 @@ describe GraphQL::StaticValidation::FragmentTypesExist do
|
|
28
28
|
inline_fragment_error = {
|
29
29
|
"message"=>"No such type Something, so it can't be a fragment condition",
|
30
30
|
"locations"=>[{"line"=>11, "column"=>5}],
|
31
|
-
"
|
31
|
+
"fields"=>["fragment somethingFields"],
|
32
32
|
}
|
33
33
|
assert_includes(errors, inline_fragment_error, "on inline fragments")
|
34
34
|
fragment_def_error = {
|
35
35
|
"message"=>"No such type Nothing, so it can't be a fragment condition",
|
36
36
|
"locations"=>[{"line"=>5, "column"=>9}],
|
37
|
-
"
|
37
|
+
"fields"=>["query getCheese", "cheese", "... on Nothing"],
|
38
38
|
}
|
39
39
|
assert_includes(errors, fragment_def_error, "on fragment definitions")
|
40
40
|
end
|
@@ -39,12 +39,12 @@ describe GraphQL::StaticValidation::FragmentsAreFinite do
|
|
39
39
|
{
|
40
40
|
"message"=>"Fragment sourceField contains an infinite loop",
|
41
41
|
"locations"=>[{"line"=>12, "column"=>5}],
|
42
|
-
"
|
42
|
+
"fields"=>["fragment sourceField"],
|
43
43
|
},
|
44
44
|
{
|
45
45
|
"message"=>"Fragment flavorField contains an infinite loop",
|
46
46
|
"locations"=>[{"line"=>17, "column"=>5}],
|
47
|
-
"
|
47
|
+
"fields"=>["fragment flavorField"],
|
48
48
|
}
|
49
49
|
]
|
50
50
|
assert_equal(expected, errors)
|
@@ -17,7 +17,7 @@ describe GraphQL::StaticValidation::FragmentTypesExist do
|
|
17
17
|
fragment_def_error = {
|
18
18
|
"message"=>"Fragment definition has no name",
|
19
19
|
"locations"=>[{"line"=>2, "column"=>5}],
|
20
|
-
"
|
20
|
+
"fields"=>["fragment "],
|
21
21
|
}
|
22
22
|
assert_includes(errors, fragment_def_error, "on fragment definitions")
|
23
23
|
end
|
@@ -34,17 +34,17 @@ describe GraphQL::StaticValidation::FragmentsAreOnCompositeTypes do
|
|
34
34
|
{
|
35
35
|
"message"=>"Invalid fragment on type Boolean (must be Union, Interface or Object)",
|
36
36
|
"locations"=>[{"line"=>6, "column"=>11}],
|
37
|
-
"
|
37
|
+
"fields"=>["query getCheese", "cheese", "... on Cheese", "... on Boolean"],
|
38
38
|
},
|
39
39
|
{
|
40
40
|
"message"=>"Invalid fragment on type DairyProductInput (must be Union, Interface or Object)",
|
41
41
|
"locations"=>[{"line"=>14, "column"=>9}],
|
42
|
-
"
|
42
|
+
"fields"=>["query getCheese", "cheese", "... on DairyProductInput"],
|
43
43
|
},
|
44
44
|
{
|
45
45
|
"message"=>"Invalid fragment on type Int (must be Union, Interface or Object)",
|
46
46
|
"locations"=>[{"line"=>20, "column"=>5}],
|
47
|
-
"
|
47
|
+
"fields"=>["fragment intFields"],
|
48
48
|
},
|
49
49
|
]
|
50
50
|
assert_equal(expected, errors)
|
@@ -19,7 +19,7 @@ describe GraphQL::StaticValidation::FragmentsAreUsed do
|
|
19
19
|
assert_includes(errors, {
|
20
20
|
"message"=>"Fragment unusedFields was defined, but not used",
|
21
21
|
"locations"=>[{"line"=>8, "column"=>5}],
|
22
|
-
"
|
22
|
+
"fields"=>[],
|
23
23
|
})
|
24
24
|
end
|
25
25
|
|
@@ -27,7 +27,7 @@ describe GraphQL::StaticValidation::FragmentsAreUsed do
|
|
27
27
|
assert_includes(errors, {
|
28
28
|
"message"=>"Fragment undefinedFields was used, but not defined",
|
29
29
|
"locations"=>[{"line"=>5, "column"=>7}],
|
30
|
-
"
|
30
|
+
"fields"=>["query getCheese", "... undefinedFields"]
|
31
31
|
})
|
32
32
|
end
|
33
33
|
|
@@ -32,7 +32,7 @@ describe GraphQL::StaticValidation::MutationRootExists do
|
|
32
32
|
missing_mutation_root_error = {
|
33
33
|
"message"=>"Schema is not configured for mutations",
|
34
34
|
"locations"=>[{"line"=>2, "column"=>5}],
|
35
|
-
"
|
35
|
+
"fields"=>["mutation addBagel"],
|
36
36
|
}
|
37
37
|
assert_includes(errors, missing_mutation_root_error)
|
38
38
|
end
|
@@ -24,21 +24,21 @@ describe GraphQL::StaticValidation::RequiredArgumentsArePresent do
|
|
24
24
|
query_root_error = {
|
25
25
|
"message"=>"Field 'cheese' is missing required arguments: id",
|
26
26
|
"locations"=>[{"line"=>4, "column"=>7}],
|
27
|
-
"
|
27
|
+
"fields"=>["query getCheese", "cheese"],
|
28
28
|
}
|
29
29
|
assert_includes(errors, query_root_error)
|
30
30
|
|
31
31
|
fragment_error = {
|
32
32
|
"message"=>"Field 'similarCheese' is missing required arguments: source",
|
33
33
|
"locations"=>[{"line"=>8, "column"=>7}],
|
34
|
-
"
|
34
|
+
"fields"=>["fragment cheeseFields", "similarCheese"],
|
35
35
|
}
|
36
36
|
assert_includes(errors, fragment_error)
|
37
37
|
|
38
38
|
directive_error = {
|
39
39
|
"message"=>"Directive 'skip' is missing required arguments: if",
|
40
40
|
"locations"=>[{"line"=>10, "column"=>10}],
|
41
|
-
"
|
41
|
+
"fields"=>["fragment cheeseFields", "id"],
|
42
42
|
}
|
43
43
|
assert_includes(errors, directive_error)
|
44
44
|
end
|
@@ -27,7 +27,7 @@ describe GraphQL::StaticValidation::SubscriptionRootExists do
|
|
27
27
|
missing_subscription_root_error = {
|
28
28
|
"message"=>"Schema is not configured for subscriptions",
|
29
29
|
"locations"=>[{"line"=>2, "column"=>5}],
|
30
|
-
"
|
30
|
+
"fields"=>["subscription"],
|
31
31
|
}
|
32
32
|
assert_includes(errors, missing_subscription_root_error)
|
33
33
|
end
|
data/spec/graphql/static_validation/rules/variable_default_values_are_correctly_typed_spec.rb
CHANGED
@@ -25,22 +25,22 @@ describe GraphQL::StaticValidation::VariableDefaultValuesAreCorrectlyTyped do
|
|
25
25
|
{
|
26
26
|
"message"=>"Default value for $badFloat doesn't match type Float",
|
27
27
|
"locations"=>[{"line"=>6, "column"=>7}],
|
28
|
-
"
|
28
|
+
"fields"=>["query getCheese"],
|
29
29
|
},
|
30
30
|
{
|
31
31
|
"message"=>"Default value for $badInt doesn't match type Int",
|
32
32
|
"locations"=>[{"line"=>7, "column"=>7}],
|
33
|
-
"
|
33
|
+
"fields"=>["query getCheese"],
|
34
34
|
},
|
35
35
|
{
|
36
36
|
"message"=>"Default value for $badInput doesn't match type DairyProductInput",
|
37
37
|
"locations"=>[{"line"=>9, "column"=>7}],
|
38
|
-
"
|
38
|
+
"fields"=>["query getCheese"],
|
39
39
|
},
|
40
40
|
{
|
41
41
|
"message"=>"Non-null variable $nonNull can't have a default value",
|
42
42
|
"locations"=>[{"line"=>10, "column"=>7}],
|
43
|
-
"
|
43
|
+
"fields"=>["query getCheese"],
|
44
44
|
}
|
45
45
|
]
|
46
46
|
assert_equal(expected, errors)
|
@@ -44,22 +44,22 @@ describe GraphQL::StaticValidation::VariableUsagesAreAllowed do
|
|
44
44
|
{
|
45
45
|
"message"=>"Nullability mismatch on variable $badInt and argument id (Int / Int!)",
|
46
46
|
"locations"=>[{"line"=>14, "column"=>28}],
|
47
|
-
"
|
47
|
+
"fields"=>["query getCheese", "badCheese", "id"],
|
48
48
|
},
|
49
49
|
{
|
50
50
|
"message"=>"Type mismatch on variable $badStr and argument id (String! / Int!)",
|
51
51
|
"locations"=>[{"line"=>15, "column"=>28}],
|
52
|
-
"
|
52
|
+
"fields"=>["query getCheese", "badStrCheese", "id"],
|
53
53
|
},
|
54
54
|
{
|
55
55
|
"message"=>"Nullability mismatch on variable $badAnimals and argument source ([DairyAnimal]! / [DairyAnimal!]!)",
|
56
56
|
"locations"=>[{"line"=>18, "column"=>30}],
|
57
|
-
"
|
57
|
+
"fields"=>["query getCheese", "cheese", "other", "source"],
|
58
58
|
},
|
59
59
|
{
|
60
60
|
"message"=>"List dimension mismatch on variable $deepAnimals and argument source ([[DairyAnimal!]!]! / [DairyAnimal!]!)",
|
61
61
|
"locations"=>[{"line"=>19, "column"=>32}],
|
62
|
-
"
|
62
|
+
"fields"=>["query getCheese", "cheese", "tooDeep", "source"],
|
63
63
|
}
|
64
64
|
]
|
65
65
|
assert_equal(expected, errors)
|
@@ -22,17 +22,17 @@ describe GraphQL::StaticValidation::VariablesAreInputTypes do
|
|
22
22
|
{
|
23
23
|
"message"=>"AnimalProduct isn't a valid input type (on $interface)",
|
24
24
|
"locations"=>[{"line"=>5, "column"=>7}],
|
25
|
-
"
|
25
|
+
"fields"=>["query getCheese"],
|
26
26
|
},
|
27
27
|
{
|
28
28
|
"message"=>"Milk isn't a valid input type (on $object)",
|
29
29
|
"locations"=>[{"line"=>6, "column"=>7}],
|
30
|
-
"
|
30
|
+
"fields"=>["query getCheese"],
|
31
31
|
},
|
32
32
|
{
|
33
33
|
"message"=>"Cheese isn't a valid input type (on $objects)",
|
34
34
|
"locations"=>[{"line"=>7, "column"=>7}],
|
35
|
-
"
|
35
|
+
"fields"=>["query getCheese"],
|
36
36
|
}
|
37
37
|
]
|
38
38
|
assert_equal(expected, errors)
|
@@ -38,17 +38,17 @@ describe GraphQL::StaticValidation::VariablesAreUsedAndDefined do
|
|
38
38
|
{
|
39
39
|
"message"=>"Variable $notUsedVar is declared by getCheese but not used",
|
40
40
|
"locations"=>[{"line"=>2, "column"=>5}],
|
41
|
-
"
|
41
|
+
"fields"=>["query getCheese"],
|
42
42
|
},
|
43
43
|
{
|
44
44
|
"message"=>"Variable $undefinedVar is used by getCheese but not declared",
|
45
45
|
"locations"=>[{"line"=>11, "column"=>29}],
|
46
|
-
"
|
46
|
+
"fields"=>["query getCheese", "cheese", "whatever", "undefined"],
|
47
47
|
},
|
48
48
|
{
|
49
49
|
"message"=>"Variable $undefinedFragmentVar is used by innerCheeseFields but not declared",
|
50
50
|
"locations"=>[{"line"=>24, "column"=>26}],
|
51
|
-
"
|
51
|
+
"fields"=>["fragment innerCheeseFields", "source", "notDefined"],
|
52
52
|
},
|
53
53
|
]
|
54
54
|
assert_equal(expected, errors)
|
@@ -73,7 +73,7 @@ describe GraphQL::StaticValidation::Validator do
|
|
73
73
|
{
|
74
74
|
"message"=>"Fragment cheeseFields contains an infinite loop",
|
75
75
|
"locations"=>[{"line"=>10, "column"=>9}],
|
76
|
-
"
|
76
|
+
"fields"=>["fragment cheeseFields"]
|
77
77
|
}
|
78
78
|
]
|
79
79
|
assert_equal(expected, errors)
|
data/spec/support/dairy_app.rb
CHANGED
@@ -105,6 +105,14 @@ MilkType = GraphQL::ObjectType.define do
|
|
105
105
|
args[:limit] ? milk.flavors.first(args[:limit]) : milk.flavors
|
106
106
|
}
|
107
107
|
end
|
108
|
+
field :executionError do
|
109
|
+
type GraphQL::STRING_TYPE
|
110
|
+
resolve -> (t, a, c) { raise(GraphQL::ExecutionError, "There was an execution error") }
|
111
|
+
end
|
112
|
+
|
113
|
+
field :allDairy, -> { types[DairyProductUnion] } do
|
114
|
+
resolve -> (obj, args, ctx) { CHEESES.values + MILKS.values }
|
115
|
+
end
|
108
116
|
end
|
109
117
|
|
110
118
|
SweetenerInterface = GraphQL::InterfaceType.define do
|
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.18.
|
4
|
+
version: 0.18.15
|
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-09-
|
11
|
+
date: 2016-09-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: codeclimate-test-reporter
|
@@ -234,6 +234,34 @@ dependencies:
|
|
234
234
|
- - ">="
|
235
235
|
- !ruby/object:Gem::Version
|
236
236
|
version: '0'
|
237
|
+
- !ruby/object:Gem::Dependency
|
238
|
+
name: github-pages
|
239
|
+
requirement: !ruby/object:Gem::Requirement
|
240
|
+
requirements:
|
241
|
+
- - ">="
|
242
|
+
- !ruby/object:Gem::Version
|
243
|
+
version: '0'
|
244
|
+
type: :development
|
245
|
+
prerelease: false
|
246
|
+
version_requirements: !ruby/object:Gem::Requirement
|
247
|
+
requirements:
|
248
|
+
- - ">="
|
249
|
+
- !ruby/object:Gem::Version
|
250
|
+
version: '0'
|
251
|
+
- !ruby/object:Gem::Dependency
|
252
|
+
name: html-proofer
|
253
|
+
requirement: !ruby/object:Gem::Requirement
|
254
|
+
requirements:
|
255
|
+
- - ">="
|
256
|
+
- !ruby/object:Gem::Version
|
257
|
+
version: '0'
|
258
|
+
type: :development
|
259
|
+
prerelease: false
|
260
|
+
version_requirements: !ruby/object:Gem::Requirement
|
261
|
+
requirements:
|
262
|
+
- - ">="
|
263
|
+
- !ruby/object:Gem::Version
|
264
|
+
version: '0'
|
237
265
|
description: A GraphQL server implementation for Ruby. Includes schema definition,
|
238
266
|
query parsing, static validation, type definition, and query execution.
|
239
267
|
email:
|