# DRF Rack # Библиотека классов расширений для Django REST Framework # # Автор: Николай В. Анохин # Все права защищены. Лицензия: MIT """ Описание класса CoverageStructureVisitor """ import ast class CoverageStructureVisitor(ast.NodeVisitor): """ Обходчик синтаксического дерева кода проекта """ def __init__(self, module_dot_path: str): """ Инициализация :param module_dot_path: Путь к модулю """ super().__init__() self.module_dot_path = module_dot_path self.class_stack = [] self.results = [] def visit_ClassDef(self, class_node) -> None: """ Обход класса :param class_node: Узел класса """ self.class_stack.append(class_node.name) self.generic_visit(class_node) self.class_stack.pop() def visit_FunctionDef(self, func_node) -> None: """ Обход функции :param func_node: Узел функции """ self._handle_function(func_node) def visit_AsyncFunctionDef(self, async_func_node) -> None: """ Обход асинхронной функции :param async_func_node: Узел асинхронной функции """ self._handle_function(async_func_node) def _handle_function(self, func_node) -> None: """ Общий класс обработки функции :param func_node: Узел функции """ func_name = func_node.name class_name = self.class_stack[-1] if self.class_stack else None if self.class_stack: class_chain = ".".join(self.class_stack) full_path = f"{self.module_dot_path}.{class_chain}.{func_name}" else: full_path = f"{self.module_dot_path}.{func_name}" self.results.append((func_name, class_name, full_path))