/Lib/idlelib/PathBrowser.py

http://unladen-swallow.googlecode.com/ · Python · 95 lines · 79 code · 16 blank · 0 comment · 17 complexity · 255d4d6243d1fbd2ec2e6a8bf7e20e56 MD5 · raw file

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