Skip to content

Commit 6f040fd

Browse files
committed
RFC: Schema Language Directives. Commit graphql/graphql-js@1b6824b
1 parent 0a16b27 commit 6f040fd

File tree

13 files changed

+312
-41
lines changed

13 files changed

+312
-41
lines changed

graphql/language/ast.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -911,14 +911,15 @@ def __hash__(self):
911911

912912

913913
class ObjectTypeDefinition(TypeDefinition):
914-
__slots__ = ('loc', 'name', 'interfaces', 'fields',)
914+
__slots__ = ('loc', 'name', 'interfaces', 'directives', 'fields',)
915915
_fields = ('name', 'interfaces', 'fields',)
916916

917-
def __init__(self, name, fields, interfaces=None, loc=None):
917+
def __init__(self, name, fields, interfaces=None, loc=None, directives=None):
918918
self.loc = loc
919919
self.name = name
920920
self.interfaces = interfaces
921921
self.fields = fields
922+
self.directives = directives
922923

923924
def __eq__(self, other):
924925
return (
@@ -927,7 +928,8 @@ def __eq__(self, other):
927928
self.loc == other.loc and
928929
self.name == other.name and
929930
self.interfaces == other.interfaces and
930-
self.fields == other.fields
931+
self.fields == other.fields and
932+
self.directives == other.directives
931933
)
932934
)
933935

@@ -936,14 +938,16 @@ def __repr__(self):
936938
'name={self.name!r}'
937939
', interfaces={self.interfaces!r}'
938940
', fields={self.fields!r}'
941+
', directives={self.directives!r}'
939942
')').format(self=self)
940943

941944
def __copy__(self):
942945
return type(self)(
943946
self.name,
944947
self.fields,
945948
self.interfaces,
946-
self.loc
949+
self.loc,
950+
self.directives,
947951
)
948952

949953
def __hash__(self):
@@ -1022,6 +1026,7 @@ def __repr__(self):
10221026
'name={self.name!r}'
10231027
', type={self.type!r}'
10241028
', default_value={self.default_value!r}'
1029+
', directives={self.directives!r}'
10251030
')').format(self=self)
10261031

10271032
def __copy__(self):
@@ -1062,6 +1067,7 @@ def __repr__(self):
10621067
return ('InterfaceTypeDefinition('
10631068
'name={self.name!r}'
10641069
', fields={self.fields!r}'
1070+
', directives={self.directives!r}'
10651071
')').format(self=self)
10661072

10671073
def __copy__(self):
@@ -1101,6 +1107,7 @@ def __repr__(self):
11011107
return ('UnionTypeDefinition('
11021108
'name={self.name!r}'
11031109
', types={self.types!r}'
1110+
', directives={self.directives!r}'
11041111
')').format(self=self)
11051112

11061113
def __copy__(self):
@@ -1137,6 +1144,7 @@ def __eq__(self, other):
11371144
def __repr__(self):
11381145
return ('ScalarTypeDefinition('
11391146
'name={self.name!r}'
1147+
'directives={self.directives!r}'
11401148
')').format(self=self)
11411149

11421150
def __copy__(self):
@@ -1175,6 +1183,7 @@ def __repr__(self):
11751183
return ('EnumTypeDefinition('
11761184
'name={self.name!r}'
11771185
', values={self.values!r}'
1186+
', directives={self.directives!r}'
11781187
')').format(self=self)
11791188

11801189
def __copy__(self):
@@ -1211,6 +1220,7 @@ def __eq__(self, other):
12111220
def __repr__(self):
12121221
return ('EnumValueDefinition('
12131222
'name={self.name!r}'
1223+
', directives={self.directives!r}'
12141224
')').format(self=self)
12151225

12161226
def __copy__(self):
@@ -1249,6 +1259,7 @@ def __repr__(self):
12491259
return ('InputObjectTypeDefinition('
12501260
'name={self.name!r}'
12511261
', fields={self.fields!r}'
1262+
', directives={self.directives!r}'
12521263
')').format(self=self)
12531264

12541265
def __copy__(self):

graphql/language/parser.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,6 @@ def parse_directives(parser):
476476
directives = []
477477
while peek(parser, TokenKind.AT):
478478
directives.append(parse_directive(parser))
479-
480479
return directives
481480

