#!/usr/bin/env python from __future__ import print_function, unicode_literals import argparse import codecs import glob import os import platform import shutil import sys import tempfile from subprocess import check_call, check_output _PY3 = sys.version_info.major == 3 _WINDOWS = platform.system().lower() == 'windows' _PACKAGE_NAME = os.environ.get( 'CLI_PACKAGE_NAME', 'github.com/urfave/cli' ) _TARGETS = {} def main(sysargs=sys.argv[:]): parser = argparse.ArgumentParser() parser.add_argument( 'target', nargs='?', choices=tuple(_TARGETS.keys()), default='test' ) args = parser.parse_args(sysargs[1:]) _TARGETS[args.target]() return 0 def _target(func): _TARGETS[func.__name__.strip('_')] = func return func @_target def _test(): if _go_version() < 'go1.2': _run('go test -v .') return coverprofiles = [] for subpackage in ['', 'altsrc']: coverprofile = 'cli.coverprofile' if subpackage != '': coverprofile = '{}.coverprofile'.format(subpackage) coverprofiles.append(coverprofile) _run('go test -v'.split() + [ '-coverprofile={}'.format(coverprofile), ('{}/{}'.format(_PACKAGE_NAME, subpackage)).rstrip('/') ]) combined_name = _combine_coverprofiles(coverprofiles) _run('go tool cover -func={}'.format(combined_name)) os.remove(combined_name) @_target def _gfmrun(): go_version = _go_version() if go_version < 'go1.3': print('runtests: skip on {}'.format(go_version), file=sys.stderr) return _run(['gfmrun', '-c', str(_gfmrun_count()), '-s', 'README.md']) @_target def _vet(): _run('go vet ./...') @_target def _migrations(): go_version = _go_version() if go_version < 'go1.3': print('runtests: skip on {}'.format(go_version), file=sys.stderr) return migration_script = os.path.abspath( os.environ.get('V1TOV2', './cli-v1-to-v2') ) v1_readme_url = os.environ.get( 'V1README', 'https://raw.githubusercontent.com/urfave/cli/v1/README.md' ) tmpdir = tempfile.mkdtemp() try: os.chdir(tmpdir) _run('curl -sSL -o README.md {}'.format(v1_readme_url).split()) _run('gfmrun extract -o .'.split()) for gofile in glob.glob('*.go'): for i in (0, 1): _run(['python', migration_script, '-w', gofile]) _run('go build -o tmp.out {}'.format(gofile).split()) finally: if os.environ.get('NOCLEAN', '') == '': shutil.rmtree(tmpdir, ignore_errors=True) @_target def _toc(): exe = ['bash'] if _WINDOWS else [] _run(exe + [ os.path.join('node_modules', '.bin', 'markdown-toc'), '-i', 'README.md' ]) _run('git diff --exit-code') @_target def _gen(): go_version = _go_version() if go_version < 'go1.5': print('runtests: skip on {}'.format(go_version), file=sys.stderr) return _run('go generate ./...') _run('git diff --exit-code') def _run(command): if hasattr(command, 'split'): command = command.split() print('runtests: {}'.format(' '.join(command)), file=sys.stderr) sys.stderr.flush() check_call(command) def _gfmrun_count(): with codecs.open('README.md', 'r', 'utf-8') as infile: lines = infile.read().splitlines() return len(list(filter(_is_go_runnable, lines))) def _is_go_runnable(line): return line.startswith('package main') def _go_version(): return check_output('go version'.split()).decode('utf-8').split()[2] def _combine_coverprofiles(coverprofiles): tmp_args = dict(suffix='.coverprofile', mode='w', delete=False) if _PY3: tmp_args['encoding'] = 'utf-8' combined = tempfile.NamedTemporaryFile(**tmp_args) combined.write('mode: set\n') for coverprofile in coverprofiles: with codecs.open(coverprofile, 'r', 'utf-8') as infile: for line in infile.readlines(): if not line.startswith('mode: '): combined.write(line) combined.flush() name = combined.name combined.close() return name if __name__ == '__main__': sys.exit(main())