Refactoring summary
This commit is contained in:
		
							parent
							
								
									648930f139
								
							
						
					
					
						commit
						e04ad3248a
					
				@ -337,7 +337,7 @@ class Collection:
 | 
			
		||||
        row_data = self._format_row_data('metadata', metadata)
 | 
			
		||||
        self.db.add_row('metadata', row_data)
 | 
			
		||||
 | 
			
		||||
    def _update_exif_data(self, dest_path, media):
 | 
			
		||||
    def _update_exif_data(self, media):
 | 
			
		||||
        updated = False
 | 
			
		||||
        if self.album_from_folder:
 | 
			
		||||
            media.set_album_from_folder()
 | 
			
		||||
@ -374,7 +374,7 @@ class Collection:
 | 
			
		||||
                    if fnmatch(file_path, exclude):
 | 
			
		||||
                        if not self.dry_run:
 | 
			
		||||
                            self.remove(file_path)
 | 
			
		||||
                        self.summary.append((file_path, 'remove_excluded'))
 | 
			
		||||
                        self.summary.append('remove', True, file_path)
 | 
			
		||||
                        break
 | 
			
		||||
 | 
			
		||||
        return self.summary
 | 
			
		||||
@ -383,13 +383,13 @@ class Collection:
 | 
			
		||||
        checksum = media.metadata['checksum']
 | 
			
		||||
        if not self._checkcomp(dest_path, checksum):
 | 
			
		||||
            self.logger.error(f'Files {src_path} and {dest_path} are not identical')
 | 
			
		||||
            self.summary.append((src_path, False))
 | 
			
		||||
            self.summary.append('check', False, src_path, dest_path)
 | 
			
		||||
            return False
 | 
			
		||||
 | 
			
		||||
        # change media file_path to dest_path
 | 
			
		||||
        media.file_path = dest_path
 | 
			
		||||
        if not self.dry_run:
 | 
			
		||||
            updated = self._update_exif_data(dest_path, media)
 | 
			
		||||
            updated = self._update_exif_data(media)
 | 
			
		||||
            if updated:
 | 
			
		||||
                checksum = utils.checksum(dest_path)
 | 
			
		||||
                media.metadata['checksum'] = checksum
 | 
			
		||||
@ -420,7 +420,7 @@ class Collection:
 | 
			
		||||
        """Check file and record the file to db"""
 | 
			
		||||
        # Check if file remain the same
 | 
			
		||||
        if not self._check_file(src_path, dest_path, media):
 | 
			
		||||
            self.summary.append((src_path, False))
 | 
			
		||||
            self.summary.append('check', False, src_path, dest_path)
 | 
			
		||||
            return False
 | 
			
		||||
 | 
			
		||||
        if not self.dry_run:
 | 
			
		||||
@ -678,7 +678,10 @@ class Collection:
 | 
			
		||||
                        )
 | 
			
		||||
                elif conflict == 1:
 | 
			
		||||
                    # There is unresolved conflict
 | 
			
		||||
                    self.summary.append((src_path, False))
 | 
			
		||||
                    if import_mode:
 | 
			
		||||
                        self.summary.append('import', False, src_path, dest_path)
 | 
			
		||||
                    else:
 | 
			
		||||
                        self.summary.append('sort', False, src_path, dest_path)
 | 
			
		||||
                elif conflict == 3:
 | 
			
		||||
                    # Same file checksum
 | 
			
		||||
                    if import_mode == 'move':
 | 
			
		||||
@ -809,7 +812,7 @@ class Collection:
 | 
			
		||||
    def init(self, loc, ignore_tags=set()):
 | 
			
		||||
        for media, file_path in self.get_medias(loc):
 | 
			
		||||
            self._add_db_data(media.metadata)
 | 
			
		||||
            self.summary.append((file_path, 'update'))
 | 
			
		||||
            self.summary.append('update', file_path)
 | 
			
		||||
 | 
			
		||||
        return self.summary
 | 
			
		||||
 | 
			
		||||
