graphql 0.11.1 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
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