#!python from __future__ import with_statement import os, sys, shlex import plac def run(fnames, cmd, verbose): "Run batch scripts and tests" for fname in fnames: with open(fname) as f: lines = list(f) if not lines[0].startswith('#!'): sys.exit('Missing or incorrect shebang line!') firstline = lines[0][2:] # strip the shebang init_args = shlex.split(firstline) tool = plac.import_main(*init_args) command = getattr(plac.Interpreter(tool), cmd) # doctest or execute if verbose: sys.stdout.write('Running %s with %s' % (fname, firstline)) command(lines[1:], verbose=verbose) @plac.annotations( verbose=('verbose mode', 'flag', 'v'), interactive=('run plac tool in interactive mode', 'flag', 'i'), multiline=('run plac tool in multiline mode', 'flag', 'm'), serve=('run plac server', 'option', 's', int), batch=('run plac batch files', 'flag', 'b'), test=('run plac test files', 'flag', 't'), fname='script to run (.py or .plac or .placet)', extra='additional arguments', ) def main(verbose, interactive, multiline, serve, batch, test, fname=None, *extra): "Runner for plac tools, plac batch files and plac tests" baseparser = plac.parser_from(main) if fname is None: baseparser.print_help() elif sys.argv[1] == fname: # script mode plactool = plac.import_main( fname, prog=os.path.basename(sys.argv[0]) + ' ' + fname) out = plac.call(plactool, sys.argv[2:], eager=False) if plac.iterable(out): for output in out: print(output) else: print(out) elif interactive or multiline or serve: plactool = plac.import_main(fname, *extra, **{'prog': ''}) i = plac.Interpreter(plactool) if interactive: i.interact(verbose=verbose) elif multiline: i.multiline(verbose=verbose) elif serve: i.start_server(serve) elif batch: run((fname,) + extra, 'execute', verbose) elif test: run((fname,) + extra, 'doctest', verbose) print('run %s plac test(s)' % (len(extra) + 1)) else: baseparser.print_usage() main.add_help = False if __name__ == '__main__': plac.call(main)