Source code for wield.declarative.argparse.annotations

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: © 2021 Massachusetts Institute of Technology.
# SPDX-FileCopyrightText: © 2021 Lee McCuller <mcculler@caltech.edu>
# NOTICE: authors should document their contributions in concisely in NOTICE
# with details inline in source files, comments, and docstrings.
"""
"""

# TODO, remove the reliance on bunch?
from wield.bunch import Bunch

from .. import NOARG
from .oo_argparse import TYPES


[docs] def store_true(*args, **kwargs): return argument(*args, action="store_true", metavar=NOARG, **kwargs)
[docs] def store_false(*args, **kwargs): return argument(*args, action="store_false", metavar=NOARG, **kwargs)
[docs] def argument( calls=None, func=None, name=None, metavar=None, default=NOARG, description=None, order=None, group=None, **kwargs ): def annotate_argument(func): if name is None: _name = func.__name__ else: _name = name if metavar is None: _metavar = (func.__name__,) else: _metavar = metavar if description is None: _description = func.__doc__ else: _description = description if not calls: _calls = ["--" + _name] else: _calls = calls if callable(default): _default = default() else: _default = default if _default is not NOARG: _description = _description.replace("{default}", str(_default)) def gen_argument(parser): kw = dict(kwargs) kw.update( # name = _name, default=_default, help=_description, dest=func.__name__, ) if _metavar is not NOARG: kw["metavar"] = _metavar g = parser.add_argument(*_calls, **kw) return g func._argparse = Bunch( type=TYPES['argument'], name=_name, name_inject=func.__name__, func=gen_argument, group=group, order=order, ) return func if func is None: return annotate_argument else: return annotate_argument(func)
# def arg_bool(func, ): # return
[docs] def group( func=None, name=None, description=None, # group = None, mutually_exclusive=False, order=None, **kwargs ): group = None def annotate_group(func): if not descriptor_check(func): raise RuntimeError("Must be a memoized descriptor") if name is None: _name = func.__name__ else: _name = name if mutually_exclusive: _name = _name + " [Mutually Exclusive]" if description is None: _description = func.__doc__ else: _description = description def gen_group(parser): g = parser.add_argument_group(_name, description=_description, **kwargs) if mutually_exclusive: g = g.add_mutually_exclusive_group() return g func._argparse = Bunch( type=TYPES['group'], name=_name, func=gen_group, group=group, order=order, ) return func if func is None: return annotate_group else: return annotate_group(func)
[docs] def command( func=None, name=None, description=None, order=None, takes_arguments=False, **kwargs ): def annotate_command(func): if name is None: _name = func.__name__ else: _name = name if description is None: _description = func.__doc__ else: _description = description func._argparse = Bunch( type=TYPES['command'], cmd_name=_name, description=_description, run_name=func.__name__, order=order, takes_arguments=takes_arguments, ) return func if func is None: return annotate_command else: return annotate_command(func)
[docs] def descriptor_check(obj): # TODO rubustify if not isinstance(obj, object): raise RuntimeError("Argparse decorator must be outermost decorator") return False return True