1import os 2import sys 3import imp 4 5from idlelib.TreeWidget import TreeItem 6from idlelib.ClassBrowser import ClassBrowser, ModuleBrowserTreeItem 7from idlelib.PyShell import PyShellFileList 8 9 10class PathBrowser(ClassBrowser): 11 12 def __init__(self, flist, _htest=False): 13 """ 14 _htest - bool, change box location when running htest 15 """ 16 self._htest = _htest 17 self.init(flist) 18 19 def settitle(self): 20 "Set window titles." 21 self.top.wm_title("Path Browser") 22 self.top.wm_iconname("Path Browser") 23 24 def rootnode(self): 25 return PathBrowserTreeItem() 26 27class PathBrowserTreeItem(TreeItem): 28 29 def GetText(self): 30 return "sys.path" 31 32 def GetSubList(self): 33 sublist = [] 34 for dir in sys.path: 35 item = DirBrowserTreeItem(dir) 36 sublist.append(item) 37 return sublist 38 39class DirBrowserTreeItem(TreeItem): 40 41 def __init__(self, dir, packages=[]): 42 self.dir = dir 43 self.packages = packages 44 45 def GetText(self): 46 if not self.packages: 47 return self.dir 48 else: 49 return self.packages[-1] + ": package" 50 51 def GetSubList(self): 52 try: 53 names = os.listdir(self.dir or os.curdir) 54 except os.error: 55 return [] 56 packages = [] 57 for name in names: 58 file = os.path.join(self.dir, name) 59 if self.ispackagedir(file): 60 nn = os.path.normcase(name) 61 packages.append((nn, name, file)) 62 packages.sort() 63 sublist = [] 64 for nn, name, file in packages: 65 item = DirBrowserTreeItem(file, self.packages + [name]) 66 sublist.append(item) 67 for nn, name in self.listmodules(names): 68 item = ModuleBrowserTreeItem(os.path.join(self.dir, name)) 69 sublist.append(item) 70 return sublist 71 72 def ispackagedir(self, file): 73 if not os.path.isdir(file): 74 return False 75 init = os.path.join(file, "__init__.py") 76 return os.path.exists(init) 77 78 def listmodules(self, allnames): 79 modules = {} 80 suffixes = imp.get_suffixes() 81 sorted = [] 82 for suff, mode, flag in suffixes: 83 i = -len(suff) 84 for name in allnames[:]: 85 normed_name = os.path.normcase(name) 86 if normed_name[i:] == suff: 87 mod_name = name[:i] 88 if mod_name not in modules: 89 modules[mod_name] = None 90 sorted.append((normed_name, name)) 91 allnames.remove(name) 92 sorted.sort() 93 return sorted 94 95def _path_browser(parent): # htest # 96 flist = PyShellFileList(parent) 97 PathBrowser(flist, _htest=True) 98 parent.mainloop() 99 100if __name__ == "__main__": 101 from unittest import main 102 main('idlelib.idle_test.test_pathbrowser', verbosity=2, exit=False) 103 104 from idlelib.idle_test.htest import run 105 run(_path_browser) 106