def main(verbose, interactive, multiline, serve, batch, test, fname='', *extra): "Runner for plac tools, plac batch files and plac tests" baseparser = plac.parser_from(main) if not fname: 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()
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()
def plac_call(obj, arglist=None, eager=True, version=None): """ If obj is a function or a bound method, parse the given arglist by using the parser inferred from the annotations of obj and call obj with the parsed arguments. If obj is an object with attribute .commands, dispatch to the associated subparser. """ assert HAS_PLAC, '`plac` package is not available, please install it' if hasattr(obj, '_plac_func'): # `plac` needs the annotated original function (w/ __annotations__ attributes) if arglist is None: arglist = sys.argv[1:] if not inspect.isfunction(obj): arglist = ['_trick_arg0_'] + arglist obj._meta['is_function'] = False parser = plac.parser_from(obj._plac_func) if version: parser.add_argument('--version', '-v', action='version', version=version) # below: trick so that `plac` will consume the command-line arguments but still use the `defaults` wrapper parser.func = obj cmd, result = parser.consume(arglist) if plac.iterable(result) and eager: # listify the result return list(result) return result else: return plac.call(obj, arglist=arglist, eager=eager, version=version)
def call(obj, arglist=sys.argv[1:], eager=True, config=None, default_section=None, gnu=True): if gnu: plac.ArgumentParser.add_argument = add_gnu_argument if config is None: return plac.call(obj, arglist=arglist, eager=eager) argparser = plac.parser_from(obj) argnames = argparser.argspec.args defaults = argparser.argspec.defaults cp = config_parser_from(obj, config, default_section) cfg = dict(zip_longest(argnames, defaults)) ini_values = _read_config(cp, config, default_section) for k in obj.__annotations__.keys(): a = plac.Annotation.from_(obj.__annotations__[k]) if a.type and k in ini_values: if a.type is type(True): try: ini_values[k] = cp._convert_to_boolean(ini_values[k]) except ValueError: argparser.print_usage(sys.stderr) _print_exit( "{}: error: {}={} failed conversion to <type 'bool'> in:\n{}\n".format( argparser.prog, k, ini_values[k], config)) else: try: ini_values[k] = a.type(ini_values[k]) except ValueError: argparser.print_usage(sys.stderr) _print_exit( '{}: error: {}={} failed conversion to {} in:\n{}\n'.format( argparser.prog, k, ini_values[k], a.type, config)) cfg.update(ini_values) if sys.version >= '3': items = cfg.items() else: items = cfg.iteritems() argparser.set_defaults(**dict((k, v) for k, v in items)) cmd, result = argparser.consume(arglist) if plac.iterable(result) and eager: # listify the result return list(result) return result