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
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
def list_arguments(cmd): namespace, command = cmd.split('.') command = fabric.state.commands[namespace][command] argspec = util.func_args(command) return argspec.args
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