blob: 9404868c79b02b8ddd0c48352a41a1ee09cd1b03 [file] [log] [blame]
David Scherer7aced172000-08-15 01:13:23 +00001import os
2import sys
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -04003import re
Brett Cannoncb66eb02012-05-11 12:58:42 -04004import importlib.machinery
David Scherer7aced172000-08-15 01:13:23 +00005
Kurt B. Kaiser2d7f6a02007-08-22 23:01:33 +00006from idlelib.TreeWidget import TreeItem
7from idlelib.ClassBrowser import ClassBrowser, ModuleBrowserTreeItem
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -04008from idlelib.PyShell import PyShellFileList
9
David Scherer7aced172000-08-15 01:13:23 +000010
11class PathBrowser(ClassBrowser):
Kurt B. Kaiserbec5e5c2001-07-13 19:57:00 +000012
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -040013 def __init__(self, flist, _htest=False):
14 """
15 _htest - bool, change box location when running htest
16 """
17 self._htest = _htest
David Scherer7aced172000-08-15 01:13:23 +000018 self.init(flist)
19
20 def settitle(self):
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)
Andrew Svetlov786fbd82012-12-17 19:51:15 +020054 except OSError:
David Scherer7aced172000-08-15 01:13:23 +000055 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 0
75 init = os.path.join(file, "__init__.py")
76 return os.path.exists(init)
77
78 def listmodules(self, allnames):
79 modules = {}
Brett Cannoncb66eb02012-05-11 12:58:42 -040080 suffixes = importlib.machinery.EXTENSION_SUFFIXES[:]
81 suffixes += importlib.machinery.SOURCE_SUFFIXES[:]
82 suffixes += importlib.machinery.BYTECODE_SUFFIXES[:]
David Scherer7aced172000-08-15 01:13:23 +000083 sorted = []
Ned Deilybfbf3f12012-10-18 18:16:44 -070084 for suff in suffixes:
David Scherer7aced172000-08-15 01:13:23 +000085 i = -len(suff)
86 for name in allnames[:]:
87 normed_name = os.path.normcase(name)
88 if normed_name[i:] == suff:
89 mod_name = name[:i]
Guido van Rossum811c4e02006-08-22 15:45:46 +000090 if mod_name not in modules:
David Scherer7aced172000-08-15 01:13:23 +000091 modules[mod_name] = None
92 sorted.append((normed_name, name))
93 allnames.remove(name)
94 sorted.sort()
95 return sorted
96
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -040097def _path_browser(parent):
98 flist = PyShellFileList(parent)
99 PathBrowser(flist, _htest=True)
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)