mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 11:49:12 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			98 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import os
 | 
						|
import sys
 | 
						|
import importlib.machinery
 | 
						|
 | 
						|
from idlelib.TreeWidget import TreeItem
 | 
						|
from idlelib.ClassBrowser import ClassBrowser, ModuleBrowserTreeItem
 | 
						|
 | 
						|
class PathBrowser(ClassBrowser):
 | 
						|
 | 
						|
    def __init__(self, flist):
 | 
						|
        self.init(flist)
 | 
						|
 | 
						|
    def settitle(self):
 | 
						|
        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):
 | 
						|
        if not os.path.isdir(file):
 | 
						|
            return 0
 | 
						|
        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 main():
 | 
						|
    from idlelib import PyShell
 | 
						|
    PathBrowser(PyShell.flist)
 | 
						|
    if sys.stdin is sys.__stdin__:
 | 
						|
        mainloop()
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    from unittest import main
 | 
						|
    main('idlelib.idle_test.test_pathbrowser', verbosity=2, exit=False)
 |