@ -853,7 +856,7 @@ class Collection:
 | 
			
		||||
                        break
 | 
			
		||||
                # set row attribute to the file
 | 
			
		||||
                self._add_db_data(media.metadata)
 | 
			
		||||
                self.summary.append((file_path, 'update'))
 | 
			
		||||
                self.summary.append('update', file_path)
 | 
			
		||||
 | 
			
		||||
        # Finally delete invalid rows
 | 
			
		||||
        for row in invalid_db_rows:
 | 
			
		||||
@ -866,10 +869,10 @@ 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, 'check'))
 | 
			
		||||
                self.summary.append('check',True, file_path)
 | 
			
		||||
            else:
 | 
			
		||||
                self.logger.error('{file_path} is corrupted')
 | 
			
		||||
                self.summary.append((file_path, False))
 | 
			
		||||
                self.summary.append('check', False, file_path)
 | 
			
		||||
 | 
			
		||||
        return self.summary
 | 
			
		||||
 | 
			
		||||
@ -898,7 +901,7 @@ class Collection:
 | 
			
		||||
    def remove_empty_folders(self, directory, remove_root=True):
 | 
			
		||||
        """Remove empty sub-folders in collection"""
 | 
			
		||||
        if not os.path.isdir(directory):
 | 
			
		||||
            self.summary.append((directory, False))
 | 
			
		||||
            self.summary.append('remove', False, directory)
 | 
			
		||||
            return self.summary
 | 
			
		||||
 | 
			
		||||
        # remove empty subfolders
 | 
			
		||||
@ -915,7 +918,7 @@ class Collection:
 | 
			
		||||
            self.logger.info(f"Removing empty folder: {directory}")
 | 
			
		||||
            if not self.dry_run:
 | 
			
		||||
                os.rmdir(directory)
 | 
			
		||||
            self.summary.append((directory, 'remove_empty_folders'))
 | 
			
		||||
            self.summary.append('remove', True, directory)
 | 
			
		||||
 | 
			
		||||
        return self.summary
 | 
			
		||||
 | 
			
		||||
