graphql 0.1.0 → 0.2.0
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/graph_ql/directive.rb +9 -5
- data/lib/graph_ql/directives/include_directive.rb +2 -2
- data/lib/graph_ql/directives/skip_directive.rb +2 -2
- data/lib/graph_ql/enum.rb +5 -8
- data/lib/graph_ql/field.rb +50 -0
- data/lib/graph_ql/interface.rb +4 -0
- data/lib/graph_ql/introspection/arguments_field.rb +2 -2
- data/lib/graph_ql/introspection/directive_type.rb +10 -10
- data/lib/graph_ql/introspection/enum_value_type.rb +11 -8
- data/lib/graph_ql/introspection/enum_values_field.rb +5 -5
- data/lib/graph_ql/introspection/field_type.rb +14 -10
- data/lib/graph_ql/introspection/fields_field.rb +4 -4
- data/lib/graph_ql/introspection/input_fields_field.rb +3 -3
- data/lib/graph_ql/introspection/input_value_type.rb +8 -8
- data/lib/graph_ql/introspection/interfaces_field.rb +5 -0
- data/lib/graph_ql/introspection/of_type_field.rb +3 -9
- data/lib/graph_ql/introspection/possible_types_field.rb +3 -10
- data/lib/graph_ql/introspection/schema_type.rb +8 -14
- data/lib/graph_ql/introspection/type_kind_enum.rb +1 -1
- data/lib/graph_ql/introspection/type_type.rb +17 -19
- data/lib/graph_ql/introspection/typename_field.rb +15 -0
- data/lib/graph_ql/parser.rb +9 -0
- data/lib/graph_ql/parser/nodes.rb +17 -7
- data/lib/graph_ql/parser/parser.rb +7 -7
- data/lib/graph_ql/parser/transform.rb +23 -20
- data/lib/graph_ql/parser/visitor.rb +29 -13
- data/lib/graph_ql/query.rb +39 -16
- data/lib/graph_ql/query/field_resolution_strategy.rb +15 -11
- data/lib/graph_ql/query/type_resolver.rb +4 -2
- data/lib/graph_ql/repl.rb +1 -1
- data/lib/graph_ql/schema.rb +19 -7
- data/lib/graph_ql/schema/each_item_validator.rb +12 -0
- data/lib/graph_ql/schema/field_validator.rb +13 -0
- data/lib/graph_ql/schema/implementation_validator.rb +21 -0
- data/lib/graph_ql/schema/schema_validator.rb +10 -0
- data/lib/graph_ql/schema/type_reducer.rb +6 -6
- data/lib/graph_ql/schema/type_validator.rb +47 -0
- data/lib/graph_ql/static_validation.rb +18 -0
- data/lib/graph_ql/static_validation/argument_literals_are_compatible.rb +13 -0
- data/lib/graph_ql/static_validation/arguments_are_defined.rb +10 -0
- data/lib/graph_ql/static_validation/arguments_validator.rb +16 -0
- data/lib/graph_ql/static_validation/directives_are_defined.rb +18 -0
- data/lib/graph_ql/static_validation/fields_are_defined_on_type.rb +29 -0
- data/lib/graph_ql/static_validation/fields_have_appropriate_selections.rb +31 -0
- data/lib/graph_ql/static_validation/fields_will_merge.rb +93 -0
- data/lib/graph_ql/static_validation/fragment_types_exist.rb +24 -0
- data/lib/graph_ql/static_validation/fragments_are_used.rb +30 -0
- data/lib/graph_ql/static_validation/literal_validator.rb +27 -0
- data/lib/graph_ql/static_validation/message.rb +29 -0
- data/lib/graph_ql/static_validation/required_arguments_are_present.rb +13 -0
- data/lib/graph_ql/static_validation/type_stack.rb +87 -0
- data/lib/graph_ql/static_validation/validator.rb +48 -0
- data/lib/graph_ql/type_kinds.rb +50 -12
- data/lib/graph_ql/types/argument_definer.rb +7 -0
- data/lib/graph_ql/types/boolean_type.rb +3 -3
- data/lib/graph_ql/types/field_definer.rb +19 -0
- data/lib/graph_ql/types/float_type.rb +3 -3
- data/lib/graph_ql/types/input_object_type.rb +4 -0
- data/lib/graph_ql/types/input_value.rb +1 -1
- data/lib/graph_ql/types/int_type.rb +4 -4
- data/lib/graph_ql/types/list_type.rb +5 -1
- data/lib/graph_ql/types/non_null_type.rb +4 -0
- data/lib/graph_ql/types/object_type.rb +9 -20
- data/lib/graph_ql/types/scalar_type.rb +4 -0
- data/lib/graph_ql/types/string_type.rb +3 -3
- data/lib/graph_ql/types/type_definer.rb +5 -9
- data/lib/graph_ql/union.rb +6 -17
- data/lib/graph_ql/version.rb +1 -1
- data/lib/graphql.rb +58 -78
- data/readme.md +80 -7
- data/spec/graph_ql/interface_spec.rb +15 -1
- data/spec/graph_ql/introspection/directive_type_spec.rb +2 -2
- data/spec/graph_ql/introspection/schema_type_spec.rb +2 -1
- data/spec/graph_ql/introspection/type_type_spec.rb +16 -1
- data/spec/graph_ql/parser/parser_spec.rb +3 -1
- data/spec/graph_ql/parser/transform_spec.rb +12 -2
- data/spec/graph_ql/parser/visitor_spec.rb +13 -5
- data/spec/graph_ql/query_spec.rb +25 -13
- data/spec/graph_ql/schema/field_validator_spec.rb +21 -0
- data/spec/graph_ql/schema/type_reducer_spec.rb +2 -2
- data/spec/graph_ql/schema/type_validator_spec.rb +54 -0
- data/spec/graph_ql/static_validation/argument_literals_are_compatible_spec.rb +41 -0
- data/spec/graph_ql/static_validation/arguments_are_defined_spec.rb +40 -0
- data/spec/graph_ql/static_validation/directives_are_defined_spec.rb +33 -0
- data/spec/graph_ql/static_validation/fields_are_defined_on_type_spec.rb +59 -0
- data/spec/graph_ql/static_validation/fields_have_appropriate_selections_spec.rb +30 -0
- data/spec/graph_ql/{validations → static_validation}/fields_will_merge_spec.rb +24 -17
- data/spec/graph_ql/static_validation/fragment_types_exist_spec.rb +38 -0
- data/spec/graph_ql/static_validation/fragments_are_used_spec.rb +24 -0
- data/spec/graph_ql/static_validation/required_arguments_are_present_spec.rb +41 -0
- data/spec/graph_ql/static_validation/type_stack_spec.rb +35 -0
- data/spec/graph_ql/static_validation/validator_spec.rb +28 -0
- data/spec/graph_ql/types/object_type_spec.rb +1 -1
- data/spec/graph_ql/union_spec.rb +1 -14
- data/spec/support/dummy_app.rb +75 -53
- metadata +53 -31
- data/lib/graph_ql/fields/abstract_field.rb +0 -37
- data/lib/graph_ql/fields/access_field.rb +0 -24
- data/lib/graph_ql/fields/field.rb +0 -34
- data/lib/graph_ql/types/abstract_type.rb +0 -14
- data/lib/graph_ql/validations/fields_are_defined_on_type.rb +0 -44
- data/lib/graph_ql/validations/fields_will_merge.rb +0 -80
- data/lib/graph_ql/validations/fragments_are_used.rb +0 -24
- data/lib/graph_ql/validator.rb +0 -29
- data/spec/graph_ql/validations/fields_are_defined_on_type_spec.rb +0 -28
- data/spec/graph_ql/validations/fragments_are_used_spec.rb +0 -28
- data/spec/graph_ql/validator_spec.rb +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 45c3f35aae5e941e7bad2109eb9405e6afc081cc
|
4
|
+
data.tar.gz: 3cd3d8dd85a88e341552d0709aff11361937d157
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 274f08f78112de84f94dcb9fcdcc62da63a36a29000aad2055cf5e353327bb9ba3f673fe3e83c3a3c6405b360847f17104ab97c66a08323400f6df3f27f6044a
|
7
|
+
data.tar.gz: 82f47b290d9779b1214bb59857edb079369932d08686a8ac1af47c15ab1f3e549e4c8f9f269947836fe2093fc49badc6986e397466cb2d1010520bc3a765e7ff
|
data/lib/graph_ql/directive.rb
CHANGED
@@ -10,14 +10,15 @@ class GraphQL::Directive < GraphQL::ObjectType
|
|
10
10
|
|
11
11
|
attr_definable :on, :arguments
|
12
12
|
|
13
|
-
def initialize
|
13
|
+
def initialize
|
14
14
|
@arguments = {}
|
15
15
|
@on = []
|
16
|
-
yield(self
|
16
|
+
yield(self, GraphQL::TypeDefiner.instance, GraphQL::FieldDefiner.instance, GraphQL::ArgumentDefiner.instance)
|
17
17
|
end
|
18
18
|
|
19
19
|
def resolve(proc_or_arguments, proc=nil)
|
20
20
|
if proc.nil?
|
21
|
+
# resolve is being defined, just set it
|
21
22
|
@resolve_proc = proc_or_arguments
|
22
23
|
else
|
23
24
|
@resolve_proc.call(proc_or_arguments, proc)
|
@@ -25,12 +26,15 @@ class GraphQL::Directive < GraphQL::ObjectType
|
|
25
26
|
end
|
26
27
|
|
27
28
|
def arguments(new_arguments=nil)
|
28
|
-
if new_arguments.nil?
|
29
|
-
@arguments
|
30
|
-
else
|
29
|
+
if !new_arguments.nil?
|
31
30
|
@arguments = new_arguments
|
32
31
|
.reduce({}) {|memo, (k, v)| memo[k.to_s] = v; memo}
|
33
32
|
.each { |k, v| v.respond_to?("name=") && v.name = k}
|
34
33
|
end
|
34
|
+
@arguments
|
35
35
|
end
|
36
36
|
end
|
37
|
+
|
38
|
+
require 'graph_ql/directives/directive_chain'
|
39
|
+
require 'graph_ql/directives/include_directive'
|
40
|
+
require 'graph_ql/directives/skip_directive'
|
@@ -1,9 +1,9 @@
|
|
1
|
-
GraphQL::IncludeDirective = GraphQL::Directive.new do |d|
|
1
|
+
GraphQL::IncludeDirective = GraphQL::Directive.new do |d, type, field, arg|
|
2
2
|
d.name "include"
|
3
3
|
d.description "Include this part of the query if `if` is true"
|
4
4
|
d.on([GraphQL::Directive::ON_FIELD, GraphQL::Directive::ON_FRAGMENT])
|
5
5
|
d.arguments({
|
6
|
-
if:
|
6
|
+
if: arg.build({type: !GraphQL::BOOLEAN_TYPE})
|
7
7
|
})
|
8
8
|
d.resolve -> (arguments, proc) {
|
9
9
|
if arguments["if"]
|
@@ -1,9 +1,9 @@
|
|
1
|
-
GraphQL::SkipDirective = GraphQL::Directive.new do |d|
|
1
|
+
GraphQL::SkipDirective = GraphQL::Directive.new do |d, type, field, arg|
|
2
2
|
d.name "skip"
|
3
3
|
d.description "Ignore this part of the query if `if` is true"
|
4
4
|
d.on([GraphQL::Directive::ON_FIELD, GraphQL::Directive::ON_FRAGMENT])
|
5
5
|
d.arguments({
|
6
|
-
if:
|
6
|
+
if: arg.build({type: !GraphQL::BOOLEAN_TYPE})
|
7
7
|
})
|
8
8
|
d.resolve -> (arguments, proc) {
|
9
9
|
if !arguments["if"]
|
data/lib/graph_ql/enum.rb
CHANGED
@@ -5,21 +5,21 @@ class GraphQL::Enum
|
|
5
5
|
attr_reader :values
|
6
6
|
def initialize
|
7
7
|
@values = {}
|
8
|
-
yield(self
|
8
|
+
yield(self, GraphQL::TypeDefiner.instance, GraphQL::FieldDefiner.instance, GraphQL::ArgumentDefiner.instance)
|
9
9
|
end
|
10
10
|
|
11
11
|
def value(name, description=nil, deprecation_reason: nil)
|
12
12
|
@values[name] = EnumValue.new(name: name, description: description, deprecation_reason: deprecation_reason)
|
13
13
|
end
|
14
14
|
|
15
|
-
def [](val)
|
16
|
-
@values[val]
|
17
|
-
end
|
18
|
-
|
19
15
|
def kind
|
20
16
|
GraphQL::TypeKinds::ENUM
|
21
17
|
end
|
22
18
|
|
19
|
+
def coerce(value)
|
20
|
+
@values[value]
|
21
|
+
end
|
22
|
+
|
23
23
|
class EnumValue
|
24
24
|
attr_reader :name, :description, :deprecation_reason
|
25
25
|
def initialize(name:, description:, deprecation_reason:)
|
@@ -27,8 +27,5 @@ class GraphQL::Enum
|
|
27
27
|
@description = description
|
28
28
|
@deprecation_reason = deprecation_reason
|
29
29
|
end
|
30
|
-
def deprecated?
|
31
|
-
!!deprecation_reason
|
32
|
-
end
|
33
30
|
end
|
34
31
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class GraphQL::Field
|
2
|
+
extend GraphQL::Definable
|
3
|
+
attr_definable(:arguments, :deprecation_reason, :name, :description, :type)
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@arguments = {}
|
7
|
+
@resolve_proc = -> (o, a, c) { GraphQL::Query::DEFAULT_RESOLVE }
|
8
|
+
yield(self, GraphQL::TypeDefiner.instance, GraphQL::FieldDefiner.instance, GraphQL::ArgumentDefiner.instance)
|
9
|
+
end
|
10
|
+
|
11
|
+
def arguments(new_arguments=nil)
|
12
|
+
if !new_arguments.nil?
|
13
|
+
self.arguments=(new_arguments)
|
14
|
+
end
|
15
|
+
@arguments
|
16
|
+
end
|
17
|
+
|
18
|
+
def arguments=(new_arguments)
|
19
|
+
stringified_arguments = new_arguments
|
20
|
+
.reduce({}) { |memo, (key, value)| memo[key.to_s] = value; memo }
|
21
|
+
# Set the name from its context on this type:
|
22
|
+
stringified_arguments.each {|k, v| v.respond_to?("name=") && v.name = k }
|
23
|
+
@arguments = stringified_arguments
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
# Used when defining:
|
28
|
+
# resolve -> (obj, args, ctx) { obj.get_value }
|
29
|
+
# Also used when executing queries:
|
30
|
+
# field.resolve(obj, args, ctx)
|
31
|
+
def resolve(proc_or_object, arguments=nil, ctx=nil)
|
32
|
+
if arguments.nil? && ctx.nil?
|
33
|
+
@resolve_proc = proc_or_object
|
34
|
+
else
|
35
|
+
@resolve_proc.call(proc_or_object, arguments, ctx)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# You can pass a proc which will cause the type to be lazy-evaled,
|
40
|
+
# That's nice if you have load-order issues
|
41
|
+
def type(type_or_proc=nil)
|
42
|
+
if !type_or_proc.nil?
|
43
|
+
@type = type_or_proc
|
44
|
+
elsif @type.is_a?(Proc)
|
45
|
+
# lazy-eval it
|
46
|
+
@type = @type.call
|
47
|
+
end
|
48
|
+
@type
|
49
|
+
end
|
50
|
+
end
|
data/lib/graph_ql/interface.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
GraphQL::ArgumentsField = GraphQL::Field.new do |f|
|
1
|
+
GraphQL::Introspection::ArgumentsField = GraphQL::Field.new do |f|
|
2
2
|
f.description "Arguments allowed to this object"
|
3
|
-
f.type GraphQL::ListType.new(of_type: GraphQL::InputValueType)
|
3
|
+
f.type GraphQL::ListType.new(of_type: GraphQL::Introspection::InputValueType)
|
4
4
|
f.resolve -> (target, a, c) { target.arguments.values }
|
5
5
|
end
|
@@ -1,12 +1,12 @@
|
|
1
|
-
GraphQL::DirectiveType = GraphQL::ObjectType.new do
|
2
|
-
name "__Directive"
|
3
|
-
description "A query directive in this schema"
|
4
|
-
fields({
|
5
|
-
name: field(type: !type.String, desc: "The name of this directive"),
|
6
|
-
description: field(type: type.String, desc: "The description for this type"),
|
7
|
-
args: GraphQL::ArgumentsField,
|
8
|
-
onOperation: field(type: !type.Boolean, property: :on_operation?, desc: "Does this directive apply to operations?"),
|
9
|
-
onFragment: field(type: !type.Boolean, property: :on_fragment?, desc: "Does this directive apply to fragments?"),
|
10
|
-
onField: field(type: !type.Boolean, property: :on_field?, desc: "Does this directive apply to fields?"),
|
1
|
+
GraphQL::Introspection::DirectiveType = GraphQL::ObjectType.new do |t, type, field|
|
2
|
+
t.name "__Directive"
|
3
|
+
t.description "A query directive in this schema"
|
4
|
+
t.fields({
|
5
|
+
name: field.build(type: !type.String, desc: "The name of this directive"),
|
6
|
+
description: field.build(type: type.String, desc: "The description for this type"),
|
7
|
+
args: GraphQL::Introspection::ArgumentsField,
|
8
|
+
onOperation: field.build(type: !type.Boolean, property: :on_operation?, desc: "Does this directive apply to operations?"),
|
9
|
+
onFragment: field.build(type: !type.Boolean, property: :on_fragment?, desc: "Does this directive apply to fragments?"),
|
10
|
+
onField: field.build(type: !type.Boolean, property: :on_field?, desc: "Does this directive apply to fields?"),
|
11
11
|
})
|
12
12
|
end
|
@@ -1,10 +1,13 @@
|
|
1
|
-
GraphQL::EnumValueType = GraphQL::ObjectType.new do
|
2
|
-
name "__EnumValue"
|
3
|
-
description "A possible value for an Enum"
|
4
|
-
fields({
|
5
|
-
name:
|
6
|
-
description:
|
7
|
-
deprecationReason:
|
8
|
-
isDeprecated:
|
1
|
+
GraphQL::Introspection::EnumValueType = GraphQL::ObjectType.new do |t, type, field|
|
2
|
+
t.name "__EnumValue"
|
3
|
+
t.description "A possible value for an Enum"
|
4
|
+
t.fields({
|
5
|
+
name: field.build(type: !type.String),
|
6
|
+
description: field.build(type: !type.String),
|
7
|
+
deprecationReason: field.build(type: !type.String, property: :deprecation_reason),
|
8
|
+
isDeprecated: GraphQL::Field.new { |f|
|
9
|
+
f.type !type.Boolean
|
10
|
+
f.resolve -> (obj, a, c) { !!obj.deprecation_reason }
|
11
|
+
},
|
9
12
|
})
|
10
13
|
end
|
@@ -1,14 +1,14 @@
|
|
1
|
-
GraphQL::EnumValuesField = GraphQL::Field.new do |f|
|
1
|
+
GraphQL::Introspection::EnumValuesField = GraphQL::Field.new do |f, type, field, arg|
|
2
2
|
f.description "Values for this enum"
|
3
|
-
f.type GraphQL::
|
3
|
+
f.type type[!GraphQL::Introspection::EnumValueType]
|
4
4
|
f.arguments({
|
5
|
-
includeDeprecated: {type: GraphQL::BOOLEAN_TYPE, default_value: false}
|
5
|
+
includeDeprecated: arg.build({type: GraphQL::BOOLEAN_TYPE, default_value: false})
|
6
6
|
})
|
7
7
|
f.resolve -> (object, arguments, context) {
|
8
|
-
return nil if object.kind
|
8
|
+
return nil if !object.kind.enum?
|
9
9
|
fields = object.values.values
|
10
10
|
if !arguments["includeDeprecated"]
|
11
|
-
fields = fields.select {|f| !f.
|
11
|
+
fields = fields.select {|f| !f.deprecation_reason }
|
12
12
|
end
|
13
13
|
fields
|
14
14
|
}
|
@@ -1,11 +1,15 @@
|
|
1
|
-
GraphQL::FieldType = GraphQL::ObjectType.new do
|
2
|
-
name "__Field"
|
3
|
-
description "Field on a GraphQL type"
|
4
|
-
|
5
|
-
name:
|
6
|
-
description:
|
7
|
-
type:
|
8
|
-
isDeprecated:
|
9
|
-
|
10
|
-
|
1
|
+
GraphQL::Introspection::FieldType = GraphQL::ObjectType.new do |t, type, field|
|
2
|
+
t.name "__Field"
|
3
|
+
t.description "Field on a GraphQL type"
|
4
|
+
t.fields({
|
5
|
+
name: field.build(type: !type.String, desc: "The name for accessing this field"),
|
6
|
+
description: field.build(type: !type.String, desc: "The description of this field"),
|
7
|
+
type: field.build(type: !GraphQL::Introspection::TypeType, desc: "The return type of this field"),
|
8
|
+
isDeprecated: GraphQL::Field.new { |f|
|
9
|
+
f.type !type.Boolean
|
10
|
+
f.description "Is this field deprecated?"
|
11
|
+
f.resolve -> (obj, a, c) { !!obj.deprecation_reason }
|
12
|
+
},
|
13
|
+
deprecationReason: field.build(type: type.String, property: :deprecation_reason, desc: "Why this field was deprecated"),
|
14
|
+
})
|
11
15
|
end
|
@@ -1,13 +1,13 @@
|
|
1
|
-
GraphQL::FieldsField = GraphQL::Field.new do |f|
|
1
|
+
GraphQL::Introspection::FieldsField = GraphQL::Field.new do |f, type, field, arg|
|
2
2
|
f.description "List of fields on this object"
|
3
|
-
f.type -> { GraphQL::
|
3
|
+
f.type -> { type[!GraphQL::Introspection::FieldType] }
|
4
4
|
f.arguments({
|
5
|
-
includeDeprecated: {type: GraphQL::BOOLEAN_TYPE, default_value: false}
|
5
|
+
includeDeprecated: arg.build({type: GraphQL::BOOLEAN_TYPE, default_value: false})
|
6
6
|
})
|
7
7
|
f.resolve -> (object, arguments, context) {
|
8
8
|
fields = object.fields.values
|
9
9
|
if !arguments["includeDeprecated"]
|
10
|
-
fields = fields.select {|f| !f.
|
10
|
+
fields = fields.select {|f| !f.deprecation_reason }
|
11
11
|
end
|
12
12
|
fields
|
13
13
|
}
|
@@ -1,9 +1,9 @@
|
|
1
|
-
GraphQL::InputFieldsField = GraphQL::Field.new do |f|
|
1
|
+
GraphQL::Introspection::InputFieldsField = GraphQL::Field.new do |f, type|
|
2
2
|
f.name "inputFields"
|
3
3
|
f.description "fields on this input object"
|
4
|
-
f.type GraphQL::
|
4
|
+
f.type type[GraphQL::Introspection::InputValueType]
|
5
5
|
f.resolve -> (target, a, c) {
|
6
|
-
if target.kind
|
6
|
+
if target.kind.input_object?
|
7
7
|
target.input_fields.values
|
8
8
|
else
|
9
9
|
nil
|
@@ -1,10 +1,10 @@
|
|
1
|
-
GraphQL::InputValueType = GraphQL::ObjectType.new do
|
2
|
-
name "InputValue"
|
3
|
-
description "An input for a field or InputObject"
|
4
|
-
fields({
|
5
|
-
name: field(type: !type.String, desc: "The key for this value"),
|
6
|
-
description: field(type: type.String, desc: "What this value is used for"),
|
7
|
-
type: field(type: -> { GraphQL::TypeType }, desc: "The expected type for this value"),
|
8
|
-
defaultValue: field(type: type.String, property: :default_value, desc: "The value applied if no other value is provided")
|
1
|
+
GraphQL::Introspection::InputValueType = GraphQL::ObjectType.new do |t, type, field|
|
2
|
+
t.name "InputValue"
|
3
|
+
t.description "An input for a field or InputObject"
|
4
|
+
t.fields({
|
5
|
+
name: field.build(type: !type.String, desc: "The key for this value"),
|
6
|
+
description: field.build(type: type.String, desc: "What this value is used for"),
|
7
|
+
type: field.build(type: -> { GraphQL::Introspection::TypeType }, desc: "The expected type for this value"),
|
8
|
+
defaultValue: field.build(type: type.String, property: :default_value, desc: "The value applied if no other value is provided")
|
9
9
|
})
|
10
10
|
end
|
@@ -0,0 +1,5 @@
|
|
1
|
+
GraphQL::Introspection::InterfacesField = GraphQL::Field.new do |f, type|
|
2
|
+
f.description "Interfaces which this object implements"
|
3
|
+
f.type -> { !type[!GraphQL::Introspection::TypeType] }
|
4
|
+
f.resolve -> (target, a, c) { target.kind.object? ? target.interfaces : nil }
|
5
|
+
end
|
@@ -1,12 +1,6 @@
|
|
1
|
-
GraphQL::OfTypeField = GraphQL::Field.new do |f|
|
1
|
+
GraphQL::Introspection::OfTypeField = GraphQL::Field.new do |f|
|
2
2
|
f.name "ofType"
|
3
3
|
f.description "The modified type of this type"
|
4
|
-
f.type -> { GraphQL::TypeType }
|
5
|
-
f.resolve -> (obj, args, ctx) {
|
6
|
-
if [GraphQL::TypeKinds::LIST, GraphQL::TypeKinds::NON_NULL].include?(obj.kind)
|
7
|
-
obj.of_type
|
8
|
-
else
|
9
|
-
nil
|
10
|
-
end
|
11
|
-
}
|
4
|
+
f.type -> { GraphQL::Introspection::TypeType }
|
5
|
+
f.resolve -> (obj, args, ctx) { obj.kind.wraps? ? obj.of_type : nil }
|
12
6
|
end
|
@@ -1,12 +1,5 @@
|
|
1
|
-
GraphQL::PossibleTypesField = GraphQL::Field.new do |f|
|
2
|
-
POSSIBLE_TYPE_KINDS = [GraphQL::TypeKinds::UNION, GraphQL::TypeKinds::INTERFACE]
|
1
|
+
GraphQL::Introspection::PossibleTypesField = GraphQL::Field.new do |f, type|
|
3
2
|
f.description "Types which compose this Union or Interface"
|
4
|
-
f.type -> { GraphQL::
|
5
|
-
f.resolve -> (target, a, c) {
|
6
|
-
if POSSIBLE_TYPE_KINDS.include?(target.kind)
|
7
|
-
target.possible_types
|
8
|
-
else
|
9
|
-
nil
|
10
|
-
end
|
11
|
-
}
|
3
|
+
f.type -> { type[GraphQL::Introspection::TypeType] }
|
4
|
+
f.resolve -> (target, a, c) { target.kind.resolves? ? target.possible_types : nil }
|
12
5
|
end
|
@@ -1,32 +1,26 @@
|
|
1
|
-
GraphQL::SchemaType = GraphQL::ObjectType.new do
|
2
|
-
name "__Schema"
|
3
|
-
description "A GraphQL schema"
|
4
|
-
fields({
|
1
|
+
GraphQL::Introspection::SchemaType = GraphQL::ObjectType.new do |t, type|
|
2
|
+
t.name "__Schema"
|
3
|
+
t.description "A GraphQL schema"
|
4
|
+
t.fields({
|
5
5
|
types: GraphQL::Field.new { |f|
|
6
|
-
f.type !type[!GraphQL::TypeType]
|
6
|
+
f.type !type[!GraphQL::Introspection::TypeType]
|
7
7
|
f.description "Types in this schema"
|
8
8
|
f.resolve -> (obj, arg, ctx) { obj.types.values }
|
9
9
|
},
|
10
10
|
directives: GraphQL::Field.new { |f|
|
11
|
-
f.type !type[!GraphQL::DirectiveType]
|
11
|
+
f.type !type[!GraphQL::Introspection::DirectiveType]
|
12
12
|
f.description "Directives in this schema"
|
13
13
|
f.resolve -> (obj, arg, ctx) { obj.directives.values }
|
14
14
|
},
|
15
15
|
queryType: GraphQL::Field.new { |f|
|
16
|
-
f.type !GraphQL::TypeType
|
16
|
+
f.type !GraphQL::Introspection::TypeType
|
17
17
|
f.description "The query root of this schema"
|
18
18
|
f.resolve -> (obj, arg, ctx) { obj.query }
|
19
19
|
},
|
20
20
|
mutationType: GraphQL::Field.new { |f|
|
21
|
-
f.type GraphQL::TypeType
|
21
|
+
f.type GraphQL::Introspection::TypeType
|
22
22
|
f.description "The mutation root of this schema"
|
23
23
|
f.resolve -> (obj, arg, ctx) { obj.mutation }
|
24
24
|
},
|
25
25
|
})
|
26
26
|
end
|
27
|
-
# type __Schema {
|
28
|
-
# types: [__Type!]!
|
29
|
-
# queryType: __Type!
|
30
|
-
# mutationType: __Type
|
31
|
-
# directives: [__Directive!]!
|
32
|
-
# }
|
@@ -1,22 +1,20 @@
|
|
1
|
-
GraphQL::TypeType = GraphQL::ObjectType.new do
|
2
|
-
name "__Type"
|
3
|
-
description "A type in the GraphQL schema"
|
1
|
+
GraphQL::Introspection::TypeType = GraphQL::ObjectType.new do |t, type, field|
|
2
|
+
t.name "__Type"
|
3
|
+
t.description "A type in the GraphQL schema"
|
4
4
|
|
5
|
-
|
6
|
-
name:
|
7
|
-
kind:
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
5
|
+
t.fields = {
|
6
|
+
name: field.build(type: !type.String, desc: "The name of this type"),
|
7
|
+
kind: GraphQL::Field.new { |f|
|
8
|
+
f.type GraphQL::Introspection::TypeKindEnum
|
9
|
+
f.description "The kind of this type"
|
10
|
+
f.resolve -> (target, a, c) { target.kind.name }
|
11
|
+
},
|
12
|
+
description: field.build(type: type.String, desc: "The description for this type"),
|
13
|
+
fields: GraphQL::Introspection::FieldsField,
|
14
|
+
ofType: GraphQL::Introspection::OfTypeField,
|
15
|
+
inputFields: GraphQL::Introspection::InputFieldsField,
|
16
|
+
possibleTypes: GraphQL::Introspection::PossibleTypesField,
|
17
|
+
enumValues: GraphQL::Introspection::EnumValuesField,
|
18
|
+
interfaces: GraphQL::Introspection::InterfacesField,
|
14
19
|
}
|
15
20
|
end
|
16
|
-
# type __Type {
|
17
|
-
# # OBJECT only
|
18
|
-
# interfaces: [__Type!]
|
19
|
-
#
|
20
|
-
# # ENUM only
|
21
|
-
# enumValues(includeDeprecated: Boolean = false): [__EnumValue!]
|
22
|
-
# }
|