PathBrowser.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import os
  2. import sys
  3. import imp
  4. from idlelib.TreeWidget import TreeItem
  5. from idlelib.ClassBrowser import ClassBrowser, ModuleBrowserTreeItem
  6. from idlelib.PyShell import PyShellFileList
  7. class PathBrowser(ClassBrowser):
  8. def __init__(self, flist, _htest=False):
  9. """
  10. _htest - bool, change box location when running htest
  11. """
  12. self._htest = _htest
  13. self.init(flist)
  14. def settitle(self):
  15. "Set window titles."
  16. self.top.wm_title("Path Browser")
  17. self.top.wm_iconname("Path Browser")
  18. def rootnode(self):
  19. return PathBrowserTreeItem()
  20. class PathBrowserTreeItem(TreeItem):
  21. def GetText(self):
  22. return "sys.path"
  23. def GetSubList(self):
  24. sublist = []
  25. for dir in sys.path:
  26. item = DirBrowserTreeItem(dir)
  27. sublist.append(item)
  28. return sublist
  29. class DirBrowserTreeItem(TreeItem):
  30. def __init__(self, dir, packages=[]):
  31. self.dir = dir
  32. self.packages = packages
  33. def GetText(self):
  34. if not self.packages:
  35. return self.dir
  36. else:
  37. return self.packages[-1] + ": package"
  38. def GetSubList(self):
  39. try:
  40. names = os.listdir(self.dir or os.curdir)
  41. except os.error:
  42. return []
  43. packages = []
  44. for name in names:
  45. file = os.path.join(self.dir, name)
  46. if self.ispackagedir(file):
  47. nn = os.path.normcase(name)
  48. packages.append((nn, name, file))
  49. packages.sort()
  50. sublist = []
  51. for nn, name, file in packages:
  52. item = DirBrowserTreeItem(file, self.packages + [name])
  53. sublist.append(item)
  54. for nn, name in self.listmodules(names):
  55. item = ModuleBrowserTreeItem(os.path.join(self.dir, name))
  56. sublist.append(item)
  57. return sublist
  58. def ispackagedir(self, file):
  59. if not os.path.isdir(file):
  60. return False
  61. init = os.path.join(file, "__init__.py")
  62. return os.path.exists(init)
  63. def listmodules(self, allnames):
  64. modules = {}
  65. suffixes = imp.get_suffixes()
  66. sorted = []
  67. for suff, mode, flag in suffixes:
  68. i = -len(suff)
  69. for name in allnames[:]:
  70. normed_name = os.path.normcase(name)
  71. if normed_name[i:] == suff:
  72. mod_name = name[:i]
  73. if mod_name not in modules:
  74. modules[mod_name] = None
  75. sorted.append((normed_name, name))
  76. allnames.remove(name)
  77. sorted.sort()
  78. return sorted
  79. def _path_browser(parent): # htest #
  80. flist = PyShellFileList(parent)
  81. PathBrowser(flist, _htest=True)
  82. parent.mainloop()
  83. if __name__ == "__main__":
  84. from unittest import main
  85. main('idlelib.idle_test.test_pathbrowser', verbosity=2, exit=False)
  86. from idlelib.idle_test.htest import run
  87. run(_path_browser)