Ticket #2099: trac_2999.patch

File trac_2999.patch, 6.5 KB (added by gfurnish, 12 years ago)

sage-ptest

  • sage-doctest

    # HG changeset patch
    # User Gary Furnish <bill@indirectproof.net>
    # Date 1204509961 28800
    # Node ID 7917fb3994d36b389faa72b8f61b2fee7dc3958f
    # Parent  8d557d04524a03be57e7b34c27f6356c81f40145
    Added Parallel Doc Testing (Fixes #2099)
    
    diff -r 8d557d04524a -r 7917fb3994d3 sage-doctest
    a b SAGE_TMP='%s/tmp/%s/'%(DOT_SAGE,os.getpi 
    2727SAGE_TMP='%s/tmp/%s/'%(DOT_SAGE,os.getpid())
    2828def delete_tmpfiles():
    2929    try:
    30         shutil.rmtree(SAGE_TMP)
     30        pass
     31#        shutil.rmtree(SAGE_TMP)
    3132    except OSError:
    3233        pass
    3334
    def test_file(file): 
    341342
    342343        tm = time.time()
    343344        try:
    344             if verbose or gdb or memcheck or massif or cachegrind:
    345                 e = os.system(cmd)
    346                 out = ''; err = ''
    347             else:
    348                 e = os.system("%s 1>.doctest/out 2>.doctest/err"%cmd)
    349                 out = open('.doctest/out').read()
    350                 err = open('.doctest/err').read()
     345            #if verbose or gdb or memcheck or massif or cachegrind:
     346            e = os.system(cmd)
     347            out = ''; err = ''
     348            #else:
     349                #e = os.system("%s 1>.doctest/out 2>.doctest/err%s"%(cmd,os.getpid()))
     350                #out = open('.doctest/out%s'% os.getpid() ).read()
     351                #err = open('.doctest/err%s'% os.getpid() ).read()
    351352        except KeyboardInterrupt:
    352353            err += "\n Error -- interrupted after %s seconds!"%tm
    353354            print "Error!!!"
  • new file sage-ptest

    diff -r 8d557d04524a -r 7917fb3994d3 sage-ptest
    - +  
     1#!/usr/bin/env python
     2
     3import os, signal, sys, time, thread, threading, tempfile
     4
     5####################################
     6
     7argv = sys.argv
     8
     9try:
     10    i = argv.index('-sage')
     11    del argv[i]
     12    use_sage_only = True
     13except ValueError:
     14    use_sage_only = False
     15
     16opts = ' '.join([X for X in argv if X[0] == '-'])
     17argv = [X for X in argv if X[0] != '-']
     18infiles = argv[2:]
     19if len(infiles) == 0:
     20    print "Usage: sage -t <files or directories>."
     21    print "For more information, type 'sage -help'."
     22    sys.exit(1)
     23
     24infiles.sort()
     25
     26files = list()
     27
     28t0 = time.time()
     29filemutex = thread.allocate_lock()
     30printmutex = thread. allocate_lock()
     31done = False
     32threadlist = list()
     33
     34numthreads = int(argv[1])
     35
     36class tester(threading.Thread):
     37    def __init__(self):
     38        threading.Thread.__init__(self)
     39    def run(x):
     40        try:
     41            while True:
     42                filemutex.acquire()
     43                if len(files)!=0:
     44                    F = files.pop()
     45                    filemutex.release()
     46                    base, ext = os.path.splitext(F)
     47                    if use_sage_only or ext == '.sage':
     48                        e = test(F, 'doctest_tex ' + opts)
     49                    elif ext in ['.py', '.pyx', '.tex', '.pxi']:
     50                        e = test(F, 'doctest '+opts)
     51                else:
     52                   filemutex.release()
     53                   return
     54        except KeyboardInterrupt:
     55            return
     56
     57
     58def launchthreads(x):
     59    for i in range(0,x):
     60        curtester = tester()
     61        threadlist.append(curtester)
     62        curtester.start()
     63
     64def abspath(x):
     65#     return os.path.abspath(x)
     66    return strip_automount_prefix(os.path.abspath(x))
     67
     68def strip_automount_prefix(filename):
     69    """
     70    Strip prefixes added on automounted filesystems in some cases,
     71    which make the absolute path appear hidden.
     72   
     73    AUTHOR:
     74        -- Kate Minola
     75    """
     76    sep = os.path.sep
     77    str = filename.split(sep,2)
     78    if len(str) < 2:
     79        new = sep
     80    else:
     81        new = sep + str[1]
     82    if os.path.exists(new):
     83        inode1 = os.stat(filename)[1]
     84        inode2 = os.stat(new)[1]
     85        if inode1 == inode2:
     86            filename = new
     87    return filename
     88
     89CUR = abspath(os.curdir)
     90
     91
     92def abs(f):
     93    return "sage -t %s %s"%(opts, abspath(f)[len(CUR)+1:])
     94
     95def skip(F):
     96    G = abspath(F)
     97    i = G.rfind('/')
     98    if os.path.exists('%s/nodoctest.py'%G[:i]):
     99        printmutex.acquire()
     100        print "%s (skipping) -- nodoctest.py file in directory"%abs(F)
     101        printmutex.release()
     102        return True
     103
     104    if G == "all.py" or "__init__.py" in G \
     105          or G[0] == '.' or '/.' in G.lstrip('/.') or \
     106          'nodoctest' in open(G).read():
     107        return True
     108
     109    return False
     110
     111failed = []
     112
     113SAGE_ROOT=os.environ['SAGE_ROOT']
     114TMP=SAGE_ROOT + "/tmp/test/"
     115if not os.path.exists(TMP):
     116    os.makedirs(TMP)
     117
     118def test(F, cmd):
     119    t = time.time()
     120    if not skip(F):
     121        outfile = tempfile.NamedTemporaryFile()
     122        filestr = "./" + abspath(F)[len(CUR)+1:]
     123#        filestr = F
     124        filestr = os.path.split(F)[1]
     125        os.chdir(os.path.dirname(F))
     126        s = 'bash -c "%s/local/bin/sage-%s %s > %s" ' %(SAGE_ROOT, cmd, filestr, outfile.name)
     127        ret = os.system(s)
     128        ol = outfile.read()
     129        if ret != 0:
     130            printmutex.acquire()
     131            failed.append(abs(F))
     132            printmutex.release()
     133    else:
     134        return False
     135    printmutex.acquire()
     136    print abs(F)
     137    if ol!="" and (not ol.isspace()):
     138        print ol
     139    print "\t [%.1f s]"%(time.time() - t)
     140    printmutex.release()
     141    return ret
     142
     143
     144def populatefilelist(filelist):
     145    global CUR
     146    for FF in filelist:
     147        if os.path.isfile(FF):
     148            files.append(FF)
     149            continue
     150        curdir = os.getcwd()
     151        filemutex.acquire()
     152        walkdir = os.path.join(CUR,FF)
     153        for root, dirs, lfiles in os.walk(walkdir):
     154            for F in lfiles:
     155                base, ext = os.path.splitext(F)
     156                if use_sage_only and ext == '.sage':
     157                    continue
     158                elif not (ext in ['.py', '.pyx', '.tex', '.pxi']):
     159                    continue
     160                elif '__nodoctest__' in files:
     161                    continue
     162                appendstr = os.path.join(root,F)
     163                files.append(appendstr)
     164            for D in dirs:
     165                if '#' in D or '/notes' in D:
     166                    dirs.remove(D)
     167        filemutex.release()
     168    return 0
     169
     170populatefilelist(infiles)
     171launchthreads(numthreads)
     172
     173
     174 
     175print " "
     176print "-"*int(70)
     177
     178for t in threadlist:
     179    t.join()
     180if len(failed) == 0:
     181    print "All tests passed!"
     182else:
     183    print "The following tests failed:\n"
     184    print "\n\t".join(failed)
     185
     186print "Total time for all tests: %.1f seconds"%(time.time() - t0)
     187
     188