1#!/usr/bin/env python 2from __future__ import print_function 3 4import argparse 5import os 6import sys 7import tempfile 8 9from subprocess import check_call, check_output 10 11 12PACKAGE_NAME = os.environ.get( 13 'CLI_PACKAGE_NAME', 'github.com/urfave/cli' 14) 15 16 17def main(sysargs=sys.argv[:]): 18 targets = { 19 'vet': _vet, 20 'test': _test, 21 'gfmrun': _gfmrun, 22 'toc': _toc, 23 'gen': _gen, 24 } 25 26 parser = argparse.ArgumentParser() 27 parser.add_argument( 28 'target', nargs='?', choices=tuple(targets.keys()), default='test' 29 ) 30 args = parser.parse_args(sysargs[1:]) 31 32 targets[args.target]() 33 return 0 34 35 36def _test(): 37 if check_output('go version'.split()).split()[2] < 'go1.2': 38 _run('go test -v .') 39 return 40 41 coverprofiles = [] 42 for subpackage in ['', 'altsrc']: 43 coverprofile = 'cli.coverprofile' 44 if subpackage != '': 45 coverprofile = '{}.coverprofile'.format(subpackage) 46 47 coverprofiles.append(coverprofile) 48 49 _run('go test -v'.split() + [ 50 '-coverprofile={}'.format(coverprofile), 51 ('{}/{}'.format(PACKAGE_NAME, subpackage)).rstrip('/') 52 ]) 53 54 combined_name = _combine_coverprofiles(coverprofiles) 55 _run('go tool cover -func={}'.format(combined_name)) 56 os.remove(combined_name) 57 58 59def _gfmrun(): 60 go_version = check_output('go version'.split()).split()[2] 61 if go_version < 'go1.3': 62 print('runtests: skip on {}'.format(go_version), file=sys.stderr) 63 return 64 _run(['gfmrun', '-c', str(_gfmrun_count()), '-s', 'README.md']) 65 66 67def _vet(): 68 _run('go vet ./...') 69 70 71def _toc(): 72 _run('node_modules/.bin/markdown-toc -i README.md') 73 _run('git diff --exit-code') 74 75 76def _gen(): 77 go_version = check_output('go version'.split()).split()[2] 78 if go_version < 'go1.5': 79 print('runtests: skip on {}'.format(go_version), file=sys.stderr) 80 return 81 82 _run('go generate ./...') 83 _run('git diff --exit-code') 84 85 86def _run(command): 87 if hasattr(command, 'split'): 88 command = command.split() 89 print('runtests: {}'.format(' '.join(command)), file=sys.stderr) 90 check_call(command) 91 92 93def _gfmrun_count(): 94 with open('README.md') as infile: 95 lines = infile.read().splitlines() 96 return len(filter(_is_go_runnable, lines)) 97 98 99def _is_go_runnable(line): 100 return line.startswith('package main') 101 102 103def _combine_coverprofiles(coverprofiles): 104 combined = tempfile.NamedTemporaryFile( 105 suffix='.coverprofile', delete=False 106 ) 107 combined.write('mode: set\n') 108 109 for coverprofile in coverprofiles: 110 with open(coverprofile, 'r') as infile: 111 for line in infile.readlines(): 112 if not line.startswith('mode: '): 113 combined.write(line) 114 115 combined.flush() 116 name = combined.name 117 combined.close() 118 return name 119 120 121if __name__ == '__main__': 122 sys.exit(main()) 123