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