Home | History | Annotate | Download | only in typ
      1 #!/usr/bin/env python
      2 
      3 from __future__ import print_function
      4 
      5 import argparse
      6 import os
      7 import subprocess
      8 import sys
      9 
     10 from tools import cov
     11 
     12 
     13 is_python3 = bool(sys.version_info.major == 3)
     14 has_python34 = False
     15 verbose = False
     16 repo_dir = os.path.abspath(os.path.dirname(__file__))
     17 path_to_cov = os.path.join(repo_dir, 'tools', 'cov.py')
     18 path_to_runner = os.path.join(repo_dir, 'typ', 'runner.py')
     19 
     20 
     21 def call(*args, **kwargs):
     22     if verbose:
     23         print(' '.join(args[0]))
     24     ret = subprocess.call(*args, **kwargs)
     25     if ret != 0:
     26         sys.exit(ret)
     27 
     28 
     29 def main(argv):
     30     parser = argparse.ArgumentParser(prog='run')
     31     parser.add_argument('--no3', action='store_true',
     32                         help='Do not run the tests under Python 3.')
     33     parser.add_argument('-v', '--verbose', action='store_true')
     34     subps = parser.add_subparsers()
     35 
     36     subp = subps.add_parser('clean', help='Remove any local files.')
     37     subp.set_defaults(func=run_clean)
     38 
     39     subp = subps.add_parser('coverage',
     40                             help='Run the tests and report code coverage.')
     41     subp.set_defaults(func=run_coverage)
     42     cov.add_arguments(subp)
     43 
     44     subp = subps.add_parser('help',
     45                             help='Get help on a subcommand.')
     46     subp.add_argument(nargs='?', action='store', dest='subcommand',
     47                       help='The command to get help for.')
     48     subp.set_defaults(func=run_help)
     49 
     50     subp = subps.add_parser('lint',
     51                             help='run lint over the source')
     52     subp.set_defaults(func=run_lint)
     53 
     54     subp = subps.add_parser('tests',
     55                             help='run the tests')
     56     subp.set_defaults(func=run_tests)
     57 
     58     args = parser.parse_args(argv)
     59 
     60     global verbose
     61     if args.verbose:
     62         verbose = True
     63     global has_python34
     64     if not args.no3:
     65         try:
     66             ver = subprocess.check_output(['python3', '--version'])
     67             has_python34 = ver.split()[1] >= '3.4'
     68         except:
     69             pass
     70     args.func(args)
     71 
     72 
     73 def run_clean(args):
     74     call(['git', 'clean', '-fxd'])
     75 
     76 
     77 def run_coverage(args):
     78     if not args.path:
     79         args.path = [repo_dir]
     80     if not args.source:
     81         args.source = [os.path.join(repo_dir, 'typ')]
     82     argv = cov.argv_from_args(args)
     83     cov_args = [path_to_runner, '-j', '1']
     84     print('Running coverage of unit tests for Python 2.7.')
     85     call(['python', path_to_cov] + argv + cov_args)
     86     if has_python34:
     87         print('Running coverage of unit tests for Python 3.4.')
     88         call(['python3', path_to_cov] + argv + cov_args)
     89 
     90 
     91 def run_help(args):
     92     if args.subcommand:
     93         main([args.subcommand, '--help'])
     94     main(['--help'])
     95 
     96 
     97 def run_lint(args):
     98     call('pylint --rcfile=pylintrc */*.py */*/*.py', shell=True)
     99 
    100 
    101 def run_tests(args):
    102     print('Testing running the typ module directly if it is in sys.path.')
    103     call(['python', '-m', 'typ', 'typ.tests.main_test.TestMain.test_basic'])
    104 
    105     print('Testing running the runner directly if nothing is in sys.path.')
    106     home_dir = os.environ['HOME']
    107     call(['python', path_to_runner, 'typ.tests.main_test.TestMain.test_basic'],
    108          cwd=home_dir)
    109 
    110     # Now run all the tests under Python2 and Python3.
    111     print('Running the unit tests under Python 2.')
    112     call(['python', path_to_runner])
    113     if has_python34:
    114         print('Running the unit tests under Python 3.4.')
    115         call(['python3', path_to_runner])
    116 
    117 
    118 if __name__ == '__main__':
    119     sys.exit(main(sys.argv[1:]))
    120