Refactoring collection options (3)
This commit is contained in:
		
							parent
							
								
									27af9bb55e
								
							
						
					
					
						commit
						7688d0e7c4
					
				@ -184,7 +184,6 @@ def _check(**kwargs):
 | 
				
			|||||||
def _clean(**kwargs):
 | 
					def _clean(**kwargs):
 | 
				
			||||||
    """Remove empty folders"""
 | 
					    """Remove empty folders"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    dry_run = kwargs['dry_run']
 | 
					 | 
				
			||||||
    folders = kwargs['folders']
 | 
					    folders = kwargs['folders']
 | 
				
			||||||
    log_level = log.get_level(kwargs['verbose'])
 | 
					    log_level = log.get_level(kwargs['verbose'])
 | 
				
			||||||
    log.console(LOG, level=log_level)
 | 
					    log.console(LOG, level=log_level)
 | 
				
			||||||
@ -195,10 +194,12 @@ def _clean(**kwargs):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    collection = Collection(
 | 
					    collection = Collection(
 | 
				
			||||||
        root,
 | 
					        root,
 | 
				
			||||||
        dry_run=dry_run,
 | 
					        {
 | 
				
			||||||
        exclude=kwargs['exclude'],
 | 
					            "dry_run": kwargs['dry_run'],
 | 
				
			||||||
        extensions=kwargs['ext'],
 | 
					            "exclude": kwargs['exclude'],
 | 
				
			||||||
        glob=kwargs['glob'],
 | 
					            "extensions": kwargs['ext'],
 | 
				
			||||||
 | 
					            "glob": kwargs['glob'],
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # TODO
 | 
					    # TODO
 | 
				
			||||||
@ -253,7 +254,6 @@ def _compare(**kwargs):
 | 
				
			|||||||
    Sort similar images in directories
 | 
					    Sort similar images in directories
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    dry_run = kwargs['dry_run']
 | 
					 | 
				
			||||||
    subdirs = kwargs['subdirs']
 | 
					    subdirs = kwargs['subdirs']
 | 
				
			||||||
    root = kwargs['collection']
 | 
					    root = kwargs['collection']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -263,10 +263,12 @@ def _compare(**kwargs):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    collection = Collection(
 | 
					    collection = Collection(
 | 
				
			||||||
        root,
 | 
					        root,
 | 
				
			||||||
        exclude=kwargs['exclude'],
 | 
					        {
 | 
				
			||||||
        extensions=kwargs['ext'],
 | 
					            "exclude": kwargs['exclude'],
 | 
				
			||||||
        glob=kwargs['glob'],
 | 
					            "extensions": kwargs['ext'],
 | 
				
			||||||
        dry_run=dry_run,
 | 
					            "glob": kwargs['glob'],
 | 
				
			||||||
 | 
					            "dry_run": kwargs['dry_run'],
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for path in paths:
 | 
					    for path in paths:
 | 
				
			||||||
@ -338,16 +340,18 @@ def _import(**kwargs):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    collection = Collection(
 | 
					    collection = Collection(
 | 
				
			||||||
        root,
 | 
					        root,
 | 
				
			||||||
        kwargs['album_from_folder'],
 | 
					        {
 | 
				
			||||||
        False,
 | 
					            'album_from_folder': kwargs['album_from_folder'],
 | 
				
			||||||
        kwargs['dry_run'],
 | 
					            'cache': False,
 | 
				
			||||||
        kwargs['exclude'],
 | 
					            'ignore_tags': kwargs['ignore_tags'],
 | 
				
			||||||
        kwargs['ext'],
 | 
					            'use_date_filename': kwargs['use_date_filename'],
 | 
				
			||||||
        kwargs['glob'],
 | 
					            'use_file_dates': kwargs['use_file_dates'],
 | 
				
			||||||
        kwargs['interactive'],
 | 
					            'exclude': kwargs['exclude'],
 | 
				
			||||||
        kwargs['ignore_tags'],
 | 
					            'extensions': kwargs['ext'],
 | 
				
			||||||
        kwargs['use_date_filename'],
 | 
					            'glob': kwargs['glob'],
 | 
				
			||||||
        kwargs['use_file_dates'],
 | 
					            'dry_run': kwargs['dry_run'],
 | 
				
			||||||
 | 
					            'interactive': kwargs['interactive'],
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # TODO retrieve collection.opt
 | 
					    # TODO retrieve collection.opt
 | 
				
			||||||
@ -396,16 +400,18 @@ def _sort(**kwargs):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    collection = Collection(
 | 
					    collection = Collection(
 | 
				
			||||||
        root,
 | 
					        root,
 | 
				
			||||||
        kwargs['album_from_folder'],
 | 
					        {
 | 
				
			||||||
        cache,
 | 
					            'album_from_folder': kwargs['album_from_folder'],
 | 
				
			||||||
        kwargs['dry_run'],
 | 
					            'cache': cache,
 | 
				
			||||||
        kwargs['exclude'],
 | 
					            'ignore_tags': kwargs['ignore_tags'],
 | 
				
			||||||
        kwargs['ext'],
 | 
					            'use_date_filename': kwargs['use_date_filename'],
 | 
				
			||||||
        kwargs['glob'],
 | 
					            'use_file_dates': kwargs['use_file_dates'],
 | 
				
			||||||
        kwargs['interactive'],
 | 
					            'exclude': kwargs['exclude'],
 | 
				
			||||||
        kwargs['ignore_tags'],
 | 
					            'extensions': kwargs['ext'],
 | 
				
			||||||
        kwargs['use_date_filename'],
 | 
					            'glob': kwargs['glob'],
 | 
				
			||||||
        kwargs['use_file_dates'],
 | 
					            'dry_run': kwargs['dry_run'],
 | 
				
			||||||
 | 
					            'interactive': kwargs['interactive'],
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # TODO retrieve collection.opt
 | 
					    # TODO retrieve collection.opt
 | 
				
			||||||
 | 
				
			|||||||
@ -308,28 +308,21 @@ class FileIO:
 | 
				
			|||||||
class Paths:
 | 
					class Paths:
 | 
				
			||||||
    """Get filtered files paths"""
 | 
					    """Get filtered files paths"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(
 | 
					    def __init__(self, filters, interactive=False):
 | 
				
			||||||
        self,
 | 
					 | 
				
			||||||
        exclude=None,
 | 
					 | 
				
			||||||
        extensions=None,
 | 
					 | 
				
			||||||
        glob='**/*',
 | 
					 | 
				
			||||||
        interactive=False,
 | 
					 | 
				
			||||||
        max_deep=None,
 | 
					 | 
				
			||||||
    ):
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Options
 | 
					        self.filters = filters
 | 
				
			||||||
        self.exclude = exclude
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if extensions and '%media' in extensions:
 | 
					        self.extensions = self.filters['extensions']
 | 
				
			||||||
            extensions.remove('%media')
 | 
					        if not self.extensions:
 | 
				
			||||||
            self.extensions = extensions.union(Medias.extensions)
 | 
					            self.extensions = set()
 | 
				
			||||||
        else:
 | 
					        elif '%media' in self.extensions:
 | 
				
			||||||
            self.extensions = extensions
 | 
					            self.extensions.remove('%media')
 | 
				
			||||||
 | 
					            self.extensions = self.extensions.union(Medias.extensions)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.glob = self.filters['glob']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.glob = glob
 | 
					 | 
				
			||||||
        self.interactive = interactive
 | 
					        self.interactive = interactive
 | 
				
			||||||
        self.log = LOG.getChild(self.__class__.__name__)
 | 
					        self.log = LOG.getChild(self.__class__.__name__)
 | 
				
			||||||
        self.max_deep = max_deep
 | 
					 | 
				
			||||||
        self.paths_list = []
 | 
					        self.paths_list = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Attributes
 | 
					        # Attributes
 | 
				
			||||||
