blob: 6c19508d314d8f654d5884bee3d3a7364745baef [file] [log] [blame]
Terry Jan Reedybfbaa6b2016-08-31 00:50:55 -04001import importlib.machinery
David Scherer7aced172000-08-15 01:13:23 +00002import os
3import sys
David Scherer7aced172000-08-15 01:13:23 +00004
Terry Jan Reedy6fa5bdc2016-05-28 13:22:31 -04005from idlelib.browser import ClassBrowser, ModuleBrowserTreeItem
6from idlelib.pyshell import PyShellFileList
Terry Jan Reedybfbaa6b2016-08-31 00:50:55 -04007from idlelib.tree import TreeItem
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -04008
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):
Terry Jan Reedy19c1a872015-07-20 17:44:59 -040020 "Set window titles."
David Scherer7aced172000-08-15 01:13:23 +000021 self.top.wm_title("Path Browser")
22 self.top.wm_iconname("Path Browser")
23
24 def rootnode(self):
25 return PathBrowserTreeItem()
26
Terry Jan Reedybfbaa6b2016-08-31 00:50:55 -040027
David Scherer7aced172000-08-15 01:13:23 +000028class PathBrowserTreeItem(TreeItem):
29
30 def GetText(self):
31 return "sys.path"
32
33 def GetSubList(self):
34 sublist = []
35 for dir in sys.path:
36 item = DirBrowserTreeItem(dir)
37 sublist.append(item)
38 return sublist
39
Terry Jan Reedybfbaa6b2016-08-31 00:50:55 -040040
David Scherer7aced172000-08-15 01:13:23 +000041class DirBrowserTreeItem(TreeItem):
42
43 def __init__(self, dir, packages=[]):
44 self.dir = dir
45 self.packages = packages
46
47 def GetText(self):
48 if not self.packages:
49 return self.dir
50 else:
51 return self.packages[-1] + ": package"
52
53 def GetSubList(self):
54 try:
55 names = os.listdir(self.dir or os.curdir)
Andrew Svetlov786fbd82012-12-17 19:51:15 +020056 except OSError:
David Scherer7aced172000-08-15 01:13:23 +000057 return []
58 packages = []
59 for name in names:
60 file = os.path.join(self.dir, name)
61 if self.ispackagedir(file):
62 nn = os.path.normcase(name)
63 packages.append((nn, name, file))
64 packages.sort()
65 sublist = []
66 for nn, name, file in packages:
67 item = DirBrowserTreeItem(file, self.packages + [name])
68 sublist.append(item)
69 for nn, name in self.listmodules(names):
70 item = ModuleBrowserTreeItem(os.path.join(self.dir, name))
71 sublist.append(item)
72 return sublist
73
74 def ispackagedir(self, file):
Terry Jan Reedy19c1a872015-07-20 17:44:59 -040075 " Return true for directories that are packages."
David Scherer7aced172000-08-15 01:13:23 +000076 if not os.path.isdir(file):
Terry Jan Reedy19c1a872015-07-20 17:44:59 -040077 return False
David Scherer7aced172000-08-15 01:13:23 +000078 init = os.path.join(file, "__init__.py")
79 return os.path.exists(init)
80
81 def listmodules(self, allnames):
82 modules = {}
Brett Cannoncb66eb02012-05-11 12:58:42 -040083 suffixes = importlib.machinery.EXTENSION_SUFFIXES[:]
Terry Jan Reedy19c1a872015-07-20 17:44:59 -040084 suffixes += importlib.machinery.SOURCE_SUFFIXES
85 suffixes += importlib.machinery.BYTECODE_SUFFIXES
David Scherer7aced172000-08-15 01:13:23 +000086 sorted = []
Ned Deilybfbf3f12012-10-18 18:16:44 -070087 for suff in suffixes:
David Scherer7aced172000-08-15 01:13:23 +000088 i = -len(suff)
89 for name in allnames[:]:
90 normed_name = os.path.normcase(name)
91 if normed_name[i:] == suff:
92 mod_name = name[:i]
Guido van Rossum811c4e02006-08-22 15:45:46 +000093 if mod_name not in modules:
David Scherer7aced172000-08-15 01:13:23 +000094 modules[mod_name] = None
95 sorted.append((normed_name, name))
96 allnames.remove(name)
97 sorted.sort()
98 return sorted
99
Terry Jan Reedybfbaa6b2016-08-31 00:50:55 -0400100
Terry Jan Reedy19c1a872015-07-20 17:44:59 -0400101def _path_browser(parent): # htest #
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -0400102 flist = PyShellFileList(parent)
103 PathBrowser(flist, _htest=True)
Terry Jan Reedya2fc99e2014-05-25 18:44:05 -0400104 parent.mainloop()
David Scherer7aced172000-08-15 01:13:23 +0000105
106if __name__ == "__main__":
Terry Jan Reedydb4e5c52013-05-27 21:32:03 -0400107 from unittest import main
108 main('idlelib.idle_test.test_pathbrowser', verbosity=2, exit=False)
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -0400109
110 from idlelib.idle_test.htest import run
111 run(_path_browser)