def get_size(self): """Возвращает размер корзины. Если корзина заблокированна, возвращает кэшированное значение. """ if self._locked: return self._size else: lock_file = self.get_lock_file_path() size = utils.get_files_size(self.directory) # Файл блокировки также содержиться в корзине size -= utils.get_files_size(lock_file) return size
def add_file(self, file_name): """Перемещает файл в корзину. Возвращает колич. удаленх фалов, их рself.азмер, список путей. Не следует использовать эту функцию вне класса во время блокировки. Позиционные аргументы: file_name -- исходный путь к файлу Добаление вроизовдиться путем пермещение файла. Путь файла переподвешивается относительно папки корзины. Протокол шивруется как последовательность символов. К файлу добавляется штамп текущего времени UTC. """ old_path = utils.get_absolute_path(file_name) new_path = self.to_internal(old_path) count = 1 size = utils.get_files_size(old_path) now = datetime.datetime.now() full_new_path = stamp.add_stamp(new_path, now) debug_fmt = "Moving file {old_path} to {new_path}" debug_msg = debug_fmt.format(old_path=old_path, new_path=full_new_path) logging.debug(debug_msg) if not self.dryrun: if not os.path.exists(os.path.dirname(full_new_path)): os.makedirs(os.path.dirname(full_new_path)) os.rename(old_path, full_new_path) return count, size, [old_path]
def restore_file(self, file_name, how_old=0): """Востанавливает файл из корзины. Возвращает колич. вост. объектов, их размер, список путей. Позиционные аргументы: file_name -- путь к файлу в корзине Непозиционные аргументы:files how_old -- версия файла в порядке устарения даты удаления. По умолчанию: 0 (последняя версия) Не следует использовать эту функцию вне класса во время блокировки. Из файла удаляется штамп времени. Файл переповешивается из папке корзины в корень. """ new_path = utils.get_absolute_path(file_name) old_path = self.to_internal(new_path) old_path_full = stamp.get_version(old_path, how_old) count = 1 size = utils.get_files_size(old_path_full) if os.path.exists(new_path): os.remove(new_path) if not os.path.exists(os.path.dirname(new_path)): debug_msg = "Make dir {directory} ".format(directory=new_path) logging.debug(debug_msg) os.makedirs(os.path.dirname(new_path)) debug_fmt = "Moving file {old_path} to {new_path}" debug_msg = debug_fmt.format(old_path=old_path, new_path=new_path) logging.debug(debug_msg) if not self.dryrun: os.rename(old_path_full, new_path) if not self.dryrun: if utils.is_empty(os.path.dirname(old_path_full)): os.rmdir(os.path.dirname(old_path_full)) return count, size, [new_path]
def add(self, path): """Добавляет элемент в корзину. Возвращает количестов удаленных файлов, их размер, список удаленных объектов. Позиционные аргументы: path -- исходный путь к элементу Перед выполнением операции происходит проверка на превышения лимита корзины. Эффективно пересчитывает новый размер корзины и количество файлов в ней. При превышение ограничений на корзину возбуждается LimitExcessException """ delta_size = utils.get_files_size(path) delta_count = utils.get_files_count(path) new_size = self.get_size() + delta_size new_count = self.get_count() + delta_count trash_dir = utils.get_absolute_path(self.directory) if os.path.commonprefix((path, trash_dir)) == trash_dir: raise ValueError("You can't remove anythin from trash.") if new_size > self.max_size: raise LimitExcessException("Size limit excess.") if new_count > self.max_count: raise LimitExcessException("Files count limit excess.") if os.path.isdir(path): _, _, added = self.add_dir(path) else: _, _, added = self.add_file(path) if self.is_locked() and not self.dryrun: self._size = new_size self._count = new_count return delta_count, delta_size, added
def remove(self, path, how_old=-1): """Удаляет элемент из корзины навсегда. Возвращает количестов очищенных файлов и их размер, список очищенных объектов. Работа возможна только во время блокировки корзины. Позиционные аргументы: path -- путь к элементу в корзине Непозиционные аргументы: how_old -- версия файла в порядке устарения даты удаления. По умолчанию: -1 (все версии) Эффективно пересчитывает новый размер корзины и количество файлов в ней. """ removed = [] path = self.to_internal(path) delta_count = 0 delta_size = 0 if not os.path.isdir(path): if how_old >= 0: full_path = stamp.get_version(path, how_old) delta_count += 1 delta_size += utils.get_files_size(full_path) removed.append(full_path) if not self.dryrun: os.remove(full_path) else: for vers in stamp.get_versions_list(path): full_path = stamp.add_stamp(path, vers) delta_count += 1 delta_size += utils.get_files_size(full_path) removed.append(full_path) if not self.dryrun: os.remove(full_path) else: for dirpath, _, filenames in os.walk(path, topdown=False): removed.append(dirpath) for element in filenames: full_path = os.path.join(dirpath, element) delta_count += 1 delta_size += utils.get_files_size(full_path) removed.append(full_path) if not self.dryrun: os.remove(full_path) if not self.dryrun: os.rmdir(dirpath) if self.is_locked() and not self.dryrun: self._size -= delta_size self._count -= delta_count removed_stplited = [stamp.split_stamp(f) for f in removed] removed_stplited_ext = [(self.to_external(f), d) for f, d in removed_stplited] return delta_count, delta_size, removed_stplited_ext
def test_dir2(self): ans = 34 result = utils.get_files_size(os.path.join(self.folder)) self.assertEqual(result, ans)
def test_dir1(self): ans = 20 result = utils.get_files_size(os.path.join(self.folder, "c")) self.assertEqual(result, ans)
def test_1(self): ans = 10 result = utils.get_files_size(os.path.join(self.folder, "b.txt")) self.assertEqual(result, ans)