コード例 #1
0
    def _fetch_children(self, fetch_obj_type='function'):
        """
        Return a list of children of this Object
        """
        root = self.ast_node

        if not hasattr(root, 'body'):
            return []

        obj_list = []
        children = root.body

        i = 0
        while i < len(children):
            child = children[i]
            if node_type(child) == fetch_obj_type:
                if i+1 < len(children):
                    line_index_end = children[i+1].lineno-2
                else:
                    line_index_end = self.line_index_end

                if fetch_obj_type == 'function' or fetch_obj_type == 'class' or fetch_obj_type == 'file':
                    obj_list.append(BaseLinesObj(
                        ast_node=child,
                        file_lines=self.file_lines,
                        line_index_end=line_index_end,
                        def_name=child.name,
                        parent_obj=self,
                        parent_file=self.parent_file)
                    )
                else:
                    obj_list.append(BaseObj(
                        child,
                        line_index_end=line_index_end,
                        parent_obj=self,
                        parent_file=self.parent_file)
                    )
            i += 1

        return obj_list
コード例 #2
0
    def __init__(self, def_name=None, ast_node=None, parent_obj=None,
                    parent_file=None, file_lines=None, line_number=0, indent=0,
                    file_path=None, line_index_end=0, get_children=True):
        """
        init method for the BaseLinesObj
        """
        if file_lines:
            self.file_lines = file_lines
            self.file_str = ''.join(self.file_lines)
        else:
            self.file_lines = file_to_list(file_path)
            self.file_str = ''.join(self.file_lines)

        if line_index_end == 0:
            self.line_index_end = len(self.file_lines)-1
        else:
            self.line_index_end = line_index_end

        # Set ast_node
        if ast_node:
            self.ast_node = ast_node
        else:
            try:
                self.ast_node, self.line_index_end = fetch_ast_node(file_lines=self.file_str,
                                                                    name=def_name,
                                                                    max_index=self.line_index_end)
            #TODO: There are errors when you try to compile non-python objects.
            #       Need to catch them and do something proper with them
            except SyntaxError as e:
                self.ast_node = None
            except TypeError as e:
                self.ast_node = None

        if not self.ast_node:
            return

        self.obj_type = node_type(self.ast_node)

        # Put this conditional stuff into the file object
        if node_type(self.ast_node) == 'file':
            #self.name = self.file_name
            self.indent = -1
            self.line_index_start = 0
            self.line_index_def_class = 0
            self.decorators = []
            self.parent_file = self
            self.parent_obj = parent_obj
        else:
            self.name = self.ast_node.name
            self.indent = self.ast_node.col_offset
            self.line_index_start = self.ast_node.lineno - 1
            self.line_index_def_class = get_line_index_def_class(self.file_lines,
                                                        self.line_index_start,
                                                        self.line_index_end)
            self.decorators = []

            self.decorators = self.fetch_child_decorators()
            if parent_obj:
                self.parent_file = parent_file
                self.parent_obj = parent_obj
            else:
                from parsefilelib.models.file_obj import FileObj
                self.parent_obj = FileObj(file_path, child=self)
                self.parent_file = self.parent_obj

        self.comments = []

        self.lines = self.file_lines[self.line_index_start:self.line_index_end+1]
        self.line_str = ''.join(self.lines)

        if get_children:
            self.classes = self.fetch_child_classes()
            self.functions = self.fetch_child_functions()

        self.docstring = ast.get_docstring(self.ast_node)
        self.imports = self.fetch_child_imports()
        self.returns = self.fetch_child_returns()
        self.variables = self.fetch_child_variables()