def rename(self, old_task_name, new_task_name): """ Renames an existing task directory. `old_task_name` Current task name. `new_task_name` New task name. Returns ``True`` if rename successful. """ if not old_task_name or old_task_name.startswith('-'): raise ValueError('Old task name is invalid') if not new_task_name or new_task_name.startswith('-'): raise ValueError('New new task name is invalid') if old_task_name == new_task_name: raise ValueError('Cannot rename task to itself') try: old_task_dir = self._get_task_dir(old_task_name) if not self.exists(old_task_dir): raise errors.TaskNotFound(old_task_name) new_task_dir = self._get_task_dir(new_task_name) if self.exists(new_task_dir): raise errors.TaskExists(new_task_name) os.rename(old_task_dir, new_task_dir) return True except OSError: return False
def rename(self, old_name, new_name): if not hasattr(self, 'test__renamed'): self.test__renamed = {} if old_name == new_name: raise ValueError if not old_name in self.test__renamed: raise errors.TaskNotFound(old_name) if new_name in self.test__renamed: raise errors.TaskExists(new_name) self.test__renamed[new_name] = True if old_name in self.test__renamed: del self.test__renamed[old_name] return True
def create(self, task_name, clone_task=None): """ Creates a new task directory. `task_name` Task name. `clone_task` Existing task name to use as a template for new task. Returns boolean. * Raises ``Value`` if task name is invalid, ``TaskExists`` if task already exists, or ``TaskNotFound`` if task for `clone_from` doesn't exist. """ if not task_name or task_name.startswith('-'): raise ValueError('Invalid task name') try: task_dir = self._get_task_dir(task_name) if self.exists(task_dir): raise errors.TaskExists(task_name) task_cfg = self.get_config_path(task_name) if clone_task: if not self.exists(clone_task): raise errors.TaskNotFound(clone_task) # copy task directory shutil.copytree(self._get_task_dir(clone_task), task_dir) else: os.mkdir(task_dir) # write default task configuration shutil.copy(self._default_task_config, task_cfg) return True except OSError: shutil.rmtree(task_dir, ignore_errors=True) return False
def execute(self, env, args): """ Prints task information. `env` Runtime ``Environment`` instance. `args` Arguments object from arg parser. """ task_name = args.task_name if task_name is None: if not env.task.active: raise errors.NoActiveTask task_name = env.task.name tasks = env.task.get_list_info(task_name) if not tasks: raise errors.TaskNotFound(task_name) _print_tasks(env, tasks)
def execute(self, env, args): """ Edits task configuration. `env` Runtime ``Environment`` instance. `args` Arguments object from arg parser. """ task_name = args.task_name if not env.task.exists(task_name): raise errors.TaskNotFound(task_name) if env.task.active and task_name == env.task.name: raise errors.ActiveTask # open in task config in editor task_config = env.task.get_config_path(task_name) if not _edit_task_config(env, task_config, confirm=True): raise errors.FocusError( u'Could not open task config: {0}'.format(task_config))
def execute(self, env, args): """ Removes a task. `env` Runtime ``Environment`` instance. `args` Arguments object from arg parser. """ # extract args task_name = args.task_name force = args.force if env.task.active and env.task.name == task_name: raise errors.ActiveTask if not env.task.exists(task_name): raise errors.TaskNotFound(task_name) if force: env.task.remove(task_name) else: try: while True: prompt = ('Are you sure you want to delete "{0}" (y/n)? '. format(task_name)) resp = env.io.prompt(prompt, newline=False).lower() if resp in ('y', 'n'): if resp == 'y': env.task.remove(task_name) break except KeyboardInterrupt: pass
def start(self, task_name): """ Starts a new task matching the provided name. `task_name` Name of existing task to start. Returns boolean. * Raises a ``TaskNotFound`` exception if task doesn't exist, an ``InvalidTaskConfig` exception if task config file is invalid, or ``DaemonFailStart`` exception if task daemons failed to fork. """ self._clean_prior() if self._loaded: raise errors.ActiveTask # get paths task_dir = os.path.join(self._paths['base_dir'], 'tasks', task_name) task_config = os.path.join(task_dir, 'task.cfg') if not os.path.isdir(task_dir): raise errors.TaskNotFound(task_name) try: # raise if task config is missing if not os.path.isfile(task_config): reason = u"Config file could not be found." raise errors.InvalidTaskConfig(task_config, reason=reason) # parse task config and send its options to registered plugins _parser = parser.parse_config(task_config, self.HEADER_TASK_CONFIG) registration.run_option_hooks(_parser) except parser.ParseError as exc: raise errors.InvalidTaskConfig(task_config, reason=unicode(exc)) # populate task info self._name = common.from_utf8(task_name) self._start_time = datetime.datetime.now() self._owner = os.getuid() self._paths['task_dir'] = task_dir self._paths['task_config'] = task_config self._loaded = True # task is setup, save active file # note, order is *important*; this is needed first # for the daemon to load self._save_active_file() # shell the focusd daemon try: started = daemon.shell_focusd(self._paths['base_dir']) # user cancelled or passwords failed? except (KeyboardInterrupt, ValueError): self._clean() return False # no event plugins registered, carry on except errors.NoPluginsRegistered: return True # failed, cleanup our mess if not started: self._clean() raise errors.DaemonFailStart return True