Source code for AutoArchive._ui.cmdline._user_action_executor

# _user_action_executor.py
#
# Project: AutoArchive
# License: GNU GPLv3
#
# Copyright (C) 2003 - 2022 Róbert Čerňanský



""":class:`UserActionExecutor` class."""



__all__ = ["UserActionExecutor"]



# {{{ INCLUDES

import os

from AutoArchive._infrastructure.utils import Utils
from AutoArchive._infrastructure.configuration import Options
from AutoArchive._application.archiving.archive_spec import ArchiveSpecInfo, ConfigConstants
from ._cmdline_commands import CmdlineCommands, _CmdlineCommandsUtils

# }}} INCLUDES



# {{{ CLASSES

[docs]class UserActionExecutor: """Takes care of execution of a user action specified on the command line. :param componentUi: Access to user interface. :type componentUi: :class:`.CmdlineUi` :param applicationContext: Application context. :type applicationContext: :class:`.ApplicationContext` :param archivingApplication: The application interface. :type archivingApplication: :class:`.ArchivingApplication`""" def __init__(self, componentUi, applicationContext, archivingApplication): self.__componentUi = componentUi self.__archivingApplication = archivingApplication self.__configuration = applicationContext.configuration self.__appEnvironment = applicationContext.appEnvironment self.__action = self.__getUserAction()
[docs] def execute(self): """Executes an action defined for the specified command for specified :term:`archive specification files <archive specification file>`. Command is read from the :attr:`.ApplicationContext.appEnvironment.options`. If ``options`` has an attribute that matches one of the :class:`.CmdlineCommands` and the value of that attribute is ``True`` then the action for the matching command is executed. If there is no such attribute, then the default action ``create`` is executed. Archive specification files can be specified by following ways: - By archive names passed in :attr:`.ApplicationContext.appEnvironment.arguments`. Archive name can not contain the string defined by :attr:`.ConfigConstants.ARCHIVE_SPEC_EXT` at the end otherwise it would be taken as the path to an archive specification file. Archive specification files corresponding to the names are looked up in the path defined by :attr:`.Options.ARCHIVE_SPECS_DIR` option. - By paths to archive specification files passed in :attr:`.ApplicationContext.appEnvironment.arguments`. A path must end with the string defined by :attr:`.ConfigConstants.ARCHIVE_SPEC_EXT`. :return: ``True`` if the action execution was successful; ``False`` otherwise.""" if not self.__validateUserAction(self.__action): return False selectedArchiveSpecs = self.__retrieveSelectedArchiveSpecs() if self.__action == CmdlineCommands.CREATE: return self.__archivingApplication.executeCreateAction(selectedArchiveSpecs) elif self.__action == CmdlineCommands.LIST: return self.__archivingApplication.executeListAction(selectedArchiveSpecs) elif self.__action == CmdlineCommands.PURGE: return self.__archivingApplication.executePurgeAction(selectedArchiveSpecs)
# {{{ helpers def __getUserAction(self): commandLineOptions = self.__appEnvironment.commandLineOptions for option in commandLineOptions: if _CmdlineCommandsUtils.isExistingCommand(option): return option return CmdlineCommands.CREATE def __validateUserAction(self, action): if action == CmdlineCommands.CREATE: if len(self.__appEnvironment.arguments) == 0 and not self.__configuration[Options.ALL]: self.__componentUi.showError("No archive specification given. Please pass the name or path to an " + "archive specification file as the program's argument; or use option " + "--all if you want to process all configured archive specifications.") return False elif action == CmdlineCommands.PURGE: if len(self.__appEnvironment.arguments) == 0 and not self.__configuration[Options.ALL]: self.__componentUi.showError("No archive name given. Please pass the name of an archive as the " + "program's argument or use option --all if you want to purge all " + "orphaned archive data.") return False return True def __retrieveSelectedArchiveSpecs(self): @Utils.uniq def getSelectedArchiveSpecs(): archiveSpecsDir = self.__configuration[Options.ARCHIVE_SPECS_DIR] for archiveName in self.__getArchiveNameArguments(): yield ArchiveSpecInfo(archiveName, os.path.join(archiveSpecsDir, archiveName + ConfigConstants.ARCHIVE_SPEC_EXT)) for archiveSpec in self.__getArchiveSpecPathArguments(): yield ArchiveSpecInfo(None, archiveSpec) return tuple(getSelectedArchiveSpecs()) def __getArchiveNameArguments(self): return (arg for arg in self.__appEnvironment.arguments if os.path.splitext(arg)[1] != ConfigConstants.ARCHIVE_SPEC_EXT) def __getArchiveSpecPathArguments(self): return (arg for arg in self.__appEnvironment.arguments if os.path.splitext(arg)[1] == ConfigConstants.ARCHIVE_SPEC_EXT)
# }}} helpers # }}} CLASSES