# epydoc -- Regression testing # # Copyright (C) 2005 Edward Loper # Author: Edward Loper # URL: # # $Id: __init__.py 1502 2007-02-14 08:38:44Z edloper $ """ Regression testing. """ __docformat__ = 'epytext en' import unittest, doctest, epydoc, os, os.path, re, sys def main(): try: doctest.register_optionflag except: print ("\n" "The regression test suite requires a more recent version of\n" "doctest (e.g., the version that ships with Python 2.4 or 2.5).\n" "Please place a new version of doctest on your path before \n" "running the test suite.\n") return PY24 = doctest.register_optionflag('PYTHON2.4') """Flag indicating that a doctest example requires Python 2.4+""" PY25 = doctest.register_optionflag('PYTHON2.5') """Flag indicating that a doctest example requires Python 2.5+""" class DocTestParser(doctest.DocTestParser): """ Custom doctest parser that adds support for two new flags +PYTHON2.4 and +PYTHON2.5. """ def parse(self, string, name=''): pieces = doctest.DocTestParser.parse(self, string, name) for i, val in enumerate(pieces): if (isinstance(val, doctest.Example) and ((val.options.get(PY24, False) and sys.version[:2] < (2,4)) or (val.options.get(PY25, False) and sys.version[:2] < (2,5)))): pieces[i] = doctest.Example('1', '1') return pieces # Turn on debugging. epydoc.DEBUG = True # Options for doctest: options = doctest.ELLIPSIS doctest.set_unittest_reportflags(doctest.REPORT_UDIFF) # Use a custom parser parser = DocTestParser() # Find all test cases. tests = [] testdir = os.path.join(os.path.split(__file__)[0]) if testdir == '': testdir = '.' for filename in os.listdir(testdir): if (filename.endswith('.doctest') and check_requirements(os.path.join(testdir, filename))): tests.append(doctest.DocFileSuite(filename, optionflags=options, parser=parser)) # Run all test cases. unittest.TextTestRunner(verbosity=2).run(unittest.TestSuite(tests)) def check_requirements(filename): """ Search for strings of the form:: [Require: ] If any are found, then try importing the module named . If the import fails, then return False. If all required modules are found, return True. (This includes the case where no requirements are listed.) """ s = open(filename).read() for m in re.finditer('(?mi)^[ ]*\:RequireModule:(.*)$', s): module = m.group(1).strip() try: __import__(module) except ImportError: print ('Skipping %r (required module %r not found)' % (os.path.split(filename)[-1], module)) return False return True if __name__=='__main__': main()