comparison upreckon/files.py @ 246:1bc89faac941 2.04

Fixed: match='re' could produce duplicate test identifiers files.Files.regexp(pattern) now makes sure to return only one metafile for each matching virtual path, namely, the one that would be returned for that virtual path by files.Files.from_virtual_path.
author Oleg Oshmyan <chortos@inbox.lv>
date Thu, 03 Oct 2013 01:19:09 +0300
parents 7827e63cd148
children f5847d29e838
comparison
equal deleted inserted replaced
242:08ffa5a975e8 246:1bc89faac941
295 yield metafile 295 yield metafile
296 if not self.archive: 296 if not self.archive:
297 for filename in archives: 297 for filename in archives:
298 yield self.__add__(filename, False) 298 yield self.__add__(filename, False)
299 299
300 def _also_add_tests(self):
301 yield self
302 if not self._has_tests:
303 for metafile in self._add_tests():
304 yield metafile
305
300 def _add_virtual(self, filename): 306 def _add_virtual(self, filename):
301 return File(posixpath.join(self.virtual_path, filename), 307 return File(posixpath.join(self.virtual_path, filename),
302 self._external_path, 308 self._external_path,
303 self._internal_path, 309 self._internal_path,
304 self.archive, 310 self.archive,
322 return File(virtual_path, 328 return File(virtual_path,
323 os.path.join(self._external_path, filename), 329 os.path.join(self._external_path, filename),
324 _has_tests=self._has_tests) 330 _has_tests=self._has_tests)
325 331
326 @classmethod 332 @classmethod
327 def regexp(cls, pattern): 333 def regexp(cls, pattern, _unique=True):
328 if not pattern: 334 if not pattern:
329 yield cls('', os.curdir) 335 yield cls('', os.curdir)
330 return 336 return
331 dirname, basename = posixpath.split(pattern) 337 dirname, basename = posixpath.split(pattern)
332 dirs = cls.regexp(dirname) 338 dirs = cls.regexp(dirname, False)
333 reobj = re.compile(pattern + '$', re.UNICODE) 339 reobj = re.compile(pattern + '$', re.UNICODE)
340 if _unique:
341 yielded = set()
334 while dirs: 342 while dirs:
335 newdirs = [] 343 newdirs = []
336 for directory in dirs: 344 for testless_directory in dirs:
337 try: 345 for directory in testless_directory._also_add_tests():
338 names = directory.listdir() 346 try:
339 except Exception: 347 names = directory.listdir()
340 continue 348 except Exception:
341 for name in names: 349 continue
342 dir_entry = directory + name 350 for name in names:
343 if re.match(reobj, dir_entry.virtual_path): 351 dir_entry = directory + name
344 yield dir_entry 352 if re.match(reobj, dir_entry.virtual_path):
345 if not directory._has_tests: 353 if not _unique:
346 if name == 'tests': 354 yield dir_entry
347 dir_entry = directory.__add__(name, False) 355 elif dir_entry.virtual_path not in yielded:
348 dir_entry._has_tests = True 356 yield dir_entry
349 newdirs.append(dir_entry) 357 yielded.add(dir_entry.virtual_path)
350 elif not directory.archive and name in archives:
351 newdirs.append(directory.__add__(name, False))
352 dirs = newdirs 358 dirs = newdirs