def do_p_edit(self, line): """Edit a project. p_edit <project name>""" project = dbutils.getOrCreateProject(line, createIfNeeded=False) if not project: raise YokadiException("Project does not exist.") # Create project line projectLine = parseutils.createLine(project.name, "", project.getKeywordDict()) # Edit line = tui.editLine(projectLine) # Update project projectName, garbage, keywordDict = parseutils.parseLine(line) if garbage: raise BadUsageException("Cannot parse line, got garbage (%s)" % garbage) if not dbutils.createMissingKeywords(keywordDict.keys()): return try: project.name = projectName except DuplicateEntryError: raise YokadiException( "A project named %s already exists. Please find another name" % projectName) project.setKeywordDict(keywordDict)
def do_p_edit(self, line): """Edit a project. p_edit <project name>""" session = db.getSession() project = dbutils.getOrCreateProject(line, createIfNeeded=False) if not project: raise YokadiException("Project does not exist.") # Create project line projectLine = parseutils.createLine(project.name, "", project.getKeywordDict()) # Edit line = tui.editLine(projectLine) # Update project projectName, garbage, keywordDict = parseutils.parseLine(line) if garbage: raise BadUsageException("Cannot parse line, got garbage (%s)" % garbage) if not dbutils.createMissingKeywords(list(keywordDict.keys())): return try: project.name = projectName project.setKeywordDict(keywordDict) session.merge(project) session.commit() except IntegrityError: session.rollback() raise YokadiException("A project named %s already exists. Please find another name" % projectName)
def _t_add(self, cmd, line): """Code shared by t_add, bug_add and n_add.""" parser = self._parser_t_add(cmd) args = parser.parse_args(line) line = " ".join(args.cmd) if not line: raise BadUsageException("Missing parameters") projectName, title, keywordDict = parseutils.parseLine(line) projectName = self._realProjectName(projectName) if not title: raise BadUsageException("Missing title") if args.crypt: # Obfuscate line in history length = readline.get_current_history_length() if length > 0: # Ensure history is positive to avoid crash with bad readline setup readline.replace_history_item(length - 1, "%s %s " % (cmd, line.replace(title, "<...encrypted...>"))) # Encrypt title title = self.cryptoMgr.encrypt(title) task = dbutils.addTask(projectName, title, keywordDict) if not task: tui.reinjectInRawInput("%s %s" % (cmd, line)) return None self.lastTaskId = task.id if args.describe: self.do_t_describe(self.lastTaskId) return task
def _t_add(self, cmd, line): """Code shared by t_add, bug_add and n_add.""" parser = self._parser_t_add(cmd) args = parser.parse_args(line) line = " ".join(args.cmd) if not line: raise BadUsageException("Missing parameters") projectName, title, keywordDict = parseutils.parseLine(line) projectName = self._realProjectName(projectName) if not title: raise BadUsageException("Missing title") if args.crypt: # Obfuscate line in history length = readline.get_current_history_length() if length > 0: # Ensure history is positive to avoid crash with bad readline setup readline.replace_history_item( length - 1, "%s %s " % (cmd, line.replace(title, "<...encrypted...>"))) # Encrypt title title = self.cryptoMgr.encrypt(title) task = dbutils.addTask(projectName, title, keywordDict) if not task: tui.reinjectInRawInput(u"%s %s" % (cmd, line)) return None self.lastTaskId = task.id if args.describe: self.do_t_describe(self.lastTaskId) return task
def testCreateLine(self): for dummy, parsedStruct in gTaskLineToParsedStructList: # We do not check the result of createLine() against the # original task line because there are many ways to write the same # taskLine. taskLine = parseutils.createLine(*parsedStruct) result = parseutils.parseLine(taskLine) self.assertEqual(result, parsedStruct)
def _t_edit(self, line): """Code shared by t_edit and bug_edit.""" def editComplete(text, state): """ Specific completer for the edit prompt. This subfunction should stay here because it needs to access to cmd members""" if state == 0: origline = readline.get_line_buffer() line = origline.lstrip() stripped = len(origline) - len(line) begidx = readline.get_begidx() - stripped endidx = readline.get_endidx() - stripped if begidx > 0: self.completion_matches = projectAndKeywordCompleter( "", text, line, begidx, endidx, shift=1) else: self.completion_matches = [] try: return self.completion_matches[state] except IndexError: return None task = self.getTaskFromId(line) if self.cryptoMgr.isEncrypted(task.title): self.cryptoMgr.force_decrypt = True # Decryption must be turned on to edit title = self.cryptoMgr.decrypt(task.title) # Create task line taskLine = parseutils.createLine("", title, task.getKeywordDict()) oldCompleter = readline.get_completer( ) # Backup previous completer to restore it in the end readline.set_completer(editComplete) # Switch to specific completer while True: # Edit print "(Press Ctrl+C to cancel)" try: line = tui.editLine(taskLine) if not line.strip(): tui.warning("Missing title") continue except KeyboardInterrupt: print print "Cancelled" task = None break foo, title, keywordDict = parseutils.parseLine(task.project.name + " " + line) if self.cryptoMgr.isEncrypted(task.title): title = self.cryptoMgr.encrypt(title) if dbutils.updateTask(task, task.project.name, title, keywordDict): break readline.set_completer(oldCompleter) # Restore standard completer return task
def _t_edit(self, line): """Code shared by t_edit and bug_edit.""" def editComplete(text, state): """ Specific completer for the edit prompt. This subfunction should stay here because it needs to access to cmd members""" if state == 0: origline = readline.get_line_buffer() line = origline.lstrip() stripped = len(origline) - len(line) begidx = readline.get_begidx() - stripped endidx = readline.get_endidx() - stripped if begidx > 0: self.completion_matches = projectAndKeywordCompleter("", text, line, begidx, endidx, shift=1) else: self.completion_matches = [] try: return self.completion_matches[state] except IndexError: return None task = self.getTaskFromId(line) if self.cryptoMgr.isEncrypted(task.title): self.cryptoMgr.force_decrypt = True # Decryption must be turned on to edit title = self.cryptoMgr.decrypt(task.title) # Create task line taskLine = parseutils.createLine("", title, task.getKeywordDict()) oldCompleter = readline.get_completer() # Backup previous completer to restore it in the end readline.set_completer(editComplete) # Switch to specific completer while True: # Edit print("(Press Ctrl+C to cancel)") try: line = tui.editLine(taskLine) if not line.strip(): tui.warning("Missing title") continue except KeyboardInterrupt: print() print("Cancelled") task = None break foo, title, keywordDict = parseutils.parseLine(task.project.name + " " + line) if self.cryptoMgr.isEncrypted(task.title): title = self.cryptoMgr.encrypt(title) if dbutils.updateTask(task, task.project.name, title, keywordDict): break readline.set_completer(oldCompleter) # Restore standard completer self.session.merge(task) return task
def do_p_add(self, line): """Add new project. Will prompt to create keywords if they do not exist. p_add <projectName> [@<keyword1>] [@<keyword2>]""" if not line: print "Give at least a project name !" return projectName, garbage, keywordDict = parseutils.parseLine(line) if garbage: raise BadUsageException("Cannot parse line, got garbage (%s)" % garbage) try: project = Project(name=projectName) except DuplicateEntryError: raise YokadiException("A project named %s already exists. Please find another name" % projectName) print "Added project '%s'" % projectName if not dbutils.createMissingKeywords(keywordDict.keys()): return None project.setKeywordDict(keywordDict)
def do_p_add(self, line): """Add new project. Will prompt to create keywords if they do not exist. p_add <projectName> [@<keyword1>] [@<keyword2>]""" if not line: print "Give at least a project name !" return projectName, garbage, keywordDict = parseutils.parseLine(line) if garbage: raise BadUsageException("Cannot parse line, got garbage (%s)" % garbage) try: project = Project(name=projectName) except DuplicateEntryError: raise YokadiException( "A project named %s already exists. Please find another name" % projectName) print "Added project '%s'" % projectName if not dbutils.createMissingKeywords(keywordDict.keys()): return None project.setKeywordDict(keywordDict)
def _t_add(self, cmd, line): """Code shared by t_add, bug_add and n_add.""" parser = self._parser_t_add(cmd) args = parser.parse_args(line) line = " ".join(args.cmd) if not line: raise BadUsageException("Missing parameters") projectName, title, keywordDict = parseutils.parseLine(line) projectName = self._realProjectName(projectName) if not title: raise BadUsageException("Missing title") task = dbutils.addTask(projectName, title, keywordDict) if not task: tui.reinjectInRawInput("%s %s" % (cmd, line)) return None self.lastTaskId = task.id if args.describe: self.do_t_describe(self.lastTaskId) return task
def do_p_add(self, line): """Add new project. Will prompt to create keywords if they do not exist. p_add <projectName> [@<keyword1>] [@<keyword2>]""" if not line: print("Give at least a project name !") return projectName, garbage, keywordDict = parseutils.parseLine(line) session = db.getSession() if garbage: raise BadUsageException("Cannot parse line, got garbage (%s)" % garbage) try: project = Project(name=projectName) session.add(project) session.commit() except IntegrityError: session.rollback() raise YokadiException("A project named %s already exists. Please find another name" % projectName) print("Added project '%s'" % projectName) if not dbutils.createMissingKeywords(list(keywordDict.keys())): return None project.setKeywordDict(keywordDict) session.merge(project) session.commit()
def parseMEditLine(line): tokens = line.split(" ", 2) nbTokens = len(tokens) if nbTokens < 3: if nbTokens == 2 and tokens[0] == "-": # Special case: adding a one-word new task tokens.append("") else: raise Exception("Invalid line") if tokens[0] == "-": id = None else: try: id = int(tokens[0]) except ValueError: raise Exception("Invalid id value") statusChar = tokens[1].lower() line = tokens[2] if statusChar == "n": status = "new" elif statusChar == "s": status = "started" elif statusChar == "d": status = "done" elif id is None: # Special case: if this is a new task, then statusChar is actually a # one-letter word starting the task title status = "new" line = tokens[1] + ((" " + line) if line else "") else: raise Exception("Invalid status") _, title, keywords = parseutils.parseLine("dummy " + line) return MEditEntry(id, status, title, keywords)
def parseMEditLine(line): tokens = line.split(" ", 2) nbTokens = len(tokens) if nbTokens < 3: if nbTokens == 2 and tokens[0] == "-": # Special case: adding a one-word new task tokens.append("") else: raise Exception("Invalid line") if tokens[0] == "-": id = None else: try: id = int(tokens[0]) except ValueError: raise Exception("Invalid id value") statusChar = tokens[1].lower() line = tokens[2] if statusChar == "n": status = "new" elif statusChar == "s": status = "started" elif statusChar == "d": status = "done" elif id == None: # Special case: if this is a new task, then statusChar is actually a # one-letter word starting the task title status = "new" line = tokens[1] + ((" " + line) if line else "") else: raise Exception("Invalid status") _, title, keywords = parseutils.parseLine("dummy " + line) return MEditEntry(id, status, title, keywords)
def testExtractKeywords(self): for src, dst in gTaskLineToParsedStructList: result = parseutils.parseLine(src) self.assertEqual(result, dst)
def _t_edit(self, line, keywordEditor=None): """Code shared by t_edit and bug_edit. if keywordEditor is not None it will be called after editing the task. Returns the modified task if OK, None if cancelled""" def editComplete(text, state): """ Specific completer for the edit prompt. This subfunction should stay here because it needs to access to cmd members""" if state == 0: origline = readline.get_line_buffer() line = origline.lstrip() stripped = len(origline) - len(line) begidx = readline.get_begidx() - stripped endidx = readline.get_endidx() - stripped if begidx > 0: self.completion_matches = projectAndKeywordCompleter( "", text, line, begidx, endidx, shift=1) else: self.completion_matches = [] try: return self.completion_matches[state] except IndexError: return None task = self.getTaskFromId(line) if self.cryptoMgr.isEncrypted(task.title): self.cryptoMgr.force_decrypt = True # Decryption must be turned on to edit title = self.cryptoMgr.decrypt(task.title) # Create task line keywordDict = task.getKeywordDict() userKeywordDict, keywordDict = dbutils.splitKeywordDict(keywordDict) taskLine = parseutils.createLine("", title, userKeywordDict) oldCompleter = readline.get_completer( ) # Backup previous completer to restore it in the end readline.set_completer(editComplete) # Switch to specific completer # Edit try: while True: print("(Press Ctrl+C to cancel)") try: line = tui.editLine(taskLine) if not line.strip(): tui.warning("Missing title") continue except KeyboardInterrupt: print() print("Cancelled") return None _, title, userKeywordDict = parseutils.parseLine( task.project.name + " " + line) if self.cryptoMgr.isEncrypted(task.title): title = self.cryptoMgr.encrypt(title) if dbutils.createMissingKeywords(userKeywordDict.keys()): # We were able to create missing keywords if there were any, # we can now exit the edit loop break finally: readline.set_completer(oldCompleter) keywordDict.update(userKeywordDict) if keywordEditor: keywordEditor(keywordDict) task.title = title task.setKeywordDict(keywordDict) return task
def _t_edit(self, line, keywordEditor=None): """Code shared by t_edit and bug_edit. if keywordEditor is not None it will be called after editing the task. Returns the modified task if OK, None if cancelled""" def editComplete(text, state): """ Specific completer for the edit prompt. This subfunction should stay here because it needs to access to cmd members""" if state == 0: origline = readline.get_line_buffer() line = origline.lstrip() stripped = len(origline) - len(line) begidx = readline.get_begidx() - stripped endidx = readline.get_endidx() - stripped if begidx > 0: self.completion_matches = projectAndKeywordCompleter("", text, line, begidx, endidx, shift=1) else: self.completion_matches = [] try: return self.completion_matches[state] except IndexError: return None task = self.getTaskFromId(line) # Create task line keywordDict = task.getKeywordDict() userKeywordDict, keywordDict = dbutils.splitKeywordDict(keywordDict) taskLine = parseutils.createLine("", task.title, userKeywordDict) oldCompleter = readline.get_completer() # Backup previous completer to restore it in the end readline.set_completer(editComplete) # Switch to specific completer # Edit try: while True: print("(Press Ctrl+C to cancel)") try: line = tui.editLine(taskLine) if not line.strip(): tui.warning("Missing title") continue except KeyboardInterrupt: print() print("Cancelled") return None _, title, userKeywordDict = parseutils.parseLine(task.project.name + " " + line) if dbutils.createMissingKeywords(userKeywordDict.keys()): # We were able to create missing keywords if there were any, # we can now exit the edit loop break finally: readline.set_completer(oldCompleter) keywordDict.update(userKeywordDict) if keywordEditor: keywordEditor(keywordDict) task.title = title task.setKeywordDict(keywordDict) return task