def paginate(lst, ipp, func=lambda x: x, salt=None, orphans=0): """paginate(lst, ipp, func=lambda x: x, salt=None, orphans=0) Yields a triple ((next, current, previous), list of entries, has changed) of a paginated entrylist. It will first filter by the specified function, then split the ist into several sublists and check wether the list or an entry has changed. :param lst: the entrylist containing Entry instances. :param ipp: items per page :param func: filter list of entries by this function :param salt: uses as additional identifier in memoize :param orphans: avoid N orphans on last page >>> for x, values, _, paginate(entryrange(20), 6, orphans=2): ... print x, values (None, 0, 1), [entries 1..6] (0, 1, 2), [entries 7..12] (1, 2, None), [entries 12..20]""" # apply filter function and prepare pagination with ipp res = filter(func, lst) res = list(batch(res, ipp)) if len(res) >= 2 and len(res[-1]) <= orphans: res[-2].extend(res[-1]) res.pop(-1) j = len(res) for i, entries in enumerate(res): i += 1 next = None if i == 1 else i - 1 curr = i prev = None if i >= j else i + 1 # get caller, so we can set a unique and meaningful hash-key frame = log.findCaller() if salt is None: hkey = '%s:%s-hash-%i' % (basename(frame[0]), frame[2], i) else: hkey = '%s:%s-hash-%s-%i' % (basename(frame[0]), frame[2], salt, i) # calculating hash value and retrieve memoized value hv = md5(*entries, attr=lambda o: o.md5) rv = cache.memoize(hkey) if rv == hv: # check if an Entry-instance has changed if any(filter(lambda e: e.has_changed, entries)): has_changed = True else: has_changed = False else: # save new value for next run cache.memoize(hkey, hv) has_changed = True yield (next, curr, prev), entries, has_changed
def paginate(lst, ipp, func=lambda x: x, salt=None, orphans=0): """paginate(lst, ipp, func=lambda x: x, salt=None, orphans=0) Yields a triple ((next, current, previous), list of entries, has changed) of a paginated entrylist. It will first filter by the specified function, then split the ist into several sublists and check wether the list or an entry has changed. :param lst: the entrylist containing Entry instances. :param ipp: items per page :param func: filter list of entries by this function :param salt: uses as additional identifier in memoize :param orphans: avoid N orphans on last page >>> for x, values, _, paginate(entryrange(20), 6, orphans=2): ... print x, values (None, 0, 1), [entries 1..6] (0, 1, 2), [entries 7..12] (1, 2, None), [entries 12..20]""" # apply filter function and prepare pagination with ipp res = filter(func, lst) res = list(batch(res, ipp)) if len(res) >= 2 and len(res[-1]) <= orphans: res[-2].extend(res[-1]) res.pop(-1) j = len(res) for i, entries in enumerate(res): i += 1 next = None if i == 1 else i-1 curr = i prev = None if i >= j else i+1 # get caller, so we can set a unique and meaningful hash-key frame = log.findCaller() if salt is None: hkey = '%s:%s-hash-%i' % (basename(frame[0]), frame[2], i) else: hkey = '%s:%s-hash-%s-%i' % (basename(frame[0]), frame[2], salt, i) # calculating hash value and retrieve memoized value hv = md5(*entries, attr=lambda o: o.md5) rv = cache.memoize(hkey) if rv == hv: # check if an Entry-instance has changed if any(filter(lambda e: e.has_changed, entries)): has_changed = True else: has_changed = False else: # save new value for next run cache.memoize(hkey, hv) has_changed = True yield (next, curr, prev), entries, has_changed
def do_tags(conf, env, options): limit = options.max if options.max > 0 else 100 entrylist = readers.load(conf)[0] if options.coverage: for tag, entries in sorted(fetch(entrylist).iteritems()): if len(entries) <= options.coverage: print blue(tag).encode('utf-8'), print ', '.join(e.filename.encode('utf-8') for e in entries) return tags = ['%i %s' % (len(value), key) for key, value in sorted(fetch(entrylist).iteritems(), key=lambda k: len(k[1]), reverse=True)] colprint( list(izip(*list(batch(tags[:limit], ceil(len(tags)/4.0))), fillvalue='')), os.popen('stty size', 'r').read().split()[1] )
def do_tags(conf, env, options): limit = options.max if options.max > 0 else 100 entrylist = readers.load(conf)[0] if options.coverage: for tag, entries in sorted(iteritems(fetch(entrylist))): if len(entries) <= options.coverage: print(blue(tag).encode('utf-8'), end=' ') print(', '.join(e.filename.encode('utf-8') for e in entries)) return tags = [ '%i %s' % (len(value), key) for key, value in sorted( iteritems(fetch(entrylist)), key=lambda k: len(k[1]), reverse=True) ] colprint( list( izip(*list(batch(tags[:limit], ceil(len(tags) / 4.0))), fillvalue='')), os.popen('stty size', 'r').read().split()[1])
def paginate(lst, ipp, salt="", orphans=0): """paginate(lst, ipp, func=lambda x: x, salt=None, orphans=0) Yields a triple ((next, current, previous), list of entries, has changed) of a paginated entrylist. It will first filter by the specified function, then split the ist into several sublists and check wether the list or an entry has changed. :param lst: the entrylist containing Entry instances. :param ipp: items per page :param salt: uses as additional identifier in memoize :param orphans: avoid N orphans on last page >>> for x, values, _, paginate(entryrange(20), 6, orphans=2): ... print(x, values) (None, 0, 1), [entries 1..6] (0, 1, 2), [entries 7..12] (1, 2, None), [entries 12..20]""" # detect removed or newly added entries modified = cache.memoize('paginate-' + salt, hash(*lst)) # slice into batches res = list(batch(lst, ipp)) if len(res) >= 2 and len(res[-1]) <= orphans: res[-2].extend(res[-1]) res.pop(-1) j = len(res) for i, entries in enumerate(res): i += 1 next = None if i == 1 else i-1 curr = i prev = None if i >= j else i+1 yield (next, curr, prev), entries, modified or any(e.modified for e in entries)