1*16467b97STreehugger Robot# bootstrapping setuptools 2*16467b97STreehugger Robotimport ez_setup 3*16467b97STreehugger Robotez_setup.use_setuptools() 4*16467b97STreehugger Robot 5*16467b97STreehugger Robotimport os 6*16467b97STreehugger Robotimport sys 7*16467b97STreehugger Robotimport textwrap 8*16467b97STreehugger Robotfrom distutils.errors import * 9*16467b97STreehugger Robotfrom distutils.command.clean import clean as _clean 10*16467b97STreehugger Robotfrom distutils.cmd import Command 11*16467b97STreehugger Robotfrom setuptools import setup 12*16467b97STreehugger Robotfrom distutils import log 13*16467b97STreehugger Robot 14*16467b97STreehugger Robotfrom distutils.core import setup 15*16467b97STreehugger Robot 16*16467b97STreehugger Robot 17*16467b97STreehugger Robotclass clean(_clean): 18*16467b97STreehugger Robot """Also cleanup local temp files.""" 19*16467b97STreehugger Robot 20*16467b97STreehugger Robot def run(self): 21*16467b97STreehugger Robot _clean.run(self) 22*16467b97STreehugger Robot 23*16467b97STreehugger Robot import fnmatch 24*16467b97STreehugger Robot 25*16467b97STreehugger Robot # kill temporary files 26*16467b97STreehugger Robot patterns = [ 27*16467b97STreehugger Robot # generic tempfiles 28*16467b97STreehugger Robot '*~', '*.bak', '*.pyc', 29*16467b97STreehugger Robot 30*16467b97STreehugger Robot # tempfiles generated by ANTLR runs 31*16467b97STreehugger Robot 't[0-9]*Lexer.py', 't[0-9]*Parser.py', 32*16467b97STreehugger Robot '*.tokens', '*__.g', 33*16467b97STreehugger Robot ] 34*16467b97STreehugger Robot 35*16467b97STreehugger Robot for path in ('antlr3', 'unittests', 'tests'): 36*16467b97STreehugger Robot path = os.path.join(os.path.dirname(__file__), path) 37*16467b97STreehugger Robot if os.path.isdir(path): 38*16467b97STreehugger Robot for root, dirs, files in os.walk(path, topdown=True): 39*16467b97STreehugger Robot graveyard = [] 40*16467b97STreehugger Robot for pat in patterns: 41*16467b97STreehugger Robot graveyard.extend(fnmatch.filter(files, pat)) 42*16467b97STreehugger Robot 43*16467b97STreehugger Robot for name in graveyard: 44*16467b97STreehugger Robot filePath = os.path.join(root, name) 45*16467b97STreehugger Robot 46*16467b97STreehugger Robot try: 47*16467b97STreehugger Robot log.info("removing '%s'", filePath) 48*16467b97STreehugger Robot os.unlink(filePath) 49*16467b97STreehugger Robot except OSError, exc: 50*16467b97STreehugger Robot log.warn( 51*16467b97STreehugger Robot "Failed to delete '%s': %s", 52*16467b97STreehugger Robot filePath, exc 53*16467b97STreehugger Robot ) 54*16467b97STreehugger Robot 55*16467b97STreehugger Robot 56*16467b97STreehugger Robotclass TestError(DistutilsError): 57*16467b97STreehugger Robot pass 58*16467b97STreehugger Robot 59*16467b97STreehugger Robot 60*16467b97STreehugger Robot# grml.. the class name appears in the --help output: 61*16467b97STreehugger Robot# ... 62*16467b97STreehugger Robot# Options for 'CmdUnitTest' command 63*16467b97STreehugger Robot# ... 64*16467b97STreehugger Robot# so I have to use a rather ugly name... 65*16467b97STreehugger Robotclass unittest(Command): 66*16467b97STreehugger Robot """Run unit tests for package""" 67*16467b97STreehugger Robot 68*16467b97STreehugger Robot description = "run unit tests for package" 69*16467b97STreehugger Robot 70*16467b97STreehugger Robot user_options = [ 71*16467b97STreehugger Robot ('xml-output=', None, 72*16467b97STreehugger Robot "Directory for JUnit compatible XML files."), 73*16467b97STreehugger Robot ] 74*16467b97STreehugger Robot boolean_options = [] 75*16467b97STreehugger Robot 76*16467b97STreehugger Robot def initialize_options(self): 77*16467b97STreehugger Robot self.xml_output = None 78*16467b97STreehugger Robot 79*16467b97STreehugger Robot def finalize_options(self): 80*16467b97STreehugger Robot pass 81*16467b97STreehugger Robot 82*16467b97STreehugger Robot def run(self): 83*16467b97STreehugger Robot testDir = os.path.join(os.path.dirname(__file__), 'unittests') 84*16467b97STreehugger Robot if not os.path.isdir(testDir): 85*16467b97STreehugger Robot raise DistutilsFileError( 86*16467b97STreehugger Robot "There is not 'unittests' directory. Did you fetch the " 87*16467b97STreehugger Robot "development version?", 88*16467b97STreehugger Robot ) 89*16467b97STreehugger Robot 90*16467b97STreehugger Robot import glob 91*16467b97STreehugger Robot import imp 92*16467b97STreehugger Robot import unittest 93*16467b97STreehugger Robot import traceback 94*16467b97STreehugger Robot import StringIO 95*16467b97STreehugger Robot 96*16467b97STreehugger Robot suite = unittest.TestSuite() 97*16467b97STreehugger Robot loadFailures = [] 98*16467b97STreehugger Robot 99*16467b97STreehugger Robot # collect tests from all unittests/test*.py files 100*16467b97STreehugger Robot testFiles = [] 101*16467b97STreehugger Robot for testPath in glob.glob(os.path.join(testDir, 'test*.py')): 102*16467b97STreehugger Robot testFiles.append(testPath) 103*16467b97STreehugger Robot 104*16467b97STreehugger Robot testFiles.sort() 105*16467b97STreehugger Robot for testPath in testFiles: 106*16467b97STreehugger Robot testID = os.path.basename(testPath)[:-3] 107*16467b97STreehugger Robot 108*16467b97STreehugger Robot try: 109*16467b97STreehugger Robot modFile, modPathname, modDescription \ 110*16467b97STreehugger Robot = imp.find_module(testID, [testDir]) 111*16467b97STreehugger Robot 112*16467b97STreehugger Robot testMod = imp.load_module( 113*16467b97STreehugger Robot testID, modFile, modPathname, modDescription 114*16467b97STreehugger Robot ) 115*16467b97STreehugger Robot 116*16467b97STreehugger Robot suite.addTests( 117*16467b97STreehugger Robot unittest.defaultTestLoader.loadTestsFromModule(testMod) 118*16467b97STreehugger Robot ) 119*16467b97STreehugger Robot 120*16467b97STreehugger Robot except Exception: 121*16467b97STreehugger Robot buf = StringIO.StringIO() 122*16467b97STreehugger Robot traceback.print_exc(file=buf) 123*16467b97STreehugger Robot 124*16467b97STreehugger Robot loadFailures.append( 125*16467b97STreehugger Robot (os.path.basename(testPath), buf.getvalue()) 126*16467b97STreehugger Robot ) 127*16467b97STreehugger Robot 128*16467b97STreehugger Robot if self.xml_output: 129*16467b97STreehugger Robot import xmlrunner 130*16467b97STreehugger Robot runner = xmlrunner.XMLTestRunner( 131*16467b97STreehugger Robot stream=open(os.path.join(self.xml_output, 'unittest.xml'), 'w')) 132*16467b97STreehugger Robot else: 133*16467b97STreehugger Robot runner = unittest.TextTestRunner(verbosity=2) 134*16467b97STreehugger Robot result = runner.run(suite) 135*16467b97STreehugger Robot 136*16467b97STreehugger Robot for testName, error in loadFailures: 137*16467b97STreehugger Robot sys.stderr.write('\n' + '='*70 + '\n') 138*16467b97STreehugger Robot sys.stderr.write( 139*16467b97STreehugger Robot "Failed to load test module %s\n" % testName 140*16467b97STreehugger Robot ) 141*16467b97STreehugger Robot sys.stderr.write(error) 142*16467b97STreehugger Robot sys.stderr.write('\n') 143*16467b97STreehugger Robot 144*16467b97STreehugger Robot if not result.wasSuccessful() or loadFailures: 145*16467b97STreehugger Robot raise TestError( 146*16467b97STreehugger Robot "Unit test suite failed!", 147*16467b97STreehugger Robot ) 148*16467b97STreehugger Robot 149*16467b97STreehugger Robot 150*16467b97STreehugger Robotclass functest(Command): 151*16467b97STreehugger Robot """Run functional tests for package""" 152*16467b97STreehugger Robot 153*16467b97STreehugger Robot description = "run functional tests for package" 154*16467b97STreehugger Robot 155*16467b97STreehugger Robot user_options = [ 156*16467b97STreehugger Robot ('testcase=', None, 157*16467b97STreehugger Robot "testcase to run [default: run all]"), 158*16467b97STreehugger Robot ('antlr-version=', None, 159*16467b97STreehugger Robot "ANTLR version to use [default: HEAD (in ../../build)]"), 160*16467b97STreehugger Robot ('antlr-jar=', None, 161*16467b97STreehugger Robot "Explicit path to an antlr jar (overrides --antlr-version)"), 162*16467b97STreehugger Robot ('xml-output=', None, 163*16467b97STreehugger Robot "Directory for JUnit compatible XML files."), 164*16467b97STreehugger Robot ] 165*16467b97STreehugger Robot 166*16467b97STreehugger Robot boolean_options = [] 167*16467b97STreehugger Robot 168*16467b97STreehugger Robot def initialize_options(self): 169*16467b97STreehugger Robot self.testcase = None 170*16467b97STreehugger Robot self.antlr_version = 'HEAD' 171*16467b97STreehugger Robot self.antlr_jar = None 172*16467b97STreehugger Robot self.xml_output = None 173*16467b97STreehugger Robot 174*16467b97STreehugger Robot def finalize_options(self): 175*16467b97STreehugger Robot pass 176*16467b97STreehugger Robot 177*16467b97STreehugger Robot def run(self): 178*16467b97STreehugger Robot import glob 179*16467b97STreehugger Robot import imp 180*16467b97STreehugger Robot import unittest 181*16467b97STreehugger Robot import traceback 182*16467b97STreehugger Robot import StringIO 183*16467b97STreehugger Robot 184*16467b97STreehugger Robot testDir = os.path.join(os.path.dirname(__file__), 'tests') 185*16467b97STreehugger Robot if not os.path.isdir(testDir): 186*16467b97STreehugger Robot raise DistutilsFileError( 187*16467b97STreehugger Robot "There is not 'tests' directory. Did you fetch the " 188*16467b97STreehugger Robot "development version?", 189*16467b97STreehugger Robot ) 190*16467b97STreehugger Robot 191*16467b97STreehugger Robot # make sure, relative imports from testcases work 192*16467b97STreehugger Robot sys.path.insert(0, testDir) 193*16467b97STreehugger Robot 194*16467b97STreehugger Robot rootDir = os.path.abspath( 195*16467b97STreehugger Robot os.path.join(os.path.dirname(__file__), '..', '..')) 196*16467b97STreehugger Robot 197*16467b97STreehugger Robot if self.antlr_jar is not None: 198*16467b97STreehugger Robot classpath = [self.antlr_jar] 199*16467b97STreehugger Robot elif self.antlr_version == 'HEAD': 200*16467b97STreehugger Robot classpath = [ 201*16467b97STreehugger Robot os.path.join(rootDir, 'tool', 'target', 'classes'), 202*16467b97STreehugger Robot os.path.join(rootDir, 'runtime', 'Java', 'target', 'classes') 203*16467b97STreehugger Robot ] 204*16467b97STreehugger Robot else: 205*16467b97STreehugger Robot classpath = [ 206*16467b97STreehugger Robot os.path.join(rootDir, 'archive', 207*16467b97STreehugger Robot 'antlr-%s.jar' % self.antlr_version) 208*16467b97STreehugger Robot ] 209*16467b97STreehugger Robot 210*16467b97STreehugger Robot classpath.extend([ 211*16467b97STreehugger Robot os.path.join(rootDir, 'lib', 'antlr-2.7.7.jar'), 212*16467b97STreehugger Robot os.path.join(rootDir, 'lib', 'stringtemplate-3.2.1.jar'), 213*16467b97STreehugger Robot os.path.join(rootDir, 'lib', 'ST-4.0.2.jar'), 214*16467b97STreehugger Robot os.path.join(rootDir, 'lib', 'junit-4.2.jar') 215*16467b97STreehugger Robot ]) 216*16467b97STreehugger Robot os.environ['CLASSPATH'] = ':'.join(classpath) 217*16467b97STreehugger Robot 218*16467b97STreehugger Robot os.environ['ANTLRVERSION'] = self.antlr_version 219*16467b97STreehugger Robot 220*16467b97STreehugger Robot suite = unittest.TestSuite() 221*16467b97STreehugger Robot loadFailures = [] 222*16467b97STreehugger Robot 223*16467b97STreehugger Robot # collect tests from all tests/t*.py files 224*16467b97STreehugger Robot testFiles = [] 225*16467b97STreehugger Robot test_glob = 't[0-9][0-9][0-9]*.py' 226*16467b97STreehugger Robot for testPath in glob.glob(os.path.join(testDir, test_glob)): 227*16467b97STreehugger Robot if testPath.endswith('Lexer.py') or testPath.endswith('Parser.py'): 228*16467b97STreehugger Robot continue 229*16467b97STreehugger Robot 230*16467b97STreehugger Robot # if a single testcase has been selected, filter out all other 231*16467b97STreehugger Robot # tests 232*16467b97STreehugger Robot if (self.testcase is not None 233*16467b97STreehugger Robot and not os.path.basename(testPath)[:-3].startswith(self.testcase)): 234*16467b97STreehugger Robot continue 235*16467b97STreehugger Robot 236*16467b97STreehugger Robot testFiles.append(testPath) 237*16467b97STreehugger Robot 238*16467b97STreehugger Robot testFiles.sort() 239*16467b97STreehugger Robot for testPath in testFiles: 240*16467b97STreehugger Robot testID = os.path.basename(testPath)[:-3] 241*16467b97STreehugger Robot 242*16467b97STreehugger Robot try: 243*16467b97STreehugger Robot modFile, modPathname, modDescription \ 244*16467b97STreehugger Robot = imp.find_module(testID, [testDir]) 245*16467b97STreehugger Robot 246*16467b97STreehugger Robot testMod = imp.load_module( 247*16467b97STreehugger Robot testID, modFile, modPathname, modDescription) 248*16467b97STreehugger Robot 249*16467b97STreehugger Robot suite.addTests( 250*16467b97STreehugger Robot unittest.defaultTestLoader.loadTestsFromModule(testMod)) 251*16467b97STreehugger Robot 252*16467b97STreehugger Robot except Exception: 253*16467b97STreehugger Robot buf = StringIO.StringIO() 254*16467b97STreehugger Robot traceback.print_exc(file=buf) 255*16467b97STreehugger Robot 256*16467b97STreehugger Robot loadFailures.append( 257*16467b97STreehugger Robot (os.path.basename(testPath), buf.getvalue())) 258*16467b97STreehugger Robot 259*16467b97STreehugger Robot if self.xml_output: 260*16467b97STreehugger Robot import xmlrunner 261*16467b97STreehugger Robot runner = xmlrunner.XMLTestRunner( 262*16467b97STreehugger Robot stream=open(os.path.join(self.xml_output, 'functest.xml'), 'w')) 263*16467b97STreehugger Robot else: 264*16467b97STreehugger Robot runner = unittest.TextTestRunner(verbosity=2) 265*16467b97STreehugger Robot 266*16467b97STreehugger Robot result = runner.run(suite) 267*16467b97STreehugger Robot 268*16467b97STreehugger Robot for testName, error in loadFailures: 269*16467b97STreehugger Robot sys.stderr.write('\n' + '='*70 + '\n') 270*16467b97STreehugger Robot sys.stderr.write( 271*16467b97STreehugger Robot "Failed to load test module %s\n" % testName 272*16467b97STreehugger Robot ) 273*16467b97STreehugger Robot sys.stderr.write(error) 274*16467b97STreehugger Robot sys.stderr.write('\n') 275*16467b97STreehugger Robot 276*16467b97STreehugger Robot if not result.wasSuccessful() or loadFailures: 277*16467b97STreehugger Robot raise TestError( 278*16467b97STreehugger Robot "Functional test suite failed!", 279*16467b97STreehugger Robot ) 280*16467b97STreehugger Robot 281*16467b97STreehugger Robot 282*16467b97STreehugger Robotsetup(name='antlr_python_runtime', 283*16467b97STreehugger Robot version='3.4', 284*16467b97STreehugger Robot packages=['antlr3'], 285*16467b97STreehugger Robot 286*16467b97STreehugger Robot author="Benjamin Niemann", 287*16467b97STreehugger Robot author_email="pink@odahoda.de", 288*16467b97STreehugger Robot url="http://www.antlr.org/", 289*16467b97STreehugger Robot download_url="http://www.antlr.org/download.html", 290*16467b97STreehugger Robot license="BSD", 291*16467b97STreehugger Robot description="Runtime package for ANTLR3", 292*16467b97STreehugger Robot long_description=textwrap.dedent('''\ 293*16467b97STreehugger Robot This is the runtime package for ANTLR3, which is required to use parsers 294*16467b97STreehugger Robot generated by ANTLR3. 295*16467b97STreehugger Robot '''), 296*16467b97STreehugger Robot cmdclass={'unittest': unittest, 297*16467b97STreehugger Robot 'functest': functest, 298*16467b97STreehugger Robot 'clean': clean 299*16467b97STreehugger Robot }, 300*16467b97STreehugger Robot ) 301