482481

@@ -603,8 +602,8 @@ def parse_scalar_type_definition(parser):
603602

604603
return ast.ScalarTypeDefinition(
605604
name=parse_name(parser),
606-
loc=loc(parser, start),
607605
directives=parse_directives(parser),
606+
loc=loc(parser, start),
608607
)
609608

610609

@@ -614,14 +613,14 @@ def parse_object_type_definition(parser):
614613
return ast.ObjectTypeDefinition(
615614
name=parse_name(parser),
616615
interfaces=parse_implements_interfaces(parser),
616+
directives=parse_directives(parser),
617617
fields=any(
618618
parser,
619619
TokenKind.BRACE_L,
620620
parse_field_definition,
621621
TokenKind.BRACE_R
622622
),
623623
loc=loc(parser, start),
624-
directives=parse_directives(parser),
625624
)
626625

627626

@@ -646,8 +645,8 @@ def parse_field_definition(parser):
646645
name=parse_name(parser),
647646
arguments=parse_argument_defs(parser),
648647
type=expect(parser, TokenKind.COLON) and parse_type(parser),
649-
loc=loc(parser, start),
650648
directives=parse_directives(parser),
649+
loc=loc(parser, start),
651650
)
652651

653652

@@ -661,13 +660,14 @@ def parse_argument_defs(parser):
661660
def parse_input_value_def(parser):
662661
start = parser.token.start
663662

