graphql 1.5.5 → 1.5.6
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 -2
- data/lib/graphql/analysis/query_complexity.rb +0 -1
- data/lib/graphql/argument.rb +43 -3
- data/lib/graphql/base_type.rb +50 -7
- data/lib/graphql/boolean_type.rb +2 -2
- data/lib/graphql/compatibility/execution_specification.rb +1 -1
- data/lib/graphql/compatibility/execution_specification/specification_schema.rb +2 -2
- data/lib/graphql/compatibility/lazy_execution_specification.rb +1 -1
- data/lib/graphql/enum_type.rb +35 -27
- data/lib/graphql/execution/execute.rb +3 -5
- data/lib/graphql/execution/lazy/lazy_method_map.rb +2 -2
- data/lib/graphql/float_type.rb +2 -2
- data/lib/graphql/function.rb +5 -0
- data/lib/graphql/id_type.rb +2 -2
- data/lib/graphql/input_object_type.rb +46 -36
- data/lib/graphql/int_type.rb +2 -2
- data/lib/graphql/introspection/input_value_type.rb +1 -1
- data/lib/graphql/list_type.rb +17 -17
- data/lib/graphql/non_null_type.rb +6 -11
- data/lib/graphql/query.rb +2 -2
- data/lib/graphql/query/literal_input.rb +15 -8
- data/lib/graphql/query/null_context.rb +29 -0
- data/lib/graphql/query/serial_execution/value_resolution.rb +2 -4
- data/lib/graphql/query/variables.rb +9 -7
- data/lib/graphql/relay/mutation.rb +6 -7
- data/lib/graphql/scalar_type.rb +54 -19
- data/lib/graphql/schema.rb +21 -5
- data/lib/graphql/schema/build_from_definition.rb +3 -1
- data/lib/graphql/schema/catchall_middleware.rb +1 -1
- data/lib/graphql/schema/default_type_error.rb +1 -1
- data/lib/graphql/schema/loader.rb +2 -2
- data/lib/graphql/schema/printer.rb +1 -1
- data/lib/graphql/schema/validation.rb +1 -2
- data/lib/graphql/static_validation/arguments_validator.rb +1 -1
- data/lib/graphql/static_validation/literal_validator.rb +5 -4
- data/lib/graphql/static_validation/rules/operation_names_are_valid.rb +1 -1
- data/lib/graphql/static_validation/validation_context.rb +1 -1
- data/lib/graphql/string_encoding_error.rb +10 -0
- data/lib/graphql/string_type.rb +8 -3
- data/lib/graphql/version.rb +1 -1
- data/spec/graphql/argument_spec.rb +13 -0
- data/spec/graphql/base_type_spec.rb +1 -1
- data/spec/graphql/boolean_type_spec.rb +1 -1
- data/spec/graphql/enum_type_spec.rb +11 -11
- data/spec/graphql/field_spec.rb +1 -1
- data/spec/graphql/float_type_spec.rb +4 -4
- data/spec/graphql/function_spec.rb +5 -4
- data/spec/graphql/input_object_type_spec.rb +28 -20
- data/spec/graphql/int_type_spec.rb +4 -4
- data/spec/graphql/language/lexer_spec.rb +0 -1
- data/spec/graphql/list_type_spec.rb +3 -3
- data/spec/graphql/query/literal_input_spec.rb +51 -0
- data/spec/graphql/query/variables_spec.rb +8 -4
- data/spec/graphql/relay/array_connection_spec.rb +1 -1
- data/spec/graphql/relay/page_info_spec.rb +1 -1
- data/spec/graphql/relay/relation_connection_spec.rb +3 -3
- data/spec/graphql/scalar_type_spec.rb +8 -8
- data/spec/graphql/schema/build_from_definition_spec.rb +2 -2
- data/spec/graphql/schema/loader_spec.rb +4 -4
- data/spec/graphql/string_type_spec.rb +33 -6
- data/spec/spec_helper.rb +0 -11
- data/spec/support/dummy/schema.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8fd00bd7b6d3c884c97818e792423683197e2f45
|
4
|
+
data.tar.gz: 731475b235eb76d4ea0e574e734d8adba1188c96
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 54fc7fd2ac112ba5be3d405d256dfe81d3dfa58c688820f406fbe97671245b7395076484915b1c67cb074a948304c015af52f5888fa1670eee88bc68f7dab779
|
7
|
+
data.tar.gz: d4fc22d899a6ea6fd5bbd3895c0f5c5837956a3264b0badbfc6f09237a07ac02fa489b3f114f62c3247067157a4e85051f48cee4d301be89d5792d48893d2af2
|
data/lib/graphql.rb
CHANGED
@@ -82,12 +82,11 @@ require "graphql/schema"
|
|
82
82
|
require "graphql/schema/loader"
|
83
83
|
require "graphql/schema/printer"
|
84
84
|
|
85
|
-
# Order does not matter for these:
|
86
|
-
|
87
85
|
require "graphql/analysis_error"
|
88
86
|
require "graphql/runtime_type_error"
|
89
87
|
require "graphql/invalid_null_error"
|
90
88
|
require "graphql/unresolved_type_error"
|
89
|
+
require "graphql/string_encoding_error"
|
91
90
|
require "graphql/query"
|
92
91
|
require "graphql/internal_representation"
|
93
92
|
require "graphql/static_validation"
|
@@ -53,7 +53,6 @@ module GraphQL
|
|
53
53
|
# Get a complexity value for a field,
|
54
54
|
# by getting the number or calling its proc
|
55
55
|
def get_complexity(irep_node, query, child_complexity)
|
56
|
-
type_defn = irep_node.owner_type
|
57
56
|
field_defn = irep_node.definition
|
58
57
|
defined_complexity = field_defn.complexity
|
59
58
|
case defined_complexity
|
data/lib/graphql/argument.rb
CHANGED
@@ -14,13 +14,40 @@ module GraphQL
|
|
14
14
|
# GraphQL::InputObjectType.define do
|
15
15
|
# argument :newName, !types.String
|
16
16
|
# end
|
17
|
+
#
|
18
|
+
# @example defining an argument with a `prepare` function
|
19
|
+
# GraphQL::Field.define do
|
20
|
+
# argument :userId, types.ID, prepare: ->(userId) do
|
21
|
+
# User.find_by(id: userId)
|
22
|
+
# end
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# @example returning an {ExecutionError} from a `prepare` function
|
26
|
+
# GraphQL::Field.define do
|
27
|
+
# argument :date do
|
28
|
+
# type !types.String
|
29
|
+
# prepare ->(date) do
|
30
|
+
# return GraphQL::ExecutionError.new("Invalid date format") unless DateValidator.valid?(date)
|
31
|
+
# Time.zone.parse(date)
|
32
|
+
# end
|
33
|
+
# end
|
34
|
+
# end
|
17
35
|
|
18
36
|
class Argument
|
19
37
|
include GraphQL::Define::InstanceDefinable
|
20
|
-
accepts_definitions :name, :type, :description, :default_value, :as
|
38
|
+
accepts_definitions :name, :type, :description, :default_value, :as, :prepare
|
21
39
|
attr_accessor :type, :description, :default_value, :name, :as
|
22
40
|
|
23
|
-
ensure_defined(:name, :description, :default_value, :type=, :type, :as, :expose_as)
|
41
|
+
ensure_defined(:name, :description, :default_value, :type=, :type, :as, :expose_as, :prepare)
|
42
|
+
|
43
|
+
# @api private
|
44
|
+
module DefaultPrepare
|
45
|
+
def self.call(value); value; end
|
46
|
+
end
|
47
|
+
|
48
|
+
def initialize
|
49
|
+
@prepare_proc = DefaultPrepare
|
50
|
+
end
|
24
51
|
|
25
52
|
def initialize_copy(other)
|
26
53
|
@expose_as = nil
|
@@ -54,9 +81,21 @@ module GraphQL
|
|
54
81
|
@expose_as ||= (@as || @name).to_s
|
55
82
|
end
|
56
83
|
|
84
|
+
# @param value
|
85
|
+
# @return [Object] The prepared `value` for this argument or `value` itself if no `prepare` function exists.
|
86
|
+
def prepare(value)
|
87
|
+
@prepare_proc.call(value)
|
88
|
+
end
|
89
|
+
|
90
|
+
# Assign a `prepare` function to prepare this argument's value before `resolve` functions are called.
|
91
|
+
# @param prepare_proc [Proc]
|
92
|
+
def prepare=(prepare_proc)
|
93
|
+
@prepare_proc = prepare_proc
|
94
|
+
end
|
95
|
+
|
57
96
|
NO_DEFAULT_VALUE = Object.new
|
58
97
|
# @api private
|
59
|
-
def self.from_dsl(name, type = nil, description = nil, default_value: NO_DEFAULT_VALUE, as: nil, &block)
|
98
|
+
def self.from_dsl(name, type = nil, description = nil, default_value: NO_DEFAULT_VALUE, as: nil, prepare: DefaultPrepare, &block)
|
60
99
|
argument = if block_given?
|
61
100
|
GraphQL::Argument.define(&block)
|
62
101
|
else
|
@@ -70,6 +109,7 @@ module GraphQL
|
|
70
109
|
argument.default_value = default_value
|
71
110
|
end
|
72
111
|
argument.as = as
|
112
|
+
argument.prepare = prepare
|
73
113
|
|
74
114
|
|
75
115
|
argument
|
data/lib/graphql/base_type.rb
CHANGED
@@ -97,21 +97,58 @@ module GraphQL
|
|
97
97
|
|
98
98
|
alias :inspect :to_s
|
99
99
|
|
100
|
-
def
|
101
|
-
|
100
|
+
def valid_isolated_input?(value)
|
101
|
+
valid_input?(value, GraphQL::Query::NullContext)
|
102
102
|
end
|
103
103
|
|
104
|
-
def
|
104
|
+
def validate_isolated_input(value)
|
105
|
+
validate_input(value, GraphQL::Query::NullContext)
|
106
|
+
end
|
107
|
+
|
108
|
+
def coerce_isolated_input(value)
|
109
|
+
coerce_input(value, GraphQL::Query::NullContext)
|
110
|
+
end
|
111
|
+
|
112
|
+
def coerce_isolated_result(value)
|
113
|
+
coerce_result(value, GraphQL::Query::NullContext)
|
114
|
+
end
|
115
|
+
|
116
|
+
def valid_input?(value, ctx = nil)
|
117
|
+
if ctx.nil?
|
118
|
+
warn_deprecated_coerce("valid_isolated_input?")
|
119
|
+
ctx = GraphQL::Query::NullContext
|
120
|
+
end
|
121
|
+
|
122
|
+
validate_input(value, ctx).valid?
|
123
|
+
end
|
124
|
+
|
125
|
+
def validate_input(value, ctx = nil)
|
126
|
+
if ctx.nil?
|
127
|
+
warn_deprecated_coerce("validate_isolated_input")
|
128
|
+
ctx = GraphQL::Query::NullContext
|
129
|
+
end
|
130
|
+
|
105
131
|
if value.nil?
|
106
132
|
GraphQL::Query::InputValidationResult.new
|
107
133
|
else
|
108
|
-
validate_non_null_input(value,
|
134
|
+
validate_non_null_input(value, ctx)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def coerce_input(value, ctx = nil)
|
139
|
+
if value.nil?
|
140
|
+
nil
|
141
|
+
else
|
142
|
+
if ctx.nil?
|
143
|
+
warn_deprecated_coerce("coerce_isolated_input")
|
144
|
+
ctx = GraphQL::Query::NullContext
|
145
|
+
end
|
146
|
+
coerce_non_null_input(value, ctx)
|
109
147
|
end
|
110
148
|
end
|
111
149
|
|
112
|
-
def
|
113
|
-
|
114
|
-
coerce_non_null_input(value)
|
150
|
+
def coerce_result(value, ctx)
|
151
|
+
raise NotImplementedError
|
115
152
|
end
|
116
153
|
|
117
154
|
# Types with fields may override this
|
@@ -168,5 +205,11 @@ module GraphQL
|
|
168
205
|
printer ||= GraphQL::Schema::Printer.new(schema, **args)
|
169
206
|
printer.print_type(self)
|
170
207
|
end
|
208
|
+
|
209
|
+
private
|
210
|
+
|
211
|
+
def warn_deprecated_coerce(alt_method_name)
|
212
|
+
warn("Coercing without a context is deprecated; use `#{alt_method_name}` if you don't want context-awareness")
|
213
|
+
end
|
171
214
|
end
|
172
215
|
end
|
data/lib/graphql/boolean_type.rb
CHANGED
@@ -3,7 +3,7 @@ GraphQL::BOOLEAN_TYPE = GraphQL::ScalarType.define do
|
|
3
3
|
name "Boolean"
|
4
4
|
description "Represents `true` or `false` values."
|
5
5
|
|
6
|
-
coerce_input ->(value) { (value == true || value == false) ? value : nil }
|
7
|
-
coerce_result ->(value) { !!value }
|
6
|
+
coerce_input ->(value, _ctx) { (value == true || value == false) ? value : nil }
|
7
|
+
coerce_result ->(value, _ctx) { !!value }
|
8
8
|
default_scalar true
|
9
9
|
end
|
@@ -61,8 +61,8 @@ module GraphQL
|
|
61
61
|
|
62
62
|
timestamp_type = GraphQL::ScalarType.define do
|
63
63
|
name "Timestamp"
|
64
|
-
coerce_input ->(value) { Time.at(value.to_i) }
|
65
|
-
coerce_result ->(value) { value.to_i }
|
64
|
+
coerce_input ->(value, _ctx) { Time.at(value.to_i) }
|
65
|
+
coerce_result ->(value, _ctx) { value.to_i }
|
66
66
|
end
|
67
67
|
|
68
68
|
named_entity_interface_type = GraphQL::InterfaceType.define do
|
@@ -162,7 +162,7 @@ module GraphQL
|
|
162
162
|
|
|
163
163
|
|
164
164
|
log = []
|
165
|
-
|
165
|
+
self.class.lazy_schema.execute(query_str, context: {lazy_instrumentation: log, pushes: []})
|
166
166
|
expected_log = [
|
167
167
|
"PUSH",
|
168
168
|
"Query.push: 1",
|
data/lib/graphql/enum_type.rb
CHANGED
@@ -105,35 +105,13 @@ module GraphQL
|
|
105
105
|
GraphQL::TypeKinds::ENUM
|
106
106
|
end
|
107
107
|
|
108
|
-
def
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
if matching_value.nil?
|
114
|
-
result.add_problem("Expected #{GraphQL::Language.serialize(value_name)} to be one of: #{allowed_values.map(&:name).join(', ')}")
|
108
|
+
def coerce_result(value, ctx = nil)
|
109
|
+
if ctx.nil?
|
110
|
+
warn_deprecated_coerce("coerce_isolated_result")
|
111
|
+
ctx = GraphQL::Query::NullContext
|
115
112
|
end
|
116
113
|
|
117
|
-
|
118
|
-
end
|
119
|
-
|
120
|
-
# Get the underlying value for this enum value
|
121
|
-
#
|
122
|
-
# @example get episode value from Enum
|
123
|
-
# episode = EpisodeEnum.coerce("NEWHOPE")
|
124
|
-
# episode # => 6
|
125
|
-
#
|
126
|
-
# @param value_name [String] the string representation of this enum value
|
127
|
-
# @return [Object] the underlying value for this enum value
|
128
|
-
def coerce_non_null_input(value_name)
|
129
|
-
if @values_by_name.key?(value_name)
|
130
|
-
@values_by_name.fetch(value_name).value
|
131
|
-
else
|
132
|
-
nil
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
def coerce_result(value, warden = nil)
|
114
|
+
warden = ctx.warden
|
137
115
|
all_values = warden ? warden.enum_values(self) : @values_by_name.each_value
|
138
116
|
enum_value = all_values.find { |val| val.value == value }
|
139
117
|
if enum_value
|
@@ -160,5 +138,35 @@ module GraphQL
|
|
160
138
|
|
161
139
|
class UnresolvedValueError < GraphQL::Error
|
162
140
|
end
|
141
|
+
|
142
|
+
private
|
143
|
+
|
144
|
+
# Get the underlying value for this enum value
|
145
|
+
#
|
146
|
+
# @example get episode value from Enum
|
147
|
+
# episode = EpisodeEnum.coerce("NEWHOPE")
|
148
|
+
# episode # => 6
|
149
|
+
#
|
150
|
+
# @param value_name [String] the string representation of this enum value
|
151
|
+
# @return [Object] the underlying value for this enum value
|
152
|
+
def coerce_non_null_input(value_name, ctx)
|
153
|
+
if @values_by_name.key?(value_name)
|
154
|
+
@values_by_name.fetch(value_name).value
|
155
|
+
else
|
156
|
+
nil
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def validate_non_null_input(value_name, ctx)
|
161
|
+
result = GraphQL::Query::InputValidationResult.new
|
162
|
+
allowed_values = ctx.warden.enum_values(self)
|
163
|
+
matching_value = allowed_values.find { |v| v.name == value_name }
|
164
|
+
|
165
|
+
if matching_value.nil?
|
166
|
+
result.add_problem("Expected #{GraphQL::Language.serialize(value_name)} to be one of: #{allowed_values.map(&:name).join(', ')}")
|
167
|
+
end
|
168
|
+
|
169
|
+
result
|
170
|
+
end
|
163
171
|
end
|
164
172
|
end
|
@@ -23,8 +23,6 @@ module GraphQL
|
|
23
23
|
private
|
24
24
|
|
25
25
|
def resolve_selection(object, current_type, selection, query_ctx, mutation: false )
|
26
|
-
query = query_ctx.query
|
27
|
-
|
28
26
|
selection_result = SelectionResult.new
|
29
27
|
|
30
28
|
selection.typed_children[current_type].each do |name, subselection|
|
@@ -143,9 +141,9 @@ module GraphQL
|
|
143
141
|
else
|
144
142
|
case field_type.kind
|
145
143
|
when GraphQL::TypeKinds::SCALAR
|
146
|
-
field_type.coerce_result(value)
|
144
|
+
field_type.coerce_result(value, field_ctx)
|
147
145
|
when GraphQL::TypeKinds::ENUM
|
148
|
-
field_type.coerce_result(value, field_ctx
|
146
|
+
field_type.coerce_result(value, field_ctx)
|
149
147
|
when GraphQL::TypeKinds::LIST
|
150
148
|
inner_type = field_type.of_type
|
151
149
|
i = 0
|
@@ -174,7 +172,7 @@ module GraphQL
|
|
174
172
|
result
|
175
173
|
when GraphQL::TypeKinds::NON_NULL
|
176
174
|
wrapped_type = field_type.of_type
|
177
|
-
|
175
|
+
resolve_value(
|
178
176
|
owner,
|
179
177
|
parent_type,
|
180
178
|
field_defn,
|
@@ -43,7 +43,7 @@ module GraphQL
|
|
43
43
|
private
|
44
44
|
|
45
45
|
def find_superclass_method(value_class)
|
46
|
-
@storage.
|
46
|
+
@storage.each_pair { |lazy_class, lazy_value_method|
|
47
47
|
return lazy_value_method if value_class < lazy_class
|
48
48
|
}
|
49
49
|
nil
|
@@ -54,7 +54,7 @@ module GraphQL
|
|
54
54
|
extend Forwardable
|
55
55
|
# Technically this should be under the mutex too,
|
56
56
|
# but I know it's only used when the lock is already acquired.
|
57
|
-
def_delegators :@storage, :
|
57
|
+
def_delegators :@storage, :each_pair, :size
|
58
58
|
|
59
59
|
def initialize
|
60
60
|
@semaphore = Mutex.new
|
data/lib/graphql/float_type.rb
CHANGED
@@ -3,7 +3,7 @@ GraphQL::FLOAT_TYPE = GraphQL::ScalarType.define do
|
|
3
3
|
name "Float"
|
4
4
|
description "Represents signed double-precision fractional values as specified by [IEEE 754](http://en.wikipedia.org/wiki/IEEE_floating_point)."
|
5
5
|
|
6
|
-
coerce_input ->(value) { value.is_a?(Numeric) ? value.to_f : nil }
|
7
|
-
coerce_result ->(value) { value.to_f }
|
6
|
+
coerce_input ->(value, _ctx) { value.is_a?(Numeric) ? value.to_f : nil }
|
7
|
+
coerce_result ->(value, _ctx) { value.to_f }
|
8
8
|
default_scalar true
|
9
9
|
end
|
data/lib/graphql/function.rb
CHANGED
@@ -78,6 +78,11 @@ module GraphQL
|
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
81
|
+
# Provides shorthand access to GraphQL's built-in types
|
82
|
+
def types
|
83
|
+
GraphQL::Define::TypeDefiner.instance
|
84
|
+
end
|
85
|
+
|
81
86
|
# Get or set the return type for this function class & descendants
|
82
87
|
# @return [GraphQL::BaseType]
|
83
88
|
def type(premade_type = nil, &block)
|
data/lib/graphql/id_type.rb
CHANGED
@@ -3,8 +3,8 @@ GraphQL::ID_TYPE = GraphQL::ScalarType.define do
|
|
3
3
|
name "ID"
|
4
4
|
description "Represents a unique identifier that is Base64 obfuscated. It is often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `\"VXNlci0xMA==\"`) or integer (such as `4`) input value will be accepted as an ID."
|
5
5
|
|
6
|
-
coerce_result ->(value) { value.to_s }
|
7
|
-
coerce_input ->(value) {
|
6
|
+
coerce_result ->(value, _ctx) { value.to_s }
|
7
|
+
coerce_input ->(value, _ctx) {
|
8
8
|
case value
|
9
9
|
when String, Integer
|
10
10
|
value.to_s
|
@@ -55,7 +55,51 @@ module GraphQL
|
|
55
55
|
GraphQL::TypeKinds::INPUT_OBJECT
|
56
56
|
end
|
57
57
|
|
58
|
-
def
|
58
|
+
def coerce_result(value, ctx = nil)
|
59
|
+
if ctx.nil?
|
60
|
+
warn_deprecated_coerce("coerce_isolated_result")
|
61
|
+
ctx = GraphQL::Query::NullContext
|
62
|
+
end
|
63
|
+
|
64
|
+
# Allow the application to provide values as :symbols, and convert them to the strings
|
65
|
+
value = value.reduce({}) { |memo, (k, v)| memo[k.to_s] = v; memo }
|
66
|
+
|
67
|
+
result = {}
|
68
|
+
|
69
|
+
arguments.each do |input_key, input_field_defn|
|
70
|
+
input_value = value[input_key]
|
71
|
+
if value.key?(input_key)
|
72
|
+
result[input_key] = if input_value.nil?
|
73
|
+
nil
|
74
|
+
else
|
75
|
+
input_field_defn.type.coerce_result(input_value, ctx)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
result
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
def coerce_non_null_input(value, ctx)
|
86
|
+
input_values = {}
|
87
|
+
|
88
|
+
arguments.each do |input_key, input_field_defn|
|
89
|
+
field_value = value[input_key]
|
90
|
+
|
91
|
+
if value.key?(input_key)
|
92
|
+
input_values[input_key] = input_field_defn.type.coerce_input(field_value, ctx)
|
93
|
+
elsif input_field_defn.default_value?
|
94
|
+
input_values[input_key] = input_field_defn.default_value
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
GraphQL::Query::Arguments.new(input_values, argument_definitions: arguments)
|
99
|
+
end
|
100
|
+
|
101
|
+
def validate_non_null_input(input, ctx)
|
102
|
+
warden = ctx.warden
|
59
103
|
result = GraphQL::Query::InputValidationResult.new
|
60
104
|
|
61
105
|
if (input.to_h rescue nil).nil?
|
@@ -78,7 +122,7 @@ module GraphQL
|
|
78
122
|
|
79
123
|
# Items in the input that are expected, but have invalid values
|
80
124
|
visible_arguments_map.map do |name, field|
|
81
|
-
field_result = field.type.validate_input(input[name],
|
125
|
+
field_result = field.type.validate_input(input[name], ctx)
|
82
126
|
if !field_result.valid?
|
83
127
|
result.merge_result!(name, field_result)
|
84
128
|
end
|
@@ -86,39 +130,5 @@ module GraphQL
|
|
86
130
|
|
87
131
|
result
|
88
132
|
end
|
89
|
-
|
90
|
-
def coerce_non_null_input(value)
|
91
|
-
input_values = {}
|
92
|
-
|
93
|
-
arguments.each do |input_key, input_field_defn|
|
94
|
-
field_value = value[input_key]
|
95
|
-
|
96
|
-
if value.key?(input_key)
|
97
|
-
coerced_value = input_field_defn.type.coerce_input(field_value)
|
98
|
-
else
|
99
|
-
coerced_value = input_field_defn.default_value
|
100
|
-
end
|
101
|
-
|
102
|
-
if coerced_value || value.key?(input_key)
|
103
|
-
input_values[input_key] = coerced_value
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
GraphQL::Query::Arguments.new(input_values, argument_definitions: arguments)
|
108
|
-
end
|
109
|
-
|
110
|
-
def coerce_result(value)
|
111
|
-
# Allow the application to provide values as :symbols, and convert them to the strings
|
112
|
-
value = value.reduce({}) { |memo, (k, v)| memo[k.to_s] = v; memo }
|
113
|
-
|
114
|
-
result = {}
|
115
|
-
|
116
|
-
arguments.each do |input_key, input_field_defn|
|
117
|
-
input_value = value[input_key]
|
118
|
-
result[input_key] = input_value.nil? ? nil : input_field_defn.type.coerce_result(input_value) if value.key?(input_key)
|
119
|
-
end
|
120
|
-
|
121
|
-
result
|
122
|
-
end
|
123
133
|
end
|
124
134
|
end
|