Coverage for /Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm/_jb_serial_tree_manager.py: 68%
56 statements
« prev ^ index » next coverage.py v7.8.2, created at 2025-06-06 12:04 +0200
« prev ^ index » next coverage.py v7.8.2, created at 2025-06-06 12:04 +0200
1# coding=utf-8
4class SerialTreeManager(object):
5 """
6 Manages output tree by building it from flat test names.
7 """
9 def __init__(self, offset):
10 super(SerialTreeManager, self).__init__()
11 # Currently active branch as list. New nodes go to this branch
12 self.current_branch = []
13 # node unique name to its nodeId
14 self._node_ids_dict = {}
15 # Node id mast be incremented for each new branch
16 self._max_node_id = offset
17 self.offset = offset
19 def _calculate_relation(self, branch_as_list):
20 """
21 Get relation of branch_as_list to current branch.
22 :return: tuple. First argument could be: "same", "child", "parent" or "sibling"(need to start new tree)
23 Second argument is relative path from current branch to child if argument is child
24 """
25 if branch_as_list == self.current_branch:
26 return "same", None
28 hierarchy_name_len = len(branch_as_list)
29 current_branch_len = len(self.current_branch)
31 if hierarchy_name_len > current_branch_len and branch_as_list[0:current_branch_len] == self.current_branch: 31 ↛ 34line 31 didn't jump to line 34 because the condition on line 31 was always true
32 return "child", branch_as_list[current_branch_len:]
34 if hierarchy_name_len < current_branch_len and self.current_branch[0:hierarchy_name_len] == branch_as_list:
35 return "parent", None
37 return "sibling", None
39 def _add_new_node(self, new_node_name):
40 """
41 Adds new node to branch
42 """
43 self.current_branch.append(new_node_name)
44 self._max_node_id += 1
45 self._node_ids_dict[".".join(self.current_branch)] = self._max_node_id
47 def level_opened(self, test_as_list, func_to_open):
48 """
49 To be called on test start.
51 :param test_as_list: test name splitted as list
52 :param func_to_open: func to be called if test can open new level
53 :return: None if new level opened, or tuple of command client should execute and try opening level again
54 Command is "open" (open provided level) or "close" (close it). Second item is test name as list
55 """
56 relation, relative_path = self._calculate_relation(test_as_list)
57 if relation == 'same': 57 ↛ 58line 57 didn't jump to line 58 because the condition on line 57 was never true
58 return # Opening same level?
59 if relation == 'child': 59 ↛ 68line 59 didn't jump to line 68 because the condition on line 59 was always true
60 # If one level -- open new level gracefully
61 if len(relative_path) == 1:
62 self._add_new_node(relative_path[0])
63 func_to_open()
64 return None
65 else:
66 # Open previous level
67 return [("open", self.current_branch + relative_path[0:1])]
68 if relation == "sibling":
69 if self.current_branch:
70 # Different tree, close whole branch
71 return [("close", self.current_branch)]
72 else:
73 return None
74 if relation == 'parent':
75 # Opening parent? Insane
76 pass
78 def level_closed(self, test_as_list, func_to_close):
79 """
80 To be called on test end or failure.
82 See level_opened doc.
83 """
84 relation, relative_path = self._calculate_relation(test_as_list)
85 if relation == 'same': 85 ↛ 89line 85 didn't jump to line 89 because the condition on line 85 was always true
86 # Closing current level
87 func_to_close()
88 self.current_branch.pop()
89 if relation == 'child': 89 ↛ 90line 89 didn't jump to line 90 because the condition on line 89 was never true
90 return None
92 if relation == 'sibling':
93 pass
94 if relation == 'parent': 94 ↛ 95line 94 didn't jump to line 95 because the condition on line 94 was never true
95 return [("close", self.current_branch)]
97 @property
98 def parent_branch(self):
99 return self.current_branch[:-1] if self.current_branch else None
101 def _get_node_id(self, branch):
102 return self._node_ids_dict[".".join(branch)]
104 # Part of contract
105 # noinspection PyUnusedLocal
106 def get_node_ids(self, test_name):
107 """
109 :return: (current_node_id, parent_node_id)
110 """
111 current = self._get_node_id(self.current_branch)
112 parent = self._get_node_id(self.parent_branch) if self.parent_branch else str(self.offset)
113 return str(current), str(parent)