Skip to content

Commit 6cbf0b2

Browse files
committed
1 parent 39b5fb3 commit 6cbf0b2

File tree

2 files changed

+11
-88
lines changed

2 files changed

+11
-88
lines changed

graphql/core/validation/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def validate(schema, ast, rules=specified_rules):
1616

1717
def visit_using_rules(schema, type_info, ast, rules):
1818
context = ValidationContext(schema, ast, type_info)
19-
errors = []
2019
rules = [rule(context) for rule in rules]
21-
visit(ast, ValidationVisitor(rules, context, type_info, errors))
20+
for instance in rules:
21+
visit(ast, ValidationVisitor(instance, context, type_info))
2222
return context.get_errors()

graphql/core/validation/visitor.py

Lines changed: 9 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,101 +1,24 @@
1-
from ..error import GraphQLError
2-
from ..language.ast import FragmentDefinition, FragmentSpread
3-
from ..language.visitor import Visitor, visit
1+
from ..language.visitor import Visitor
42

53

64
class ValidationVisitor(Visitor):
7-
__slots__ = 'context', 'rules', 'total_rules', 'type_info', 'errors', 'ignore_children'
5+
__slots__ = 'context', 'instance', 'type_info'
86

9-
def __init__(self, rules, context, type_info, errors):
7+
def __init__(self, instance, context, type_info):
108
self.context = context
11-
self.rules = rules
12-
self.total_rules = len(rules)
9+
self.instance = instance
1310
self.type_info = type_info
14-
self.errors = errors
15-
self.ignore_children = {}
1611

1712
def enter(self, node, key, parent, path, ancestors):
1813
self.type_info.enter(node)
19-
to_ignore = None
20-
rules_wanting_to_visit_fragment = None
21-
22-
skipped = 0
23-
for rule in self.rules:
24-
if rule in self.ignore_children:
25-
skipped += 1
26-
continue
27-
28-
visit_spread_fragments = getattr(rule, 'visit_spread_fragments', False)
29-
30-
if isinstance(node, FragmentDefinition) and key and visit_spread_fragments:
31-
if to_ignore is None:
32-
to_ignore = []
33-
34-
to_ignore.append(rule)
35-
continue
36-
37-
result = rule.enter(node, key, parent, path, ancestors)
38-
39-
if result and is_error(result):
40-
append(self.errors, result)
41-
result = False
42-
43-
if result is None and visit_spread_fragments and isinstance(node, FragmentSpread):
44-
if rules_wanting_to_visit_fragment is None:
45-
rules_wanting_to_visit_fragment = []
46-
47-
rules_wanting_to_visit_fragment.append(rule)
48-
49-
if result is False:
50-
if to_ignore is None:
51-
to_ignore = []
52-
53-
to_ignore.append(rule)
54-
55-
if rules_wanting_to_visit_fragment:
56-
fragment = self.context.get_fragment(node.name.value)
57-
58-
if fragment:
59-
sub_visitor = ValidationVisitor(rules_wanting_to_visit_fragment, self.context, self.type_info,
60-
self.errors)
61-
visit(fragment, sub_visitor)
62-
63-
should_skip = (len(to_ignore) if to_ignore else 0 + skipped) == self.total_rules
64-
65-
if should_skip:
14+
result = self.instance.enter(node, key, parent, path, ancestors)
15+
if result is False:
6616
self.type_info.leave(node)
6717

68-
elif to_ignore:
69-
for rule in to_ignore:
70-
self.ignore_children[rule] = node
71-
72-
if should_skip:
73-
return False
18+
return result
7419

7520
def leave(self, node, key, parent, path, ancestors):
76-
for rule in self.rules:
77-
if rule in self.ignore_children:
78-
if self.ignore_children[rule] is node:
79-
del self.ignore_children[rule]
80-
81-
continue
82-
83-
result = rule.leave(node, key, parent, path, ancestors)
84-
85-
if result and is_error(result):
86-
append(self.errors, result)
21+
result = self.instance.leave(node, key, parent, path, ancestors)
8722

8823
self.type_info.leave(node)
89-
90-
91-
def is_error(value):
92-
if isinstance(value, list):
93-
return all(isinstance(item, GraphQLError) for item in value)
94-
return isinstance(value, GraphQLError)
95-
96-
97-
def append(arr, items):
98-
if isinstance(items, list):
99-
arr.extend(items)
100-
else:
101-
arr.append(items)
24+
return result

0 commit comments

Comments
 (0)