コード例 #1
0
ファイル: decorators.py プロジェクト: waipeng/hivemind
    def _configurable(func):
        # If there is a . assume that the name is fully qualified.
        if '.' in name:
            conf_name = conf_section(*name.split('.', 1))
        else:
            conf_name = conf_section(func.__module__, name)
        conf = func_config(conf_name)
        args_list = util.func_args(func)

        @wraps(func)
        def wrapper(*args, **kwargs):
            filtered_defaults = dict((a, conf.get(a))
                                     for a in args_list.args if a in conf)
            arguments = dict(zip(reversed(args_list.args),
                                 reversed(args_list.defaults or [])))
            arguments.update(dict(zip(args_list.args, args)))
            arguments.update(kwargs)
            arguments.update(filtered_defaults)
            missing_args = [arg for arg in args_list.args
                            if arg not in arguments]
            if missing_args:
                raise Exception(
                    'Configuration section %s is missing values for %s' %
                    (conf_name, missing_args))

            return func(**arguments)
        return wrapper
コード例 #2
0
    def _configurable(func):
        # If there is a . assume that the name is fully qualified.
        if '.' in name:
            conf_name = conf_section(*name.split('.', 1))
        else:
            conf_name = conf_section(func.__module__, name)
        conf = func_config(conf_name)
        args_list = util.func_args(func)

        @wraps(func)
        def wrapper(*args, **kwargs):
            filtered_defaults = dict(
                (a, conf.get(a)) for a in args_list.args if a in conf)
            arguments = dict(
                zip(reversed(args_list.args), reversed(args_list.defaults
                                                       or [])))
            arguments.update(dict(zip(args_list.args, args)))
            arguments.update(kwargs)
            arguments.update(filtered_defaults)
            missing_args = [
                arg for arg in args_list.args if arg not in arguments
            ]
            if missing_args:
                raise Exception(
                    'Configuration section %s is missing values for %s' %
                    (conf_name, missing_args))

            return func(**arguments)

        return wrapper
コード例 #3
0
def list_arguments(cmd):
    namespace, command = cmd.split('.')
    command = fabric.state.commands[namespace][command]
    argspec = util.func_args(command)
    return argspec.args
コード例 #4
0
def register_subcommand(subparsers, name, function):
    """Register a new subcommand.  Return the subcommand parser."""
    conf = command_config(name)
    doc, fields_doc = parse_docstring(function.__doc__ or "")
    doc.seek(0)
    doc = conf.get('@doc', doc.read())
    subcommand = subparsers.add_parser(name,
                                       help=doc,
                                       description=doc)
    args = util.func_args(function)

    # Add the arguments and the function for extraction later.
    subcommand.set_defaults(hivemind_func=function)

    class Nothing:
        pass

    # Pad out the default list with None
    defaults = ((
        Nothing(),) * (len(args.args) - len(args.defaults or tuple())) +
                (args.defaults or tuple()))

    used_short_args = set(['-h'])

    def args_to_options(arg, negative=False):
        options = argname_to_option_flags(arg)

        # Strip duplicate short arguments
        if options[-1] in used_short_args:
            options = options[:-1]
        # No short argument for negative arguments
        elif negative:
            options = options[:-1]
        else:
            used_short_args.add(options[-1])
        return options

    # A list of (argparse_arg, func_arg) mappings
    arg_mapping = []

    # Add all the inspected arguments as flags.
    for arg, default in zip(args.args, defaults):
        kwargs = {}
        if conf.get(arg):
            kwargs['default'] = conf.get(arg)
        elif not isinstance(default, Nothing):
            kwargs['default'] = default

        datatype, field_doc = fields_doc.get(arg, (None, ''))

        if default is True:
            del kwargs['default']
            narg = 'no_' + arg
            arg_mapping.append((narg, arg))
            subcommand.add_argument(
                *args_to_options(narg, negative=True),
                help=field_doc,
                action='store_false', **kwargs)
        elif default is False:
            arg_mapping.append((arg, arg))
            subcommand.add_argument(
                *args_to_options(arg),
                help=field_doc + " (default: %(default)s)",
                action='store_true', **kwargs)
        elif isinstance(default, list):
            arg_mapping.append((arg, arg))
            # If choices then use the first value from the list as the
            # default.
            if datatype == 'choices':
                kwargs['choices'] = kwargs['default']
                kwargs['default'] = kwargs['default'][0]
                action = 'store'
            else:
                action = 'append'
                # When loading default value, if it's as string
                # convert it to a list.
                if isinstance(kwargs['default'], (str, unicode)):
                    kwargs['default'] = kwargs['default'].split(',')

            subcommand.add_argument(
                *args_to_options(arg), action=action,
                help=field_doc + " (default: %(default)s)",
                **kwargs)
        else:
            arg_mapping.append((arg, arg))
            if 'default' in kwargs:
                subcommand.add_argument(
                    *args_to_options(arg), action='store',
                    help=field_doc + " (default: %(default)s)",
                    **kwargs)
            else:
                subcommand.add_argument(
                    arg, action='store',
                    help=field_doc,
                    **kwargs)

    subcommand.set_defaults(hivemind_arg_mapping=arg_mapping)

    return subcommand