|
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 |
4 | 2 |
|
5 | 3 |
|
6 | 4 | class ValidationVisitor(Visitor):
|
7 |
| - __slots__ = 'context', 'rules', 'total_rules', 'type_info', 'errors', 'ignore_children' |
| 5 | + __slots__ = 'context', 'instance', 'type_info' |
8 | 6 |
|
9 |
| - def __init__(self, rules, context, type_info, errors): |
| 7 | + def __init__(self, instance, context, type_info): |
10 | 8 | self.context = context
|
11 |
| - self.rules = rules |
12 |
| - self.total_rules = len(rules) |
| 9 | + self.instance = instance |
13 | 10 | self.type_info = type_info
|
14 |
| - self.errors = errors |
15 |
| - self.ignore_children = {} |
16 | 11 |
|
17 | 12 | def enter(self, node, key, parent, path, ancestors):
|
18 | 13 | 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: |
66 | 16 | self.type_info.leave(node)
|
67 | 17 |
|
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 |
74 | 19 |
|
75 | 20 | 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) |
87 | 22 |
|
88 | 23 | 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