Skip to content

Commit 20de4b0

Browse files
committed
Schema coordinates
Replicates graphql/graphql-js@e2457b33
1 parent 28d6281 commit 20de4b0

18 files changed

Lines changed: 1043 additions & 4 deletions

‎docs/modules/language.rst‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,15 @@ Each kind of AST node has its own class:
7575
.. autoclass:: VariableDefinitionNode
7676
.. autoclass:: VariableNode
7777

78+
Schema coordinates are represented using the following node classes:
79+
80+
.. autoclass:: SchemaCoordinateNode
81+
.. autoclass:: TypeCoordinateNode
82+
.. autoclass:: MemberCoordinateNode
83+
.. autoclass:: ArgumentCoordinateNode
84+
.. autoclass:: DirectiveCoordinateNode
85+
.. autoclass:: DirectiveArgumentCoordinateNode
86+
7887
Directive locations are specified using the following enumeration:
7988

8089
.. autoclass:: DirectiveLocation
@@ -91,6 +100,7 @@ You can also check the type of nodes with the following predicates:
91100
.. autofunction:: is_type_definition_node
92101
.. autofunction:: is_type_system_extension_node
93102
.. autofunction:: is_type_extension_node
103+
.. autofunction:: is_schema_coordinate_node
94104

95105
Lexer
96106
-----
@@ -116,6 +126,7 @@ Parser
116126
.. autofunction:: parse_type
117127
.. autofunction:: parse_value
118128
.. autofunction:: parse_const_value
129+
.. autofunction:: parse_schema_coordinate
119130

120131
Printer
121132
-------

‎docs/modules/utilities.rst‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,3 +112,17 @@ Compare two GraphQLSchemas and detect breaking changes:
112112
.. autoclass:: BreakingChangeType
113113
.. autoclass:: DangerousChange
114114
.. autoclass:: DangerousChangeType
115+
116+
Resolve a schema coordinate to the schema element it refers to:
117+
118+
.. autofunction:: resolve_schema_coordinate
119+
.. autofunction:: resolve_ast_schema_coordinate
120+
121+
.. autoclass:: ResolvedNamedType
122+
.. autoclass:: ResolvedField
123+
.. autoclass:: ResolvedInputField
124+
.. autoclass:: ResolvedEnumValue
125+
.. autoclass:: ResolvedFieldArgument
126+
.. autoclass:: ResolvedDirective
127+
.. autoclass:: ResolvedDirectiveArgument
128+
.. autoclass:: ResolvedSchemaElement

‎src/graphql/__init__.py‎

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
parse_value,
6969
parse_const_value,
7070
parse_type,
71+
parse_schema_coordinate,
7172
# Print
7273
print_ast,
7374
# Visit
@@ -92,6 +93,7 @@
9293
is_type_definition_node,
9394
is_type_system_extension_node,
9495
is_type_extension_node,
96+
is_schema_coordinate_node,
9597
# Types
9698
SourceLocation,
9799
Location,
@@ -158,6 +160,13 @@
158160
UnionTypeExtensionNode,
159161
EnumTypeExtensionNode,
160162
InputObjectTypeExtensionNode,
163+
# Schema Coordinates
164+
SchemaCoordinateNode,
165+
TypeCoordinateNode,
166+
MemberCoordinateNode,
167+
ArgumentCoordinateNode,
168+
DirectiveCoordinateNode,
169+
DirectiveArgumentCoordinateNode,
161170
)
162171

163172
# Utilities for operating on GraphQL type schema and parsed sources.
@@ -226,6 +235,17 @@
226235
DangerousChangeType,
227236
find_breaking_changes,
228237
find_dangerous_changes,
238+
# Resolve a schema coordinate to a schema element.
239+
resolve_schema_coordinate,
240+
resolve_ast_schema_coordinate,
241+
ResolvedNamedType,
242+
ResolvedField,
243+
ResolvedInputField,
244+
ResolvedEnumValue,
245+
ResolvedFieldArgument,
246+
ResolvedDirective,
247+
ResolvedDirectiveArgument,
248+
ResolvedSchemaElement,
229249
)
230250

231251
# Create and operate on GraphQL type definitions and schema.
@@ -602,6 +622,7 @@
602622
"parse_value",
603623
"parse_const_value",
604624
"parse_type",
625+
"parse_schema_coordinate",
605626
"print_ast",
606627
"visit",
607628
"ParallelVisitor",
@@ -624,6 +645,7 @@
624645
"is_type_definition_node",
625646
"is_type_system_extension_node",
626647
"is_type_extension_node",
648+
"is_schema_coordinate_node",
627649
"SourceLocation",
628650
"Location",
629651
"Token",
@@ -687,6 +709,12 @@
687709
"UnionTypeExtensionNode",
688710
"EnumTypeExtensionNode",
689711
"InputObjectTypeExtensionNode",
712+
"SchemaCoordinateNode",
713+
"TypeCoordinateNode",
714+
"MemberCoordinateNode",
715+
"ArgumentCoordinateNode",
716+
"DirectiveCoordinateNode",
717+
"DirectiveArgumentCoordinateNode",
690718
"execute",
691719
"execute_sync",
692720
"default_field_resolver",
@@ -786,6 +814,16 @@
786814
"BreakingChangeType",
787815
"DangerousChange",
788816
"DangerousChangeType",
817+
"resolve_schema_coordinate",
818+
"resolve_ast_schema_coordinate",
819+
"ResolvedNamedType",
820+
"ResolvedField",
821+
"ResolvedInputField",
822+
"ResolvedEnumValue",
823+
"ResolvedFieldArgument",
824+
"ResolvedDirective",
825+
"ResolvedDirectiveArgument",
826+
"ResolvedSchemaElement",
789827
"Undefined",
790828
"UndefinedType",
791829
]

