graphql 0.10.2 → 0.10.3
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.rb +1 -0
- data/lib/graphql/introspection/introspection_query.rb +3 -2
- data/lib/graphql/introspection/schema_type.rb +4 -0
- data/lib/graphql/language/parser.rb +1 -1
- data/lib/graphql/query/executor.rb +4 -7
- data/lib/graphql/schema.rb +9 -4
- data/lib/graphql/version.rb +1 -1
- data/spec/graphql/language/parser_spec.rb +4 -1
- data/spec/graphql/schema/printer_spec.rb +1 -0
- data/spec/graphql/schema_spec.rb +7 -0
- data/spec/support/calculator_schema.rb +57 -56
- data/spec/support/dairy_app.rb +12 -1
- 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: cace79bd801a58fbf53eb0ff5a5ef4ea501b1208
|
4
|
+
data.tar.gz: 495b61e0510a41d880db3a99008446650196742a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 635f9a6cbc5d9093227b3699cb93271526c105fff445bacc4e1a39777a51a6b8db1fcc5c692271a0de4d00045b2dd3d33b39dfea90f33c74176ef6ea3e7a57cb
|
7
|
+
data.tar.gz: 8ca5879203ad6178ad7fff7e3ef12e76de2c90825b1de2e5efd831afe654f49bb3d02b0f9ef6a5d5654586ee20693452ba971e645717d2e561caba396c6c1e3d
|
data/lib/graphql.rb
CHANGED
@@ -5,6 +5,7 @@ query IntrospectionQuery {
|
|
5
5
|
__schema {
|
6
6
|
queryType { name }
|
7
7
|
mutationType { name }
|
8
|
+
subscriptionType { name }
|
8
9
|
types {
|
9
10
|
...FullType
|
10
11
|
}
|
@@ -24,7 +25,7 @@ fragment FullType on __Type {
|
|
24
25
|
kind
|
25
26
|
name
|
26
27
|
description
|
27
|
-
fields {
|
28
|
+
fields(includeDeprecated: true) {
|
28
29
|
name
|
29
30
|
description
|
30
31
|
args {
|
@@ -42,7 +43,7 @@ fragment FullType on __Type {
|
|
42
43
|
interfaces {
|
43
44
|
...TypeRef
|
44
45
|
}
|
45
|
-
enumValues {
|
46
|
+
enumValues(includeDeprecated: true) {
|
46
47
|
name
|
47
48
|
description
|
48
49
|
isDeprecated
|
@@ -17,4 +17,8 @@ GraphQL::Introspection::SchemaType = GraphQL::ObjectType.define do
|
|
17
17
|
field :mutationType, GraphQL::Introspection::TypeType, "The mutation root of this schema" do
|
18
18
|
resolve -> (obj, arg, ctx) { obj.mutation }
|
19
19
|
end
|
20
|
+
|
21
|
+
field :subscriptionType, GraphQL::Introspection::TypeType, "The subscription root of this schema" do
|
22
|
+
resolve -> (obj, arg, ctx) { obj.subscription }
|
23
|
+
end
|
20
24
|
end
|
@@ -43,7 +43,7 @@ module GraphQL
|
|
43
43
|
directives.maybe.as(:optional_directives).as(:directives) >> space? >>
|
44
44
|
selections.as(:selections)
|
45
45
|
}
|
46
|
-
rule(:operation_type) { (str("query") | str("mutation")) }
|
46
|
+
rule(:operation_type) { (str("query") | str("mutation") | str("subscription")) }
|
47
47
|
rule(:operation_variable_definitions) { str("(") >> space? >> (operation_variable_definition >> separator?).repeat(1) >> space? >> str(")") }
|
48
48
|
rule(:operation_variable_definition) {
|
49
49
|
value_variable.as(:variable_name) >> space? >>
|
@@ -29,14 +29,11 @@ module GraphQL
|
|
29
29
|
operation = query.selected_operation
|
30
30
|
return {} if operation.nil?
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
elsif operation.operation_type == "mutation"
|
36
|
-
root_type = query.schema.mutation
|
37
|
-
execution_strategy_class = query.schema.mutation_execution_strategy
|
38
|
-
end
|
32
|
+
op_type = operation.operation_type
|
33
|
+
root_type = query.schema.public_send(op_type)
|
34
|
+
execution_strategy_class = query.schema.public_send("#{op_type}_execution_strategy")
|
39
35
|
execution_strategy = execution_strategy_class.new
|
36
|
+
|
40
37
|
query.context.execution_strategy = execution_strategy
|
41
38
|
data_result = execution_strategy.execute(operation, root_type, query)
|
42
39
|
result = { "data" => data_result }
|
data/lib/graphql/schema.rb
CHANGED
@@ -5,18 +5,22 @@ class GraphQL::Schema
|
|
5
5
|
DIRECTIVES = [GraphQL::Directive::SkipDirective, GraphQL::Directive::IncludeDirective]
|
6
6
|
DYNAMIC_FIELDS = ["__type", "__typename", "__schema"]
|
7
7
|
|
8
|
-
attr_reader :query, :mutation, :directives, :static_validator
|
8
|
+
attr_reader :query, :mutation, :subscription, :directives, :static_validator
|
9
9
|
# Override these if you don't want the default executor:
|
10
|
-
attr_accessor :query_execution_strategy,
|
10
|
+
attr_accessor :query_execution_strategy,
|
11
|
+
:mutation_execution_strategy,
|
12
|
+
:subscription_execution_strategy
|
11
13
|
|
12
14
|
# @return [Array<#call>] Middlewares suitable for MiddlewareChain, applied to fields during execution
|
13
15
|
attr_reader :middleware
|
14
16
|
|
15
17
|
# @param query [GraphQL::ObjectType] the query root for the schema
|
16
|
-
# @param mutation [GraphQL::ObjectType
|
17
|
-
|
18
|
+
# @param mutation [GraphQL::ObjectType] the mutation root for the schema
|
19
|
+
# @param subscription [GraphQL::ObjectType] the subscription root for the schema
|
20
|
+
def initialize(query:, mutation: nil, subscription: nil)
|
18
21
|
@query = query
|
19
22
|
@mutation = mutation
|
23
|
+
@subscription = subscription
|
20
24
|
@directives = DIRECTIVES.reduce({}) { |m, d| m[d.name] = d; m }
|
21
25
|
@static_validator = GraphQL::StaticValidation::Validator.new(schema: self)
|
22
26
|
@rescue_middleware = GraphQL::Schema::RescueMiddleware.new
|
@@ -24,6 +28,7 @@ class GraphQL::Schema
|
|
24
28
|
# Default to the built-in execution strategy:
|
25
29
|
self.query_execution_strategy = GraphQL::Query::SerialExecution
|
26
30
|
self.mutation_execution_strategy = GraphQL::Query::SerialExecution
|
31
|
+
self.subscription_execution_strategy = GraphQL::Query::SerialExecution
|
27
32
|
end
|
28
33
|
|
29
34
|
def_delegators :@rescue_middleware, :rescue_from, :remove_handler
|
data/lib/graphql/version.rb
CHANGED
@@ -22,6 +22,9 @@ describe GraphQL::Language::Parser do
|
|
22
22
|
... family # background info, of course
|
23
23
|
}
|
24
24
|
}
|
25
|
+
subscription watchStuff {
|
26
|
+
field, otherField
|
27
|
+
}
|
25
28
|
|
26
29
|
# a fragment:
|
27
30
|
fragment family on Species {
|
@@ -41,7 +44,7 @@ describe GraphQL::Language::Parser do
|
|
41
44
|
it 'parses operation definitions' do
|
42
45
|
assert(parser.operation_definition.parse_with_debug(%|{id, name, ...people}|), "just a selection")
|
43
46
|
assert(parser.operation_definition.parse_with_debug(%|query personStuff {id, name, ...people, ... stuff}|), "named fetch")
|
44
|
-
assert(parser.operation_definition.parse_with_debug(%|
|
47
|
+
assert(parser.operation_definition.parse_with_debug(%|subscription personStuff @flagDirective {id, name, ...people}|), "with a directive")
|
45
48
|
assert(parser.operation_definition.parse_with_debug(%|mutation changeStuff($stuff: Int = 1 $things: [SomeType]! = [{something: 1}, {something: 2}], $another: Sometype = {something: 3}) { id }|), "mutation with arguments")
|
46
49
|
assert(parser.operation_definition.parse_with_debug(%|mutation { id }|), "unnamed")
|
47
50
|
end
|
data/spec/graphql/schema_spec.rb
CHANGED
@@ -13,4 +13,11 @@ describe GraphQL::Schema do
|
|
13
13
|
assert_equal(2, rescue_middleware.rescue_table.length)
|
14
14
|
end
|
15
15
|
end
|
16
|
+
|
17
|
+
describe "#subscription" do
|
18
|
+
it "calls fields on the subscription type" do
|
19
|
+
res = schema.execute("subscription { test }")
|
20
|
+
assert_equal("Test", res["data"]["test"])
|
21
|
+
end
|
22
|
+
end
|
16
23
|
end
|
@@ -1,73 +1,74 @@
|
|
1
1
|
# This GraphQL Schema performs operations on numbers.
|
2
2
|
# It can perform operations on values you give it and return values
|
3
3
|
# It also maintains some state which can be updated or read
|
4
|
+
module Calculator
|
5
|
+
# You can reduce a list of values to a single value
|
6
|
+
REDUCERS = {
|
7
|
+
"SUM" => -> (values) { [values.inject(&:+)] },
|
8
|
+
"MAX" => :max.to_proc,
|
9
|
+
"MIN" => :min.to_proc,
|
10
|
+
}
|
4
11
|
|
5
|
-
|
6
|
-
REDUCERS
|
7
|
-
|
8
|
-
|
9
|
-
"MIN" => :min.to_proc,
|
10
|
-
}
|
11
|
-
|
12
|
-
ReducerEnum = GraphQL::EnumType.define do
|
13
|
-
REDUCERS.map do |op_name, op_proc|
|
14
|
-
value(op_name)
|
12
|
+
ReducerEnum = GraphQL::EnumType.define do
|
13
|
+
REDUCERS.map do |op_name, op_proc|
|
14
|
+
value(op_name)
|
15
|
+
end
|
15
16
|
end
|
16
|
-
end
|
17
17
|
|
18
|
-
# You can make a new list by transforming each member
|
19
|
-
MAPPERS = {
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
}
|
18
|
+
# You can make a new list by transforming each member
|
19
|
+
MAPPERS = {
|
20
|
+
"ADD" => -> (val, arg) { val + arg },
|
21
|
+
"SUB" => -> (val, arg) { val - arg },
|
22
|
+
"EQ" => -> (val, arg) { val == arg ? 1 : 0},
|
23
|
+
}
|
24
24
|
|
25
|
-
MapperEnum = GraphQL::EnumType.define do
|
26
|
-
|
27
|
-
|
25
|
+
MapperEnum = GraphQL::EnumType.define do
|
26
|
+
MAPPERS.map do |op_name, op_proc|
|
27
|
+
value(op_name)
|
28
|
+
end
|
28
29
|
end
|
29
|
-
end
|
30
30
|
|
31
|
-
# Input a list of integers
|
32
|
-
ListOfInts = GraphQL::INT_TYPE.to_list_type
|
31
|
+
# Input a list of integers
|
32
|
+
ListOfInts = GraphQL::INT_TYPE.to_list_type
|
33
33
|
|
34
|
-
# Expose a list of values and perform operations
|
35
|
-
ValuesType = GraphQL::ObjectType.define do
|
36
|
-
|
37
|
-
|
38
|
-
|
34
|
+
# Expose a list of values and perform operations
|
35
|
+
ValuesType = GraphQL::ObjectType.define do
|
36
|
+
field :values, ListOfInts do
|
37
|
+
resolve -> (obj, _args, _ctx) { obj }
|
38
|
+
end
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
40
|
+
# Get a single value based on the values in this list
|
41
|
+
field :reduce, types.Int do
|
42
|
+
argument :operation, !ReducerEnum
|
43
|
+
resolve -> (obj, args, ctx) {
|
44
|
+
reduce_name = args[:operation]
|
45
|
+
reduce_fn = REDUCERS[reduce_name]
|
46
|
+
reduce_fn.call(obj)
|
47
|
+
}
|
48
|
+
end
|
49
49
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
50
|
+
# Handle self-referential fields by wrapping the type in a proc.
|
51
|
+
# It will be lazy-eval'ed
|
52
|
+
field :map, -> { ValuesType } do
|
53
|
+
argument :operation, !MapperEnum
|
54
|
+
argument :argument, !types.Int
|
55
|
+
resolve -> (obj, args, ctx) {
|
56
|
+
op_arg = args[:argument]
|
57
|
+
op_name = args[:operation]
|
58
|
+
op_func = MAPPERS[op_name]
|
59
|
+
obj.map { |item| op_func.call(item, op_arg) }
|
60
|
+
}
|
61
|
+
end
|
61
62
|
end
|
62
|
-
end
|
63
63
|
|
64
|
-
QueryType = GraphQL::ObjectType.define do
|
65
|
-
|
64
|
+
QueryType = GraphQL::ObjectType.define do
|
65
|
+
name("Query")
|
66
66
|
|
67
|
-
|
68
|
-
|
69
|
-
|
67
|
+
field :perform, ValuesType do
|
68
|
+
argument :initial, !ListOfInts
|
69
|
+
resolve -> (obj, args, ctx) { args[:initial] }
|
70
|
+
end
|
70
71
|
end
|
71
|
-
end
|
72
72
|
|
73
|
-
|
73
|
+
Schema = GraphQL::Schema.new(query: QueryType)
|
74
|
+
end
|
data/spec/support/dairy_app.rb
CHANGED
@@ -219,5 +219,16 @@ MutationType = GraphQL::ObjectType.define do
|
|
219
219
|
end
|
220
220
|
end
|
221
221
|
|
222
|
-
|
222
|
+
SubscriptionType = GraphQL::ObjectType.define do
|
223
|
+
name "Subscription"
|
224
|
+
field :test, types.String do
|
225
|
+
resolve -> (o, a, c) { "Test" }
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
DummySchema = GraphQL::Schema.new(
|
230
|
+
query: QueryType,
|
231
|
+
mutation: MutationType,
|
232
|
+
subscription: SubscriptionType,
|
233
|
+
)
|
223
234
|
DummySchema.rescue_from(NoSuchDairyError) { |err| err.message }
|
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.10.
|
4
|
+
version: 0.10.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Mosolgo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parslet
|