|
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