blob: 58ff830b437e41f679782b3ab33a9b102c8d8f9f [file] [log] [blame]
David Scherer7aced172000-08-15 01:13:23 +00001import os
2import sys
Brett Cannoncb66eb02012-05-11 12:58:42 -04003import importlib.machinery
David Scherer7aced172000-08-15 01:13:23 +00004
Kurt B. Kaiser2d7f6a02007-08-22 23:01:33 +00005from idlelib.TreeWidget import TreeItem
6from idlelib.ClassBrowser import ClassBrowser, ModuleBrowserTreeItem
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -04007from idlelib.PyShell import PyShellFileList
8
David Scherer7aced172000-08-15 01:13:23 +00009
10class PathBrowser(ClassBrowser):
Kurt B. Kaiserbec5e5c2001-07-13 19:57:00 +000011
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -040012 def __init__(self, flist, _htest=False):
13 """
14 _htest - bool, change box location when running htest
15 """
16 self._htest = _htest
David Scherer7aced172000-08-15 01:13:23 +000017 self.init(flist)
18
19 def settitle(self):
20 self.top.wm_title("Path Browser")
21 self.top.wm_iconname("Path Browser")
22
23 def rootnode(self):
24 return PathBrowserTreeItem()
25
26class PathBrowserTreeItem(TreeItem):
27
28 def GetText(self):
29 return "sys.path"
30
31 def GetSubList(self):
32 sublist = []
33 for dir in sys.path:
34 item = DirBrowserTreeItem(dir)
35 sublist.append(item)
36 return sublist
37
38class DirBrowserTreeItem(TreeItem):
39
40 def __init__(self, dir, packages=[]):
41 self.dir = dir
42 self.packages = packages
43
44 def GetText(self):
45 if not self.packages:
46 return self.dir
47 else:
48 return self.packages[-1] + ": package"
49
50 def GetSubList(self):
51 try:
52 names = os.listdir(self.dir or os.curdir)
Andrew Svetlov786fbd82012-12-17 19:51:15 +020053 except OSError:
David Scherer7aced172000-08-15 01:13:23 +000054 return []
55 packages = []
56 for name in names:
57 file = os.path.join(self.dir, name)
58 if self.ispackagedir(file):
59 nn = os.path.normcase(name)
60 packages.append((nn, name, file))
61 packages.sort()
62 sublist = []
63 for nn, name, file in packages:
64 item = DirBrowserTreeItem(file, self.packages + [name])
65 sublist.append(item)
66 for nn, name in self.listmodules(names):
67 item = ModuleBrowserTreeItem(os.path.join(self.dir, name))
68 sublist.append(item)
69 return sublist
70
71 def ispackagedir(self, file):
72 if not os.path.isdir(file):
73 return 0
74 init = os.path.join(file, "__init__.py")
75 return os.path.exists(init)
76
77 def listmodules(self, allnames):
78 modules = {}
Brett Cannoncb66eb02012-05-11 12:58:42 -040079 suffixes = importlib.machinery.EXTENSION_SUFFIXES[:]
80 suffixes += importlib.machinery.SOURCE_SUFFIXES[:]
81 suffixes += importlib.machinery.BYTECODE_SUFFIXES[:]
David Scherer7aced172000-08-15 01:13:23 +000082 sorted = []
Ned Deilybfbf3f12012-10-18 18:16:44 -070083 for suff in suffixes:
David Scherer7aced172000-08-15 01:13:23 +000084 i = -len(suff)
85 for name in allnames[:]:
86 normed_name = os.path.normcase(name)
87 if normed_name[i:] == suff:
88 mod_name = name[:i]
Guido van Rossum811c4e02006-08-22 15:45:46 +000089 if mod_name not in modules:
David Scherer7aced172000-08-15 01:13:23 +000090 modules[mod_name] = None
91 sorted.append((normed_name, name))
92 allnames.remove(name)
93 sorted.sort()
94 return sorted
95
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -040096def _path_browser(parent):
97 flist = PyShellFileList(parent)
98 PathBrowser(flist, _htest=True)
Terry Jan Reedya2fc99e2014-05-25 18:44:05 -040099 parent.mainloop()
David Scherer7aced172000-08-15 01:13:23 +0000100
101if __name__ == "__main__":
Terry Jan Reedydb4e5c52013-05-27 21:32:03 -0400102 from unittest import main
103 main('idlelib.idle_test.test_pathbrowser', verbosity=2, exit=False)
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -0400104
105 from idlelib.idle_test.htest import run
106 run(_path_browser)