def alert_callback(mx, my, xs): my, mx = self.win.getmaxyx() y = count(xs).next task = self.state.tasks[self.selected_task] info = task.info(extra=["state"]) infoitems = [("args", info.pop("args", None)), ("kwargs", info.pop("kwargs", None))] + info.items() for key, value in infoitems: if key is None: continue value = str(value) curline = y() keys = key + ": " self.win.addstr(curline, 3, keys, curses.A_BOLD) wrapped = wrap(value, mx - 2) if len(wrapped) == 1: self.win.addstr(curline, len(keys) + 3, abbr(wrapped[0], self.screen_width - (len(keys) + 3))) else: for subline in wrapped: nexty = y() if nexty >= my - 1: subline = " " * 4 + "[...]" elif nexty >= my: break self.win.addstr(nexty, 3, abbr(" " * 4 + subline, self.screen_width - 4), curses.A_NORMAL)
def format_row(self, uuid, task, worker, timestamp, state): mx = self.display_width # include spacing detail_width = mx - 1 - STATE_WIDTH - 1 - TIMESTAMP_WIDTH uuid_space = detail_width - 1 - MIN_TASK_WIDTH - 1 - MIN_WORKER_WIDTH if uuid_space < UUID_WIDTH: uuid_width = uuid_space else: uuid_width = UUID_WIDTH detail_width = detail_width - uuid_width - 1 task_width = int(ceil(detail_width / 2.0)) worker_width = detail_width - task_width - 1 uuid = abbr(uuid, uuid_width).ljust(uuid_width) worker = abbr(worker, worker_width).ljust(worker_width) task = abbrtask(task, task_width).ljust(task_width) state = abbr(state, STATE_WIDTH).ljust(STATE_WIDTH) timestamp = timestamp.ljust(TIMESTAMP_WIDTH) row = "%s %s %s %s %s " % (uuid, worker, task, timestamp, state) if self.screen_width is None: self.screen_width = len(row[:mx]) return row[:mx]
def format_row(self, uuid, worker, task, timestamp, state): my, mx = self.win.getmaxyx() mx = mx - 3 uuid_max = 36 if mx < 88: uuid_max = mx - 52 - 2 uuid = abbr(uuid, uuid_max).ljust(uuid_max) worker = abbr(worker, 16).ljust(16) task = abbrtask(task, 16).ljust(16) state = abbr(state, 8).ljust(8) timestamp = timestamp.ljust(8) row = "%s %s %s %s %s " % (uuid, worker, task, timestamp, state) if self.screen_width is None: self.screen_width = len(row[:mx]) return row[:mx]
def draw(self): win = self.win self.handle_keypress() x = 3 y = blank_line = count(2).next my, mx = win.getmaxyx() win.erase() win.bkgd(" ", curses.color_pair(1)) win.border() win.addstr(1, x, self.greet, curses.A_DIM | curses.color_pair(5)) blank_line() win.addstr(y(), x, self.format_row("UUID", "TASK", "WORKER", "TIME", "STATE"), curses.A_BOLD | curses.A_UNDERLINE) tasks = self.tasks if tasks: for uuid, task in tasks: if task.uuid: state_color = self.state_colors.get(task.state) attr = curses.A_NORMAL if task.uuid == self.selected_task: attr = curses.A_STANDOUT timestamp = datetime.fromtimestamp( task.timestamp or time.time()) timef = timestamp.strftime("%H:%M:%S") line = self.format_row(uuid, task.name, task.worker.hostname, timef, task.state) lineno = y() win.addstr(lineno, x, line, attr) if state_color: win.addstr(lineno, len(line) - len(task.state) + 1, task.state, state_color | attr) if task.ready: task.visited = time.time() # -- Footer blank_line() win.hline(my - 6, x, curses.ACS_HLINE, self.screen_width) # Selected Task Info if self.selected_task: win.addstr(my - 5, x, self.selected_str, curses.A_BOLD) info = "Missing extended info" try: selection = self.state.tasks[self.selected_task] except KeyError: pass else: info = selection.info(["args", "kwargs", "result", "runtime", "eta"]) if "runtime" in info: info["runtime"] = "%.2fs" % info["runtime"] if "result" in info: info["result"] = abbr(info["result"], 16) info = " ".join("%s=%s" % (key, value) for key, value in info.items()) win.addstr(my - 5, x + len(self.selected_str), info) else: win.addstr(my - 5, x, "No task selected", curses.A_NORMAL) # Workers if self.workers: win.addstr(my - 4, x, self.online_str, curses.A_BOLD) win.addstr(my - 4, x + len(self.online_str), ", ".join(self.workers), curses.A_NORMAL) else: win.addstr(my - 4, x, "No workers discovered.") # Info win.addstr(my - 3, x, self.info_str, curses.A_BOLD) win.addstr(my - 3, x + len(self.info_str), "events:%s tasks:%s workers:%s/%s" % ( self.state.event_count, self.state.task_count, len([w for w in self.state.workers.values() if w.alive]), len(self.state.workers)), curses.A_DIM) # Help win.addstr(my - 2, x, self.help_title, curses.A_BOLD) win.addstr(my - 2, x + len(self.help_title), self.help, curses.A_DIM) win.refresh()
def test_abbr(self): self.assertEqual(utils.abbr(None, 3), "???") self.assertEqual(utils.abbr("ABCDEFGHI", 6), "ABC...") self.assertEqual(utils.abbr("ABCDEFGHI", 20), "ABCDEFGHI") self.assertEqual(utils.abbr("ABCDEFGHI", 6, None), "ABCDEF")
def draw(self): win = self.win self.handle_keypress() x = LEFT_BORDER_OFFSET y = blank_line = count(2).next my, mx = win.getmaxyx() win.erase() win.bkgd(" ", curses.color_pair(1)) win.border() win.addstr(1, x, self.greet, curses.A_DIM | curses.color_pair(5)) blank_line() win.addstr(y(), x, self.format_row("UUID", "TASK", "WORKER", "TIME", "STATE"), curses.A_BOLD | curses.A_UNDERLINE) tasks = self.tasks if tasks: for row, (uuid, task) in enumerate(tasks): if row > self.display_height: break if task.uuid: lineno = y() self.display_task_row(lineno, task) # -- Footer blank_line() win.hline(my - 6, x, curses.ACS_HLINE, self.screen_width - 4) # Selected Task Info if self.selected_task: win.addstr(my - 5, x, self.selected_str, curses.A_BOLD) info = "Missing extended info" try: selection = self.state.tasks[self.selected_task] except KeyError: pass else: info = selection.info(["args", "kwargs", "result", "runtime", "eta"]) if "runtime" in info: info["runtime"] = "%.2fs" % info["runtime"] if "result" in info: info["result"] = abbr(info["result"], 16) info = " ".join("%s=%s" % (key, value) for key, value in info.items()) detail = "... -> key i" infowin = abbr(info, self.screen_width - len(self.selected_str) - 2, detail) win.addstr(my - 5, x + len(self.selected_str), infowin) # Make ellipsis bold if detail in infowin: detailpos = len(infowin) - len(detail) win.addstr(my - 5, x + len(self.selected_str) + detailpos, detail, curses.A_BOLD) else: win.addstr(my - 5, x, "No task selected", curses.A_NORMAL) # Workers if self.workers: win.addstr(my - 4, x, self.online_str, curses.A_BOLD) win.addstr(my - 4, x + len(self.online_str), ", ".join(sorted(self.workers)), curses.A_NORMAL) else: win.addstr(my - 4, x, "No workers discovered.") # Info win.addstr(my - 3, x, self.info_str, curses.A_BOLD) win.addstr(my - 3, x + len(self.info_str), "events:%s tasks:%s workers:%s/%s" % ( self.state.event_count, self.state.task_count, len([w for w in self.state.workers.values() if w.alive]), len(self.state.workers)), curses.A_DIM) # Help self.safe_add_str(my - 2, x, self.help_title, curses.A_BOLD) self.safe_add_str(my - 2, x + len(self.help_title), self.help, curses.A_DIM) win.refresh()
def draw(self): win = self.win self.handle_keypress() x = LEFT_BORDER_OFFSET y = blank_line = count(2).next my, mx = win.getmaxyx() win.erase() win.bkgd(" ", curses.color_pair(1)) win.border() win.addstr(1, x, self.greet, curses.A_DIM | curses.color_pair(5)) blank_line() win.addstr(y(), x, self.format_row("UUID", "TASK", "WORKER", "TIME", "STATE"), curses.A_BOLD | curses.A_UNDERLINE) tasks = self.tasks if tasks: for row, (uuid, task) in enumerate(tasks): if row > self.display_height: break if task.uuid: lineno = y() self.display_task_row(lineno, task) # -- Footer blank_line() win.hline(my - 6, x, curses.ACS_HLINE, self.screen_width - 4) # Selected Task Info if self.selected_task: win.addstr(my - 5, x, self.selected_str, curses.A_BOLD) info = "Missing extended info" detail = "" try: selection = self.state.tasks[self.selected_task] except KeyError: pass else: info = selection.info(["args", "kwargs", "result", "runtime", "eta"]) if "runtime" in info: info["runtime"] = "%.2fs" % info["runtime"] if "result" in info: info["result"] = abbr(info["result"], 16) info = " ".join("%s=%s" % (key, value) for key, value in info.items()) detail = "... -> key i" infowin = abbr(info, self.screen_width - len(self.selected_str) - 2, detail) win.addstr(my - 5, x + len(self.selected_str), infowin) # Make ellipsis bold if detail in infowin: detailpos = len(infowin) - len(detail) win.addstr(my - 5, x + len(self.selected_str) + detailpos, detail, curses.A_BOLD) else: win.addstr(my - 5, x, "No task selected", curses.A_NORMAL) # Workers if self.workers: win.addstr(my - 4, x, self.online_str, curses.A_BOLD) win.addstr(my - 4, x + len(self.online_str), ", ".join(sorted(self.workers)), curses.A_NORMAL) else: win.addstr(my - 4, x, "No workers discovered.") # Info win.addstr(my - 3, x, self.info_str, curses.A_BOLD) win.addstr(my - 3, x + len(self.info_str), "events:%s tasks:%s workers:%s/%s" % ( self.state.event_count, self.state.task_count, len([w for w in self.state.workers.values() if w.alive]), len(self.state.workers)), curses.A_DIM) # Help self.safe_add_str(my - 2, x, self.help_title, curses.A_BOLD) self.safe_add_str(my - 2, x + len(self.help_title), self.help, curses.A_DIM) win.refresh()
def draw(self): win = self.win self.handle_keypress() x = 3 y = blank_line = count(2).next my, mx = win.getmaxyx() win.erase() win.bkgd(" ", curses.color_pair(1)) win.border() win.addstr(1, x, self.greet, curses.A_DIM | curses.color_pair(5)) blank_line() win.addstr(y(), x, self.format_row("UUID", "TASK", "WORKER", "TIME", "STATE"), curses.A_BOLD | curses.A_UNDERLINE) tasks = self.tasks if tasks: for uuid, task in tasks: if task.uuid: state_color = self.state_colors.get(task.state) attr = curses.A_NORMAL if task.uuid == self.selected_task: attr = curses.A_STANDOUT timestamp = datetime.fromtimestamp(task.timestamp or time.time()) timef = timestamp.strftime("%H:%M:%S") line = self.format_row(uuid, task.name, task.worker.hostname, timef, task.state) lineno = y() win.addstr(lineno, x, line, attr) if state_color: win.addstr(lineno, len(line) - len(task.state) + 1, task.state, state_color | attr) if task.ready: task.visited = time.time() # -- Footer blank_line() win.hline(my - 6, x, curses.ACS_HLINE, self.screen_width) # Selected Task Info if self.selected_task: win.addstr(my - 5, x, self.selected_str, curses.A_BOLD) info = "Missing extended info" try: selection = self.state.tasks[self.selected_task] except KeyError: pass else: info = selection.info( ["args", "kwargs", "result", "runtime", "eta"]) if "runtime" in info: info["runtime"] = "%.2fs" % info["runtime"] if "result" in info: info["result"] = abbr(info["result"], 16) info = " ".join("%s=%s" % (key, value) for key, value in info.items()) win.addstr(my - 5, x + len(self.selected_str), info) else: win.addstr(my - 5, x, "No task selected", curses.A_NORMAL) # Workers if self.workers: win.addstr(my - 4, x, self.online_str, curses.A_BOLD) win.addstr(my - 4, x + len(self.online_str), ", ".join(self.workers), curses.A_NORMAL) else: win.addstr(my - 4, x, "No workers discovered.") # Info win.addstr(my - 3, x, self.info_str, curses.A_BOLD) win.addstr( my - 3, x + len(self.info_str), "events:%s tasks:%s workers:%s/%s" % (self.state.event_count, self.state.task_count, len([w for w in self.state.workers.values() if w.alive ]), len(self.state.workers)), curses.A_DIM) # Help win.addstr(my - 2, x, self.help_title, curses.A_BOLD) win.addstr(my - 2, x + len(self.help_title), self.help, curses.A_DIM) win.refresh()