blob: 6de242d0000beddfcd657d6717c3d5cd60faf1d5 [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
Cheryl Sabellacd99e792017-09-23 16:46:01 -04005from idlelib.browser import ModuleBrowser, ModuleBrowserTreeItem
Terry Jan Reedybfbaa6b2016-08-31 00:50:55 -04006from idlelib.tree import TreeItem
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -04007
David Scherer7aced172000-08-15 01:13:23 +00008
Cheryl Sabellacd99e792017-09-23 16:46:01 -04009class PathBrowser(ModuleBrowser):
Kurt B. Kaiserbec5e5c2001-07-13 19:57:00 +000010
Cheryl Sabella20d48a42017-11-22 19:05:25 -050011 def __init__(self, master, *, _htest=False, _utest=False):
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -040012 """
13 _htest - bool, change box location when running htest
14 """
Cheryl Sabella20d48a42017-11-22 19:05:25 -050015 self.master = master
Terry Jan Reedy1b392ff2014-05-24 18:48:18 -040016 self._htest = _htest
Cheryl Sabella058de112017-09-22 16:08:44 -040017 self._utest = _utest
Cheryl Sabella20d48a42017-11-22 19:05:25 -050018 self.init()
David Scherer7aced172000-08-15 01:13:23 +000019
20 def settitle(self):
Terry Jan Reedy19c1a872015-07-20 17:44:59 -040021 "Set window titles."
David Scherer7aced172000-08-15 01:13:23 +000022 self.top.wm_title("Path Browser")
23 self.top.wm_iconname("Path Browser")
24
25 def rootnode(self):
26 return PathBrowserTreeItem()
27
Terry Jan Reedybfbaa6b2016-08-31 00:50:55 -040028
David Scherer7aced172000-08-15 01:13:23 +000029class PathBrowserTreeItem(TreeItem):
30
31 def GetText(self):
32 return "sys.path"
33
34 def GetSubList(self):
35 sublist = []
36 for dir in sys.path:
37 item = DirBrowserTreeItem(dir)
38 sublist.append(item)
39 return sublist
40
Terry Jan Reedybfbaa6b2016-08-31 00:50:55 -040041
David Scherer7aced172000-08-15 01:13:23 +000042class DirBrowserTreeItem(TreeItem):
43
44 def __init__(self, dir, packages=[]):
45 self.dir = dir
46 self.packages = packages
47
48 def GetText(self):
49 if not self.packages:
50 return self.dir
51 else:
52 return self.packages[-1] + ": package"
53
54 def GetSubList(self):
55 try:
56 names = os.listdir(self.dir or os.curdir)
Andrew Svetlov786fbd82012-12-17 19:51:15 +020057 except OSError:
David Scherer7aced172000-08-15 01:13:23 +000058 return []
59 packages = []
60 for name in names:
61 file = os.path.join(self.dir, name)
62 if self.ispackagedir(file):
63 nn = os.path.normcase(name)
64 packages.append((nn, name, file))
65 packages.sort()
66 sublist = []
67 for nn, name, file in packages:
68 item = DirBrowserTreeItem(file, self.packages + [name])
69 sublist.append(item)
70 for nn, name in self.listmodules(names):
71 item = ModuleBrowserTreeItem(os.path.join(self.dir, name))
72 sublist.append(item)
73 return sublist
74
75 def ispackagedir(self, file):
Terry Jan Reedy19c1a872015-07-20 17:44:59 -040076 " Return true for directories that are packages."
David Scherer7aced172000-08-15 01:13:23 +000077 if not os.path.isdir(file):
Terry Jan Reedy19c1a872015-07-20 17:44:59 -040078 return False
David Scherer7aced172000-08-15 01:13:23 +000079 init = os.path.join(file, "__init__.py")
80 return os.path.exists(init)
81
82 def listmodules(self, allnames):
83 modules = {}
Brett Cannoncb66eb02012-05-11 12:58:42 -040084 suffixes = importlib.machinery.EXTENSION_SUFFIXES[:]
Terry Jan Reedy19c1a872015-07-20 17:44:59 -040085 suffixes += importlib.machinery.SOURCE_SUFFIXES
86 suffixes += importlib.machinery.BYTECODE_SUFFIXES
David Scherer7aced172000-08-15 01:13:23 +000087 sorted = []
Ned Deilybfbf3f12012-10-18 18:16:44 -070088 for suff in suffixes:
David Scherer7aced172000-08-15 01:13:23 +000089 i = -len(suff)
90 for name in allnames[:]:
91 normed_name = os.path.normcase(name)
92 if normed_name[i:] == suff:
93 mod_name = name[:i]
Guido van Rossum811c4e02006-08-22 15:45:46 +000094 if mod_name not in modules:
David Scherer7aced172000-08-15 01:13:23 +000095 modules[mod_name] = None
96 sorted.append((normed_name, name))
97 allnames.remove(name)
98 sorted.sort()
99 return sorted
100
Terry Jan Reedybfbaa6b2016-08-31 00:50:55 -0400101
Terry Jan Reedy19c1a872015-07-20 17:44:59 -0400102def _path_browser(parent): # htest #
Cheryl Sabella20d48a42017-11-22 19:05:25 -0500103 PathBrowser(parent, _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)