def __str__(self): field_groups = utils.group_by( sum((r.fields for r in self.records), []), lambda f: f.name) sum_record = self.sum(field_groups) width_by_name = { name: max(map(len, (name, ) + tuple(f.formatted for f in fields))) for (name, fields) in field_groups.items() } for f in sum_record.fields: width_by_name[f.name] = max(width_by_name[f.name], len(f.formatted)) for r in self.records: r.format(width_by_name) sum_record.format(width_by_name) title_record = deepcopy(self.records[0]) # TODO: will tox hate me for f in title_record.fields: f.value = f.name f.formatter = lambda x: x bar = '*' * (sum(width_by_name.values()) + (len(width_by_name) - 1) * len(title_record.separator)) title = self.title, bar, str(title_record), bar data = tuple(map(str, self.records)) total = (bar, str(sum_record), bar) return self.separator.join(title + data + total)
def get_unique(x, key, order='first'): assert order in ('first', 'last', 'unique') grouped = utils.group_by(x, key) if order == 'unique': assert all(len(v) == 1 for v in grouped.values()) index = 0 if order == 'first' else -1 return [grouped[k][index] for k in grouped]
def make_get_by_name(self): grouped = utils.group_by(self.xs, self.name) self.names = utils.by(map(lambda v: v.pop(), grouped.values()), self.name) for name, g in grouped.items(): if g: utils.log_debug('duplicate name, using first', name, self.names[name], *g)
def parse_items(item_dicts): utils.log_debug('parse_items', len(item_dicts)) return utils.group_by(map(Item, item_dicts), lambda i: i.id) # this is an Order.id
def make_get_by_name(self): self.names = utils.group_by(self.xs, self.name)