comparison files.py @ 132:cdd0f970d112

Fixed several small bugs in the files module
author Oleg Oshmyan <chortos@inbox.lv>
date Thu, 19 May 2011 02:55:36 +0100
parents 62a96d51bf94
children a9d2aa6810c7
comparison
equal deleted inserted replaced
131:7923faf392fe 132:cdd0f970d112
43 43
44 @abstractmethod 44 @abstractmethod
45 def extract(self, name, target): raise NotImplementedError 45 def extract(self, name, target): raise NotImplementedError
46 46
47 def __del__(self): 47 def __del__(self):
48 del self.file 48 try:
49 del self.file
50 except NameError:
51 pass
49 52
50 try: 53 try:
51 import tarfile 54 import tarfile
52 except ImportError: 55 except ImportError:
53 TarArchive = None 56 TarArchive = None
54 else: 57 else:
55 class TarArchive(Archive): 58 class TarArchive(Archive):
56 __slots__ = '__namelist' 59 __slots__ = '_namelist'
57 60
58 def __init__(self, path): 61 def __init__(self, path):
59 self.file = tarfile.open(path) 62 self.file = tarfile.open(path)
60 63
61 def extract(self, name, target): 64 def extract(self, name, target):
66 # TODO: somehow automagically emulate universal line break support 69 # TODO: somehow automagically emulate universal line break support
67 def open(self, name): 70 def open(self, name):
68 return self.file.extractfile(name) 71 return self.file.extractfile(name)
69 72
70 def exists(self, queried_name): 73 def exists(self, queried_name):
71 if not hasattr(self, '__namelist'): 74 if not hasattr(self, '_namelist'):
72 names = set() 75 names = set()
73 for name in self.file.getnames(): 76 for name in self.file.getnames():
74 cutname = name 77 cutname = name
75 while cutname: 78 while cutname:
76 names.add(cutname) 79 names.add(cutname)
77 cutname = cutname.rpartition('/')[0] 80 cutname = cutname.rpartition('/')[0]
78 self.__namelist = frozenset(names) 81 self._namelist = frozenset(names)
79 return queried_name in self.__namelist 82 return queried_name in self._namelist
80 83
81 def __enter__(self): 84 def __enter__(self):
82 if hasattr(self.file, '__enter__'): 85 if hasattr(self.file, '__enter__'):
83 self.file.__enter__() 86 self.file.__enter__()
84 return self 87 return self
100 import zipfile 103 import zipfile
101 except ImportError: 104 except ImportError:
102 ZipArchive = None 105 ZipArchive = None
103 else: 106 else:
104 class ZipArchive(Archive): 107 class ZipArchive(Archive):
105 __slots__ = '__namelist' 108 __slots__ = '_namelist'
106 109
107 def __init__(self, path): 110 def __init__(self, path):
108 self.file = zipfile.ZipFile(path) 111 self.file = zipfile.ZipFile(path)
109 112
110 def extract(self, name, target): 113 def extract(self, name, target):
121 124
122 def open(self, name): 125 def open(self, name):
123 return self.file.open(name, 'rU') 126 return self.file.open(name, 'rU')
124 127
125 def exists(self, queried_name): 128 def exists(self, queried_name):
126 if not hasattr(self, '__namelist'): 129 if not hasattr(self, '_namelist'):
127 names = set() 130 names = set()
128 for name in self.file.namelist(): 131 for name in self.file.namelist():
129 cutname = name 132 cutname = name
130 while cutname: 133 while cutname:
131 names.add(cutname) 134 names.add(cutname)
132 cutname = cutname.rpartition('/')[0] 135 cutname = cutname.rpartition('/')[0]
133 self.__namelist = frozenset(names) 136 self._namelist = frozenset(names)
134 return queried_name in self.__namelist 137 return queried_name in self._namelist
135 138
136 def __enter__(self): 139 def __enter__(self):
137 if hasattr(self.file, '__enter__'): 140 if hasattr(self.file, '__enter__'):
138 self.file.__enter__() 141 self.file.__enter__()
139 return self 142 return self