76 lines
2.0 KiB
Python
76 lines
2.0 KiB
Python
# DRF Rack
|
|
# Библиотека классов расширений для Django REST Framework
|
|
#
|
|
# Автор: Николай В. Анохин <n.anokhin@xeaf.net>
|
|
# Все права защищены. Лицензия: MIT
|
|
|
|
"""
|
|
Описание класса RackCoverageVisitor
|
|
"""
|
|
|
|
import ast
|
|
import configparser
|
|
from pathlib import Path
|
|
|
|
from django.conf import settings
|
|
|
|
|
|
class RackCoverageVisitor(ast.NodeVisitor):
|
|
"""
|
|
Реализует методы для рекурсивного обхода дерева элементов
|
|
"""
|
|
|
|
def __init__(self, module_dot_path: str):
|
|
"""
|
|
Инициализация
|
|
"""
|
|
|
|
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
|
|
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, full_path))
|
|
|