@@ -23,62 +23,63 @@ class SingleFieldSubscriptionsRule(ValidationRule):
23
23
def enter_operation_definition (
24
24
self , node : OperationDefinitionNode , * _args : Any
25
25
) -> None :
26
- if node .operation == OperationType .SUBSCRIPTION :
27
- schema = self .context .schema
28
- subscription_type = schema .subscription_type
29
- if subscription_type :
30
- operation_name = node .name .value if node .name else None
31
- variable_values : Dict [str , Any ] = {}
32
- document = self .context .document
33
- fragments : Dict [str , FragmentDefinitionNode ] = {
34
- definition .name .value : definition
35
- for definition in document .definitions
36
- if isinstance (definition , FragmentDefinitionNode )
37
- }
38
- fields = collect_fields (
39
- schema ,
40
- fragments ,
41
- variable_values ,
42
- subscription_type ,
43
- node .selection_set ,
44
- {},
45
- set (),
46
- )
47
- if len (fields ) > 1 :
48
- field_selection_lists = list (fields .values ())
49
- extra_field_selection_lists = field_selection_lists [1 :]
50
- extra_field_selection = [
51
- field
52
- for fields in extra_field_selection_lists
53
- for field in (
54
- fields
55
- if isinstance (fields , list )
56
- else [cast (FieldNode , fields )]
26
+ if node .operation != OperationType .SUBSCRIPTION :
27
+ return
28
+ schema = self .context .schema
29
+ subscription_type = schema .subscription_type
30
+ if subscription_type :
31
+ operation_name = node .name .value if node .name else None
32
+ variable_values : Dict [str , Any ] = {}
33
+ document = self .context .document
34
+ fragments : Dict [str , FragmentDefinitionNode ] = {
35
+ definition .name .value : definition
36
+ for definition in document .definitions
37
+ if isinstance (definition , FragmentDefinitionNode )
38
+ }
39
+ fields = collect_fields (
40
+ schema ,
41
+ fragments ,
42
+ variable_values ,
43
+ subscription_type ,
44
+ node .selection_set ,
45
+ {},
46
+ set (),
47
+ )
48
+ if len (fields ) > 1 :
49
+ field_selection_lists = list (fields .values ())
50
+ extra_field_selection_lists = field_selection_lists [1 :]
51
+ extra_field_selection = [
52
+ field
53
+ for fields in extra_field_selection_lists
54
+ for field in (
55
+ fields
56
+ if isinstance (fields , list )
57
+ else [cast (FieldNode , fields )]
58
+ )
59
+ ]
60
+ self .report_error (
61
+ GraphQLError (
62
+ (
63
+ "Anonymous Subscription"
64
+ if operation_name is None
65
+ else f"Subscription '{ operation_name } '"
57
66
)
58
- ]
67
+ + " must select only one top level field." ,
68
+ extra_field_selection ,
69
+ )
70
+ )
71
+ for field_nodes in fields .values ():
72
+ field = field_nodes [0 ]
73
+ field_name = field .name .value
74
+ if field_name .startswith ("__" ):
59
75
self .report_error (
60
76
GraphQLError (
61
77
(
62
78
"Anonymous Subscription"
63
79
if operation_name is None
64
80
else f"Subscription '{ operation_name } '"
65
81
)
66
- + " must select only one top level field." ,
67
- extra_field_selection ,
82
+ + " must not select an introspection top level field." ,
83
+ field_nodes ,
68
84
)
69
85
)
70
- for field_nodes in fields .values ():
71
- field = field_nodes [0 ]
72
- field_name = field .name .value
73
- if field_name .startswith ("__" ):
74
- self .report_error (
75
- GraphQLError (
76
- (
77
- "Anonymous Subscription"
78
- if operation_name is None
79
- else f"Subscription '{ operation_name } '"
80
- )
81
- + " must not select an introspection top level field." ,
82
- field_nodes ,
83
- )
84
- )
0 commit comments