mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 11:49:12 +00:00 
			
		
		
		
	This follows the previous patch that changed idlelib file names. Class names that matched old module names are not changed. Change idlelib imports in turtledemo.__main__. Exception: config-extensions.def. Previously, extension section names, file names, and class names had to match. Changing section names would create cross-version conflicts in config-extensions.cfg (user customizations). Instead map old names to new file names at point of import in editor.EditorWindow.load_extension. Patch extensively tested with test_idle, idle_test.htest.py, a custom import-all test, running IDLE in a console to catch messages, and testing each menu item. Based on a patch by Al Sweigart.
		
			
				
	
	
		
			108 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import os
 | 
						|
import sys
 | 
						|
import importlib.machinery
 | 
						|
 | 
						|
from idlelib.tree import TreeItem
 | 
						|
from idlelib.browser import ClassBrowser, ModuleBrowserTreeItem
 | 
						|
from idlelib.pyshell import PyShellFileList
 | 
						|
 | 
						|
 | 
						|
class PathBrowser(ClassBrowser):
 | 
						|
 | 
						|
    def __init__(self, flist, _htest=False):
 | 
						|
        """
 | 
						|
        _htest - bool, change box location when running htest
 | 
						|
        """
 | 
						|
        self._htest = _htest
 | 
						|
        self.init(flist)
 | 
						|
 | 
						|
    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 #
 | 
						|
    flist = PyShellFileList(parent)
 | 
						|
    PathBrowser(flist, _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)
 |