Example #1
0
    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
Example #2
0
    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)
Example #3
0
    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)
Example #4
0
    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
Example #5
0
 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.')
Example #6
0
 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.')
Example #7
0
 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.')
Example #8
0
 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')
Example #9
0
 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.')
Example #10
0
 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')