graphql 0.11.1 → 0.12.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.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/lib/graphql.rb +5 -2
  3. data/lib/graphql/argument.rb +8 -3
  4. data/lib/graphql/base_type.rb +5 -3
  5. data/lib/graphql/boolean_type.rb +6 -1
  6. data/lib/graphql/define.rb +8 -0
  7. data/lib/graphql/define/assign_argument.rb +19 -0
  8. data/lib/graphql/define/assign_enum_value.rb +16 -0
  9. data/lib/graphql/define/assign_object_field.rb +19 -0
  10. data/lib/graphql/define/assignment_dictionary.rb +26 -0
  11. data/lib/graphql/define/defined_object_proxy.rb +32 -0
  12. data/lib/graphql/define/instance_definable.rb +79 -0
  13. data/lib/graphql/{definition_helpers → define}/non_null_with_bang.rb +1 -1
  14. data/lib/graphql/{definition_helpers → define}/type_definer.rb +1 -1
  15. data/lib/graphql/directive.rb +7 -2
  16. data/lib/graphql/enum_type.rb +12 -6
  17. data/lib/graphql/execution_error.rb +1 -1
  18. data/lib/graphql/field.rb +26 -23
  19. data/lib/graphql/float_type.rb +2 -3
  20. data/lib/graphql/id_type.rb +9 -1
  21. data/lib/graphql/input_object_type.rb +11 -8
  22. data/lib/graphql/int_type.rb +2 -1
  23. data/lib/graphql/interface_type.rb +7 -2
  24. data/lib/graphql/introspection/input_value_type.rb +10 -1
  25. data/lib/graphql/invalid_null_error.rb +1 -1
  26. data/lib/graphql/object_type.rb +27 -25
  27. data/lib/graphql/query.rb +5 -8
  28. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -10
  29. data/lib/graphql/scalar_type.rb +4 -3
  30. data/lib/graphql/schema.rb +1 -1
  31. data/lib/graphql/static_validation/rules/document_does_not_exceed_max_depth.rb +1 -1
  32. data/lib/graphql/static_validation/validation_context.rb +5 -4
  33. data/lib/graphql/static_validation/validator.rb +3 -3
  34. data/lib/graphql/string_type.rb +2 -1
  35. data/lib/graphql/union_type.rb +1 -1
  36. data/lib/graphql/version.rb +1 -1
  37. data/readme.md +4 -10
  38. data/spec/graphql/boolean_type_spec.rb +20 -0
  39. data/spec/graphql/define/instance_definable_spec.rb +55 -0
  40. data/spec/graphql/field_spec.rb +14 -2
  41. data/spec/graphql/float_type_spec.rb +15 -0
  42. data/spec/graphql/id_type_spec.rb +9 -0
  43. data/spec/graphql/int_type_spec.rb +15 -0
  44. data/spec/graphql/introspection/input_value_type_spec.rb +36 -0
  45. data/spec/graphql/introspection/type_type_spec.rb +0 -23
  46. data/spec/graphql/query_spec.rb +16 -0
  47. data/spec/graphql/static_validation/complexity_validator_spec.rb +1 -1
  48. data/spec/graphql/static_validation/rules/argument_literals_are_compatible_spec.rb +4 -3
  49. data/spec/graphql/static_validation/rules/arguments_are_defined_spec.rb +4 -3
  50. data/spec/graphql/static_validation/rules/directives_are_defined_spec.rb +4 -3
  51. data/spec/graphql/static_validation/rules/document_does_not_exceed_max_depth_spec.rb +9 -1
  52. data/spec/graphql/static_validation/rules/fields_are_defined_on_type_spec.rb +3 -2
  53. data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +4 -3
  54. data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +4 -3
  55. data/spec/graphql/static_validation/rules/fragment_spreads_are_possible_spec.rb +4 -3
  56. data/spec/graphql/static_validation/rules/fragment_types_exist_spec.rb +4 -3
  57. data/spec/graphql/static_validation/rules/fragments_are_finite_spec.rb +4 -3
  58. data/spec/graphql/static_validation/rules/fragments_are_on_composite_types_spec.rb +4 -3
  59. data/spec/graphql/static_validation/rules/fragments_are_used_spec.rb +4 -3
  60. data/spec/graphql/static_validation/rules/required_arguments_are_present_spec.rb +4 -3
  61. data/spec/graphql/static_validation/rules/variable_default_values_are_correctly_typed_spec.rb +5 -4
  62. data/spec/graphql/static_validation/rules/variable_usages_are_allowed_spec.rb +4 -3
  63. data/spec/graphql/static_validation/rules/variables_are_input_types_spec.rb +4 -3
  64. data/spec/graphql/static_validation/rules/variables_are_used_and_defined_spec.rb +4 -3
  65. data/spec/graphql/static_validation/type_stack_spec.rb +3 -2
  66. data/spec/graphql/static_validation/validator_spec.rb +3 -25
  67. data/spec/graphql/string_type_spec.rb +15 -0
  68. data/spec/support/dairy_app.rb +2 -0
  69. metadata +25 -9
  70. data/lib/graphql/definition_helpers.rb +0 -4
  71. data/lib/graphql/definition_helpers/defined_by_config.rb +0 -123
  72. data/lib/graphql/definition_helpers/string_named_hash.rb +0 -22
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe GraphQL::StaticValidation::RequiredArgumentsArePresent do
4
- let(:document) { GraphQL.parse("
4
+ let(:query_string) {"
5
5
  query getCheese {
6
6
  cheese(id: 1) { source }
7
7
  cheese { source }
@@ -12,10 +12,11 @@ describe GraphQL::StaticValidation::RequiredArgumentsArePresent do
12
12
  flavor @include(if: true)
13
13
  id @skip
14
14
  }
15
- ")}
15
+ "}
16
16
 
17
17
  let(:validator) { GraphQL::StaticValidation::Validator.new(schema: DummySchema, rules: [GraphQL::StaticValidation::RequiredArgumentsArePresent]) }
18
- let(:errors) { validator.validate(document) }
18
+ let(:query) { GraphQL::Query.new(DummySchema, query_string) }
19
+ let(:errors) { validator.validate(query) }
19
20
 
20
21
  it 'finds undefined arguments to fields and directives' do
21
22
  assert_equal(3, errors.length)
@@ -1,10 +1,10 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe GraphQL::StaticValidation::VariableDefaultValuesAreCorrectlyTyped do
4
- let(:document) { GraphQL.parse('
4
+ let(:query_string) {%|
5
5
  query getCheese(
6
6
  $id: Int = 1,
7
- $bool: Boolean = 3.4e24, # can be coerced
7
+ $int: Int = 3.4e24, # can be coerced
8
8
  $str: String!,
9
9
  $badFloat: Float = true,
10
10
  $badInt: Int = "abc",
@@ -14,10 +14,11 @@ describe GraphQL::StaticValidation::VariableDefaultValuesAreCorrectlyTyped do
14
14
  ) {
15
15
  cheese(id: $id) { source }
16
16
  }
17
- ')}
17
+ |}
18
18
 
19
19
  let(:validator) { GraphQL::StaticValidation::Validator.new(schema: DummySchema, rules: [GraphQL::StaticValidation::VariableDefaultValuesAreCorrectlyTyped]) }
20
- let(:errors) { validator.validate(document) }
20
+ let(:query) { GraphQL::Query.new(DummySchema, query_string) }
21
+ let(:errors) { validator.validate(query) }
21
22
 
22
23
  it "finds default values that don't match their types" do
23
24
  expected = [
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe GraphQL::StaticValidation::VariableUsagesAreAllowed do
4
- let(:document) { GraphQL.parse('
4
+ let(:query_string) {'
5
5
  query getCheese(
6
6
  $goodInt: Int = 1,
7
7
  $okInt: Int!,
@@ -30,10 +30,11 @@ describe GraphQL::StaticValidation::VariableUsagesAreAllowed do
30
30
  ... on Cheese { id }
31
31
  }
32
32
  }
33
- ')}
33
+ '}
34
34
 
35
35
  let(:validator) { GraphQL::StaticValidation::Validator.new(schema: DummySchema, rules: [GraphQL::StaticValidation::VariableUsagesAreAllowed]) }
36
- let(:errors) { validator.validate(document) }
36
+ let(:query) { GraphQL::Query.new(DummySchema, query_string) }
37
+ let(:errors) { validator.validate(query) }
37
38
 
38
39
  it "finds variables used as arguments but don't match the argument's type" do
39
40
  assert_equal(4, errors.length)
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe GraphQL::StaticValidation::VariablesAreInputTypes do
4
- let(:document) { GraphQL.parse('
4
+ let(:query_string) {'
5
5
  query getCheese(
6
6
  $id: Int = 1,
7
7
  $str: [String!],
@@ -11,10 +11,11 @@ describe GraphQL::StaticValidation::VariablesAreInputTypes do
11
11
  ) {
12
12
  cheese(id: $id) { source }
13
13
  }
14
- ')}
14
+ '}
15
15
 
16
16
  let(:validator) { GraphQL::StaticValidation::Validator.new(schema: DummySchema, rules: [GraphQL::StaticValidation::VariablesAreInputTypes]) }
17
- let(:errors) { validator.validate(document) }
17
+ let(:query) { GraphQL::Query.new(DummySchema, query_string) }
18
+ let(:errors) { validator.validate(query) }
18
19
 
19
20
  it "finds variables whose types are invalid" do
20
21
  expected = [
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe GraphQL::StaticValidation::VariablesAreUsedAndDefined do
4
- let(:document) { GraphQL.parse('
4
+ let(:query_string) {'
5
5
  query getCheese(
6
6
  $usedVar: Int,
7
7
  $usedInnerVar: String,
@@ -27,10 +27,11 @@ describe GraphQL::StaticValidation::VariablesAreUsedAndDefined do
27
27
  source(notDefined: $undefinedFragmentVar)
28
28
  someField(someArg: $usedFragmentVar)
29
29
  }
30
- ')}
30
+ '}
31
31
 
32
32
  let(:validator) { GraphQL::StaticValidation::Validator.new(schema: DummySchema, rules: [GraphQL::StaticValidation::VariablesAreUsedAndDefined]) }
33
- let(:errors) { validator.validate(document) }
33
+ let(:query) { GraphQL::Query.new(DummySchema, query_string) }
34
+ let(:errors) { validator.validate(query) }
34
35
 
35
36
  it "finds variables which are used-but-not-defined or defined-but-not-used" do
36
37
  expected = [
@@ -20,11 +20,12 @@ describe GraphQL::StaticValidation::TypeStack do
20
20
  }
21
21
  fragment edibleFields on Edible { fatContent @skip(if: false)}
22
22
  |}
23
- let(:document) { GraphQL.parse(query_string) }
23
+
24
24
  let(:validator) { GraphQL::StaticValidation::Validator.new(schema: DummySchema, rules: [TypeCheckValidator]) }
25
+ let(:query) { GraphQL::Query.new(DummySchema, query_string) }
25
26
 
26
27
  it 'stores up types' do
27
- validator.validate(document)
28
+ validator.validate(query)
28
29
  expected = [
29
30
  ["Query", "Cheese"],
30
31
  ["Query", "Cheese", "Non-Null"],
@@ -1,33 +1,11 @@
1
1
  require 'spec_helper'
2
2
 
3
- class SchemaErrorValidator
4
- def validate(context)
5
- context.errors << GraphQL::StaticValidation::Message.new("Something is wrong: #{context.schema}", line: 100, col: 4)
6
- end
7
- end
8
-
9
- class DocumentErrorValidator
10
- include
11
- def validate(context)
12
- context.errors << GraphQL::StaticValidation::Message.new("Something is wrong: #{context.document.name}", line: 1, col: 1)
13
- end
14
- end
15
-
16
3
  describe GraphQL::StaticValidation::Validator do
17
- let(:document) { OpenStruct.new(name: "This is not a document", children: [], definitions: []) }
18
- let(:validator) { GraphQL::StaticValidation::Validator.new(schema: "This is not a schema", rules: [SchemaErrorValidator, DocumentErrorValidator]) }
19
- let(:errors) { validator.validate(document) }
20
- it 'uses rules' do
21
- expected_errors = [
22
- {"message" => "Something is wrong: This is not a schema", "locations" => [{"line" => 100, "column" => 4}]},
23
- {"message" => "Something is wrong: This is not a document", "locations" => [{"line" => 1, "column" => 1}]}
24
- ]
25
- assert_equal(expected_errors, errors)
26
- end
4
+ let(:validator) { GraphQL::StaticValidation::Validator.new(schema: DummySchema) }
5
+ let(:query) { GraphQL::Query.new(DummySchema, query_string) }
6
+ let(:errors) { validator.validate(query) }
27
7
 
28
8
  describe 'validation order' do
29
- let(:validator) { GraphQL::StaticValidation::Validator.new(schema: DummySchema) }
30
- let(:document) { GraphQL.parse(query_string)}
31
9
 
32
10
  describe 'fields & arguments' do
33
11
  let(:query_string) { %|
@@ -0,0 +1,15 @@
1
+ require "spec_helper"
2
+
3
+ describe GraphQL::STRING_TYPE do
4
+ describe "coerce_input" do
5
+ it "accepts strings" do
6
+ assert_equal "str", GraphQL::STRING_TYPE.coerce_input("str")
7
+ end
8
+
9
+ it "doesn't accept other types" do
10
+ assert_equal nil, GraphQL::STRING_TYPE.coerce_input(100)
11
+ assert_equal nil, GraphQL::STRING_TYPE.coerce_input(true)
12
+ assert_equal nil, GraphQL::STRING_TYPE.coerce_input(0.999)
13
+ end
14
+ end
15
+ end
@@ -118,6 +118,8 @@ DairyProductInputType = GraphQL::InputObjectType.define {
118
118
  description "Where it came from"
119
119
  end
120
120
 
121
+ input_field :originDairy, types.String, "Dairy which produced it", default_value: "Sugar Hollow Dairy"
122
+
121
123
  input_field :fatContent, types.Float, "How much fat it has"
122
124
  }
123
125
 
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.11.1
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Mosolgo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-06 00:00:00.000000000 Z
11
+ date: 2016-03-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parslet
@@ -142,14 +142,14 @@ dependencies:
142
142
  requirements:
143
143
  - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: '10.4'
145
+ version: '11.0'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: '10.4'
152
+ version: '11.0'
153
153
  description: A GraphQL server implementation for Ruby. Includes schema definition,
154
154
  query parsing, static validation, type definition, and query execution.
155
155
  email:
@@ -163,11 +163,15 @@ files:
163
163
  - lib/graphql/argument.rb
164
164
  - lib/graphql/base_type.rb
165
165
  - lib/graphql/boolean_type.rb
166
- - lib/graphql/definition_helpers.rb
167
- - lib/graphql/definition_helpers/defined_by_config.rb
168
- - lib/graphql/definition_helpers/non_null_with_bang.rb
169
- - lib/graphql/definition_helpers/string_named_hash.rb
170
- - lib/graphql/definition_helpers/type_definer.rb
166
+ - lib/graphql/define.rb
167
+ - lib/graphql/define/assign_argument.rb
168
+ - lib/graphql/define/assign_enum_value.rb
169
+ - lib/graphql/define/assign_object_field.rb
170
+ - lib/graphql/define/assignment_dictionary.rb
171
+ - lib/graphql/define/defined_object_proxy.rb
172
+ - lib/graphql/define/instance_definable.rb
173
+ - lib/graphql/define/non_null_with_bang.rb
174
+ - lib/graphql/define/type_definer.rb
171
175
  - lib/graphql/directive.rb
172
176
  - lib/graphql/directive/include_directive.rb
173
177
  - lib/graphql/directive/skip_directive.rb
@@ -268,14 +272,19 @@ files:
268
272
  - lib/graphql/version.rb
269
273
  - readme.md
270
274
  - spec/graphql/base_type_spec.rb
275
+ - spec/graphql/boolean_type_spec.rb
276
+ - spec/graphql/define/instance_definable_spec.rb
271
277
  - spec/graphql/directive_spec.rb
272
278
  - spec/graphql/enum_type_spec.rb
273
279
  - spec/graphql/execution_error_spec.rb
274
280
  - spec/graphql/field_spec.rb
281
+ - spec/graphql/float_type_spec.rb
275
282
  - spec/graphql/id_type_spec.rb
276
283
  - spec/graphql/input_object_type_spec.rb
284
+ - spec/graphql/int_type_spec.rb
277
285
  - spec/graphql/interface_type_spec.rb
278
286
  - spec/graphql/introspection/directive_type_spec.rb
287
+ - spec/graphql/introspection/input_value_type_spec.rb
279
288
  - spec/graphql/introspection/introspection_query_spec.rb
280
289
  - spec/graphql/introspection/schema_type_spec.rb
281
290
  - spec/graphql/introspection/type_type_spec.rb
@@ -321,6 +330,7 @@ files:
321
330
  - spec/graphql/static_validation/rules/variables_are_used_and_defined_spec.rb
322
331
  - spec/graphql/static_validation/type_stack_spec.rb
323
332
  - spec/graphql/static_validation/validator_spec.rb
333
+ - spec/graphql/string_type_spec.rb
324
334
  - spec/graphql/union_type_spec.rb
325
335
  - spec/spec_helper.rb
326
336
  - spec/support/calculator_schema.rb
@@ -355,14 +365,19 @@ specification_version: 4
355
365
  summary: A GraphQL server implementation for Ruby
356
366
  test_files:
357
367
  - spec/graphql/base_type_spec.rb
368
+ - spec/graphql/boolean_type_spec.rb
369
+ - spec/graphql/define/instance_definable_spec.rb
358
370
  - spec/graphql/directive_spec.rb
359
371
  - spec/graphql/enum_type_spec.rb
360
372
  - spec/graphql/execution_error_spec.rb
361
373
  - spec/graphql/field_spec.rb
374
+ - spec/graphql/float_type_spec.rb
362
375
  - spec/graphql/id_type_spec.rb
363
376
  - spec/graphql/input_object_type_spec.rb
377
+ - spec/graphql/int_type_spec.rb
364
378
  - spec/graphql/interface_type_spec.rb
365
379
  - spec/graphql/introspection/directive_type_spec.rb
380
+ - spec/graphql/introspection/input_value_type_spec.rb
366
381
  - spec/graphql/introspection/introspection_query_spec.rb
367
382
  - spec/graphql/introspection/schema_type_spec.rb
368
383
  - spec/graphql/introspection/type_type_spec.rb
@@ -408,6 +423,7 @@ test_files:
408
423
  - spec/graphql/static_validation/rules/variables_are_used_and_defined_spec.rb
409
424
  - spec/graphql/static_validation/type_stack_spec.rb
410
425
  - spec/graphql/static_validation/validator_spec.rb
426
+ - spec/graphql/string_type_spec.rb
411
427
  - spec/graphql/union_type_spec.rb
412
428
  - spec/spec_helper.rb
413
429
  - spec/support/calculator_schema.rb
@@ -1,4 +0,0 @@
1
- require 'graphql/definition_helpers/non_null_with_bang'
2
- require 'graphql/definition_helpers/defined_by_config'
3
- require 'graphql/definition_helpers/string_named_hash'
4
- require 'graphql/definition_helpers/type_definer'
@@ -1,123 +0,0 @@
1
- module GraphQL
2
- module DefinitionHelpers
3
- # Provide a two-step definition process.
4
- #
5
- # 1. Use a config object to gather definitions
6
- # 2. Transfer definitions to an actual instance of an object
7
- #
8
- module DefinedByConfig
9
- def self.included(base)
10
- base.extend(ClassMethods)
11
- end
12
-
13
- # This object is `instance_eval`'d when defining _any_ object in the schema.
14
- # Then, the applicable properties of this object are transfered to the given instance.
15
- class DefinitionConfig
16
- def self.attr_definable(*names)
17
- attr_accessor(*names)
18
- names.each do |name|
19
- ivar_name = "@#{name}".to_sym
20
- define_method(name) do |new_value=nil|
21
- new_value && self.instance_variable_set(ivar_name, new_value)
22
- instance_variable_get(ivar_name)
23
- end
24
- end
25
- end
26
-
27
- attr_definable :name, :description,
28
- :interfaces, # object
29
- :deprecation_reason, # field
30
- :type, # field / argument
31
- :property, # field
32
- :resolve, # field / directive
33
- :resolve_type, # interface / union
34
- :possible_types, # interface / union
35
- :default_value, # argument
36
- :on, # directive
37
- :coerce, #scalar
38
- :coerce_input, #scalar
39
- :coerce_result #scalar
40
-
41
- attr_reader :fields, :input_fields, :arguments, :values
42
-
43
- def initialize
44
- @interfaces = []
45
- @possible_types = []
46
- @on = []
47
- @fields = {}
48
- @arguments = {}
49
- @values = []
50
- @input_fields = {}
51
- end
52
-
53
- def types
54
- GraphQL::DefinitionHelpers::TypeDefiner.instance
55
- end
56
-
57
- def field(name, type = nil, desc = nil, field: nil, property: nil, &block)
58
- if block_given?
59
- field = GraphQL::Field.define(&block)
60
- else
61
- field ||= GraphQL::Field.new
62
- end
63
- type && field.type = type
64
- desc && field.description = desc
65
- property && field.property = property
66
- field.name ||= name.to_s
67
- fields[name.to_s] = field
68
- end
69
-
70
- # For EnumType
71
- def value(name, desc = nil, deprecation_reason: nil, value: name)
72
- values << GraphQL::EnumType::EnumValue.new(name: name, description: desc, deprecation_reason: deprecation_reason, value: value)
73
- end
74
-
75
- # For InputObjectType
76
- def input_field(name, type = nil, desc = nil, default_value: nil, &block)
77
- argument = if block_given?
78
- GraphQL::Argument.define(&block)
79
- else
80
- GraphQL::Argument.new
81
- end
82
- argument.name = name
83
- type && argument.type = type
84
- desc && argument.description = desc
85
- default_value && argument.default_value = default_value
86
- input_fields[name.to_s] = argument
87
- end
88
-
89
- def argument(name, type, description = nil, default_value: nil)
90
- argument = GraphQL::Argument.new
91
- argument.name = name.to_s
92
- argument.type = type
93
- argument.description = description
94
- argument.default_value = default_value
95
- @arguments[name.to_s] = argument
96
- end
97
-
98
- def to_instance(object, attributes)
99
- attributes.each do |attr_name|
100
- configured_value = self.public_send(attr_name)
101
- object.public_send("#{attr_name}=", configured_value)
102
- end
103
- object
104
- end
105
- end
106
-
107
- module ClassMethods
108
- # Pass the block to this class's `DefinitionConfig`,
109
- # The return the result of {DefinitionConfig#to_instance}
110
- def define(&block)
111
- config = DefinitionConfig.new
112
- block && config.instance_eval(&block)
113
- config.to_instance(self.new, @defined_attrs)
114
- end
115
-
116
- def defined_by_config(*defined_attrs)
117
- @defined_attrs ||= []
118
- @defined_attrs += defined_attrs
119
- end
120
- end
121
- end
122
- end
123
- end
@@ -1,22 +0,0 @@
1
- module GraphQL
2
- module DefinitionHelpers
3
- # Accepts a hash with symbol keys.
4
- # - convert keys to strings
5
- # - if the value responds to `name=`, then assign the hash key as `name`
6
- #
7
- # Used by {ObjectType#fields}, {Field#arguments} and others.
8
- class StringNamedHash
9
- # Normalized hash for the input
10
- # @return [Hash] Hash with string keys
11
- attr_reader :to_h
12
-
13
- # @param input_hash [Hash] Hash to be normalized
14
- def initialize(input_hash)
15
- @to_h = input_hash
16
- .reduce({}) { |memo, (key, value)| memo[key.to_s] = value; memo }
17
- # Set the name of the value based on its key
18
- @to_h.each {|k, v| v.respond_to?("name=") && v.name = k }
19
- end
20
- end
21
- end
22
- end