17db96d56Sopenharmony_ciimport importlib.machinery 27db96d56Sopenharmony_ciimport os 37db96d56Sopenharmony_ciimport sys 47db96d56Sopenharmony_ci 57db96d56Sopenharmony_cifrom idlelib.browser import ModuleBrowser, ModuleBrowserTreeItem 67db96d56Sopenharmony_cifrom idlelib.tree import TreeItem 77db96d56Sopenharmony_ci 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_ciclass PathBrowser(ModuleBrowser): 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_ci def __init__(self, master, *, _htest=False, _utest=False): 127db96d56Sopenharmony_ci """ 137db96d56Sopenharmony_ci _htest - bool, change box location when running htest 147db96d56Sopenharmony_ci """ 157db96d56Sopenharmony_ci self.master = master 167db96d56Sopenharmony_ci self._htest = _htest 177db96d56Sopenharmony_ci self._utest = _utest 187db96d56Sopenharmony_ci self.init() 197db96d56Sopenharmony_ci 207db96d56Sopenharmony_ci def settitle(self): 217db96d56Sopenharmony_ci "Set window titles." 227db96d56Sopenharmony_ci self.top.wm_title("Path Browser") 237db96d56Sopenharmony_ci self.top.wm_iconname("Path Browser") 247db96d56Sopenharmony_ci 257db96d56Sopenharmony_ci def rootnode(self): 267db96d56Sopenharmony_ci return PathBrowserTreeItem() 277db96d56Sopenharmony_ci 287db96d56Sopenharmony_ci 297db96d56Sopenharmony_ciclass PathBrowserTreeItem(TreeItem): 307db96d56Sopenharmony_ci 317db96d56Sopenharmony_ci def GetText(self): 327db96d56Sopenharmony_ci return "sys.path" 337db96d56Sopenharmony_ci 347db96d56Sopenharmony_ci def GetSubList(self): 357db96d56Sopenharmony_ci sublist = [] 367db96d56Sopenharmony_ci for dir in sys.path: 377db96d56Sopenharmony_ci item = DirBrowserTreeItem(dir) 387db96d56Sopenharmony_ci sublist.append(item) 397db96d56Sopenharmony_ci return sublist 407db96d56Sopenharmony_ci 417db96d56Sopenharmony_ci 427db96d56Sopenharmony_ciclass DirBrowserTreeItem(TreeItem): 437db96d56Sopenharmony_ci 447db96d56Sopenharmony_ci def __init__(self, dir, packages=[]): 457db96d56Sopenharmony_ci self.dir = dir 467db96d56Sopenharmony_ci self.packages = packages 477db96d56Sopenharmony_ci 487db96d56Sopenharmony_ci def GetText(self): 497db96d56Sopenharmony_ci if not self.packages: 507db96d56Sopenharmony_ci return self.dir 517db96d56Sopenharmony_ci else: 527db96d56Sopenharmony_ci return self.packages[-1] + ": package" 537db96d56Sopenharmony_ci 547db96d56Sopenharmony_ci def GetSubList(self): 557db96d56Sopenharmony_ci try: 567db96d56Sopenharmony_ci names = os.listdir(self.dir or os.curdir) 577db96d56Sopenharmony_ci except OSError: 587db96d56Sopenharmony_ci return [] 597db96d56Sopenharmony_ci packages = [] 607db96d56Sopenharmony_ci for name in names: 617db96d56Sopenharmony_ci file = os.path.join(self.dir, name) 627db96d56Sopenharmony_ci if self.ispackagedir(file): 637db96d56Sopenharmony_ci nn = os.path.normcase(name) 647db96d56Sopenharmony_ci packages.append((nn, name, file)) 657db96d56Sopenharmony_ci packages.sort() 667db96d56Sopenharmony_ci sublist = [] 677db96d56Sopenharmony_ci for nn, name, file in packages: 687db96d56Sopenharmony_ci item = DirBrowserTreeItem(file, self.packages + [name]) 697db96d56Sopenharmony_ci sublist.append(item) 707db96d56Sopenharmony_ci for nn, name in self.listmodules(names): 717db96d56Sopenharmony_ci item = ModuleBrowserTreeItem(os.path.join(self.dir, name)) 727db96d56Sopenharmony_ci sublist.append(item) 737db96d56Sopenharmony_ci return sublist 747db96d56Sopenharmony_ci 757db96d56Sopenharmony_ci def ispackagedir(self, file): 767db96d56Sopenharmony_ci " Return true for directories that are packages." 777db96d56Sopenharmony_ci if not os.path.isdir(file): 787db96d56Sopenharmony_ci return False 797db96d56Sopenharmony_ci init = os.path.join(file, "__init__.py") 807db96d56Sopenharmony_ci return os.path.exists(init) 817db96d56Sopenharmony_ci 827db96d56Sopenharmony_ci def listmodules(self, allnames): 837db96d56Sopenharmony_ci modules = {} 847db96d56Sopenharmony_ci suffixes = importlib.machinery.EXTENSION_SUFFIXES[:] 857db96d56Sopenharmony_ci suffixes += importlib.machinery.SOURCE_SUFFIXES 867db96d56Sopenharmony_ci suffixes += importlib.machinery.BYTECODE_SUFFIXES 877db96d56Sopenharmony_ci sorted = [] 887db96d56Sopenharmony_ci for suff in suffixes: 897db96d56Sopenharmony_ci i = -len(suff) 907db96d56Sopenharmony_ci for name in allnames[:]: 917db96d56Sopenharmony_ci normed_name = os.path.normcase(name) 927db96d56Sopenharmony_ci if normed_name[i:] == suff: 937db96d56Sopenharmony_ci mod_name = name[:i] 947db96d56Sopenharmony_ci if mod_name not in modules: 957db96d56Sopenharmony_ci modules[mod_name] = None 967db96d56Sopenharmony_ci sorted.append((normed_name, name)) 977db96d56Sopenharmony_ci allnames.remove(name) 987db96d56Sopenharmony_ci sorted.sort() 997db96d56Sopenharmony_ci return sorted 1007db96d56Sopenharmony_ci 1017db96d56Sopenharmony_ci 1027db96d56Sopenharmony_cidef _path_browser(parent): # htest # 1037db96d56Sopenharmony_ci PathBrowser(parent, _htest=True) 1047db96d56Sopenharmony_ci parent.mainloop() 1057db96d56Sopenharmony_ci 1067db96d56Sopenharmony_ciif __name__ == "__main__": 1077db96d56Sopenharmony_ci from unittest import main 1087db96d56Sopenharmony_ci main('idlelib.idle_test.test_pathbrowser', verbosity=2, exit=False) 1097db96d56Sopenharmony_ci 1107db96d56Sopenharmony_ci from idlelib.idle_test.htest import run 1117db96d56Sopenharmony_ci run(_path_browser) 112