33import pickle
44from copy import deepcopy
55from textwrap import dedent
6- from typing import Optional , Tuple
76
87import pytest
98
109from graphql .error import GraphQLSyntaxError
1110from graphql .language import (
1211 ArgumentNode ,
1312 BooleanValueNode ,
13+ ConstDirectiveNode ,
14+ ConstValueNode ,
1415 DirectiveDefinitionNode ,
1516 DirectiveNode ,
1617 DocumentNode ,
2223 InterfaceTypeDefinitionNode ,
2324 InterfaceTypeExtensionNode ,
2425 ListTypeNode ,
26+ Location ,
2527 NamedTypeNode ,
2628 NameNode ,
2729 NonNullTypeNode ,
3234 ScalarTypeDefinitionNode ,
3335 SchemaDefinitionNode ,
3436 SchemaExtensionNode ,
37+ Source ,
3538 StringValueNode ,
39+ Token ,
40+ TokenKind ,
3641 TypeNode ,
3742 UnionTypeDefinitionNode ,
38- ValueNode ,
3943 parse ,
4044)
4145
4246from ..fixtures import kitchen_sink_sdl # noqa: F401
4347
44- try :
45- from typing import TypeAlias
46- except ImportError : # Python < 3.10
47- from typing_extensions import TypeAlias
4848
49-
50- Location : TypeAlias = Optional [Tuple [int , int ]]
49+ def make_loc (position : tuple [int , int ]) -> Location :
50+ """Create a Location for testing with the given (start, end) offsets."""
51+ source = Source (body = "" )
52+ token = Token (
53+ kind = TokenKind .NAME , start = position [0 ], end = position [1 ], line = 1 , column = 1
54+ )
55+ return Location (start_token = token , end_token = token , source = source )
5156
5257
53- def assert_syntax_error (text : str , message : str , location : Location ) -> None :
58+ def assert_syntax_error (
59+ text : str , message : str , location : tuple [int , int ] | None
60+ ) -> None :
5461 with pytest .raises (GraphQLSyntaxError ) as exc_info :
5562 parse (text )
5663 error = exc_info .value
@@ -59,85 +66,104 @@ def assert_syntax_error(text: str, message: str, location: Location) -> None:
5966 assert error .locations == [location ]
6067
6168
62- def assert_definitions (body : str , loc : Location , num = 1 ):
69+ def assert_definitions (body : str , position : tuple [ int , int ] | None , num : int = 1 ):
6370 doc = parse (body )
6471 assert isinstance (doc , DocumentNode )
65- assert doc .loc == loc
72+ assert doc .loc == position
6673 definitions = doc .definitions
6774 assert isinstance (definitions , tuple )
6875 assert len (definitions ) == num
6976 return definitions [0 ] if num == 1 else definitions
7077
7178
72- def type_node (name : str , loc : Location ):
73- return NamedTypeNode (name = name_node (name , loc ), loc = loc )
79+ def type_node (name : str , position : tuple [ int , int ] ):
80+ return NamedTypeNode (name = name_node (name , position ), loc = make_loc ( position ) )
7481
7582
76- def name_node (name : str , loc : Location ):
77- return NameNode (value = name , loc = loc )
83+ def name_node (name : str , position : tuple [ int , int ] ):
84+ return NameNode (value = name , loc = make_loc ( position ) )
7885
7986
80- def field_node (name : NameNode , type_ : TypeNode , loc : Location ):
81- return field_node_with_args (name , type_ , (), loc )
87+ def field_node (name : NameNode , type_ : TypeNode , position : tuple [ int , int ] ):
88+ return field_node_with_args (name , type_ , (), position )
8289
8390
84- def field_node_with_args (name : NameNode , type_ : TypeNode , args : tuple , loc : Location ):
91+ def field_node_with_args (
92+ name : NameNode , type_ : TypeNode , args : tuple , position : tuple [int , int ]
93+ ):
8594 return FieldDefinitionNode (
86- name = name , arguments = args , type = type_ , directives = (), loc = loc , description = None
95+ name = name ,
96+ arguments = args ,
97+ type = type_ ,
98+ directives = (),
99+ loc = make_loc (position ),
100+ description = None ,
87101 )
88102
89103
90- def non_null_type (type_ : TypeNode , loc : Location ):
91- return NonNullTypeNode (type = type_ , loc = loc )
104+ def non_null_type (type_ : NamedTypeNode | ListTypeNode , position : tuple [ int , int ] ):
105+ return NonNullTypeNode (type = type_ , loc = make_loc ( position ) )
92106
93107
94- def enum_value_node (name : str , loc : Location ):
108+ def enum_value_node (name : str , position : tuple [ int , int ] ):
95109 return EnumValueDefinitionNode (
96- name = name_node (name , loc ), directives = (), loc = loc , description = None
110+ name = name_node (name , position ),
111+ directives = (),
112+ loc = make_loc (position ),
113+ description = None ,
97114 )
98115
99116
100117def input_value_node (
101- name : NameNode , type_ : TypeNode , default_value : ValueNode | None , loc : Location
118+ name : NameNode ,
119+ type_ : TypeNode ,
120+ default_value : ConstValueNode | None ,
121+ position : tuple [int , int ],
102122):
103123 return InputValueDefinitionNode (
104124 name = name ,
105125 type = type_ ,
106126 default_value = default_value ,
107127 directives = (),
108- loc = loc ,
128+ loc = make_loc ( position ) ,
109129 description = None ,
110130 )
111131
112132
113- def boolean_value_node (value : bool , loc : Location ):
114- return BooleanValueNode (value = value , loc = loc )
133+ def boolean_value_node (value : bool , position : tuple [ int , int ] ):
134+ return BooleanValueNode (value = value , loc = make_loc ( position ) )
115135
116136
117- def string_value_node (value : str , block : bool | None , loc : Location ):
118- return StringValueNode (value = value , block = block , loc = loc )
137+ def string_value_node (value : str , block : bool | None , position : tuple [ int , int ] ):
138+ return StringValueNode (value = value , block = block , loc = make_loc ( position ) )
119139
120140
121- def list_type_node (type_ : TypeNode , loc : Location ):
122- return ListTypeNode (type = type_ , loc = loc )
141+ def list_type_node (type_ : TypeNode , position : tuple [ int , int ] ):
142+ return ListTypeNode (type = type_ , loc = make_loc ( position ) )
123143
124144
125145def schema_extension_node (
126- directives : tuple [DirectiveNode , ...],
146+ directives : tuple [ConstDirectiveNode , ...],
127147 operation_types : tuple [OperationTypeDefinitionNode , ...],
128- loc : Location ,
148+ position : tuple [ int , int ] ,
129149):
130150 return SchemaExtensionNode (
131- directives = directives , operation_types = operation_types , loc = loc
151+ directives = directives , operation_types = operation_types , loc = make_loc ( position )
132152 )
133153
134154
135- def operation_type_definition (operation : OperationType , type_ : TypeNode , loc : Location ):
136- return OperationTypeDefinitionNode (operation = operation , type = type_ , loc = loc )
155+ def operation_type_definition (
156+ operation : OperationType , type_ : NamedTypeNode , position : tuple [int , int ]
157+ ):
158+ return OperationTypeDefinitionNode (
159+ operation = operation , type = type_ , loc = make_loc (position )
160+ )
137161
138162
139- def directive_node (name : NameNode , arguments : tuple [ArgumentNode , ...], loc : Location ):
140- return DirectiveNode (name = name , arguments = arguments , loc = loc )
163+ def directive_node (
164+ name : NameNode , arguments : tuple [ArgumentNode , ...], position : tuple [int , int ]
165+ ):
166+ return DirectiveNode (name = name , arguments = arguments , loc = make_loc (position ))
141167
142168
143169def describe_schema_parser ():
0 commit comments