--- a/Allura/allura/lib/utils.py
+++ b/Allura/allura/lib/utils.py
@@ -5,6 +5,7 @@
import logging
import random
import mimetypes
+from itertools import groupby
from logging.handlers import WatchedFileHandler
import tg
@@ -150,6 +151,13 @@
return s[:k]
return s
+
+def chunked_iter(iterable, max_size):
+ '''return iterable 'chunks' from the iterable of max size max_size'''
+ eiter = enumerate(iterable)
+ keyfunc = lambda (i,x): i//max_size
+ for _, chunk in groupby(eiter, keyfunc):
+ yield (x for i,x in chunk)
class AntiSpam(object):
'''Helper class for bot-protecting forms'''
@@ -343,3 +351,21 @@
super(CaseInsensitiveDict, self).update(*args, **kwargs)
self._reindex()
+def postmortem_hook(etype, value, tb): # pragma no cover
+ import sys, pdb, traceback
+ try:
+ from IPython.ipapi import make_session; make_session()
+ from IPython.Debugger import Pdb
+ sys.stderr.write('Entering post-mortem IPDB shell\n')
+ p = Pdb(color_scheme='Linux')
+ p.reset()
+ p.setup(None, tb)
+ p.print_stack_trace()
+ sys.stderr.write('%s: %s\n' % ( etype, value))
+ p.cmdloop()
+ p.forget()
+ # p.interaction(None, tb)
+ except ImportError:
+ sys.stderr.write('Entering post-mortem PDB shell\n')
+ traceback.print_exception(etype, value, tb)
+ pdb.post_mortem(tb)