Skip to content

Commit a8e4858

Browse files
committed
Add support for extend input to parser
1 parent c3673cf commit a8e4858

File tree

3 files changed

+64
-0
lines changed

3 files changed

+64
-0
lines changed

lib/graphql/compatibility/schema_parser_specification.rb

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,63 @@ def test_it_parses_enum_type_extension_with_directives
533533
assert_equal 0, enum_type_extension.values.length
534534
end
535535

536+
def test_it_parses_input_object_type_extension_with_fields
537+
document = parse('
538+
extend input UserInput {
539+
login: String!
540+
}
541+
')
542+
543+
input_object_type_extension = document.definitions.first
544+
assert_equal GraphQL::Language::Nodes::InputObjectTypeExtension, input_object_type_extension.class
545+
assert_equal 'UserInput', input_object_type_extension.name
546+
assert_equal [2, 15], input_object_type_extension.position
547+
548+
assert_equal 1, input_object_type_extension.fields.length
549+
assert_equal GraphQL::Language::Nodes::InputValueDefinition, input_object_type_extension.fields.first.class
550+
assert_equal 'login', input_object_type_extension.fields.first.name
551+
552+
assert_equal 0, input_object_type_extension.directives.length
553+
end
554+
555+
def test_it_parses_input_object_type_extension_with_directives_and_fields
556+
document = parse('
557+
extend input UserInput @deprecated {
558+
login: String!
559+
}
560+
')
561+
562+
input_object_type_extension = document.definitions.first
563+
assert_equal GraphQL::Language::Nodes::InputObjectTypeExtension, input_object_type_extension.class
564+
assert_equal 'UserInput', input_object_type_extension.name
565+
assert_equal [2, 15], input_object_type_extension.position
566+
567+
assert_equal 1, input_object_type_extension.fields.length
568+
assert_equal GraphQL::Language::Nodes::InputValueDefinition, input_object_type_extension.fields.first.class
569+
assert_equal 'login', input_object_type_extension.fields.first.name
570+
571+
assert_equal 1, input_object_type_extension.directives.length
572+
assert_equal GraphQL::Language::Nodes::Directive, input_object_type_extension.directives.first.class
573+
assert_equal 'deprecated', input_object_type_extension.directives.first.name
574+
end
575+
576+
def test_it_parses_input_object_type_extension_with_directives
577+
document = parse('
578+
extend input UserInput @deprecated
579+
')
580+
581+
input_object_type_extension = document.definitions.first
582+
assert_equal GraphQL::Language::Nodes::InputObjectTypeExtension, input_object_type_extension.class
583+
assert_equal 'UserInput', input_object_type_extension.name
584+
assert_equal [2, 15], input_object_type_extension.position
585+
586+
assert_equal 0, input_object_type_extension.fields.length
587+
588+
assert_equal 1, input_object_type_extension.directives.length
589+
assert_equal GraphQL::Language::Nodes::Directive, input_object_type_extension.directives.first.class
590+
assert_equal 'deprecated', input_object_type_extension.directives.first.name
591+
end
592+
536593
def test_it_parses_whole_definition_with_descriptions
537594
document = parse(SCHEMA_DEFINITION_STRING)
538595

lib/graphql/language/nodes.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,6 +571,8 @@ def children
571571
fields + directives
572572
end
573573
end
574+
575+
class InputObjectTypeExtension < InputObjectTypeDefinition; end;
574576
end
575577
end
576578
end

lib/graphql/language/parser.y

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ rule
311311
| interface_type_extension
312312
| union_type_extension
313313
| enum_type_extension
314+
| input_object_type_extension
314315

315316
scalar_type_extension: EXTEND SCALAR name directives_list { return make_node(:ScalarTypeExtension, name: val[2], directives: val[3], position_source: val[0]) }
316317

@@ -333,6 +334,10 @@ rule
333334
EXTEND ENUM name directives_list_opt LCURLY enum_value_definitions RCURLY { return make_node(:EnumTypeExtension, name: val[2], directives: val[3], values: val[5], position_source: val[0]) }
334335
| EXTEND ENUM name directives_list { return make_node(:EnumTypeExtension, name: val[2], directives: val[3], values: [], position_source: val[0]) }
335336

337+
input_object_type_extension:
338+
EXTEND INPUT name directives_list_opt LCURLY input_value_definition_list RCURLY { return make_node(:InputObjectTypeExtension, name: val[2], directives: val[3], fields: val[5], position_source: val[0]) }
339+
| EXTEND INPUT name directives_list { return make_node(:InputObjectTypeExtension, name: val[2], directives: val[3], fields: [], position_source: val[0]) }
340+
336341
scalar_type_definition: SCALAR name directives_list_opt { return make_node(:ScalarTypeDefinition, name: val[1], directives: val[2], description: get_description(val[0]), position_source: val[0]) }
337342

338343
object_type_definition:

0 commit comments

Comments
 (0)