Source code for stack.decorators
# coding utf8
from functools import reduce
from operator import add
from stack.args import subparsers as parser
[docs]def command_argument_paraser(fn, parser):
def doc_parser(doc):
if not doc:
return ''
else:
kvs = doc.strip().split(', ')
if kvs[0].startswith('@'):
return (kvs[0][1:], kvs[1:])
else:
return doc
def add_params(parser, params):
help_doc = params[1][-1]
meta_var = params[1][-2]
parser.add_argument(params[0], *params[1][:2], help=help_doc, metavar=meta_var, type=str)
return parser
docs = map(doc_parser, filter(bool, fn.__doc__.split('\n')))
name = fn.__name__
params = filter(lambda x: isinstance(x, tuple), docs)
helps = filter(lambda x: isinstance(x, str), docs)
command = parser.add_parser(name, help=reduce(add, helps))
reduce(add_params, params, command)
[docs]def command(fn):
command_argument_paraser(fn, parser)
return lambda *args, **kwargs: fn(*args, **kwargs)