ltoc.py 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import os, sys, UserList
  2. import finder, tocfilter, resource
  3. class lTOC(UserList.UserList):
  4. """ A class for managing lists of resources.
  5. Should be a UserList subclass. Doh.
  6. Like a list, but has merge(other) and filter() methods """
  7. def __init__(self, reslist=None, filters=None):
  8. UserList.UserList.__init__(self, reslist)
  9. self.filters = []
  10. if filters is not None:
  11. self.filters = filters[:]
  12. def prepend(self, res):
  13. self.resources.insert(0, res)
  14. def merge(self, other):
  15. ' merge in another ltoc, discarding dups and preserving order '
  16. tmp = {}
  17. for res in self.data:
  18. tmp[res.name] = 0
  19. for res in other:
  20. if tmp.get(res.name, 1):
  21. self.data.append(res)
  22. tmp[res.name] = 0
  23. def filter(self):
  24. ' invoke all filters '
  25. for i in range(len(self.data)):
  26. res = self.data[i]
  27. if res:
  28. for f in self.filters:
  29. if f.matches(res):
  30. self.data[i] = None
  31. break
  32. self.data = filter(None, self.data)
  33. return self
  34. def unique(self):
  35. ' remove all duplicate entries, preserving order '
  36. new = self.__class__()
  37. new.merge(self)
  38. self.data = new.data
  39. def toList(self):
  40. ' return self as a list of (name, path, typ) '
  41. tmp = []
  42. for res in self.data:
  43. tmp.append((res.name, res.path, res.typ))
  44. return tmp
  45. def addFilter(self, filter):
  46. if type(filter) == type(''):
  47. self.filters.append(finder.makeresource(filter).asFilter())
  48. else:
  49. if type(filter) == type(self):
  50. if isinstance(filter, tocfilter._Filter):
  51. self.filters.append(filter)
  52. elif isinstance(filter, resource.resource):
  53. self.filters.append(filter.asFilter())
  54. else:
  55. raise ValueError, "can't make filter from %s", repr(filter)
  56. else:
  57. raise ValueError, "can't make filter from %s", repr(filter)
  58. print " added filter", `self.filters[-1]`
  59. if __name__ == '__main__':
  60. sys.path.insert(0, '.')
  61. import finder
  62. import pprint
  63. s = finder.scriptresource('finder.py', './finder.py')
  64. ## pyltoc = lTOC(s.modules)
  65. ## l1 = pyltoc.toList()
  66. ## print "Raw py ltoc:", pprint.pprint(l1)
  67. ## f1 = ModFilter(['dospath', 'macpath', 'posixpath'])
  68. ## l2 = lTOC(s.modules).filter(f1).toList()
  69. ## print "Filter out dospath, macpath, posixpath:", pprint.pprint(l2)
  70. ## f2 = DirFilter(['.'])
  71. ## l3 = lTOC(s.modules).filter(f2).toList()
  72. ## print "Filter out current dir:", pprint.pprint(l3)
  73. ## f3 = StdLibFilter()
  74. ## l4 = lTOC(s.modules).filter(f3).toList()
  75. ## print "Filter out stdlib:", pprint.pprint(l4)
  76. ## #print "Filter out current dir and stdlib:", lTOC(s.modules).filter(f2, f3).toList()
  77. binltoc = lTOC(s.binaries)
  78. print "Raw bin ltoc:", pprint.pprint(binltoc.toList())
  79. binltoc.addFilter('c:/winnt/system32')
  80. pprint.pprint(binltoc.filter().toList())