def test_mask_time_big(self): path1 = os.path.join(self.folder, "a.txt") path2 = os.path.join(self.folder, "b.txt") path3 = os.path.join(self.folder, "c") dtime = datetime.datetime.now() new_path1 = stamp.add_stamp(path1, dtime) new_path2 = stamp.add_stamp(path2, dtime) new_path3 = stamp.add_stamp(path3, dtime) open(new_path1, "w").close() open(new_path2, "w").close() open(new_path3, "w").close() mask1 = stamp.extend_mask_by_stamp(path1) mask2 = stamp.extend_mask_by_stamp(path2) mask3 = stamp.extend_mask_by_stamp(path3) dircetory1, file_mask1 = os.path.split(mask1) dircetory2, file_mask2 = os.path.split(mask2) dircetory3, file_mask3 = os.path.split(mask3) files1 = utils.search(dircetory1, "", file_mask1) files1 = [stamp.split_stamp(f)[0] for f in files1] files2 = utils.search(dircetory2, "", file_mask2) files2 = [stamp.split_stamp(f)[0] for f in files2] files3 = utils.search(dircetory3, "", file_mask3) files3 = [stamp.split_stamp(f)[0] for f in files3] self.assertEqual(files1, [path1]) self.assertEqual(files2, [path2]) self.assertEqual(files3, [path3])
def test_simple(self): directory = os.path.join(self.files_folder, "e") path = os.path.join(directory, "f.txt") with self.trash.lock(): count, size, delta_files = self.trash.add(path) self.assertEquals(count, 1) self.assertEquals(size, 10) delta_files = unify(delta_files, directory) self.assertEquals(delta_files, ["f.txt"]) files = list(utils.search(directory, "*", "*")) files = [os.path.relpath(f, directory) for f in files] files.sort() self.assertEquals(files, ["g.txt", "h.png", "j", "k"]) count, size, delta_files = self.trash.restore(path) self.assertEquals(count, 1) self.assertEquals(size, 10) delta_files = unify(delta_files, directory) self.assertEquals(delta_files, ["f.txt"]) files = list(utils.search(directory, "*", "*")) files = [os.path.relpath(f, directory) for f in files] files.sort() self.assertEquals(files, ["f.txt", "g.txt", "h.png", "j", "k"])
def test_dir(self): directory = self.files_folder path = os.path.join(directory, "e") with self.trash.lock(): count, size, delta_files = self.trash.add(path) self.assertEquals(count, 5) self.assertEquals(size, 15) delta_files = unify(delta_files, directory) self.assertEquals(delta_files, [ "e", "e/f.txt", "e/g.txt", "e/h.png", "e/j", "e/k", "e/k/l.txt" ]) files = list(utils.search(directory, "*", "*")) files = [os.path.relpath(f, directory) for f in files] files.sort() self.assertEquals(files, ["a.txt", "b.txt", "c.png", "d"]) count, size, delta_files = self.trash.restore(path) self.assertEquals(count, 5) self.assertEquals(size, 15) files = list(utils.search(directory, "", "*", recursive=True)) files = [os.path.relpath(f, directory) for f in files] files.sort() self.assertEquals(files, [ "a.txt", "b.txt", "c.png", "d", "e/f.txt", "e/g.txt", "e/h.png", "e/j", "e/k/l.txt" ])
def test_remove_dir(self): directory = self.files_folder path = os.path.join(directory, "e") with self.trash.lock(): count, size, delta_files = self.trash.add(path) self.assertEquals(count, 5) self.assertEquals(size, 15) delta_files = unify(delta_files, directory) self.assertEquals(delta_files, [ "e", "e/f.txt", "e/g.txt", "e/h.png", "e/j", "e/k", "e/k/l.txt" ]) count, size, delta_files = self.trash.remove(path) self.assertEquals(count, 5) self.assertEquals(size, 15) delta_files = [f_d[0] for f_d in delta_files] delta_files = unify(delta_files, directory) self.assertEquals(delta_files, [ "e", "e/f.txt", "e/g.txt", "e/h.png", "e/j", "e/k", "e/k/l.txt" ]) files = list(utils.search(directory, "*", "*")) files = [os.path.relpath(f, directory) for f in files] files.sort() self.assertEquals(files, ["a.txt", "b.txt", "c.png", "d"]) self.assertFalse(os.path.exists(self.trash.to_internal(path)))
def search(self, path_mask, recursive=False, find_all=False): """Поиск в корзине по маске. Возвращает словарь с версиями. Маска задается в формате Unix filename pattern. Путь задается относительно Позиионные аргументы: path_mask -- маска Непозиционные аргументы: recursive -- производить лиpath поиск в подпапках. find_all -- углублять в подпапки, если они соответствуют маске (по-умолчанию False) """ path_mask = self.to_internal(path_mask) directory, mask = os.path.split(path_mask) if not os.path.exists(directory): return {} file_mask = stamp.extend_mask_by_stamp(mask) files = utils.search(directory, mask, file_mask, recursive=recursive, find_all=find_all) files = [self.to_external(f) for f in files] files_versions = stamp.files_to_file_dict(files) return files_versions
def test_dict(self): mask = stamp.extend_mask_by_stamp(self.path) dircetory, file_mask = os.path.split(mask) files = utils.search(dircetory, "", file_mask) dct = stamp.files_to_file_dict(files) self.assertEqual(dct[self.path], [self.dtime3, self.dtime2, self.dtime1])
def test_simple_clear(self): directory = os.path.join(self.files_folder, "e") path = os.path.join(directory, "f.txt") with self.trash.lock(): count, size, delta_files = self.trash.add(path) self.assertEquals(count, 1) self.assertEquals(size, 10) delta_files = unify(delta_files, directory) self.assertEquals(delta_files, ["f.txt"]) count, size, delta_files = self.trash.remove(path) self.assertEquals(count, 1) self.assertEquals(size, 10) delta_files = [f_d[0] for f_d in delta_files] delta_files = unify(delta_files, directory) self.assertEquals(delta_files, ["f.txt"]) files = list(utils.search(directory, "*", "*")) files = [os.path.relpath(f, directory) for f in files] files.sort() self.assertEquals(files, ["g.txt", "h.png", "j", "k"]) files = stamp.get_versions_list(self.trash.to_internal(path)) self.assertTrue(len(files) == 0)
def test_time(self): mask = stamp.extend_mask_by_stamp(self.path) dircetory, file_mask = os.path.split(mask) files = utils.search(dircetory, "", file_mask) times = [stamp.split_stamp(f)[1] for f in files] times.sort() self.assertEqual(times, [self.dtime1, self.dtime2, self.dtime3])
def test_remove_mask1(self): directory = os.path.join(self.files_folder, "e") path = os.path.join(directory, "*") count, size, delta_files = self.mrm.remove(path) self.assertEquals(count, 5) self.assertEquals(size, 15) files = list(utils.search(directory, "*", "*")) self.assertEquals(len(files), 0)
def test_mask(self): path = os.path.join(self.folder, "a.txt") dtime = datetime.datetime.now() new_path = stamp.add_stamp(path, dtime) open(new_path, "w").close() mask = stamp.extend_mask_by_stamp(path) dircetory, file_mask = os.path.split(mask) files = utils.search(dircetory, "", file_mask) files = [stamp.split_stamp(f)[0] for f in files] self.assertEqual(files, [path])
def test_2(self): files = utils.search(self.folder, "*", "*", recursive=False, find_all=False) files = list(files) files = [os.path.relpath(f, self.folder) for f in files] files.sort() self.assertEqual(files, ["a.txt", "b.txt", "c", "e.png"])
def test_mask2(self): files = utils.search(self.folder, "", "[ab].txt", recursive=True, find_all=False) files = list(files) files = [os.path.relpath(f, self.folder) for f in files] files.sort() ans = ["a.txt", "b.txt"] self.assertEqual(files, ans)
def test_find_all(self): files = utils.search(self.folder, "*", "*", recursive=True, find_all=True) files = list(files) files = [os.path.relpath(f, self.folder) for f in files] files.sort() ans = ["a.txt", "b.txt", "c", os.path.join("c", "d.txt"), "e.png"] self.assertEqual(files, ans)
def test_remove_mask2(self): directory = os.path.join(self.files_folder, "e") path = os.path.join(directory, "*.txt") count, size, delta_files = self.mrm.remove(path) self.assertEquals(count, 2) self.assertEquals(size, 15) files = list(utils.search(directory, "*", "*")) files = [os.path.relpath(f, directory) for f in files] files.sort() self.assertEquals(files, ["h.png", "j", "k"])
def test_simple_remove(self): directory = self.files_folder path = os.path.join(directory, "a.txt") count, size, delta_files = self.mrm.remove(path) self.assertEquals(count, 1) self.assertEquals(size, 10) files = list(utils.search(directory, "*", "*")) files = [os.path.relpath(f, directory) for f in files] files.sort() self.assertEquals(files, ["b.txt", "c.png", "d", "e"])
def test_remove_mask6(self): directory = os.path.join(self.files_folder) path = os.path.join(directory, "*") count, size, delta_files = self.mrm.remove(path, recursive=True) self.assertEquals(count, 9) self.assertEquals(size, 30) files = list(utils.search(directory, "*", "*")) files = [os.path.relpath(f, directory) for f in files] files.sort() self.assertEquals(files, [])
def test_restore3(self): directory = os.path.join(self.files_folder) path = os.path.join(directory, "[bc].*") self.mrm.remove(path) count, size, delta_files = self.mrm.restore(path) self.assertEquals(count, 2) self.assertEquals(size, 5) files = list(utils.search(directory, "*", "*")) files = [os.path.relpath(f, directory) for f in files] files.sort() self.assertEquals(files, ["a.txt", "b.txt", "c.png", "d", "e"])
def test_remove_mask3(self): directory = os.path.join(self.files_folder) path = os.path.join(directory, "*.txt") count, size, delta_files = self.mrm.remove(path, recursive=True) self.assertEquals(count, 5) self.assertEquals(size, 30) files = list( utils.search(directory, "*", "*", recursive=True, find_all=True)) files = [os.path.relpath(f, directory) for f in files] files.sort() self.assertEquals(files, ["c.png", "d", "e", "e/h.png", "e/j", "e/k"])
def test_restore5(self): directory = os.path.join(self.files_folder) path = os.path.join(directory, "*") self.mrm.remove(path) count, size, delta_files = self.mrm.restore(path) self.assertEquals(count, 9) self.assertEquals(size, 30) files = list(utils.search(directory, "", "*", recursive=True)) files = [os.path.relpath(f, directory) for f in files] files.sort() self.assertEquals(files, [ "a.txt", "b.txt", "c.png", "d", "e/f.txt", "e/g.txt", "e/h.png", "e/j", "e/k/l.txt" ])
def get_versions_list(path): """Возвращает список штампом времени добавленных к файлу Позицонные аргументы: path -- путь к файлу Формат штампов: "{path}_rmdt={posix_sec}_rmmsec={microsec}_" """ directory, file_name = os.path.split(path) extend_file_name = extend_mask_by_stamp(file_name) files = utils.search(directory, '', extend_file_name) versions = [split_stamp(f)[1] for f in files] versions.sort(reverse=True) return versions
def remove(self, path_mask, recursive=False): """Удаляет фалйы по маске в корзину. Возвращает количестов удаленных файлов и их размер. Маска задается в формате Unix filename pattern. Только последний элемент пути может быть маской. Позиионные аргументы: path_mask -- маска Непозиционные аргументы: recursive -- производить ли поиск в подпапках. По умолчанию: False Корзина блокируется. """ path_mask = os.path.expanduser(path_mask) path_mask = os.path.abspath(path_mask) size = 0 count = 0 files = [] directory, mask = os.path.split(path_mask) with self.trash.lock(): found = utils.search(directory, mask, mask, recursive=recursive) for path in found: if not control.remove(path, interactive=self.interactive): continue try: try: if self.dryrun: with self.trash.dryrun_mode(): dcount, dsize, dfiles = self.trash.add(path) else: dcount, dsize, dfiles = self.trash.add(path) except LimitExcessException: if self.allow_autoclean and not self.dryrun: log_msg = ("Bukkit limit excess. " "Trying to autoclean.") logging.info(log_msg) dcount, dsize = self.autocleaner.autoclean() log_fmt = "{count} files({size} bytes) cleaned." log_msg = log_fmt.format(count=dcount, size=dsize) if self.dryrun: with self.trash.dryrun_mode(): dcount, dsize, dfiles = self.trash.add( path) else: dcount, dsize, dfiles = self.trash.add(path) else: raise except Exception: if not self.force: raise count += dcount size += dsize files.extend(dfiles) return count, size, files