@@ -246,7 +246,7 @@ def reduce_spread_fragments(spreads):
246
246
)
247
247
for fragment_definition in self .fragment_definitions
248
248
if fragment_definition .name .value not in fragment_names_used
249
- ]
249
+ ]
250
250
251
251
if errors :
252
252
return errors
@@ -315,7 +315,7 @@ def __init__(self, context):
315
315
node .name .value : self .gather_spreads (node )
316
316
for node in context .get_ast ().definitions
317
317
if isinstance (node , ast .FragmentDefinition )
318
- }
318
+ }
319
319
self .known_to_lead_to_cycle = set ()
320
320
321
321
def enter_FragmentDefinition (self , node , * args ):
@@ -450,7 +450,7 @@ def leave_OperationDefinition(self, *args):
450
450
)
451
451
for variable_definition in self .variable_definitions
452
452
if variable_definition .variable .name .value not in self .variable_name_used
453
- ]
453
+ ]
454
454
455
455
if errors :
456
456
return errors
@@ -851,7 +851,7 @@ def leave_SelectionSet(self, node, *args):
851
851
return [
852
852
GraphQLError (self .fields_conflict_message (reason_name , reason ), list (fields )) for
853
853
(reason_name , reason ), fields in conflicts
854
- ]
854
+ ]
855
855
856
856
@staticmethod
857
857
def same_type (type1 , type2 ):
@@ -967,3 +967,26 @@ def reason_message(cls, reason):
967
967
for reason_name , sub_reason in reason )
968
968
969
969
return reason
970
+
971
+
972
+ class UniqueInputFieldNames (ValidationRule ):
973
+ def __init__ (self , context ):
974
+ super (UniqueInputFieldNames , self ).__init__ (context )
975
+ self .known_names = {}
976
+
977
+ def enter_ObjectValue (self , * args ):
978
+ self .known_names = {}
979
+
980
+ def enter_ObjectField (self , node , * args ):
981
+ field_name = node .name .value
982
+ if field_name in self .known_names :
983
+ return GraphQLError (
984
+ self .duplicate_input_field_message (field_name ),
985
+ [self .known_names [field_name ], node .name ]
986
+ )
987
+
988
+ self .known_names [field_name ] = node .name
989
+
990
+ @staticmethod
991
+ def duplicate_input_field_message (field_name ):
992
+ return 'There can only be one input field named "{}".' .format (field_name )
0 commit comments