graphql 0.4.0 → 0.5.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/argument.rb +38 -4
- data/lib/graph_ql/boolean_type.rb +3 -5
- data/lib/graph_ql/definition_helpers.rb +1 -0
- data/lib/graph_ql/definition_helpers/defined_by_config.rb +20 -0
- data/lib/graph_ql/enum_type.rb +52 -16
- data/lib/graph_ql/field.rb +79 -14
- data/lib/graph_ql/float_type.rb +3 -3
- data/lib/graph_ql/id_type.rb +3 -5
- data/lib/graph_ql/input_object_type.rb +41 -4
- data/lib/graph_ql/int_type.rb +3 -5
- data/lib/graph_ql/interface_type.rb +36 -8
- data/lib/graph_ql/introspection/arguments_field.rb +4 -4
- data/lib/graph_ql/introspection/directive_type.rb +9 -11
- data/lib/graph_ql/introspection/enum_value_type.rb +9 -12
- data/lib/graph_ql/introspection/enum_values_field.rb +6 -8
- data/lib/graph_ql/introspection/field_type.rb +11 -15
- data/lib/graph_ql/introspection/fields_field.rb +5 -7
- data/lib/graph_ql/introspection/input_fields_field.rb +5 -5
- data/lib/graph_ql/introspection/input_value_type.rb +7 -9
- data/lib/graph_ql/introspection/interfaces_field.rb +4 -4
- data/lib/graph_ql/introspection/of_type_field.rb +5 -5
- data/lib/graph_ql/introspection/possible_types_field.rb +4 -4
- data/lib/graph_ql/introspection/schema_field.rb +6 -8
- data/lib/graph_ql/introspection/schema_type.rb +19 -25
- data/lib/graph_ql/introspection/type_by_name_field.rb +7 -1
- data/lib/graph_ql/introspection/type_kind_enum.rb +4 -4
- data/lib/graph_ql/introspection/type_type.rb +18 -18
- data/lib/graph_ql/introspection/typename_field.rb +6 -10
- data/lib/graph_ql/object_type.rb +87 -12
- data/lib/graph_ql/scalar_type.rb +22 -0
- data/lib/graph_ql/schema.rb +1 -1
- data/lib/graph_ql/string_type.rb +3 -5
- data/lib/graph_ql/union_type.rb +24 -3
- data/lib/graph_ql/version.rb +1 -1
- data/lib/graphql.rb +1 -1
- data/readme.md +66 -64
- data/spec/graph_ql/field_spec.rb +3 -3
- data/spec/support/dairy_app.rb +119 -133
- data/spec/support/dairy_data.rb +1 -1
- data/spec/support/star_wars_schema.rb +50 -57
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a73d6da0ba5269a9b68a0bdd479058ac4b65783
|
4
|
+
data.tar.gz: fb49181fff74d8a45fa7ac2d6ef941ce9a20eedd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7fc070deec02d1ad30a5f6807692010920a0ee69395205a1cf11f1dd98ec3ebb1ea55ca228c60e5165d03644cdf38a8a1649c9025e00d46cdb72e715acd2e586
|
7
|
+
data.tar.gz: b22f2cbe6338c2d30f1a6b1ca6d772d49d6ba396370f519b473105c61ae512e5605e891ca1f53936f8f41d08d49e4e8d1615f759cc34ebb646a22ad20cc0d755
|
data/lib/graph_ql/argument.rb
CHANGED
@@ -1,10 +1,44 @@
|
|
1
1
|
# Used for defined arguments ({Field}, {InputObjectType})
|
2
2
|
#
|
3
|
-
#
|
3
|
+
# @example defining an argument for a field
|
4
|
+
# GraphQL::Field.define do
|
5
|
+
# # ...
|
6
|
+
# argument :favoriteFood, types.String, "Favorite thing to eat", default_value: "pizza"
|
7
|
+
# end
|
8
|
+
#
|
9
|
+
# @example defining an input field for an {InputObjectType}
|
10
|
+
# GraphQL::InputObjectType.define do
|
11
|
+
# input_field :newName, !types.String
|
12
|
+
# end
|
13
|
+
#
|
4
14
|
class GraphQL::Argument
|
5
|
-
|
6
|
-
|
7
|
-
|
15
|
+
attr_accessor :name, :type, :description, :default_value
|
16
|
+
|
17
|
+
include GraphQL::DefinitionHelpers::DefinedByConfig
|
18
|
+
|
19
|
+
# This object is `self` when you're defining arguments with a block.
|
20
|
+
# @example `argument` helper's `self` is a DefinitionConfig
|
21
|
+
#
|
22
|
+
# argument :name do
|
23
|
+
# puts self.class.name
|
24
|
+
# end
|
25
|
+
# # => GraphQL::Argument::DefinitionConfig
|
26
|
+
#
|
27
|
+
class DefinitionConfig
|
28
|
+
extend GraphQL::DefinitionHelpers::Definable
|
29
|
+
attr_definable :type, :description, :default_value, :name
|
30
|
+
|
31
|
+
def to_instance
|
32
|
+
GraphQL::Argument.new(
|
33
|
+
type: type,
|
34
|
+
description: description,
|
35
|
+
default_value: default_value,
|
36
|
+
name: name,
|
37
|
+
)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def initialize(type: nil, description: nil, default_value: nil, name: nil)
|
8
42
|
@type = type
|
9
43
|
@description = description,
|
10
44
|
@default_value = default_value
|
@@ -6,5 +6,6 @@ require 'graph_ql/definition_helpers/argument_definer'
|
|
6
6
|
require 'graph_ql/definition_helpers/definable'
|
7
7
|
require 'graph_ql/definition_helpers/field_definer'
|
8
8
|
require 'graph_ql/definition_helpers/non_null_with_bang'
|
9
|
+
require 'graph_ql/definition_helpers/defined_by_config'
|
9
10
|
require 'graph_ql/definition_helpers/string_named_hash'
|
10
11
|
require 'graph_ql/definition_helpers/type_definer'
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# Provide a two-step definition process.
|
2
|
+
#
|
3
|
+
# 1. Use a config object to gather definitions
|
4
|
+
# 2. Transfer definitions to an actual instance of an object
|
5
|
+
#
|
6
|
+
module GraphQL::DefinitionHelpers::DefinedByConfig
|
7
|
+
def self.included(base)
|
8
|
+
base.extend(ClassMethods)
|
9
|
+
end
|
10
|
+
|
11
|
+
module ClassMethods
|
12
|
+
# Pass the block to this class's `DefinitionConfig`,
|
13
|
+
# The return the result of {DefinitionConfig#to_instance}
|
14
|
+
def define(&block)
|
15
|
+
config = self.const_get(:DefinitionConfig).new
|
16
|
+
block && config.instance_eval(&block)
|
17
|
+
config.to_instance
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/graph_ql/enum_type.rb
CHANGED
@@ -3,36 +3,68 @@
|
|
3
3
|
#
|
4
4
|
# @example An enum of programming languages
|
5
5
|
#
|
6
|
-
# LanguageEnum = GraphQL::EnumType.
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
#
|
6
|
+
# LanguageEnum = GraphQL::EnumType.define do
|
7
|
+
# name "Languages"
|
8
|
+
# description "Programming languages for Web projects"
|
9
|
+
# value("PYTHON", "A dynamic, function-oriented language")
|
10
|
+
# value("RUBY", "A very dynamic language aimed at programmer happiness")
|
11
|
+
# value("JAVASCRIPT", "Accidental lingua franca of the web")
|
12
12
|
# end
|
13
13
|
class GraphQL::EnumType
|
14
14
|
include GraphQL::DefinitionHelpers::NonNullWithBang
|
15
|
+
include GraphQL::DefinitionHelpers::DefinedByConfig
|
15
16
|
extend GraphQL::DefinitionHelpers::Definable
|
16
17
|
attr_definable :name, :description
|
17
|
-
|
18
|
+
attr_accessor :values
|
19
|
+
|
20
|
+
class DefinitionConfig
|
21
|
+
extend GraphQL::DefinitionHelpers::Definable
|
22
|
+
# These are deprecated:
|
23
|
+
attr_definable :name, :description
|
24
|
+
attr_reader :values
|
25
|
+
def initialize
|
26
|
+
@values = {}
|
27
|
+
end
|
28
|
+
|
29
|
+
def types
|
30
|
+
GraphQL::DefinitionHelpers::TypeDefiner.instance
|
31
|
+
end
|
32
|
+
|
33
|
+
def value(name, desc = nil, deprecation_reason: nil, value: name)
|
34
|
+
value = EnumValue.new(name: name, description: description, deprecation_reason: deprecation_reason, value: value)
|
35
|
+
values[name] = value
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_instance
|
39
|
+
object = GraphQL::EnumType.new
|
40
|
+
object.name = name
|
41
|
+
object.description = description
|
42
|
+
object.values = values
|
43
|
+
object
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
18
47
|
def initialize
|
19
48
|
@values = {}
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
49
|
+
if block_given?
|
50
|
+
yield(
|
51
|
+
self,
|
52
|
+
GraphQL::DefinitionHelpers::TypeDefiner.instance,
|
53
|
+
GraphQL::DefinitionHelpers::FieldDefiner.instance,
|
54
|
+
GraphQL::DefinitionHelpers::ArgumentDefiner.instance
|
55
|
+
)
|
56
|
+
warn("Initializing with .new is deprecated, use .define instead! (see #{self})")
|
57
|
+
end
|
26
58
|
end
|
27
59
|
|
28
60
|
# Define a value within this enum
|
29
|
-
#
|
61
|
+
# @deprecated use {.define} API instead
|
30
62
|
# @param name [String] the string representation of this value
|
31
63
|
# @param description [String]
|
32
64
|
# @param deprecation_reason [String] if provided, `deprecated?` will be true
|
33
65
|
# @param value [Object] the underlying value for this enum value
|
34
66
|
def value(name, description=nil, deprecation_reason: nil, value: name)
|
35
|
-
|
67
|
+
values[name] = EnumValue.new(name: name, description: description, deprecation_reason: deprecation_reason, value: value)
|
36
68
|
end
|
37
69
|
|
38
70
|
def kind
|
@@ -48,7 +80,11 @@ class GraphQL::EnumType
|
|
48
80
|
# @param value_name [String] the string representation of this enum value
|
49
81
|
# @return [Object] the underlying value for this enum value
|
50
82
|
def coerce(value_name)
|
51
|
-
|
83
|
+
values[value_name].value
|
84
|
+
end
|
85
|
+
|
86
|
+
def to_s
|
87
|
+
name
|
52
88
|
end
|
53
89
|
|
54
90
|
# A value within an {EnumType}
|
data/lib/graph_ql/field.rb
CHANGED
@@ -1,28 +1,83 @@
|
|
1
|
-
#
|
1
|
+
# {Field}s belong to {ObjectType}s and {InterfaceType}s.
|
2
|
+
#
|
3
|
+
# They're usually created with the `field` helper.
|
2
4
|
#
|
3
|
-
# You can also use {FieldDefiner#build} to create fields.
|
4
5
|
#
|
5
6
|
# @example creating a field
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
7
|
+
# GraphQL::ObjectType.define do
|
8
|
+
# field :name, types.String, "The name of this thing "
|
9
|
+
# end
|
10
|
+
#
|
11
|
+
# @example creating a field that accesses a different property on the object
|
12
|
+
# GraphQL::ObjectType.define do
|
13
|
+
# # use the `property` option:
|
14
|
+
# field :firstName, types.String, property: :first_name
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
# @example defining a field, then attaching it to a type
|
18
|
+
# name_field = GraphQL::Field.define do
|
19
|
+
# name("Name")
|
20
|
+
# type(!types.String)
|
21
|
+
# description("The name of this thing")
|
22
|
+
# resolve -> (object, arguments, context) { object.name }
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# NamedType = GraphQL::ObjectType.define do
|
26
|
+
# # use the `field` option:
|
27
|
+
# field :name, field: name_field
|
11
28
|
# end
|
12
29
|
#
|
13
30
|
class GraphQL::Field
|
31
|
+
DEFAULT_RESOLVE = -> (o, a, c) { GraphQL::Query::DEFAULT_RESOLVE }
|
32
|
+
include GraphQL::DefinitionHelpers::DefinedByConfig
|
33
|
+
# These are deprecated:
|
14
34
|
extend GraphQL::DefinitionHelpers::Definable
|
15
35
|
attr_definable(:arguments, :deprecation_reason, :name, :description, :type)
|
16
36
|
|
37
|
+
class DefinitionConfig
|
38
|
+
extend GraphQL::DefinitionHelpers::Definable
|
39
|
+
attr_definable :name, :description, :type, :deprecation_reason, :resolve
|
40
|
+
def initialize
|
41
|
+
@arguments = {}
|
42
|
+
end
|
43
|
+
|
44
|
+
def types
|
45
|
+
GraphQL::DefinitionHelpers::TypeDefiner.instance
|
46
|
+
end
|
47
|
+
|
48
|
+
def argument(name, type, description = nil, default_value: nil)
|
49
|
+
@arguments[name.to_s] = GraphQL::Argument.new(
|
50
|
+
name: name.to_s,
|
51
|
+
type: type,
|
52
|
+
description: description,
|
53
|
+
default_value: nil,
|
54
|
+
)
|
55
|
+
end
|
56
|
+
|
57
|
+
def to_instance
|
58
|
+
object = GraphQL::Field.new
|
59
|
+
object.name = name
|
60
|
+
object.type = type
|
61
|
+
object.description = description
|
62
|
+
object.deprecation_reason = deprecation_reason
|
63
|
+
object.resolve = resolve
|
64
|
+
object.arguments = @arguments
|
65
|
+
object
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
17
69
|
def initialize
|
18
70
|
@arguments = {}
|
19
|
-
@resolve_proc =
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
71
|
+
@resolve_proc = DEFAULT_RESOLVE
|
72
|
+
if block_given?
|
73
|
+
yield(
|
74
|
+
self,
|
75
|
+
GraphQL::DefinitionHelpers::TypeDefiner.instance,
|
76
|
+
GraphQL::DefinitionHelpers::FieldDefiner.instance,
|
77
|
+
GraphQL::DefinitionHelpers::ArgumentDefiner.instance
|
78
|
+
)
|
79
|
+
warn("Initializing with .new is deprecated, use .define instead! (see #{self})")
|
80
|
+
end
|
26
81
|
end
|
27
82
|
|
28
83
|
def arguments(new_arguments=nil)
|
@@ -38,6 +93,7 @@ class GraphQL::Field
|
|
38
93
|
end
|
39
94
|
|
40
95
|
# @overload resolve(definition_proc)
|
96
|
+
# @deprecated use {.define} API instead
|
41
97
|
# Define this field to return a value with `definition_proc`
|
42
98
|
# @example defining the resolve method
|
43
99
|
# field.resolve -> (obj, args, ctx) { obj.get_value }
|
@@ -59,7 +115,12 @@ class GraphQL::Field
|
|
59
115
|
end
|
60
116
|
end
|
61
117
|
|
118
|
+
def resolve=(resolve_proc)
|
119
|
+
@resolve_proc = resolve_proc || DEFAULT_RESOLVE
|
120
|
+
end
|
121
|
+
|
62
122
|
# @overload type(return_type)
|
123
|
+
# @deprecated use {.define} API instead
|
63
124
|
# Define the return type for this field
|
64
125
|
# @param return_type [GraphQL::ObjectType, GraphQL::ScalarType] The type this field returns
|
65
126
|
#
|
@@ -79,4 +140,8 @@ class GraphQL::Field
|
|
79
140
|
end
|
80
141
|
@type
|
81
142
|
end
|
143
|
+
|
144
|
+
def to_s
|
145
|
+
"<Field: #{name || "not-named"}>"
|
146
|
+
end
|
82
147
|
end
|
data/lib/graph_ql/float_type.rb
CHANGED
data/lib/graph_ql/id_type.rb
CHANGED
@@ -10,9 +10,44 @@
|
|
10
10
|
# end
|
11
11
|
#
|
12
12
|
class GraphQL::InputObjectType < GraphQL::ObjectType
|
13
|
+
# Deprecated:
|
13
14
|
attr_definable :input_fields
|
14
15
|
|
16
|
+
class DefinitionConfig
|
17
|
+
extend GraphQL::DefinitionHelpers::Definable
|
18
|
+
attr_definable :name, :description, :input_fields
|
19
|
+
def initialize
|
20
|
+
@input_fields = {}
|
21
|
+
end
|
22
|
+
|
23
|
+
def types
|
24
|
+
GraphQL::DefinitionHelpers::TypeDefiner.instance
|
25
|
+
end
|
26
|
+
|
27
|
+
def input_field(name, type = nil, desc = nil, default_value: nil, &block)
|
28
|
+
argument = if block_given?
|
29
|
+
GraphQL::Argument.define(&block)
|
30
|
+
else
|
31
|
+
GraphQL::Argument.new
|
32
|
+
end
|
33
|
+
argument.name = name
|
34
|
+
type && argument.type = type
|
35
|
+
desc && argument.desc = desc
|
36
|
+
default_value && argument.default_value = default_value
|
37
|
+
@input_fields[name.to_s] = argument
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_instance
|
41
|
+
object = GraphQL::InputObjectType.new
|
42
|
+
object.name = name
|
43
|
+
object.description = description
|
44
|
+
object.input_fields = @input_fields
|
45
|
+
object
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
15
49
|
# @overload input_fields(new_fields)
|
50
|
+
# @deprecated use {.define} API instead
|
16
51
|
# Define allowed fields, normalized with {StringNamedHash}
|
17
52
|
# @param new_fields [Hash] allowed fields for this input object type
|
18
53
|
#
|
@@ -21,10 +56,12 @@ class GraphQL::InputObjectType < GraphQL::ObjectType
|
|
21
56
|
# @return [Hash] allowed fields for this input object type
|
22
57
|
#
|
23
58
|
def input_fields(new_fields=nil)
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
59
|
+
new_fields && self.input_fields = new_fields
|
60
|
+
@input_fields
|
61
|
+
end
|
62
|
+
|
63
|
+
def input_fields=(new_fields)
|
64
|
+
@input_fields = GraphQL::DefinitionHelpers::StringNamedHash.new(new_fields).to_h
|
28
65
|
end
|
29
66
|
|
30
67
|
def kind
|
data/lib/graph_ql/int_type.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
GraphQL::INT_TYPE = GraphQL::ScalarType.
|
2
|
-
|
3
|
-
|
4
|
-
value.is_a?(Numeric) ? value.to_i : nil
|
5
|
-
end
|
1
|
+
GraphQL::INT_TYPE = GraphQL::ScalarType.define do
|
2
|
+
name "Int"
|
3
|
+
coerce -> (value) { value.is_a?(Numeric) ? value.to_i : nil }
|
6
4
|
end
|
@@ -1,14 +1,13 @@
|
|
1
1
|
# A collection of types which implement the same fields
|
2
2
|
#
|
3
3
|
# @example An interface with three required fields
|
4
|
-
# DeviceInterface = GraphQL::InterfaceType.
|
5
|
-
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
#
|
11
|
-
# })
|
4
|
+
# DeviceInterface = GraphQL::InterfaceType.define do
|
5
|
+
# name("Device")
|
6
|
+
# description("Hardware devices for computing")
|
7
|
+
#
|
8
|
+
# field :ram, types.String
|
9
|
+
# field :processor, ProcessorType
|
10
|
+
# field :release_year, types.Int
|
12
11
|
# end
|
13
12
|
#
|
14
13
|
class GraphQL::InterfaceType < GraphQL::ObjectType
|
@@ -16,6 +15,35 @@ class GraphQL::InterfaceType < GraphQL::ObjectType
|
|
16
15
|
GraphQL::TypeKinds::INTERFACE
|
17
16
|
end
|
18
17
|
|
18
|
+
class DefinitionConfig
|
19
|
+
extend GraphQL::DefinitionHelpers::Definable
|
20
|
+
attr_definable :name, :description
|
21
|
+
|
22
|
+
def initialize
|
23
|
+
@fields = {}
|
24
|
+
end
|
25
|
+
|
26
|
+
def types
|
27
|
+
GraphQL::DefinitionHelpers::TypeDefiner.instance
|
28
|
+
end
|
29
|
+
|
30
|
+
def field(name, type = nil, desc = nil, property: nil, field: nil, &block)
|
31
|
+
field ||= GraphQL::Field.define(&block)
|
32
|
+
type && field.type = type
|
33
|
+
desc && field.description = desc
|
34
|
+
field.name ||= name.to_s
|
35
|
+
@fields[name.to_s] = field
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_instance
|
39
|
+
object = GraphQL::InterfaceType.new
|
40
|
+
object.name = name
|
41
|
+
object.description = description
|
42
|
+
object.fields = @fields
|
43
|
+
object
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
19
47
|
# @return [Array<GraphQL::ObjectType>] Types which declare that they implement this interface
|
20
48
|
def possible_types
|
21
49
|
@possible_types ||= []
|