@ -924,8 +927,6 @@ class Collection:
 | 
			
		||||
            self._copy(src_path, dest_path)
 | 
			
		||||
        else:
 | 
			
		||||
            self._move(src_path, dest_path)
 | 
			
		||||
        if import_mode:
 | 
			
		||||
            update = False
 | 
			
		||||
 | 
			
		||||
        result = self._record_file(
 | 
			
		||||
            src_path, dest_path, media, import_mode=import_mode
 | 
			
		||||
@ -934,11 +935,14 @@ class Collection:
 | 
			
		||||
        if result:
 | 
			
		||||
            self.dest_list.append(dest_path)
 | 
			
		||||
            if import_mode:
 | 
			
		||||
                self.summary.append((src_path, 'import'))
 | 
			
		||||
                self.summary.append('import', True, src_path, dest_path)
 | 
			
		||||
            else:
 | 
			
		||||
                self.summary.append((src_path, 'sort'))
 | 
			
		||||
                self.summary.append('sort', True, src_path, dest_path)
 | 
			
		||||
        else:
 | 
			
		||||
            self.summary.append((src_path, False))
 | 
			
		||||
            if import_mode:
 | 
			
		||||
                self.summary.append('import', False, src_path, dest_path)
 | 
			
		||||
            else:
 | 
			
		||||
                self.summary.append('sort', False, src_path, dest_path)
 | 
			
		||||
 | 
			
		||||
        return self.summary
 | 
			
		||||
 | 
			
		||||
@ -973,7 +977,7 @@ class Collection:
 | 
			
		||||
            self._remove_empty_subdirs(subdirs, src_dirs)
 | 
			
		||||
 | 
			
		||||
        if not self._check_processed():
 | 
			
		||||
            self.summary.append((None, False))
 | 
			
		||||
            self.summary.append('check', False)
 | 
			
		||||
 | 
			
		||||
        return self.summary
 | 
			
		||||
 | 
			
		||||
@ -1023,7 +1027,7 @@ class Collection:
 | 
			
		||||
        self._sort_medias(files_data, remove_duplicates=remove_duplicates)
 | 
			
		||||
 | 
			
		||||
        if not self._check_processed():
 | 
			
		||||
            self.summary.append((None, False))
 | 
			
		||||
            self.summary.append('check', False)
 | 
			
		||||
 | 
			
		||||
        return self.summary
 | 
			
		||||
 | 
			
		||||
@ -1100,7 +1104,7 @@ class Collection:
 | 
			
		||||
            self.logger.error('Nb of row have changed unexpectedly')
 | 
			
		||||
 | 
			
		||||
        if not self._check_processed():
 | 
			
		||||
            self.summary.append((None, False))
 | 
			
		||||
            self.summary.append('check', False)
 | 
			
		||||
 | 
			
		||||
        return self.summary
 | 
			
		||||
 | 
			
		||||
@ -1166,6 +1170,6 @@ class Collection:
 | 
			
		||||
                # Update exif data
 | 
			
		||||
                media.set_key_values(key, value)
 | 
			
		||||
 | 
			
		||||
                self.summary.append((file_path, 'update'))
 | 
			
		||||
                self.summary.append('update', False, file_path)
 | 
			
		||||
 | 
			
		||||
        return self.summary
 | 
			
		||||
 | 
			
		||||
@ -1,64 +1,97 @@
 | 
			
		||||
# import pandas as pd
 | 
			
		||||
from tabulate import tabulate
 | 
			
		||||
 | 
			
		||||
class Tables:
 | 
			
		||||
    """Create table and display result in Pandas DataFrame"""
 | 
			
		||||
 | 
			
		||||
    def __init__(self, actions):
 | 
			
		||||
        self.actions = actions
 | 
			
		||||
 | 
			
		||||
        self.table = []
 | 
			
		||||
 | 
			
		||||
        self.columns = ['action', 'file_path', 'dest_path']
 | 
			
		||||
        # self.df = self.dataframe()
 | 
			
		||||
 | 
			
		||||
    def append(self, action, file_path=None, dest_path=None):
 | 
			
		||||
        row = (action, file_path, dest_path)
 | 
			
		||||
        self.table.append(row)
 | 
			
		||||
 | 
			
		||||
    def sum(self, action=None):
 | 
			
		||||
        if not action:
 | 
			
		||||
            return len(self.table)
 | 
			
		||||
 | 
			
		||||
        count = 0
 | 
			
		||||
        for row in self.table:
 | 
			
		||||
            if row[0] == action:
 | 
			
		||||
                count += 1
 | 
			
		||||
 | 
			
		||||
        return count
 | 
			
		||||
 | 
			
		||||
    # def dataframe(self):
 | 
			
		||||
    #     return pd.DataFrame(self.table, columns=self.columns)
 | 
			
		||||
 | 
			
		||||
    def tabulate(self):
 | 
			
		||||
        errors_headers = self.columns
 | 
			
		||||
        return tabulate(self.table, headers=errors_headers)
 | 
			
		||||
 | 
			
		||||
class Summary:
 | 
			
		||||
    def __init__(self, path):
 | 
			
		||||
    """Result summary of ordigi program call"""
 | 
			
		||||
 | 
			
		||||
    def __init__(self, root):
 | 
			
		||||
        self.actions = (
 | 
			
		||||
            'check',
 | 
			
		||||
            'import',
 | 
			
		||||
            'remove_empty_folders',
 | 
			
		||||
            'remove_excluded',
 | 
			
		||||
            'remove',
 | 
			
		||||
            'sort',
 | 
			
		||||
            'update',
 | 
			
		||||
        )
 | 
			
		||||
        self.path = path
 | 
			
		||||
        self.result = {}
 | 
			
		||||
        for action in self.actions:
 | 
			
		||||
            self.result[action] = 0
 | 
			
		||||
 | 
			
		||||
        # Set labels
 | 
			
		||||
        self.state = ['success', 'errors']
 | 
			
		||||
        self.root = root
 | 
			
		||||
        self.success_table = Tables(self.actions)
 | 
			
		||||
        self.errors_table = Tables(self.actions)
 | 
			
		||||
        self.errors = 0
 | 
			
		||||
        self.errors_items = []
 | 
			
		||||
 | 
			
		||||
    def append(self, row):
 | 
			
		||||
        file_path, action = row
 | 
			
		||||
 | 
			
		||||
    def append(self, action, success, file_path=None, dest_path=None):
 | 
			
		||||
        if action:
 | 
			
		||||
            for m in self.actions:
 | 
			
		||||
                if action == m:
 | 
			
		||||
                    self.result[action] += 1
 | 
			
		||||
            if success:
 | 
			
		||||
                self.success_table.append(action, file_path, dest_path)
 | 
			
		||||
            else:
 | 
			
		||||
                self.errors_table.append(action, file_path, dest_path)
 | 
			
		||||
 | 
			
		||||
        if not success:
 | 
			
		||||
            self.errors +=1
 | 
			
		||||
            if file_path:
 | 
			
		||||
                self.errors_items.append(file_path)
 | 
			
		||||
 | 
			
		||||
    def print(self):
 | 
			
		||||
        """Print summary"""
 | 
			
		||||
 | 
			
		||||
        print()
 | 
			
		||||
        for action in self.result:
 | 
			
		||||
            nb = self.result[action]
 | 
			
		||||
            if self.result[action] != 0:
 | 
			
		||||
        for action in self.actions:
 | 
			
		||||
            nb = self.success_table.sum(action)
 | 
			
		||||
            if nb != 0:
 | 
			
		||||
                if action == 'check':
 | 
			
		||||
                    print(f"SUMMARY: {nb} files checked in {self.path}.")
 | 
			
		||||
                    print(f"SUMMARY: {nb} files checked in {self.root}.")
 | 
			
		||||
                elif action == 'import':
 | 
			
		||||
                    print(f"SUMMARY: {nb} files imported into {self.path}.")
 | 
			
		||||
                    print(f"SUMMARY: {nb} files imported into {self.root}.")
 | 
			
		||||
                elif action == 'sort':
 | 
			
		||||
                    print(f"SUMMARY: {nb} files sorted inside {self.path}.")
 | 
			
		||||
                    print(f"SUMMARY: {nb} files sorted inside {self.root}.")
 | 
			
		||||
                elif action == 'remove_excluded':
 | 
			
		||||
                    print(f"SUMMARY: {nb} files deleted in {self.path}.")
 | 
			
		||||
                    print(f"SUMMARY: {nb} files deleted in {self.root}.")
 | 
			
		||||
                elif action == 'remove_empty_folders':
 | 
			
		||||
                    print(f"SUMMARY: {nb} empty folders removed in {self.path}.")
 | 
			
		||||
                    print(f"SUMMARY: {nb} empty folders removed in {self.root}.")
 | 
			
		||||
                elif action == 'update':
 | 
			
		||||
                    print(f"SUMMARY: {nb} files updated in {self.path} database.")
 | 
			
		||||
                    print(f"SUMMARY: {nb} files updated in {self.root} database.")
 | 
			
		||||
 | 
			
		||||
        if sum(self.result.values()) == 0 and not self.errors:
 | 
			
		||||
            print(f"SUMMARY: no file imported, sorted or deleted from {self.path}.")
 | 
			
		||||
        success = self.success_table.sum()
 | 
			
		||||
        if not success and not self.errors:
 | 
			
		||||
            print(f"SUMMARY: no action done in {self.root}.")
 | 
			
		||||
 | 
			
		||||
        if self.errors > 0:
 | 
			
		||||
        errors = self.errors_table.sum()
 | 
			
		||||
        if errors:
 | 
			
		||||
            print()
 | 
			
		||||
            errors_headers = [f"ERROR: {self.errors} errors reported in files:"]
 | 
			
		||||
            errors_result = []
 | 
			
		||||
            for path in self.errors_items:
 | 
			
		||||
                errors_result.append([path])
 | 
			
		||||
            print(f"ERROR: {errors} errors reported for files:")
 | 
			
		||||
            print(self.success_table.tabulate())
 | 
			
		||||
 | 
			
		||||
            print(tabulate(errors_result, headers=errors_headers))
 | 
			
		||||
            print()
 | 
			
		||||
        elif self.errors:
 | 
			
		||||
            print(f"ERROR: {errors} errors reported.")
 | 
			
		||||
 | 
			
		||||
@ -131,12 +131,12 @@ class TestCollection:
 | 
			
		||||
    def assert_import(self, summary, nb):
 | 
			
		||||
        # Summary is created and there is no errors
 | 
			
		||||
        assert summary.errors == 0
 | 
			
		||||
        assert summary.result['import'] == nb
 | 
			
		||||
        assert summary.success_table.sum('import') == nb
 | 
			
		||||
 | 
			
		||||
    def assert_sort(self, summary, nb):
 | 
			
		||||
        # Summary is created and there is no errors
 | 
			
		||||
        assert summary.errors == 0
 | 
			
		||||
        assert summary.result['sort'] == nb
 | 
			
		||||
        assert summary.success_table.sum('sort') == nb
 | 
			
		||||
 | 
			
		||||
    def test_sort_files(self, tmp_path):
 | 
			
		||||
        collection = Collection(tmp_path, album_from_folder=True,
 | 
			
		||||
@ -148,7 +148,8 @@ class TestCollection:
 | 
			
		||||
        self.assert_import(summary, 30)
 | 
			
		||||
 | 
			
		||||
        summary = collection.check_files()
 | 
			
		||||
        assert summary.result['check'] == 30
 | 
			
		||||
        assert summary.success_table.sum('import') == 30
 | 
			
		||||
        assert summary.success_table.sum('update') == 0
 | 
			
		||||
        assert not summary.errors
 | 
			
		||||
 | 
			
		||||
        # check if album value are set
 | 
			
		||||
@ -169,13 +170,14 @@ class TestCollection:
 | 
			
		||||
 | 
			
		||||
        shutil.copytree(tmp_path / 'test_exif', tmp_path / 'test_exif_copy')
 | 
			
		||||
        collection.summary = Summary(tmp_path)
 | 
			
		||||
        assert sum(collection.summary.result.values()) == 0
 | 
			
		||||
        assert collection.summary.success_table.sum() == 0
 | 
			
		||||
        summary = collection.update(loc)
 | 
			
		||||
        assert summary.result['update'] == 2
 | 
			
		||||
        assert summary.success_table.sum('update') == 2
 | 
			
		||||
        assert summary.success_table.sum() == 2
 | 
			
		||||
        assert not summary.errors
 | 
			
		||||
        collection.summary = Summary(tmp_path)
 | 
			
		||||
        summary = collection.update(loc)
 | 
			
		||||
        assert not summary.result['update']
 | 
			
		||||
        assert summary.success_table.sum() == 0
 | 
			
		||||
        assert not summary.errors
 | 
			
		||||
 | 
			
		||||
        # test with populated dest dir
 | 
			
		||||
@ -186,7 +188,8 @@ class TestCollection:
 | 
			
		||||
        # test summary update
 | 
			
		||||
        collection.summary = Summary(tmp_path)
 | 
			
		||||
        summary = collection.update(loc)
 | 
			
		||||
        assert summary.result['update']
 | 
			
		||||
        assert summary.success_table.sum('sort') == 0
 | 
			
		||||
        assert summary.success_table.sum('update')
 | 
			
		||||
        assert not summary.errors
 | 
			
		||||
 | 
			
		||||
    def test_sort_files_invalid_db(self, tmp_path):
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user