Skip to content

Commit 70e0d85

Browse files
committed
Add Node Predicates
Replicates graphql/graphql-js@4fd9260
1 parent 9adb940 commit 70e0d85

File tree

8 files changed

+179
-46
lines changed

8 files changed

+179
-46
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ a query language for APIs created by Facebook.
1313

1414
The current version 1.0.0rc2 of GraphQL-core-next is up-to-date with GraphQL.js
1515
version 14.0.0rc2. All parts of the API are covered by an extensive test
16-
suite of currently 1552 unit tests.
16+
suite of currently 1561 unit tests.
1717

1818

1919
## Documentation

graphql/__init__.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,16 @@
172172
TokenKind,
173173
DirectiveLocation,
174174
BREAK, SKIP, REMOVE, IDLE,
175+
# Predicates
176+
is_definition_node,
177+
is_executable_definition_node,
178+
is_selection_node,
179+
is_value_node,
180+
is_type_node,
181+
is_type_system_definition_node,
182+
is_type_definition_node,
183+
is_type_system_extension_node,
184+
is_type_extension_node,
175185
# Types
176186
Lexer,
177187
SourceLocation,
@@ -389,6 +399,10 @@
389399
'parse', 'parse_value', 'parse_type',
390400
'print_ast', 'visit', 'ParallelVisitor', 'TypeInfoVisitor', 'Visitor',
391401
'TokenKind', 'DirectiveLocation', 'BREAK', 'SKIP', 'REMOVE', 'IDLE',
402+
'is_definition_node', 'is_executable_definition_node',
403+
'is_selection_node', 'is_value_node', 'is_type_node',
404+
'is_type_system_definition_node', 'is_type_definition_node',
405+
'is_type_system_extension_node', 'is_type_extension_node',
392406
'Lexer', 'SourceLocation', 'Location', 'Token',
393407
'NameNode', 'DocumentNode', 'DefinitionNode', 'ExecutableDefinitionNode',
394408
'OperationDefinitionNode', 'OperationType', 'VariableDefinitionNode',

graphql/language/__init__.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@
3838
ObjectTypeExtensionNode, InterfaceTypeExtensionNode,
3939
UnionTypeExtensionNode, EnumTypeExtensionNode,
4040
InputObjectTypeExtensionNode)
41+
from .predicates import (
42+
is_definition_node, is_executable_definition_node,
43+
is_selection_node, is_value_node, is_type_node,
44+
is_type_system_definition_node, is_type_definition_node,
45+
is_type_system_extension_node, is_type_extension_node)
4146
from .directive_locations import DirectiveLocation
4247

4348
__all__ = [
@@ -70,4 +75,8 @@
7075
'SchemaExtensionNode', 'TypeExtensionNode', 'ScalarTypeExtensionNode',
7176
'ObjectTypeExtensionNode', 'InterfaceTypeExtensionNode',
7277
'UnionTypeExtensionNode', 'EnumTypeExtensionNode',
73-
'InputObjectTypeExtensionNode']
78+
'InputObjectTypeExtensionNode',
79+
'is_definition_node', 'is_executable_definition_node',
80+
'is_selection_node', 'is_value_node', 'is_type_node',
81+
'is_type_system_definition_node', 'is_type_definition_node',
82+
'is_type_system_extension_node', 'is_type_extension_node']

graphql/language/predicates.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from .ast import (
2+
Node, DefinitionNode, ExecutableDefinitionNode, SchemaExtensionNode,
3+
SelectionNode, TypeDefinitionNode, TypeExtensionNode, TypeNode,
4+
TypeSystemDefinitionNode, ValueNode)
5+
6+
__all__ = [
7+
'is_definition_node', 'is_executable_definition_node',
8+
'is_selection_node', 'is_value_node', 'is_type_node',
9+
'is_type_system_definition_node', 'is_type_definition_node',
10+
'is_type_system_extension_node', 'is_type_extension_node']
11+
12+
13+
def is_definition_node(node: Node) -> bool:
14+
return isinstance(node, DefinitionNode)
15+
16+
17+
def is_executable_definition_node(node: Node) -> bool:
18+
return isinstance(node, ExecutableDefinitionNode)
19+
20+
21+
def is_selection_node(node: Node) -> bool:
22+
return isinstance(node, SelectionNode)
23+
24+
25+
def is_value_node(node: Node) -> bool:
26+
return isinstance(node, ValueNode)
27+
28+
29+
def is_type_node(node: Node) -> bool:
30+
return isinstance(node, TypeNode)
31+
32+
33+
def is_type_system_definition_node(node: Node) -> bool:
34+
return isinstance(node, TypeSystemDefinitionNode)
35+
36+
37+
def is_type_definition_node(node: Node) -> bool:
38+
return isinstance(node, TypeDefinitionNode)
39+
40+
41+
def is_type_system_extension_node(node: Node) -> bool:
42+
return isinstance(node, (SchemaExtensionNode, TypeExtensionNode))
43+
44+
45+
def is_type_extension_node(node: Node) -> bool:
46+
return isinstance(node, TypeExtensionNode)

