'Print a summary of all the test cases that have been run by
this DocTestRunner, and return a tuple `(f, t)`, where `f` is
the total number of failed examples, and `t` is the total
number of tried examples.
The optional `verbose` argument controls how detailed the
summary is.  If the verbosity is not specified, then the
DocTestRunner\'s verbosity is used.'

def summarize(self, verbose=None):

    if (verbose is None):
        verbose = self._verbose
    notests = []
    passed = []
    failed = []
    totalt = totalf = 0
    for x in self._name2ft.items():
        (name, (f, t)) = x
        assert (f <= t)
        totalt += t
        totalf += f
        if (t == 0):
            notests.append(name)
        elif (f == 0):
            passed.append((name, t))
        else:
            failed.append(x)
    if verbose:
        if notests:
            print len(notests), 'items    had    no    tests:'
            notests.sort()
            for thing in notests:
                print '            ', thing
        if passed:
            print len(passed), 'items    passed    all    tests:'
            passed.sort()
            for (thing, count) in passed:
                print ('    %3d    tests    in    %s' % (count, thing))
    if failed:
        print self.DIVIDER
        print len(failed), 'items    had    failures:'
        failed.sort()
        for (thing, (f, t)) in failed:
            print ('    %3d    of    %3d    in    %s' % (f, t, thing))
    if verbose:
        print totalt, 'tests    in', len(self._name2ft), 'items.'
        print (totalt - totalf), 'passed    and', totalf, 'failed.'
    if totalf:
        print '***Test    Failed***', totalf, 'failures.'
    elif verbose:
        print 'Test    passed.'
    return (totalf, totalt)
