import logging from port_stats import colorize from port_stats import lists from port_stats import tasks LOG = logging.getLogger(__name__) def percent(small, big): perc = (100.0 * small) / big return "%6s (%6.2f%% of %s)" % (small, perc, big) def text_totals(keys, data, legend=(), total=None): result = [] for key in keys: if total: message = "%10s:%-24s" % (key, percent(data.get(key), total)) else: message = '%10s:%6s' % (key, data.get(key)) if key in legend: message += ' // %s' % legend[key] result.append(message) if total: result.append('%10s:%6s' % ('[TOTAL]', total)) return '\n'.join(result) COLORS_EX = tuple(colorize.COLORS) + ('[RECENT]', '[PENDING]') def color_stats(by_color, names=None): if names: data = dict((color, sum(1 for p in by_color[color] if p[0] in names)) for color in colorize.COLORS) else: data = dict((color, len(by_color[color])) for color in colorize.COLORS) data['[PENDING]'] = data.get('ORANGE', 0) + data.get('YELLOW', 0) data['[RECENT]'] = data.get('GREEN', 0) + data.get('SLATE', 0) return data def color_totals(by_color, names=None, total=None, summary=False): data = color_stats(by_color, names) if summary: keys = COLORS_EX legend = dict(colorize.LEGEND) legend['[RECENT]'] = 'recent enough' legend['[PENDING]'] = 'updates are pending' else: keys = colorize.COLORS legend = colorize.LEGEND return text_totals(keys, data, legend, total) def package_one_line(name, by_name, package_tasks, separator='\t'): color, bp, np = by_name[name] tasks_str = tasks.format_tasks_short(package_tasks.get(name)) return '\t'.join((color, name, lists.format_evr(bp), lists.format_evr(np), tasks_str)) def format_colored_task(info, by_name): return tasks.format_task( info, extra_info=lambda p: colorize.package_color(p, by_name) or 'NONE')