664-
return ast.InputValueDefinition(
663+
bla = ast.InputValueDefinition(
665664
name=parse_name(parser),
666665
type=expect(parser, TokenKind.COLON) and parse_type(parser),
667666
default_value=parse_const_value(parser) if skip(parser, TokenKind.EQUALS) else None,
668-
loc=loc(parser, start),
669667
directives=parse_directives(parser),
668+
loc=loc(parser, start),
670669
)
670+
return bla
671671

672672

673673
def parse_interface_type_definition(parser):
@@ -676,9 +676,9 @@ def parse_interface_type_definition(parser):
676676

677677
return ast.InterfaceTypeDefinition(
678678
name=parse_name(parser),
679+
directives=parse_directives(parser),
679680
fields=any(parser, TokenKind.BRACE_L, parse_field_definition, TokenKind.BRACE_R),
680681
loc=loc(parser, start),
681-
directives=parse_directives(parser),
682682
)
683683

684684

@@ -688,9 +688,9 @@ def parse_union_type_definition(parser):
688688

689689
return ast.UnionTypeDefinition(
690690
name=parse_name(parser),
691+
directives=parse_directives(parser),
691692
types=expect(parser, TokenKind.EQUALS) and parse_union_members(parser),
692693
loc=loc(parser, start),
693-
directives=parse_directives(parser),
694694
)
695695

696696

@@ -712,9 +712,9 @@ def parse_enum_type_definition(parser):
712712

713713
return ast.EnumTypeDefinition(
714714
name=parse_name(parser),
715+
directives=parse_directives(parser),
715716
values=many(parser, TokenKind.BRACE_L, parse_enum_value_definition, TokenKind.BRACE_R),
716717
loc=loc(parser, start),
717-
directives=parse_directives(parser),
718718
)
719719

720720

@@ -723,8 +723,8 @@ def parse_enum_value_definition(parser):
723723

724724
return ast.EnumValueDefinition(
725725
name=parse_name(parser),
726-
loc=loc(parser, start),
727726
directives=parse_directives(parser),
727+
loc=loc(parser, start),
728728
)
729729

730730

@@ -734,9 +734,9 @@ def parse_input_object_type_definition(parser):
734734

735735
return ast.InputObjectTypeDefinition(
736736
name=parse_name(parser),
737+
directives=parse_directives(parser),
737738
fields=any(parser, TokenKind.BRACE_L, parse_input_value_def, TokenKind.BRACE_R),
738739
loc=loc(parser, start),
739-
directives=parse_directives(parser),
740740
)
741741

742742

graphql/language/printer.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -118,15 +118,16 @@ def leave_OperationTypeDefinition(self, node, *args):
118118
return '{}: {}'.format(node.operation, node.type)
119119

120120
def leave_ScalarTypeDefinition(self, node, *args):
121-
return 'scalar ' + node.name + join(node.directives, ' ')
121+
return 'scalar ' + node.name + wrap(' ', join(node.directives, ' '))
122122

123123
def leave_ObjectTypeDefinition(self, node, *args):
124-
return (
125-
'type ' + node.name + ' ' +
126-
wrap('implements ', join(node.interfaces, ', '), ' ') +
127-
join(node.directives, ' ') + ' ' +
124+
return join([
125+
'type',
126+
node.name,
127+
wrap('implements ', join(node.interfaces, ', ')),
128+
join(node.directives, ' '),
128129
block(node.fields)
129-
)
130+
], ' ')
130131

131132
def leave_FieldDefinition(self, node, *args):
132133
return (
@@ -138,22 +139,22 @@ def leave_FieldDefinition(self, node, *args):
138139
)
139140

140141
def leave_InputValueDefinition(self, node, *args):
141-
return node.name + ': ' + node.type + wrap(' = ', node.default_value) + ' ' + join(node.directives, ' ')
142+
return node.name + ': ' + node.type + wrap(' = ', node.default_value) + wrap(' ', join(node.directives, ' '))
142143

143144
def leave_InterfaceTypeDefinition(self, node, *args):
144-
return 'interface ' + node.name + ' ' + join(node.directives, ' ') + ' ' + block(node.fields)
145+
return 'interface ' + node.name + wrap(' ', join(node.directives, ' ')) + ' ' + block(node.fields)
145146

146147
def leave_UnionTypeDefinition(self, node, *args):
147-
return 'union ' + node.name + ' ' + join(node.directives, ' ') + ' = ' + join(node.types, ' | ')
148+
return 'union ' + node.name + wrap(' ', join(node.directives, ' ')) + ' = ' + join(node.types, ' | ')
148149

149150
def leave_EnumTypeDefinition(self, node, *args):
150-
return 'enum ' + node.name + ' ' + join(node.directives, ' ') + ' ' + block(node.values)
151+
return 'enum ' + node.name + wrap(' ', join(node.directives, ' ')) + ' ' + block(node.values)
151152

152153
def leave_EnumValueDefinition(self, node, *args):
153-
return node.name
154+
return node.name + wrap(' ', join(node.directives, ' '))
154155

155156
def leave_InputObjectTypeDefinition(self, node, *args):
156-
return 'input ' + node.name + ' ' + join(node.directives, ' ') + ' ' + block(node.fields)
157+
return 'input ' + node.name + wrap(' ', join(node.directives, ' ')) + ' ' + block(node.fields)
157158

158159
def leave_TypeExtensionDefinition(self, node, *args):
159160
return 'extend ' + node.definition

graphql/language/tests/fixtures.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,29 +81,52 @@
8181
six(argument: InputType = {key: "value"}): Type
8282
}
8383
84+
type AnnotatedObject @onObject(arg: "value") {
85+
annotatedField(arg: Type = "default" @onArg): Type @onField
86+
}
87+
8488
interface Bar {
8589
one: Type
8690
four(argument: String = "string"): String
8791
}
8892
93+
interface AnnotatedInterface @onInterface {
94+
annotatedField(arg: Type @onArg): Type @onField
95+
}
96+
8997
union Feed = Story | Article | Advert
9098
99+
union AnnotatedUnion @onUnion = A | B
100+
91101
scalar CustomScalar
92102
103+
scalar AnnotatedScalar @onScalar
104+
93105
enum Site {
94106
DESKTOP
95107
MOBILE
96108
}
97109
110+
enum AnnotatedEnum @onEnum {
111+
ANNOTATED_VALUE @onEnumValue
112+
OTHER_VALUE
113+
}
114+
98115
input InputType {
99116
key: String!
100117
answer: Int = 42
101118
}
102119
120+
input AnnotatedInput @onInputObjectType {
121+
annotatedField: Type @onField
122+
}
123+
103124
extend type Foo {
104125
seven(argument: [String]): Type
105126
}
106127
128+
extend type Foo @onType {}
129+
107130
type NoFields {}
108131
109132
directive @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT

0 commit comments

Comments
 (0)