112 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import importlib.machinery
 | |
| import os
 | |
| import sys
 | |
| 
 | |
| from idlelib.browser import ModuleBrowser, ModuleBrowserTreeItem
 | |
| from idlelib.tree import TreeItem
 | |
| 
 | |
| 
 | |
| class PathBrowser(ModuleBrowser):
 | |
| 
 | |
|     def __init__(self, master, *, _htest=False, _utest=False):
 | |
|         """
 | |
|         _htest - bool, change box location when running htest
 | |
|         """
 | |
|         self.master = master
 | |
|         self._htest = _htest
 | |
|         self._utest = _utest
 | |
|         self.init()
 | |
| 
 | |
|     def settitle(self):
 | |
|         "Set window titles."
 | |
|         self.top.wm_title("Path Browser")
 | |
|         self.top.wm_iconname("Path Browser")
 | |
| 
 | |
|     def rootnode(self):
 | |
|         return PathBrowserTreeItem()
 | |
| 
 | |
| 
 | |
| class PathBrowserTreeItem(TreeItem):
 | |
| 
 | |
|     def GetText(self):
 | |
|         return "sys.path"
 | |
| 
 | |
|     def GetSubList(self):
 | |
|         sublist = []
 | |
|         for dir in sys.path:
 | |
|             item = DirBrowserTreeItem(dir)
 | |
|             sublist.append(item)
 | |
|         return sublist
 | |
| 
 | |
| 
 | |
| class DirBrowserTreeItem(TreeItem):
 | |
| 
 | |
|     def __init__(self, dir, packages=[]):
 | |
|         self.dir = dir
 | |
|         self.packages = packages
 | |
| 
 | |
|     def GetText(self):
 | |
|         if not self.packages:
 | |
|             return self.dir
 | |
|         else:
 | |
|             return self.packages[-1] + ": package"
 | |
| 
 | |
|     def GetSubList(self):
 | |
|         try:
 | |
|             names = os.listdir(self.dir or os.curdir)
 | |
|         except OSError:
 | |
|             return []
 | |
|         packages = []
 | |
|         for name in names:
 | |
|             file = os.path.join(self.dir, name)
 | |
|             if self.ispackagedir(file):
 | |
|                 nn = os.path.normcase(name)
 | |
|                 packages.append((nn, name, file))
 | |
|         packages.sort()
 | |
|         sublist = []
 | |
|         for nn, name, file in packages:
 | |
|             item = DirBrowserTreeItem(file, self.packages + [name])
 | |
|             sublist.append(item)
 | |
|         for nn, name in self.listmodules(names):
 | |
|             item = ModuleBrowserTreeItem(os.path.join(self.dir, name))
 | |
|             sublist.append(item)
 | |
|         return sublist
 | |
| 
 | |
|     def ispackagedir(self, file):
 | |
|         " Return true for directories that are packages."
 | |
|         if not os.path.isdir(file):
 | |
|             return False
 | |
|         init = os.path.join(file, "__init__.py")
 | |
|         return os.path.exists(init)
 | |
| 
 | |
|     def listmodules(self, allnames):
 | |
|         modules = {}
 | |
|         suffixes = importlib.machinery.EXTENSION_SUFFIXES[:]
 | |
|         suffixes += importlib.machinery.SOURCE_SUFFIXES
 | |
|         suffixes += importlib.machinery.BYTECODE_SUFFIXES
 | |
|         sorted = []
 | |
|         for suff in suffixes:
 | |
|             i = -len(suff)
 | |
|             for name in allnames[:]:
 | |
|                 normed_name = os.path.normcase(name)
 | |
|                 if normed_name[i:] == suff:
 | |
|                     mod_name = name[:i]
 | |
|                     if mod_name not in modules:
 | |
|                         modules[mod_name] = None
 | |
|                         sorted.append((normed_name, name))
 | |
|                         allnames.remove(name)
 | |
|         sorted.sort()
 | |
|         return sorted
 | |
| 
 | |
| 
 | |
| def _path_browser(parent):  # htest #
 | |
|     PathBrowser(parent, _htest=True)
 | |
|     parent.mainloop()
 | |
| 
 | |
| if __name__ == "__main__":
 | |
|     from unittest import main
 | |
|     main('idlelib.idle_test.test_pathbrowser', verbosity=2, exit=False)
 | |
| 
 | |
|     from idlelib.idle_test.htest import run
 | |
|     run(_path_browser)
 |