Skip to content

Commit 348d98a

Browse files
author
Robert Mosolgo
authored
Merge pull request #267 from goco-inc/alt-consistent-default-values
Alternative: Make default_value behavior consistent
2 parents 93ce300 + 5a8667d commit 348d98a

File tree

15 files changed

+110
-31
lines changed

15 files changed

+110
-31
lines changed

graphql.gemspec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
1919

2020
s.add_development_dependency "codeclimate-test-reporter", "~>0.4"
2121
s.add_development_dependency "pry", "~> 0.10"
22+
s.add_development_dependency 'pry-stack_explorer'
2223
s.add_development_dependency "guard", "~> 2.12"
2324
s.add_development_dependency "guard-bundler", "~> 2.1"
2425
s.add_development_dependency "guard-minitest", "~> 2.4"

lib/graphql/input_object_type.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,5 +87,19 @@ def coerce_non_null_input(value)
8787

8888
GraphQL::Query::Arguments.new(input_values)
8989
end
90+
91+
def coerce_result(value)
92+
# Allow the application to provide values as :symbols, and convert them to the strings
93+
value = value.reduce({}) { |memo, (k, v)| memo[k.to_s] = v; memo }
94+
95+
result = {}
96+
97+
arguments.each do |input_key, input_field_defn|
98+
input_value = value[input_key]
99+
result[input_key] = input_value.nil? ? nil : input_field_defn.type.coerce_result(input_value)
100+
end
101+
102+
result
103+
end
90104
end
91105
end

lib/graphql/introspection/input_value_type.rb

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,7 @@
77
field :defaultValue, types.String, "The value applied if no other value is provided" do
88
resolve -> (obj, args, ctx) {
99
value = obj.default_value
10-
if value.is_a?(String)
11-
"\"#{value}\""
12-
else
13-
value
14-
end
10+
value.nil? ? nil : JSON.dump(obj.type.coerce_result(value))
1511
}
1612
end
1713
end

lib/graphql/list_type.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,11 @@ def validate_non_null_input(value)
5353
end
5454

5555
def coerce_non_null_input(value)
56-
ensure_array(value).map{ |item| of_type.coerce_input(item) }
56+
ensure_array(value).map { |item| of_type.coerce_input(item) }
57+
end
58+
59+
def coerce_result(value)
60+
ensure_array(value).map { |item| item.nil? ? nil : of_type.coerce_result(item) }
5761
end
5862

5963
private

lib/graphql/non_null_type.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ def coerce_input(value)
5757
of_type.coerce_input(value)
5858
end
5959

60+
def coerce_result(value)
61+
of_type.coerce_result(value)
62+
end
63+
6064
def kind
6165
GraphQL::TypeKinds::NON_NULL
6266
end

lib/graphql/query/literal_input.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def self.from_arguments(ast_arguments, argument_defns, variables)
1616
values_hash = {}
1717
argument_defns.each do |arg_name, arg_defn|
1818
ast_arg = ast_arguments.find { |ast_arg| ast_arg.name == arg_name }
19-
arg_default_value = arg_defn.type.coerce_input(arg_defn.default_value)
19+
arg_default_value = arg_defn.default_value
2020
if ast_arg.nil? && arg_default_value.nil?
2121
# If it wasn't in the document,
2222
# and there's no provided default,

lib/graphql/scalar_type.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def coerce_input=(proc)
6262

6363
def coerce_result(value)
6464
ensure_defined
65-
@coerce_result_proc.call(value)
65+
@coerce_result_proc ? @coerce_result_proc.call(value) : value
6666
end
6767

6868
def coerce_result=(proc)

lib/graphql/schema/loader.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def define_type(type, type_resolver)
5858
name: enum["name"],
5959
description: enum["description"],
6060
deprecation_reason: enum["deprecationReason"],
61-
value: enum["value"]
61+
value: enum["name"]
6262
)
6363
})
6464
when "INTERFACE"
@@ -102,7 +102,7 @@ def define_type(type, type_resolver)
102102
name: type["name"],
103103
type: type_resolver.call(type["type"]),
104104
description: type["description"],
105-
default_value: type["defaultValue"]
105+
default_value: type["defaultValue"] ? JSON.parse(type["defaultValue"], quirks_mode: true) : nil
106106
)
107107
when "SCALAR"
108108
case type.fetch("name")

lib/graphql/schema/validation.rb

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,16 @@ def self.assert_named_items_are_valid(item_name, get_items_proc)
100100

101101
DEFAULT_VALUE_IS_VALID_FOR_TYPE = -> (type) {
102102
if !type.default_value.nil?
103-
coerced_value = type.type.coerce_input(type.default_value)
104-
if coerced_value.nil?
105-
"default value #{type.default_value.inspect} is not valid for type #{type.type}"
103+
coerced_value = begin
104+
type.type.coerce_result(type.default_value)
105+
rescue => ex
106+
ex
107+
end
108+
109+
if coerced_value.nil? || coerced_value.is_a?(StandardError)
110+
msg = "default value #{type.default_value.inspect} is not valid for type #{type.type}"
111+
msg += " (#{coerced_value})" if coerced_value.is_a?(StandardError)
112+
msg
106113
end
107114
end
108115
}

spec/graphql/argument_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
}
1616

1717
expected_error = %|Query is invalid: field "invalid" argument "invalid" default value ["123"] is not valid for type Float|
18-
assert_equal expected_error, err.message
18+
assert_includes err.message, expected_error
1919
end
2020

2121
it "accepts proc type" do

0 commit comments

Comments
 (0)