def construct_arguments(self, cls, positional_args={}): ''' Adds arguments to subparsers, returns populated dict of methods and their details. :param cls: the class to parse for methods to use :type cls: type :param positional_args: a dict of argument names per method name which should be used as positional argument. :type positional_args: dict :rtype: dict :return: a dict with metadata used for creating the cli arguments with argparse ''' arg_result = {} for method in inspect.getmembers(cls, is_api_method): name = method[1].__name__ docstring = parser.get_method_docstring(cls, name) result = parser.parse_docstring(docstring, cls) result['class'] = cls pretty_name = name[len(API_MARKER) + 1:] # adding argument to subparsers positional_arg = positional_args.get(pretty_name, None) result['positional_arg'] = positional_arg arg = self.create_arg_object(cls, pretty_name, result['arguments'], result['return'], result['description'], positional_arg) arg_result[pretty_name] = result return arg_result
def test_get_docsring(self): class A(object): def foo(self): """docstring""" def bar(self): pass class B(A): def foo(self): pass def bar(self): pass self.assertEqual(parser.get_method_docstring(B, 'foo'), 'docstring') self.assertEqual(parser.get_method_docstring(B, 'bar'), None)
def __init__(self, driver_obj, method_name): if inspect.isclass(driver_obj): self.driver_cls = driver_obj else: self.driver_cls = driver_obj.__class__ self.driver_obj = driver_obj self.method_name = method_name self.method = getattr(self.driver_obj, method_name, None) if not inspect.ismethod(self.method): raise NoSuchOperationError() method_doc = get_method_docstring(self.driver_cls, method_name) if not method_doc: raise MethodParsingException('Empty docstring') argspec_arg = parse_args(self.method) docstring_parse_result = parse_docstring(method_doc, self.driver_cls) self.description = docstring_parse_result['description'] docstring_args = docstring_parse_result['arguments'] #check vargs self.vargs_entries = [] self.req_vargs_entries = [] for name, arg_info in docstring_args.items(): docstring_arg_tmp = docstring_args[name] #print docstring_arg_tmp entry_kwargs = { 'name': name, 'description': docstring_arg_tmp['description'], 'type_name': docstring_arg_tmp['type_name'], 'required': (docstring_arg_tmp['required'] or arg_info['required']), } if not entry_kwargs['required']: self.vargs_entries.append(entry_kwargs) else: self.req_vargs_entries.append(entry_kwargs) #update kwargs kwargs = set(docstring_args).difference(argspec_arg) self.kwargs_entries = [] for entry in kwargs: kwargs_entry = { 'name':entry, 'description':docstring_args[entry]['description'], 'type_name':docstring_args[entry]['type_name'], 'required':docstring_args[entry]['required'] } self.kwargs_entries.append(kwargs_entry) method_return = docstring_parse_result['return'] self.result_entry = method_return
def test_foo_create_node(self): docstring = parser.get_method_docstring(self.Foo, 'create_node') result = parser.parse_docstring(docstring, self.Foo) description = result['description'] args = result['arguments'] return_type = result['return']['type_name'] return_description = result['return']['description'] self.assertTrue(description.startswith('Create a new node ')) self.assertEqual(len(args), 2) self.assertEqual('``str``', args['name']['type_name']) self.assertEqual('``dict``', args['size']['type_name']) self.assertEqual(return_type, 'class:`Node`') self.assertEqual(return_description, 'The newly created node.')
def test_bar_deploy_node(self): docstring = parser.get_method_docstring(self.Bar, 'deploy_node') result = parser.parse_docstring(docstring, self.Bar) description = result['description'] args = result['arguments'] return_type = result['return']['type_name'] return_description = result['return']['description'] self.assertTrue(description.startswith('Deploy bar node')) self.assertEqual(len(args), 3) self.assertEqual('class:`NodeAuthSSHKey`', args['deploy']['type_name']) self.assertEqual('``str``', args['name']['type_name']) self.assertEqual('``dict``', args['size']['type_name']) self.assertEqual(return_type, 'class:`Node`') self.assertEqual(return_description, 'The newly created node.')
def test_bar_create_node(self): docstring = parser.get_method_docstring(self.Bar, 'create_node') result = parser.parse_docstring(docstring, self.Bar) description = result['description'] args = result['arguments'] return_type = result['return']['type_name'] return_description = result['return']['description'] self.assertTrue(description.startswith('Create a new bar node')) self.assertEqual(len(args), 3) self.assertEqual('``str``', args['name']['type_name']) self.assertEqual('``dict``', args['size']['type_name']) self.assertEqual('``str``', args['ex_fqdn']['type_name']) self.assertEqual(return_type, 'class:`Node`') self.assertEqual(return_description, 'New bar node')