#!/usr/bin/python3
|
|
from __future__ import with_statement
|
|
import os
|
|
import sys
|
|
import 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)
|
|
plactool.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)
|
|
plactool.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)
|