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