‎src/graphql/language/__init__.py‎

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,13 @@
1414

1515
from .lexer import Lexer
1616

17-
from .parser import parse, parse_type, parse_value, parse_const_value
17+
from .parser import (
18+
parse,
19+
parse_type,
20+
parse_value,
21+
parse_const_value,
22+
parse_schema_coordinate,
23+
)
1824

1925
from .printer import print_ast
2026

@@ -94,6 +100,12 @@
94100
UnionTypeExtensionNode,
95101
EnumTypeExtensionNode,
96102
InputObjectTypeExtensionNode,
103+
SchemaCoordinateNode,
104+
TypeCoordinateNode,
105+
MemberCoordinateNode,
106+
ArgumentCoordinateNode,
107+
DirectiveCoordinateNode,
108+
DirectiveArgumentCoordinateNode,
97109
)
98110
from .predicates import (
99111
is_definition_node,
@@ -106,6 +118,7 @@
106118
is_type_definition_node,
107119
is_type_system_extension_node,
108120
is_type_extension_node,
121+
is_schema_coordinate_node,
109122
)
110123
from .directive_locations import DirectiveLocation
111124

@@ -121,6 +134,7 @@
121134
"parse_value",
122135
"parse_const_value",
123136
"parse_type",
137+
"parse_schema_coordinate",
124138
"print_ast",
125139
"Source",
126140
"visit",
@@ -195,6 +209,12 @@
195209
"UnionTypeExtensionNode",
196210
"EnumTypeExtensionNode",
197211
"InputObjectTypeExtensionNode",
212+
"SchemaCoordinateNode",
213+
"TypeCoordinateNode",
214+
"MemberCoordinateNode",
215+
"ArgumentCoordinateNode",
216+
"DirectiveCoordinateNode",
217+
"DirectiveArgumentCoordinateNode",
198218
"is_definition_node",
199219
"is_executable_definition_node",
200220
"is_selection_node",
@@ -205,4 +225,5 @@
205225
"is_type_definition_node",
206226
"is_type_system_extension_node",
207227
"is_type_extension_node",
228+
"is_schema_coordinate_node",
208229
]

‎src/graphql/language/ast.py‎

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@
6969
"UnionTypeExtensionNode",
7070
"EnumTypeExtensionNode",
7171
"InputObjectTypeExtensionNode",
72+
"SchemaCoordinateNode",
73+
"TypeCoordinateNode",
74+
"MemberCoordinateNode",
75+
"ArgumentCoordinateNode",
76+
"DirectiveCoordinateNode",
77+
"DirectiveArgumentCoordinateNode",
7278
"QUERY_DOCUMENT_KEYS",
7379
]
7480

@@ -314,6 +320,11 @@ class OperationType(Enum):
314320
"union_type_extension": ("name", "directives", "types"),
315321
"enum_type_extension": ("name", "directives", "values"),
316322
"input_object_type_extension": ("name", "directives", "fields"),
323+
"type_coordinate": ("name",),
324+
"member_coordinate": ("name", "member_name"),
325+
"argument_coordinate": ("name", "field_name", "argument_name"),
326+
"directive_coordinate": ("name",),
327+
"directive_argument_coordinate": ("name", "argument_name"),
317328
}
318329

319330

@@ -826,3 +837,49 @@ class InputObjectTypeExtensionNode(TypeExtensionNode):
826837
__slots__ = ("fields",)
827838

828839
fields: Tuple[InputValueDefinitionNode, ...]
840+
841+
842+
# Schema Coordinates
843+
844+
845+
class TypeCoordinateNode(Node):
846+
__slots__ = ("name",)
847+
848+
name: NameNode
849+
850+
851+
class MemberCoordinateNode(Node):
852+
__slots__ = "name", "member_name"
853+
854+
name: NameNode
855+
member_name: NameNode
856+
857+
858+
class ArgumentCoordinateNode(Node):
859+
__slots__ = "name", "field_name", "argument_name"
860+
861+
name: NameNode
862+
field_name: NameNode
863+
argument_name: NameNode
864+
865+
866+
class DirectiveCoordinateNode(Node):
867+
__slots__ = ("name",)
868+
869+
name: NameNode
870+
871+
872+
class DirectiveArgumentCoordinateNode(Node):
873+
__slots__ = "name", "argument_name"
874+
875+
name: NameNode
876+
argument_name: NameNode
877+
878+
879+
SchemaCoordinateNode = Union[
880+
TypeCoordinateNode,
881+
MemberCoordinateNode,
882+
ArgumentCoordinateNode,
883+
DirectiveCoordinateNode,
884+
DirectiveArgumentCoordinateNode,
885+
]

‎src/graphql/language/lexer.py‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -461,6 +461,7 @@ def read_name(self, start: int) -> Token:
461461
TokenKind.AMP,
462462
TokenKind.PAREN_L,
463463
TokenKind.PAREN_R,
464+
TokenKind.DOT,
464465
TokenKind.SPREAD,
465466
TokenKind.COLON,
466467
TokenKind.EQUALS,

0 commit comments

Comments
 (0)