graphql 0.10.1 → 0.10.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/graphql/language/parser.rb +1 -1
- data/lib/graphql/language/transform.rb +1 -0
- data/lib/graphql/schema/type_reducer.rb +4 -2
- data/lib/graphql/version.rb +1 -1
- data/readme.md +5 -1
- data/spec/graphql/language/parser_spec.rb +1 -1
- data/spec/graphql/language/transform_spec.rb +1 -1
- data/spec/graphql/schema/type_reducer_spec.rb +13 -1
- data/spec/support/calculator_schema.rb +73 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a8c997dbb80987c2b0312c95913b8cb7bef898be
|
4
|
+
data.tar.gz: f77f1a3b90d96887a93ee560f8dd5ba5370a4453
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4f20614f4bcefc6ed7771c516046ae24581785ea25579e0bd5a8bdcad1cbd7d5eca7c981e59b4eec08bb54772cdb15c3f5f44f62eee1ea51d224e2c87608c821
|
7
|
+
data.tar.gz: a525157abbc09c4b1abd6e55a18b975305dbb93d8583709850bc159cb2e7d87ee62dd3b3d7fddf9188daa3e6c07f1bb83f2c8715c921c8b12b1e898e823dfbf0
|
@@ -97,7 +97,7 @@ module GraphQL
|
|
97
97
|
rule(:value_input_object) { str("{") >> space? >> value_input_object_pair.repeat(1).as(:input_object) >> space? >> str("}") }
|
98
98
|
rule(:value_input_object_pair) { space? >> name.as(:input_object_name) >> space? >> str(":") >> space? >> value.as(:input_object_value) >> separator? }
|
99
99
|
rule(:value_int) { (value_sign? >> match('\d').repeat(1)).as(:int) }
|
100
|
-
rule(:value_string) { str('"') >> value_string_char.repeat.as(:string) >> str('"')}
|
100
|
+
rule(:value_string) { str('"') >> value_string_char.repeat.maybe.as(:optional_string_content).as(:string) >> str('"')}
|
101
101
|
rule(:value_string_char) { value_string_escaped_char | value_string_escaped_unicode | value_string_source_char}
|
102
102
|
rule(:value_string_escaped_char) { str("\\") >> match('["\/bfnrt]') }
|
103
103
|
rule(:value_string_escaped_unicode) { str("\\") >> match('u[\dA-Fa-f]{4}')}
|
@@ -110,6 +110,7 @@ module GraphQL
|
|
110
110
|
string.gsub!(UTF_8, &UTF_8_REPLACE)
|
111
111
|
string
|
112
112
|
}
|
113
|
+
rule(optional_string_content: simple(:v)) { v.to_s }
|
113
114
|
rule(variable: simple(:v)) { create_node(:VariableIdentifier, name: v.to_s, position_source: v) }
|
114
115
|
rule(enum: simple(:v)) { create_node(:Enum, name: v.to_s, position_source: v)}
|
115
116
|
end
|
@@ -4,7 +4,6 @@ class GraphQL::Schema::TypeReducer
|
|
4
4
|
attr_reader :type, :existing_type_hash
|
5
5
|
|
6
6
|
def initialize(type, existing_type_hash)
|
7
|
-
type = type.nil? ? nil : type.unwrap
|
8
7
|
validate_type(type)
|
9
8
|
if type.respond_to?(:name) && existing_type_hash.fetch(type.name, nil).equal?(type)
|
10
9
|
@result = existing_type_hash
|
@@ -58,7 +57,10 @@ class GraphQL::Schema::TypeReducer
|
|
58
57
|
end
|
59
58
|
|
60
59
|
def reduce_type(type, type_hash)
|
61
|
-
|
60
|
+
unless type.is_a?(GraphQL::BaseType)
|
61
|
+
raise GraphQL::Schema::InvalidTypeError.new(type, ["Must be a GraphQL::BaseType"])
|
62
|
+
end
|
63
|
+
self.class.new(type.unwrap, type_hash).result
|
62
64
|
end
|
63
65
|
|
64
66
|
def validate_type(type)
|
data/lib/graphql/version.rb
CHANGED
data/readme.md
CHANGED
@@ -8,7 +8,11 @@
|
|
8
8
|
|
9
9
|
A Ruby implementation of [GraphQL](http://graphql.org/).
|
10
10
|
|
11
|
-
-
|
11
|
+
- Guides
|
12
|
+
- [Introduction](https://github.com/rmosolgo/graphql-ruby/blob/master/guides/introduction.md)
|
13
|
+
- [Defining Your Schema](https://github.com/rmosolgo/graphql-ruby/blob/master/guides/defining_your_schema.md)
|
14
|
+
- [Executing Queries](https://github.com/rmosolgo/graphql-ruby/blob/master/guides/executing_queries.md)
|
15
|
+
|
12
16
|
- [API Documentation](http://www.rubydoc.info/github/rmosolgo/graphql-ruby)
|
13
17
|
|
14
18
|
## Installation
|
@@ -68,7 +68,7 @@ describe GraphQL::Language::Parser do
|
|
68
68
|
assert(parser.field.parse_with_debug(%|myField { name, id }|), 'gets subselections')
|
69
69
|
assert(parser.field.parse_with_debug(%{myAlias: myField}), 'gets an alias')
|
70
70
|
assert(parser.field.parse_with_debug(%{myField(intKey: 1, floatKey: 1.1e5)}), 'gets arguments')
|
71
|
-
assert(parser.field.parse_with_debug('myAlias: myField(stringKey: "\"my_string\"", boolKey: false, objKey: { key : true }, otherObjKey: {key: true})'), 'gets alias and arguments')
|
71
|
+
assert(parser.field.parse_with_debug('myAlias: myField(stringKey: "\"my_string\"", emptyStringKey: "", boolKey: false, objKey: { key : true }, otherObjKey: {key: true})'), 'gets alias and arguments')
|
72
72
|
assert(parser.field.parse_with_debug(%|myField @withFlag, @skip(if: true) { name, id }|), 'gets with directive')
|
73
73
|
end
|
74
74
|
|
@@ -88,7 +88,7 @@ describe GraphQL::Language::Transform do
|
|
88
88
|
end
|
89
89
|
|
90
90
|
it 'transforms fields' do
|
91
|
-
res = get_result(%|best_pals: friends(first: 3, coolnessLevel: SO_COOL, query: {nice: {very: true}})|, parse: :field)
|
91
|
+
res = get_result(%|best_pals: friends(first: 3, coolnessLevel: SO_COOL, query: {nice: {very: true}}, emptyStr: "")|, parse: :field)
|
92
92
|
assert_equal(GraphQL::Language::Nodes::Field, res.class)
|
93
93
|
assert_equal(1, res.line)
|
94
94
|
assert_equal(1, res.col)
|
@@ -51,10 +51,22 @@ describe GraphQL::Schema::TypeReducer do
|
|
51
51
|
end
|
52
52
|
}
|
53
53
|
|
54
|
-
|
54
|
+
let(:another_invalid_type) {
|
55
|
+
GraphQL::ObjectType.define do
|
56
|
+
name "AnotherInvalidType"
|
57
|
+
field :someField, String
|
58
|
+
end
|
59
|
+
}
|
60
|
+
|
61
|
+
it 'raises an InvalidTypeError when passed nil' do
|
55
62
|
reducer = GraphQL::Schema::TypeReducer.new(invalid_type, {})
|
56
63
|
assert_raises(GraphQL::Schema::InvalidTypeError) { reducer.result }
|
57
64
|
end
|
65
|
+
|
66
|
+
it 'raises an InvalidTypeError when passed an object that isnt a GraphQL::BaseType' do
|
67
|
+
reducer = GraphQL::Schema::TypeReducer.new(another_invalid_type, {})
|
68
|
+
assert_raises(GraphQL::Schema::InvalidTypeError) { reducer.result }
|
69
|
+
end
|
58
70
|
end
|
59
71
|
|
60
72
|
describe 'when a schema has multiple types with the same name' do
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# This GraphQL Schema performs operations on numbers.
|
2
|
+
# It can perform operations on values you give it and return values
|
3
|
+
# It also maintains some state which can be updated or read
|
4
|
+
|
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
|
+
}
|
11
|
+
|
12
|
+
ReducerEnum = GraphQL::EnumType.define do
|
13
|
+
REDUCERS.map do |op_name, op_proc|
|
14
|
+
value(op_name)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
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
|
+
|
25
|
+
MapperEnum = GraphQL::EnumType.define do
|
26
|
+
MAPPERS.map do |op_name, op_proc|
|
27
|
+
value(op_name)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
# Input a list of integers
|
32
|
+
ListOfInts = GraphQL::INT_TYPE.to_list_type
|
33
|
+
|
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
|
+
|
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
|
+
|
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
|
62
|
+
end
|
63
|
+
|
64
|
+
QueryType = GraphQL::ObjectType.define do
|
65
|
+
name("Query")
|
66
|
+
|
67
|
+
field :perform, ValuesType do
|
68
|
+
argument :initial, !ListOfInts
|
69
|
+
resolve -> (obj, args, ctx) { args[:initial] }
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
CalculatorSchema = GraphQL::Schema.new(query: QueryType)
|
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.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: 2015-10
|
11
|
+
date: 2015-11-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parslet
|
@@ -313,6 +313,7 @@ files:
|
|
313
313
|
- spec/graphql/static_validation/validator_spec.rb
|
314
314
|
- spec/graphql/union_type_spec.rb
|
315
315
|
- spec/spec_helper.rb
|
316
|
+
- spec/support/calculator_schema.rb
|
316
317
|
- spec/support/dairy_app.rb
|
317
318
|
- spec/support/dairy_data.rb
|
318
319
|
- spec/support/star_wars_data.rb
|
@@ -394,6 +395,7 @@ test_files:
|
|
394
395
|
- spec/graphql/static_validation/validator_spec.rb
|
395
396
|
- spec/graphql/union_type_spec.rb
|
396
397
|
- spec/spec_helper.rb
|
398
|
+
- spec/support/calculator_schema.rb
|
397
399
|
- spec/support/dairy_app.rb
|
398
400
|
- spec/support/dairy_data.rb
|
399
401
|
- spec/support/star_wars_data.rb
|