graphql/utilities/build_ast_schema.py

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -59,26 +59,19 @@ def build_ast_schema(
5959
node_map: TypeDefinitionsMap = {}
6060
directive_defs: List[DirectiveDefinitionNode] = []
6161
append_directive_def = directive_defs.append
62-
type_definition_nodes = (
63-
ScalarTypeDefinitionNode,
64-
ObjectTypeDefinitionNode,
65-
InterfaceTypeDefinitionNode,
66-
EnumTypeDefinitionNode,
67-
UnionTypeDefinitionNode,
68-
InputObjectTypeDefinitionNode)
69-
for d in document_ast.definitions:
70-
if isinstance(d, SchemaDefinitionNode):
71-
schema_def = d
72-
elif isinstance(d, type_definition_nodes):
73-
d = cast(TypeDefinitionNode, d)
74-
type_name = d.name.value
62+
for def_ in document_ast.definitions:
63+
if isinstance(def_, SchemaDefinitionNode):
64+
schema_def = def_
65+
elif isinstance(def_, TypeDefinitionNode):
66+
def_ = cast(TypeDefinitionNode, def_)
67+
type_name = def_.name.value
7568
if type_name in node_map:
7669
raise TypeError(
7770
f"Type '{type_name}' was defined more than once.")
78-
append_type_def(d)
79-
node_map[type_name] = d
80-
elif isinstance(d, DirectiveDefinitionNode):
81-
append_directive_def(d)
71+
append_type_def(def_)
72+
node_map[type_name] = def_
73+
elif isinstance(def_, DirectiveDefinitionNode):
74+
append_directive_def(def_)
8275

8376
if schema_def:
8477
operation_types: Dict[OperationType, Any] = get_operation_types(

graphql/utilities/extend_schema.py

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,10 @@
66

77
from ..error import GraphQLError
88
from ..language import (
9-
DirectiveDefinitionNode, DocumentNode,
10-
EnumTypeDefinitionNode, EnumTypeExtensionNode,
11-
InputObjectTypeDefinitionNode, InputObjectTypeExtensionNode,
12-
InterfaceTypeDefinitionNode, InterfaceTypeExtensionNode,
13-
ObjectTypeDefinitionNode, ObjectTypeExtensionNode, OperationType,
14-
ScalarTypeDefinitionNode, ScalarTypeExtensionNode,
15-
SchemaExtensionNode, SchemaDefinitionNode,
16-
UnionTypeDefinitionNode, UnionTypeExtensionNode,
9+
DirectiveDefinitionNode, DocumentNode, EnumTypeExtensionNode,
10+
InputObjectTypeExtensionNode, InterfaceTypeExtensionNode,
11+
ObjectTypeExtensionNode, OperationType, SchemaExtensionNode,
12+
SchemaDefinitionNode, TypeDefinitionNode, UnionTypeExtensionNode,
1713
NamedTypeNode, TypeExtensionNode)
1814
from ..type import (
1915
GraphQLArgument, GraphQLArgumentMap, GraphQLDirective,
@@ -79,13 +75,7 @@ def extend_schema(
7975
schema_def = def_
8076
elif isinstance(def_, SchemaExtensionNode):
8177
schema_extensions.append(def_)
82-
elif isinstance(def_, (
83-
ObjectTypeDefinitionNode,
84-
InterfaceTypeDefinitionNode,
85-
EnumTypeDefinitionNode,
86-
UnionTypeDefinitionNode,
87-
ScalarTypeDefinitionNode,
88-
InputObjectTypeDefinitionNode)):
78+
elif isinstance(def_, TypeDefinitionNode):
8979
# Sanity check that none of the defined types conflict with the
9080
# schema's existing types.
9181
type_name = def_.name.value
@@ -95,13 +85,7 @@ def extend_schema(
9585
' It cannot also be defined in this type definition.',
9686
[def_])
9787
type_definition_map[type_name] = def_
98-
elif isinstance(def_, (
99-
ScalarTypeExtensionNode,
100-
ObjectTypeExtensionNode,
101-
InterfaceTypeExtensionNode,
102-
EnumTypeExtensionNode,
103-
InputObjectTypeExtensionNode,
104-
UnionTypeExtensionNode)):
88+
elif isinstance(def_, TypeExtensionNode):
10589
# Sanity check that this type extension exists within the
10690
# schema's existing types.
10791
extended_type_name = def_.name.value

graphql/validation/rules/executable_definitions.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22

33
from ...error import GraphQLError
44
from ...language import (
5-
DirectiveDefinitionNode, DocumentNode, FragmentDefinitionNode,
6-
OperationDefinitionNode, SchemaDefinitionNode, SchemaExtensionNode,
7-
TypeDefinitionNode)
5+
DirectiveDefinitionNode, DocumentNode, ExecutableDefinitionNode,
6+
SchemaDefinitionNode, SchemaExtensionNode, TypeDefinitionNode)
87
from . import ASTValidationRule
98

109
__all__ = ['ExecutableDefinitionsRule', 'non_executable_definitions_message']
@@ -23,8 +22,7 @@ class ExecutableDefinitionsRule(ASTValidationRule):
2322

2423
def enter_document(self, node: DocumentNode, *_args):
2524
for definition in node.definitions:
26-
if not isinstance(definition, (
27-
OperationDefinitionNode, FragmentDefinitionNode)):
25+
if not isinstance(definition, ExecutableDefinitionNode):
2826
self.report_error(GraphQLError(
2927
non_executable_definitions_message(
3028
'schema' if isinstance(definition, (

tests/language/test_predicates.py

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
from graphql.language import (
2+
DefinitionNode, DocumentNode, ExecutableDefinitionNode,
3+
FieldDefinitionNode, FieldNode, InlineFragmentNode, IntValueNode, Node,
4+
NonNullTypeNode, ObjectValueNode, ScalarTypeDefinitionNode,
5+
ScalarTypeExtensionNode, SchemaDefinitionNode, SchemaExtensionNode,
6+
SelectionNode, SelectionSetNode, TypeDefinitionNode, TypeExtensionNode,
7+
TypeNode, TypeSystemDefinitionNode, ValueNode,
8+
is_definition_node, is_executable_definition_node,
9+
is_selection_node, is_value_node, is_type_node,
10+
is_type_system_definition_node, is_type_definition_node,
11+
is_type_system_extension_node, is_type_extension_node)
12+
13+
14+
def describe_predicates():
15+
16+
def check_definition_node():
17+
assert not is_definition_node(Node())
18+
assert not is_definition_node(DocumentNode())
19+
assert is_definition_node(DefinitionNode())
20+
assert is_definition_node(ExecutableDefinitionNode())
21+
assert is_definition_node(TypeSystemDefinitionNode())
22+
23+
def check_exectuable_definition_node():
24+
assert not is_executable_definition_node(Node())
25+
assert not is_executable_definition_node(DocumentNode())
26+
assert not is_executable_definition_node(DefinitionNode())
27+
assert is_executable_definition_node(ExecutableDefinitionNode())
28+
assert not is_executable_definition_node(TypeSystemDefinitionNode())
29+
30+
def check_selection_node():
31+
assert not is_selection_node(Node())
32+
assert not is_selection_node(DocumentNode())
33+
assert is_selection_node(SelectionNode())
34+
assert is_selection_node(FieldNode())
35+
assert is_selection_node(InlineFragmentNode())
36+
assert not is_selection_node(SelectionSetNode())
37+
38+
def check_value_node():
39+
assert not is_value_node(Node())
40+
assert not is_value_node(DocumentNode())
41+
assert is_value_node(ValueNode())
42+
assert is_value_node(IntValueNode())
43+
assert is_value_node(ObjectValueNode())
44+
assert not is_value_node(TypeNode())
45+
46+
def check_type_node():
47+
assert not is_type_node(Node())
48+
assert not is_type_node(DocumentNode())
49+
assert not is_type_node(ValueNode())
50+
assert is_type_node(TypeNode())
51+
assert is_type_node(NonNullTypeNode())
52+
53+
def check_type_system_definition_node():
54+
assert not is_type_system_definition_node(Node())
55+
assert not is_type_system_definition_node(DocumentNode())
56+
assert is_type_system_definition_node(TypeSystemDefinitionNode())
57+
assert not is_type_system_definition_node(TypeNode())
58+
assert not is_type_system_definition_node(DefinitionNode())
59+
assert is_type_system_definition_node(TypeDefinitionNode())
60+
assert is_type_system_definition_node(SchemaDefinitionNode())
61+
assert is_type_system_definition_node(ScalarTypeDefinitionNode())
62+
assert is_type_system_definition_node(FieldDefinitionNode())
63+
64+
def check_type_definition_node():
65+
assert not is_type_definition_node(Node())
66+
assert not is_type_definition_node(DocumentNode())
67+
assert is_type_definition_node(TypeDefinitionNode())
68+
assert is_type_definition_node(ScalarTypeDefinitionNode())
69+
assert not is_type_definition_node(TypeSystemDefinitionNode())
70+
assert not is_type_definition_node(DefinitionNode())
71+
assert not is_type_definition_node(TypeNode())
72+
73+
def check_type_system_extension_node():
74+
assert not is_type_system_extension_node(Node())
75+
assert not is_type_system_extension_node(DocumentNode())
76+
assert is_type_system_extension_node(SchemaExtensionNode())
77+
assert is_type_system_extension_node(TypeExtensionNode())
78+
assert not is_type_system_extension_node(TypeSystemDefinitionNode())
79+
assert not is_type_system_extension_node(DefinitionNode())
80+
assert not is_type_system_extension_node(TypeNode())
81+
82+
def check_type_extension_node():
83+
assert not is_type_extension_node(Node())
84+
assert not is_type_extension_node(DocumentNode())
85+
assert is_type_extension_node(TypeExtensionNode())
86+
assert not is_type_extension_node(ScalarTypeDefinitionNode())
87+
assert is_type_extension_node(ScalarTypeExtensionNode())
88+
assert not is_type_extension_node(DefinitionNode())
89+
assert not is_type_extension_node(TypeNode())

0 commit comments

Comments
 (0)