annotate CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/lib/python3.8/idlelib/debugobj.py @ 68:5028fdace37b

planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author jpayne
date Tue, 18 Mar 2025 16:23:26 -0400
parents
children
rev   line source
jpayne@68 1 # XXX TO DO:
jpayne@68 2 # - popup menu
jpayne@68 3 # - support partial or total redisplay
jpayne@68 4 # - more doc strings
jpayne@68 5 # - tooltips
jpayne@68 6
jpayne@68 7 # object browser
jpayne@68 8
jpayne@68 9 # XXX TO DO:
jpayne@68 10 # - for classes/modules, add "open source" to object browser
jpayne@68 11 from reprlib import Repr
jpayne@68 12
jpayne@68 13 from idlelib.tree import TreeItem, TreeNode, ScrolledCanvas
jpayne@68 14
jpayne@68 15 myrepr = Repr()
jpayne@68 16 myrepr.maxstring = 100
jpayne@68 17 myrepr.maxother = 100
jpayne@68 18
jpayne@68 19 class ObjectTreeItem(TreeItem):
jpayne@68 20 def __init__(self, labeltext, object, setfunction=None):
jpayne@68 21 self.labeltext = labeltext
jpayne@68 22 self.object = object
jpayne@68 23 self.setfunction = setfunction
jpayne@68 24 def GetLabelText(self):
jpayne@68 25 return self.labeltext
jpayne@68 26 def GetText(self):
jpayne@68 27 return myrepr.repr(self.object)
jpayne@68 28 def GetIconName(self):
jpayne@68 29 if not self.IsExpandable():
jpayne@68 30 return "python"
jpayne@68 31 def IsEditable(self):
jpayne@68 32 return self.setfunction is not None
jpayne@68 33 def SetText(self, text):
jpayne@68 34 try:
jpayne@68 35 value = eval(text)
jpayne@68 36 self.setfunction(value)
jpayne@68 37 except:
jpayne@68 38 pass
jpayne@68 39 else:
jpayne@68 40 self.object = value
jpayne@68 41 def IsExpandable(self):
jpayne@68 42 return not not dir(self.object)
jpayne@68 43 def GetSubList(self):
jpayne@68 44 keys = dir(self.object)
jpayne@68 45 sublist = []
jpayne@68 46 for key in keys:
jpayne@68 47 try:
jpayne@68 48 value = getattr(self.object, key)
jpayne@68 49 except AttributeError:
jpayne@68 50 continue
jpayne@68 51 item = make_objecttreeitem(
jpayne@68 52 str(key) + " =",
jpayne@68 53 value,
jpayne@68 54 lambda value, key=key, object=self.object:
jpayne@68 55 setattr(object, key, value))
jpayne@68 56 sublist.append(item)
jpayne@68 57 return sublist
jpayne@68 58
jpayne@68 59 class ClassTreeItem(ObjectTreeItem):
jpayne@68 60 def IsExpandable(self):
jpayne@68 61 return True
jpayne@68 62 def GetSubList(self):
jpayne@68 63 sublist = ObjectTreeItem.GetSubList(self)
jpayne@68 64 if len(self.object.__bases__) == 1:
jpayne@68 65 item = make_objecttreeitem("__bases__[0] =",
jpayne@68 66 self.object.__bases__[0])
jpayne@68 67 else:
jpayne@68 68 item = make_objecttreeitem("__bases__ =", self.object.__bases__)
jpayne@68 69 sublist.insert(0, item)
jpayne@68 70 return sublist
jpayne@68 71
jpayne@68 72 class AtomicObjectTreeItem(ObjectTreeItem):
jpayne@68 73 def IsExpandable(self):
jpayne@68 74 return False
jpayne@68 75
jpayne@68 76 class SequenceTreeItem(ObjectTreeItem):
jpayne@68 77 def IsExpandable(self):
jpayne@68 78 return len(self.object) > 0
jpayne@68 79 def keys(self):
jpayne@68 80 return range(len(self.object))
jpayne@68 81 def GetSubList(self):
jpayne@68 82 sublist = []
jpayne@68 83 for key in self.keys():
jpayne@68 84 try:
jpayne@68 85 value = self.object[key]
jpayne@68 86 except KeyError:
jpayne@68 87 continue
jpayne@68 88 def setfunction(value, key=key, object=self.object):
jpayne@68 89 object[key] = value
jpayne@68 90 item = make_objecttreeitem("%r:" % (key,), value, setfunction)
jpayne@68 91 sublist.append(item)
jpayne@68 92 return sublist
jpayne@68 93
jpayne@68 94 class DictTreeItem(SequenceTreeItem):
jpayne@68 95 def keys(self):
jpayne@68 96 keys = list(self.object.keys())
jpayne@68 97 try:
jpayne@68 98 keys.sort()
jpayne@68 99 except:
jpayne@68 100 pass
jpayne@68 101 return keys
jpayne@68 102
jpayne@68 103 dispatch = {
jpayne@68 104 int: AtomicObjectTreeItem,
jpayne@68 105 float: AtomicObjectTreeItem,
jpayne@68 106 str: AtomicObjectTreeItem,
jpayne@68 107 tuple: SequenceTreeItem,
jpayne@68 108 list: SequenceTreeItem,
jpayne@68 109 dict: DictTreeItem,
jpayne@68 110 type: ClassTreeItem,
jpayne@68 111 }
jpayne@68 112
jpayne@68 113 def make_objecttreeitem(labeltext, object, setfunction=None):
jpayne@68 114 t = type(object)
jpayne@68 115 if t in dispatch:
jpayne@68 116 c = dispatch[t]
jpayne@68 117 else:
jpayne@68 118 c = ObjectTreeItem
jpayne@68 119 return c(labeltext, object, setfunction)
jpayne@68 120
jpayne@68 121
jpayne@68 122 def _object_browser(parent): # htest #
jpayne@68 123 import sys
jpayne@68 124 from tkinter import Toplevel
jpayne@68 125 top = Toplevel(parent)
jpayne@68 126 top.title("Test debug object browser")
jpayne@68 127 x, y = map(int, parent.geometry().split('+')[1:])
jpayne@68 128 top.geometry("+%d+%d" % (x + 100, y + 175))
jpayne@68 129 top.configure(bd=0, bg="yellow")
jpayne@68 130 top.focus_set()
jpayne@68 131 sc = ScrolledCanvas(top, bg="white", highlightthickness=0, takefocus=1)
jpayne@68 132 sc.frame.pack(expand=1, fill="both")
jpayne@68 133 item = make_objecttreeitem("sys", sys)
jpayne@68 134 node = TreeNode(sc.canvas, None, item)
jpayne@68 135 node.update()
jpayne@68 136
jpayne@68 137 if __name__ == '__main__':
jpayne@68 138 from unittest import main
jpayne@68 139 main('idlelib.idle_test.test_debugobj', verbosity=2, exit=False)
jpayne@68 140
jpayne@68 141 from idlelib.idle_test.htest import run
jpayne@68 142 run(_object_browser)