1import importlib.machinery
2import os
3import sys
4
5from idlelib.browser import ModuleBrowser, ModuleBrowserTreeItem
6from idlelib.tree import TreeItem
7
8
9class PathBrowser(ModuleBrowser):
10
11    def __init__(self, master, *, _htest=False, _utest=False):
12        """
13        _htest - bool, change box location when running htest
14        """
15        self.master = master
16        self._htest = _htest
17        self._utest = _utest
18        self.init()
19
20    def settitle(self):
21        "Set window titles."
22        self.top.wm_title("Path Browser")
23        self.top.wm_iconname("Path Browser")
24
25    def rootnode(self):
26        return PathBrowserTreeItem()
27
28
29class PathBrowserTreeItem(TreeItem):
30
31    def GetText(self):
32        return "sys.path"
33
34    def GetSubList(self):
35        sublist = []
36        for dir in sys.path:
37            item = DirBrowserTreeItem(dir)
38            sublist.append(item)
39        return sublist
40
41
42class DirBrowserTreeItem(TreeItem):
43
44    def __init__(self, dir, packages=[]):
45        self.dir = dir
46        self.packages = packages
47
48    def GetText(self):
49        if not self.packages:
50            return self.dir
51        else:
52            return self.packages[-1] + ": package"
53
54    def GetSubList(self):
55        try:
56            names = os.listdir(self.dir or os.curdir)
57        except OSError:
58            return []
59        packages = []
60        for name in names:
61            file = os.path.join(self.dir, name)
62            if self.ispackagedir(file):
63                nn = os.path.normcase(name)
64                packages.append((nn, name, file))
65        packages.sort()
66        sublist = []
67        for nn, name, file in packages:
68            item = DirBrowserTreeItem(file, self.packages + [name])
69            sublist.append(item)
70        for nn, name in self.listmodules(names):
71            item = ModuleBrowserTreeItem(os.path.join(self.dir, name))
72            sublist.append(item)
73        return sublist
74
75    def ispackagedir(self, file):
76        " Return true for directories that are packages."
77        if not os.path.isdir(file):
78            return False
79        init = os.path.join(file, "__init__.py")
80        return os.path.exists(init)
81
82    def listmodules(self, allnames):
83        modules = {}
84        suffixes = importlib.machinery.EXTENSION_SUFFIXES[:]
85        suffixes += importlib.machinery.SOURCE_SUFFIXES
86        suffixes += importlib.machinery.BYTECODE_SUFFIXES
87        sorted = []
88        for suff in suffixes:
89            i = -len(suff)
90            for name in allnames[:]:
91                normed_name = os.path.normcase(name)
92                if normed_name[i:] == suff:
93                    mod_name = name[:i]
94                    if mod_name not in modules:
95                        modules[mod_name] = None
96                        sorted.append((normed_name, name))
97                        allnames.remove(name)
98        sorted.sort()
99        return sorted
100
101
102def _path_browser(parent):  # htest #
103    PathBrowser(parent, _htest=True)
104    parent.mainloop()
105
106if __name__ == "__main__":
107    from unittest import main
108    main('idlelib.idle_test.test_pathbrowser', verbosity=2, exit=False)
109
110    from idlelib.idle_test.htest import run
111    run(_path_browser)
112