From 16b3c646c2bdfec57bf081be9b2da7980cd6270e Mon Sep 17 00:00:00 2001 From: Cedric Leporcq Date: Mon, 18 Oct 2021 07:45:54 +0200 Subject: [PATCH] Change summary format and fixes --- ordigi.py | 4 +-- ordigi/collection.py | 49 +++++++++++++++++++------------- ordigi/summary.py | 67 ++++++++++++++++++++++++++------------------ 3 files changed, 72 insertions(+), 48 deletions(-) diff --git a/ordigi.py b/ordigi.py index 6a0cf68..5085649 100755 --- a/ordigi.py +++ b/ordigi.py @@ -313,10 +313,10 @@ def clean(**kwargs): ) if clean_all or folders: - collection.remove_empty_folders(path) + summary = collection.remove_empty_folders(path) if kwargs['delete_excluded']: - collection.remove_excluded_files() + summary = collection.remove_excluded_files() if log_level < 30: summary.print() diff --git a/ordigi/collection.py b/ordigi/collection.py index 0c812e9..24ad143 100644 --- a/ordigi/collection.py +++ b/ordigi/collection.py @@ -380,7 +380,7 @@ class Collection: if self.root in src_path.parents: self.db.delete_filepath(str(src_path.relative_to(self.root))) - self.summary.append((src_path, dest_path)) + self.summary.append((src_path, self.mode)) record = True else: @@ -405,9 +405,13 @@ class Collection: for exclude in self.exclude: if fnmatch(file_path, exclude): - self.remove(file_path) + if not self.dry_run: + self.remove(file_path) + self.summary.append((file_path, 'delete')) break + return self.summary + def sort_file(self, src_path, dest_path, remove_duplicates=False): ''' Copy or move file to dest_path. @@ -435,7 +439,9 @@ class Collection: f'File in source and destination are identical. Duplicate will be ignored.' ) if mode == 'move': - self.remove(src_path) + if not dry_run: + self.remove(src_path) + self.summary.append((src_path, 'delete')) return None else: # name is same, but file is different self.logger.warning( @@ -774,7 +780,7 @@ class Collection: metadata = media.get_metadata(self.root, loc, self.db, self.cache) media.metadata['file_path'] = os.path.relpath(file_path, self.root) self._add_db_data(media.metadata) - self.summary.append((file_path, file_path)) + self.summary.append((file_path, 'record')) return self.summary @@ -784,7 +790,7 @@ class Collection: checksum = utils.checksum(file_path) relpath = file_path.relative_to(self.root) if checksum == self.db.get_checksum(relpath): - self.summary.append((file_path, file_path)) + self.summary.append((file_path, 'record')) else: self.logger.error('{file_path} is corrupted') self.summary.append((file_path, False)) @@ -829,7 +835,7 @@ class Collection: break # set row attribute to the file self._add_db_data(media.metadata) - self.summary.append((file_path, file_path)) + self.summary.append((file_path, 'record')) # Finally delete invalid rows for row in invalid_db_rows: @@ -843,8 +849,8 @@ class Collection: # if folder empty, delete it files = os.listdir(directory) if len(files) == 0: - self.logger.info(f"Removing empty folder: {directory}") - directory.rmdir() + if not self.dry_run: + directory.rmdir() if self.root in directory.parent.parents: parents.add(directory.parent) @@ -939,24 +945,29 @@ class Collection: return self.summary, record - def remove_empty_folders(self, path, remove_root=True): + def remove_empty_folders(self, directory, remove_root=True): 'Function to remove empty folders' - if not os.path.isdir(path): - return + if not os.path.isdir(directory): + self.summary.append((directory, False)) + return self.summary # remove empty subfolders - files = os.listdir(path) + files = os.listdir(directory) if len(files): for f in files: - fullpath = os.path.join(path, f) + fullpath = os.path.join(directory, f) if os.path.isdir(fullpath): self.remove_empty_folders(fullpath) # if folder empty, delete it - files = os.listdir(path) + files = os.listdir(directory) if len(files) == 0 and remove_root: - self.logger.info(f"Removing empty folder: {path}") - os.rmdir(path) + self.logger.info(f"Removing empty folder: {directory}") + if not self.dry_run: + os.rmdir(directory) + self.summary.append((directory, 'delete')) + + return self.summary def move_file(self, img_path, dest_path): if not self.dry_run: @@ -1017,7 +1028,7 @@ class Collection: self.move_file(img_path, dest_path) moved_imgs.add(img_path) if self._record_file(img_path, dest_path, media): - self.summary.append((img_path, dest_path)) + self.summary.append((img_path, self.mode)) else: self.summary.append((img_path, False)) result = False @@ -1028,7 +1039,7 @@ class Collection: self.move_file(img_path, dest_path) moved_imgs.add(img_path) if self._record_file(img_path, dest_path, media_ref): - self.summary.append((img_path, dest_path)) + self.summary.append((img_path, self.mode)) else: self.summary.append((img_path, False)) result = False @@ -1069,7 +1080,7 @@ class Collection: self.move_file(src_path, dest_path) moved_files.add(src_path) if self._record_file(src_path, dest_path, media): - self.summary.append((src_path, dest_path)) + self.summary.append((src_path, self.mode)) else: self.summary.append((src_path, False)) result = False diff --git a/ordigi/summary.py b/ordigi/summary.py index d050495..a226ad3 100644 --- a/ordigi/summary.py +++ b/ordigi/summary.py @@ -1,39 +1,52 @@ from tabulate import tabulate -class Summary(object): +class Summary: + def __init__(self): - self.records = [] - self.success = 0 - self.error = 0 - self.error_items = [] + self.modes = ('record', 'copy', 'move', 'delete') + self.result = {} + for mode in self.modes: + self.result[mode] = 0 + + self.errors = 0 + self.errors_items = [] def append(self, row): - id, status = row + file_path, mode = row - if status: - self.success += 1 + if mode: + for m in self.modes: + if mode == m: + self.result[mode] += 1 else: - self.error += 1 - self.error_items.append(id) + self.errors += 1 + self.errors_items.append(file_path) def print(self): - if self.error > 0: - error_headers = ["File"] - error_result = [] - for id in self.error_items: - error_result.append([id]) - - print('Errors details:') - print(tabulate(error_result, headers=error_headers)) - print("\n") - - headers = ["Metric", "Count"] - result = [ - ["Success", self.success], - ["Error", self.error], - ] print() - print('Summary:') - print(tabulate(result, tablefmt="plain")) + for mode in self.result: + nb = self.result[mode] + if self.result[mode] != 0: + if mode == 'record': + print(f"SUMMARY: {nb} files recorded.") + elif mode == 'copy': + print(f"SUMMARY: {nb} files copied.") + elif mode == 'move': + print(f"SUMMARY: {nb} files moved.") + else: + print(f"SUMMARY: {nb} files deleted.") + if sum(self.result.values()) == 0 and not self.errors: + print(f"OK !!") + + if self.errors > 0: + print() + errors_headers = [f"ERROR: {self.errors} errors reported in files:"] + errors_result = [] + for path in self.errors_items: + errors_result.append([path]) + + print(tabulate(errors_result, headers=errors_headers)) + print() +