@ -382,10 +375,11 @@ class Paths:
 | 
				
			|||||||
            if path / '.ordigi' in file_path.parents:
 | 
					            if path / '.ordigi' in file_path.parents:
 | 
				
			||||||
                continue
 | 
					                continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if self.max_deep is not None:
 | 
					            if self.filters['max_deep'] is not None:
 | 
				
			||||||
                if level > self.max_deep:
 | 
					                if level > self.filters['max_deep']:
 | 
				
			||||||
                    continue
 | 
					                    continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            self.exclude = self.filters['exclude']
 | 
				
			||||||
            if self.exclude:
 | 
					            if self.exclude:
 | 
				
			||||||
                matched = False
 | 
					                matched = False
 | 
				
			||||||
                for exclude in self.exclude:
 | 
					                for exclude in self.exclude:
 | 
				
			||||||
@ -695,34 +689,10 @@ class SortMedias:
 | 
				
			|||||||
class Collection(SortMedias):
 | 
					class Collection(SortMedias):
 | 
				
			||||||
    """Class of the media collection."""
 | 
					    """Class of the media collection."""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(
 | 
					    def __init__(self, root, cli_options=None):
 | 
				
			||||||
        self,
 | 
					 | 
				
			||||||
        root,
 | 
					 | 
				
			||||||
        album_from_folder=False,
 | 
					 | 
				
			||||||
        cache=False,
 | 
					 | 
				
			||||||
        dry_run=False,
 | 
					 | 
				
			||||||
        exclude=None,
 | 
					 | 
				
			||||||
        extensions=None,
 | 
					 | 
				
			||||||
        glob='**/*',
 | 
					 | 
				
			||||||
        interactive=False,
 | 
					 | 
				
			||||||
        ignore_tags=None,
 | 
					 | 
				
			||||||
        use_date_filename=False,
 | 
					 | 
				
			||||||
        use_file_dates=False,
 | 
					 | 
				
			||||||
    ):
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # TODO move to cli
 | 
					        if not cli_options:
 | 
				
			||||||
        cli_options = {
 | 
					            cli_options = {}
 | 
				
			||||||
            'album_from_folder': album_from_folder,
 | 
					 | 
				
			||||||
            'cache': cache,
 | 
					 | 
				
			||||||
            'dry_run': dry_run,
 | 
					 | 
				
			||||||
            'exclude': exclude,
 | 
					 | 
				
			||||||
            'extensions': extensions,
 | 
					 | 
				
			||||||
            'glob': '**/*',
 | 
					 | 
				
			||||||
            'interactive': interactive,
 | 
					 | 
				
			||||||
            'ignore_tags': ignore_tags,
 | 
					 | 
				
			||||||
            'use_date_filename': use_date_filename,
 | 
					 | 
				
			||||||
            'use_file_dates': use_file_dates,
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.log = LOG.getChild(self.__class__.__name__)
 | 
					        self.log = LOG.getChild(self.__class__.__name__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -734,34 +704,30 @@ class Collection(SortMedias):
 | 
				
			|||||||
        self.root = root
 | 
					        self.root = root
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Get config options
 | 
					        # Get config options
 | 
				
			||||||
        config = self.get_config()
 | 
					        self.opt = self.get_config_options()
 | 
				
			||||||
        self.opt = config.get_options()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Set client options
 | 
					        # Set client options
 | 
				
			||||||
        for option, value in cli_options.items():
 | 
					        for option, value in cli_options.items():
 | 
				
			||||||
            self.opt[option] = value
 | 
					            for section in self.opt:
 | 
				
			||||||
        self._set_cli_option('exclude', exclude)
 | 
					                self.opt[section][option] = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.exclude = self.opt['Filters']['exclude']
 | 
				
			||||||
 | 
					        if not self.exclude:
 | 
				
			||||||
 | 
					            self.exclude = set()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.db = CollectionDb(root)
 | 
					        self.db = CollectionDb(root)
 | 
				
			||||||
        self.fileio = FileIO(self.opt['dry_run'])
 | 
					        self.fileio = FileIO(self.opt['Terminal']['dry_run'])
 | 
				
			||||||
        self.paths = Paths(
 | 
					        self.paths = Paths(
 | 
				
			||||||
            self.opt['exclude'],
 | 
					            self.opt['Filters'],
 | 
				
			||||||
            self.opt['extensions'],
 | 
					            interactive=self.opt['Terminal']['interactive'],
 | 
				
			||||||
            self.opt['glob'],
 | 
					 | 
				
			||||||
            self.opt['interactive'],
 | 
					 | 
				
			||||||
            self.opt['max_deep'],
 | 
					 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.medias = Medias(
 | 
					        self.medias = Medias(
 | 
				
			||||||
            self.paths,
 | 
					            self.paths,
 | 
				
			||||||
            root,
 | 
					            root,
 | 
				
			||||||
            self.opt['album_from_folder'],
 | 
					            self.opt['Exif'],
 | 
				
			||||||
            self.opt['cache'],
 | 
					 | 
				
			||||||
            self.db,
 | 
					            self.db,
 | 
				
			||||||
            self.opt['interactive'],
 | 
					            self.opt['Terminal']['interactive'],
 | 
				
			||||||
            self.opt['ignore_tags'],
 | 
					 | 
				
			||||||
            self.opt['use_date_filename'],
 | 
					 | 
				
			||||||
            self.opt['use_file_dates'],
 | 
					 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Features
 | 
					        # Features
 | 
				
			||||||
@ -770,30 +736,37 @@ class Collection(SortMedias):
 | 
				
			|||||||
            self.medias,
 | 
					            self.medias,
 | 
				
			||||||
            root,
 | 
					            root,
 | 
				
			||||||
            self.db,
 | 
					            self.db,
 | 
				
			||||||
            self.opt['dry_run'],
 | 
					            self.opt['Terminal']['dry_run'],
 | 
				
			||||||
            self.opt['interactive'],
 | 
					            self.opt['Terminal']['interactive'],
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Attributes
 | 
					        # Attributes
 | 
				
			||||||
        self.summary = Summary(self.root)
 | 
					        self.summary = Summary(self.root)
 | 
				
			||||||
        self.theme = request.load_theme()
 | 
					        self.theme = request.load_theme()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_config(self):
 | 
					    def get_config_options(self):
 | 
				
			||||||
        """Get collection config"""
 | 
					        """Get collection config"""
 | 
				
			||||||
        return Config(self.root.joinpath('.ordigi', 'ordigi.conf'))
 | 
					        config =  Config(self.root.joinpath('.ordigi', 'ordigi.conf'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def _set_cli_option(self, option, cli_option):
 | 
					        return config.get_config_options()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def _set_option(self, section, option, cli_option):
 | 
				
			||||||
        """if client option is set overwrite collection option value"""
 | 
					        """if client option is set overwrite collection option value"""
 | 
				
			||||||
        if cli_option:
 | 
					        if cli_option:
 | 
				
			||||||
            self.opt['option'] = cli_option
 | 
					            self.opt[section][option] = cli_option
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_collection_files(self, exclude=True):
 | 
					    def get_collection_files(self, exclude=True):
 | 
				
			||||||
        if exclude:
 | 
					        if exclude:
 | 
				
			||||||
            exclude = self.paths.exclude
 | 
					            exclude = self.exclude
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        paths = Paths(
 | 
					        paths = Paths(
 | 
				
			||||||
            exclude,
 | 
					            filters = {
 | 
				
			||||||
            interactive=self.opt['interactive'],
 | 
					                'exclude': exclude,
 | 
				
			||||||
 | 
					                'extensions': None,
 | 
				
			||||||
 | 
					                'glob': '**/*',
 | 
				
			||||||
 | 
					                'max_deep': None,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            interactive=self.opt['Terminal']['interactive'],
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        for file_path in paths.get_files(self.root):
 | 
					        for file_path in paths.get_files(self.root):
 | 
				
			||||||
            yield file_path
 | 
					            yield file_path
 | 
				
			||||||
@ -905,7 +878,7 @@ class Collection(SortMedias):
 | 
				
			|||||||
        """Remove excluded files in collection"""
 | 
					        """Remove excluded files in collection"""
 | 
				
			||||||
        # get all files
 | 
					        # get all files
 | 
				
			||||||
        for file_path in self.get_collection_files(exclude=False):
 | 
					        for file_path in self.get_collection_files(exclude=False):
 | 
				
			||||||
            for exclude in self.paths.exclude:
 | 
					            for exclude in self.exclude:
 | 
				
			||||||
                if fnmatch(file_path, exclude):
 | 
					                if fnmatch(file_path, exclude):
 | 
				
			||||||
                    self.fileio.remove(file_path)
 | 
					                    self.fileio.remove(file_path)
 | 
				
			||||||
                    self.summary.append('remove', True, file_path)
 | 
					                    self.summary.append('remove', True, file_path)
 | 
				
			||||||
@ -953,7 +926,7 @@ class Collection(SortMedias):
 | 
				
			|||||||
        files = os.listdir(directory)
 | 
					        files = os.listdir(directory)
 | 
				
			||||||
        if len(files) == 0 and remove_root:
 | 
					        if len(files) == 0 and remove_root:
 | 
				
			||||||
            self.log.info(f"Removing empty folder: {directory}")
 | 
					            self.log.info(f"Removing empty folder: {directory}")
 | 
				
			||||||
            if not self.opt['dry_run']:
 | 
					            if not self.opt['Terminal']['dry_run']:
 | 
				
			||||||
                os.rmdir(directory)
 | 
					                os.rmdir(directory)
 | 
				
			||||||
            self.summary.append('remove', True, directory)
 | 
					            self.summary.append('remove', True, directory)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -970,13 +943,13 @@ class Collection(SortMedias):
 | 
				
			|||||||
        self._init_check_db(loc)
 | 
					        self._init_check_db(loc)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # if path format client option is set overwrite it
 | 
					        # if path format client option is set overwrite it
 | 
				
			||||||
        self._set_cli_option('path_format', path_format)
 | 
					        self._set_option('Path', 'path_format', path_format)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Get medias data
 | 
					        # Get medias data
 | 
				
			||||||
        subdirs = set()
 | 
					        subdirs = set()
 | 
				
			||||||
        for src_path, metadata in self.medias.get_metadatas(src_dirs, imp=imp, loc=loc):
 | 
					        for src_path, metadata in self.medias.get_metadatas(src_dirs, imp=imp, loc=loc):
 | 
				
			||||||
            # Get the destination path according to metadata
 | 
					            # Get the destination path according to metadata
 | 
				
			||||||
            fpath = FPath(path_format, self.opt['day_begins'])
 | 
					            fpath = FPath(path_format, self.opt['Path']['day_begins'])
 | 
				
			||||||
            metadata['file_path'] = fpath.get_path(metadata)
 | 
					            metadata['file_path'] = fpath.get_path(metadata)
 | 
				
			||||||
            subdirs.add(src_path.parent)
 | 
					            subdirs.add(src_path.parent)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -42,36 +42,6 @@ def check_re(getoption):
 | 
				
			|||||||
class Config:
 | 
					class Config:
 | 
				
			||||||
    """Manage config file"""
 | 
					    """Manage config file"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Initialize with default options
 | 
					 | 
				
			||||||
    options: dict = {
 | 
					 | 
				
			||||||
        'Console': {
 | 
					 | 
				
			||||||
            'dry_run': False,
 | 
					 | 
				
			||||||
            'interactive': False,
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        'Database': {
 | 
					 | 
				
			||||||
            'cache': False,
 | 
					 | 
				
			||||||
            'album_from_folder': False,
 | 
					 | 
				
			||||||
            'ignore_tags': None,
 | 
					 | 
				
			||||||
            'use_date_filename': False,
 | 
					 | 
				
			||||||
            'use_file_dates': False,
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        'Filters': {
 | 
					 | 
				
			||||||
            'exclude': None,
 | 
					 | 
				
			||||||
            'extensions': None,
 | 
					 | 
				
			||||||
            'glob': '**/*',
 | 
					 | 
				
			||||||
            'max_deep': None,
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        'Geolocation': {
 | 
					 | 
				
			||||||
            'geocoder': constants.DEFAULT_GEOCODER,
 | 
					 | 
				
			||||||
            'prefer_english_names': False,
 | 
					 | 
				
			||||||
            'timeout': gopt.default_timeout,
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        'Path': {
 | 
					 | 
				
			||||||
            'day_begins': 0,
 | 
					 | 
				
			||||||
            'path_format': constants.DEFAULT_PATH_FORMAT,
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    def __init__(self, conf_path=constants.CONFIG_FILE, conf=None):
 | 
					    def __init__(self, conf_path=constants.CONFIG_FILE, conf=None):
 | 
				
			||||||
        self.conf_path = conf_path
 | 
					        self.conf_path = conf_path
 | 
				
			||||||
        if conf is None:
 | 
					        if conf is None:
 | 
				
			||||||
@ -83,6 +53,39 @@ class Config:
 | 
				
			|||||||
        else:
 | 
					        else:
 | 
				
			||||||
            self.conf = conf
 | 
					            self.conf = conf
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        self.options = self.set_default_options()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def set_default_options(self) -> dict:
 | 
				
			||||||
 | 
					        # Initialize with default options
 | 
				
			||||||
 | 
					        return {
 | 
				
			||||||
 | 
					            'Exif': {
 | 
				
			||||||
 | 
					                'album_from_folder': False,
 | 
				
			||||||
 | 
					                'cache': False,
 | 
				
			||||||
 | 
					                'ignore_tags': None,
 | 
				
			||||||
 | 
					                'use_date_filename': False,
 | 
				
			||||||
 | 
					                'use_file_dates': False,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            'Filters': {
 | 
				
			||||||
 | 
					                'exclude': None,
 | 
				
			||||||
 | 
					                'extensions': None,
 | 
				
			||||||
 | 
					                'glob': '**/*',
 | 
				
			||||||
 | 
					                'max_deep': None,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            'Geolocation': {
 | 
				
			||||||
 | 
					                'geocoder': constants.DEFAULT_GEOCODER,
 | 
				
			||||||
 | 
					                'prefer_english_names': False,
 | 
				
			||||||
 | 
					                'timeout': gopt.default_timeout,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            'Path': {
 | 
				
			||||||
 | 
					                'day_begins': 0,
 | 
				
			||||||
 | 
					                'path_format': constants.DEFAULT_PATH_FORMAT,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					            'Terminal': {
 | 
				
			||||||
 | 
					                'dry_run': False,
 | 
				
			||||||
 | 
					                'interactive': False,
 | 
				
			||||||
 | 
					            },
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def write(self, conf):
 | 
					    def write(self, conf):
 | 
				
			||||||
        with open(self.conf_path, 'w') as conf_file:
 | 
					        with open(self.conf_path, 'w') as conf_file:
 | 
				
			||||||
            conf.write(conf_file)
 | 
					            conf.write(conf_file)
 | 
				
			||||||
@ -125,7 +128,7 @@ class Config:
 | 
				
			|||||||
        return re.compile(self.conf.get(section, option))
 | 
					        return re.compile(self.conf.get(section, option))
 | 
				
			||||||
    getre = check_re(_getre)
 | 
					    getre = check_re(_getre)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_option(self, section, option):
 | 
					    def get_config_option(self, section, option):
 | 
				
			||||||
        bool_options = {
 | 
					        bool_options = {
 | 
				
			||||||
            'cache',
 | 
					            'cache',
 | 
				
			||||||
            'dry_run',
 | 
					            'dry_run',
 | 
				
			||||||
@ -176,16 +179,13 @@ class Config:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        return value
 | 
					        return value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_options(self) -> dict:
 | 
					    def get_config_options(self) -> dict:
 | 
				
			||||||
        """Get config options"""
 | 
					        """Get config options"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        old_options = {}
 | 
					 | 
				
			||||||
        for section in self.options:
 | 
					        for section in self.options:
 | 
				
			||||||
            for option in self.options[section]:
 | 
					            for option in self.options[section]:
 | 
				
			||||||
                # Option is in section
 | 
					                # Option is in section
 | 
				
			||||||
                # TODO make a function
 | 
					                value = self.get_config_option(section, option)
 | 
				
			||||||
                value = self.get_option(section, option)
 | 
					 | 
				
			||||||
                old_options[option] = value
 | 
					 | 
				
			||||||
                self.options[section][option] = value
 | 
					                self.options[section][option] = value
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return old_options
 | 
					        return self.options
 | 
				
			||||||
 | 
				
			|||||||
@ -611,13 +611,9 @@ class Medias:
 | 
				
			|||||||
        self,
 | 
					        self,
 | 
				
			||||||
        paths,
 | 
					        paths,
 | 
				
			||||||
        root,
 | 
					        root,
 | 
				
			||||||
        album_from_folder=False,
 | 
					        exif_options,
 | 
				
			||||||
        cache=False,
 | 
					 | 
				
			||||||
        db=None,
 | 
					        db=None,
 | 
				
			||||||
        interactive=False,
 | 
					        interactive=False,
 | 
				
			||||||
        ignore_tags=None,
 | 
					 | 
				
			||||||
        use_date_filename=False,
 | 
					 | 
				
			||||||
        use_file_dates=False,
 | 
					 | 
				
			||||||
    ):
 | 
					    ):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Modules
 | 
					        # Modules
 | 
				
			||||||
@ -628,13 +624,11 @@ class Medias:
 | 
				
			|||||||
        self.root = root
 | 
					        self.root = root
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Options
 | 
					        # Options
 | 
				
			||||||
        self.cache = cache
 | 
					        self.exif_opt = exif_options
 | 
				
			||||||
        self.album_from_folder = album_from_folder
 | 
					        self.album_from_folder = self.exif_opt['album_from_folder']
 | 
				
			||||||
        self.ignore_tags = ignore_tags
 | 
					        self.ignore_tags = self.exif_opt['ignore_tags']
 | 
				
			||||||
        self.interactive = interactive
 | 
					        self.interactive = interactive
 | 
				
			||||||
        self.log = LOG.getChild(self.__class__.__name__)
 | 
					        self.log = LOG.getChild(self.__class__.__name__)
 | 
				
			||||||
        self.use_date_filename = use_date_filename
 | 
					 | 
				
			||||||
        self.use_file_dates = use_file_dates
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Attributes
 | 
					        # Attributes
 | 
				
			||||||
        # List to store medias datas
 | 
					        # List to store medias datas
 | 
				
			||||||
@ -648,16 +642,17 @@ class Medias:
 | 
				
			|||||||
            self.album_from_folder,
 | 
					            self.album_from_folder,
 | 
				
			||||||
            self.ignore_tags,
 | 
					            self.ignore_tags,
 | 
				
			||||||
            self.interactive,
 | 
					            self.interactive,
 | 
				
			||||||
            self.use_date_filename,
 | 
					            self.exif_opt['use_date_filename'],
 | 
				
			||||||
            self.use_file_dates,
 | 
					            self.exif_opt['use_file_dates'],
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return media
 | 
					        return media
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def get_metadata(self, file_path, src_dir, loc=None):
 | 
					    def get_metadata(self, file_path, src_dir, loc=None):
 | 
				
			||||||
        media = self.get_media(file_path, src_dir)
 | 
					        media = self.get_media(file_path, src_dir)
 | 
				
			||||||
        media.get_metadata(self.root, loc, self.db.sqlite,
 | 
					        media.get_metadata(
 | 
				
			||||||
                self.cache)
 | 
					            self.root, loc, self.db.sqlite, self.exif_opt['cache']
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return media.metadata
 | 
					        return media.metadata
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -137,7 +137,8 @@ class TestCollection:
 | 
				
			|||||||
        assert summary.success_table.sum('sort') == nb
 | 
					        assert summary.success_table.sum('sort') == nb
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_sort_files(self, tmp_path):
 | 
					    def test_sort_files(self, tmp_path):
 | 
				
			||||||
        collection = Collection(tmp_path, album_from_folder=True)
 | 
					        cli_options = {'album_from_folder': True}
 | 
				
			||||||
 | 
					        collection = Collection(tmp_path, cli_options=cli_options)
 | 
				
			||||||
        loc = GeoLocation()
 | 
					        loc = GeoLocation()
 | 
				
			||||||
        summary = collection.sort_files([self.src_path],
 | 
					        summary = collection.sort_files([self.src_path],
 | 
				
			||||||
                self.path_format, loc, imp='copy')
 | 
					                self.path_format, loc, imp='copy')
 | 
				
			||||||
@ -150,14 +151,20 @@ class TestCollection:
 | 
				
			|||||||
        assert not summary.errors
 | 
					        assert not summary.errors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # check if album value are set
 | 
					        # check if album value are set
 | 
				
			||||||
        paths = Paths(glob='**/*').get_files(tmp_path)
 | 
					        filters = {
 | 
				
			||||||
 | 
					            'exclude': None,
 | 
				
			||||||
 | 
					            'extensions': None,
 | 
				
			||||||
 | 
					            'glob': '**/*',
 | 
				
			||||||
 | 
					            'max_deep': None,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        paths = Paths(filters).get_files(tmp_path)
 | 
				
			||||||
        for file_path in paths:
 | 
					        for file_path in paths:
 | 
				
			||||||
            if '.db' not in str(file_path):
 | 
					            if '.db' not in str(file_path):
 | 
				
			||||||
                media = Media(file_path, tmp_path, album_from_folder=True)
 | 
					                media = Media(file_path, tmp_path, album_from_folder=True)
 | 
				
			||||||
                for value in ReadExif(file_path).get_key_values('album'):
 | 
					                for value in ReadExif(file_path).get_key_values('album'):
 | 
				
			||||||
                    assert value != '' or None
 | 
					                    assert value != '' or None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        collection = Collection(tmp_path, album_from_folder=True)
 | 
					        collection = Collection(tmp_path, cli_options=cli_options)
 | 
				
			||||||
        # Try to change path format and sort files again
 | 
					        # Try to change path format and sort files again
 | 
				
			||||||
        path = '{city}/{%Y}-{name}.%l{ext}'
 | 
					        path = '{city}/{%Y}-{name}.%l{ext}'
 | 
				
			||||||
        summary = collection.sort_files([tmp_path],
 | 
					        summary = collection.sort_files([tmp_path],
 | 
				
			||||||
@ -222,8 +229,13 @@ class TestCollection:
 | 
				
			|||||||
                shutil.copyfile(dest_path, src_path)
 | 
					                shutil.copyfile(dest_path, src_path)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_get_files(self):
 | 
					    def test_get_files(self):
 | 
				
			||||||
        exclude={'**/*.dng',}
 | 
					        filters = {
 | 
				
			||||||
        paths = Paths(exclude=exclude, max_deep=1)
 | 
					            'exclude': {'**/*.dng',},
 | 
				
			||||||
 | 
					            'extensions': None,
 | 
				
			||||||
 | 
					            'glob': '**/*',
 | 
				
			||||||
 | 
					            'max_deep': 1,
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        paths = Paths(filters)
 | 
				
			||||||
        paths = list(paths.get_files(self.src_path))
 | 
					        paths = list(paths.get_files(self.src_path))
 | 
				
			||||||
        assert len(paths) == 9
 | 
					        assert len(paths) == 9
 | 
				
			||||||
        assert Path(self.src_path, 'test_exif/photo.dng') not in paths
 | 
					        assert Path(self.src_path, 'test_exif/photo.dng') not in paths
 | 
				
			||||||
 | 
				
			|||||||
@ -58,8 +58,8 @@ class TestConfig:
 | 
				
			|||||||
    #     path = config.get_path_definition()
 | 
					    #     path = config.get_path_definition()
 | 
				
			||||||
    #     assert path == '%u{%Y-%m}/{city}|{city}-{%Y}/{folders[:1]}/{folder}/{%Y-%m-%b-%H-%M-%S}-{basename}.%l{ext}'
 | 
					    #     assert path == '%u{%Y-%m}/{city}|{city}-{%Y}/{folders[:1]}/{folder}/{%Y-%m-%b-%H-%M-%S}-{basename}.%l{ext}'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_get_options(self, conf):
 | 
					    def test_get_config_options(self, conf):
 | 
				
			||||||
        config = Config(conf=conf)
 | 
					        config = Config(conf=conf)
 | 
				
			||||||
        options = config.get_options()
 | 
					        options = config.get_config_options()
 | 
				
			||||||
        assert isinstance(options, dict)
 | 
					        assert isinstance(options, dict)
 | 
				
			||||||
        # assert isinstance(options['Path'], dict)
 | 
					        # assert isinstance(options['Path'], dict)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user