ยปCore Development>Code coverage>Lib/idlelib/StackViewer.py

Python code coverage for Lib/idlelib/StackViewer.py

#countcontent
1n/aimport os
2n/aimport sys
3n/aimport linecache
4n/a
5n/afrom idlelib.TreeWidget import TreeNode, TreeItem, ScrolledCanvas
6n/afrom idlelib.ObjectBrowser import ObjectTreeItem, make_objecttreeitem
7n/a
8n/adef StackBrowser(root, flist=None, tb=None, top=None):
9n/a if top is None:
10n/a from tkinter import Toplevel
11n/a top = Toplevel(root)
12n/a sc = ScrolledCanvas(top, bg="white", highlightthickness=0)
13n/a sc.frame.pack(expand=1, fill="both")
14n/a item = StackTreeItem(flist, tb)
15n/a node = TreeNode(sc.canvas, None, item)
16n/a node.expand()
17n/a
18n/aclass StackTreeItem(TreeItem):
19n/a
20n/a def __init__(self, flist=None, tb=None):
21n/a self.flist = flist
22n/a self.stack = self.get_stack(tb)
23n/a self.text = self.get_exception()
24n/a
25n/a def get_stack(self, tb):
26n/a if tb is None:
27n/a tb = sys.last_traceback
28n/a stack = []
29n/a if tb and tb.tb_frame is None:
30n/a tb = tb.tb_next
31n/a while tb is not None:
32n/a stack.append((tb.tb_frame, tb.tb_lineno))
33n/a tb = tb.tb_next
34n/a return stack
35n/a
36n/a def get_exception(self):
37n/a type = sys.last_type
38n/a value = sys.last_value
39n/a if hasattr(type, "__name__"):
40n/a type = type.__name__
41n/a s = str(type)
42n/a if value is not None:
43n/a s = s + ": " + str(value)
44n/a return s
45n/a
46n/a def GetText(self):
47n/a return self.text
48n/a
49n/a def GetSubList(self):
50n/a sublist = []
51n/a for info in self.stack:
52n/a item = FrameTreeItem(info, self.flist)
53n/a sublist.append(item)
54n/a return sublist
55n/a
56n/aclass FrameTreeItem(TreeItem):
57n/a
58n/a def __init__(self, info, flist):
59n/a self.info = info
60n/a self.flist = flist
61n/a
62n/a def GetText(self):
63n/a frame, lineno = self.info
64n/a try:
65n/a modname = frame.f_globals["__name__"]
66n/a except:
67n/a modname = "?"
68n/a code = frame.f_code
69n/a filename = code.co_filename
70n/a funcname = code.co_name
71n/a sourceline = linecache.getline(filename, lineno)
72n/a sourceline = sourceline.strip()
73n/a if funcname in ("?", "", None):
74n/a item = "%s, line %d: %s" % (modname, lineno, sourceline)
75n/a else:
76n/a item = "%s.%s(...), line %d: %s" % (modname, funcname,
77n/a lineno, sourceline)
78n/a return item
79n/a
80n/a def GetSubList(self):
81n/a frame, lineno = self.info
82n/a sublist = []
83n/a if frame.f_globals is not frame.f_locals:
84n/a item = VariablesTreeItem("<locals>", frame.f_locals, self.flist)
85n/a sublist.append(item)
86n/a item = VariablesTreeItem("<globals>", frame.f_globals, self.flist)
87n/a sublist.append(item)
88n/a return sublist
89n/a
90n/a def OnDoubleClick(self):
91n/a if self.flist:
92n/a frame, lineno = self.info
93n/a filename = frame.f_code.co_filename
94n/a if os.path.isfile(filename):
95n/a self.flist.gotofileline(filename, lineno)
96n/a
97n/aclass VariablesTreeItem(ObjectTreeItem):
98n/a
99n/a def GetText(self):
100n/a return self.labeltext
101n/a
102n/a def GetLabelText(self):
103n/a return None
104n/a
105n/a def IsExpandable(self):
106n/a return len(self.object) > 0
107n/a
108n/a def keys(self):
109n/a return list(self.object.keys())
110n/a
111n/a def GetSubList(self):
112n/a sublist = []
113n/a for key in self.keys():
114n/a try:
115n/a value = self.object[key]
116n/a except KeyError:
117n/a continue
118n/a def setfunction(value, key=key, object=self.object):
119n/a object[key] = value
120n/a item = make_objecttreeitem(key + " =", value, setfunction)
121n/a sublist.append(item)
122n/a return sublist