def testFunc(self): found_params = find_param_docs(self.doc) self.assertTrue(self.params.keys() == found_params.keys()) for key, value in self.params.items(): self.assertTrue(key in found_params) found_value = found_params[key] self.assertTrue(value[0] == found_value[0]) for kwarg, val in value[1].items(): self.assertTrue(val == found_value[1][kwarg])
def test_find_param(doc, params): found_params = find_param_docs(doc) assert params.keys() == found_params.keys() for key, value in params.items(): assert key in found_params found_value = found_params[key] assert value[0] == found_value[0] for kwarg, val in value[1].items(): assert val == found_value[1][kwarg]
def _generate_command(self, func, name=None, doctype='rest', *args, **kwargs): '''Generate argparse's subparser. :param func: The function to analyze. :param name: If given, a different name for the command. The default one is ``func.__name__``.''' func_name = func.__name__ name = func_name if name is None else name argspec = getfullargspec(func) self._argspecs[func_name] = argspec argz = izip_longest(reversed(argspec.args), reversed(argspec.defaults or []), fillvalue=_POSITIONAL()) argz = reversed(list(argz)) doc = (inspect.getdoc(func) or '').strip() + '\n' if doctype == 'numpy': config = Config(napoleon_google_docstring=False, napoleon_use_rtype=False) doc = str(NumpyDocstring(doc, config)) elif doctype == 'google': config = Config(napoleon_numpy_docstring=False, napoleon_use_rtype=False) doc = str(GoogleDocstring(doc, config)) elif doctype == 'rest': pass else: raise ValueError('doctype must be one of "numpy", "google", ' 'or "rest"') cmd_help, cmd_desc = split_doc(purify_doc(doc)) subparser = self._subparsers.add_parser(name, help=cmd_help or None, description=cmd_desc or None, **kwargs) params = find_param_docs(doc) for a, kw in self._analyze_func(func, params, argz, argspec.varargs): completer = kw.pop('completer', None) arg = subparser.add_argument(*a, **purify_kwargs(kw)) if completer is not None: arg.completer = completer subparser.set_defaults(**{_DISPATCH_TO: func}) return func
def analyze_func(self, func, doc, argz, varargs_name): '''Analyze the given function, merging default arguments, overridden arguments (with @arg) and parameters extracted from the docstring. :param func: The function to analyze. :param doc: The function's docstring. :param argz: A list of the form (arg, default), containing arguments and their default value. :param varargs_name: The name of the variable arguments, if present, otherwise ``None``.''' params = find_param_docs(doc) for arg, default in argz: override = getattr(func, '_argopts', {}).get(arg, ((), {})) yield merge(arg, default, override, *params.get(arg, ([], {}))) if varargs_name is not None: kwargs = {'nargs': '*'} kwargs.update(params.get(varargs_name, (None, {}))[1]) yield ([varargs_name], kwargs)
def analyze_func(self, func, doc, argz, varargs_name): """Analyze the given function, merging default arguments, overridden arguments (with @arg) and parameters extracted from the docstring. :param func: The function to analyze. :param doc: The function's docstring. :param argz: A list of the form (arg, default), containing arguments and their default value. :param varargs_name: The name of the variable arguments, if present, otherwise ``None``.""" params = find_param_docs(doc) for arg, default in argz: override = getattr(func, "_argopts", {}).get(arg, ((), {})) yield merge(arg, default, override, *params.get(arg, ([], {}))) if varargs_name is not None: kwargs = {"nargs": "*"} kwargs.update(params.get(varargs_name, (None, {}))[1]) yield ([varargs_name], kwargs)
def _generate_command(self, func, name=None, doctype='rest', *args, **kwargs): '''Generate argparse's subparser. :param func: The function to analyze. :param name: If given, a different name for the command. The default one is ``func.__name__``.''' func_name = func.__name__ name = func_name if name is None else name argspec = inspect.getargspec(func) self._argspecs[func_name] = argspec argz = izip_longest(reversed(argspec.args), reversed(argspec.defaults or []), fillvalue=_POSITIONAL()) argz = reversed(list(argz)) doc = (inspect.getdoc(func) or '').strip() + '\n' if doctype == 'numpy': config = Config(napoleon_google_docstring=False, napoleon_use_rtype=False) doc = str(NumpyDocstring(doc, config)) elif doctype == 'google': config = Config(napoleon_numpy_docstring=False, napoleon_use_rtype=False) doc = str(GoogleDocstring(doc, config)) elif doctype == 'rest': pass else: raise ValueError('doctype must be one of "numpy", "google", ' 'or "rest"') cmd_help, cmd_desc = split_doc(purify_doc(doc)) subparser = self._subparsers.add_parser(name, help=cmd_help or None, description=cmd_desc or None, **kwargs) params = find_param_docs(doc) for a, kw in self._analyze_func(func, params, argz, argspec.varargs): completer = kw.pop('completer', None) arg = subparser.add_argument(*a, **purify_kwargs(kw)) if completer is not None: arg.completer = completer subparser.set_defaults(**{_DISPATCH_TO: func}) return func
def _generate_command(self, func, name=None, doctype='rest', *args, **kwargs): '''Generate argparse's subparser. :param func: The function to analyze. :param name: If given, a different name for the command. The default one is ``func.__name__``.''' name = name or func.__name__ doc = (inspect.getdoc(func) or '').strip() + '\n' if doctype == 'numpy': config = Config(napoleon_google_docstring=False, napoleon_use_rtype=False) doc = str(NumpyDocstring(doc, config)) elif doctype == 'google': config = Config(napoleon_numpy_docstring=False, napoleon_use_rtype=False) doc = str(GoogleDocstring(doc, config)) elif doctype == 'rest': pass else: raise ValueError('doctype must be one of "numpy", "google", ' 'or "rest"') cmd_help, cmd_desc = split_doc(purify_doc(doc)) subparser = self._subparsers.add_parser(name, help=cmd_help or None, description=cmd_desc or None, **kwargs) doc_params = find_param_docs(doc) self._signatures[func.__name__] = signature(func) for a, kw in self._analyze_func(func, doc_params): completer = kw.pop('completer', None) arg = subparser.add_argument(*a, **purify_kwargs(kw)) if completer is not None: arg.completer = completer subparser.set_defaults(**{_DISPATCH_TO: func}) return func