Spaces:
Configuration error
Configuration error
import ast | |
import os | |
from typing import List | |
def get_function_names_from_file(file_path: str) -> List[str]: | |
""" | |
Extracts all static method names from litellm_logging.py | |
""" | |
with open(file_path, "r") as file: | |
tree = ast.parse(file.read()) | |
function_names = [] | |
for node in tree.body: | |
if isinstance(node, ast.ClassDef): | |
# Functions inside classes | |
for class_node in node.body: | |
if isinstance(class_node, (ast.FunctionDef, ast.AsyncFunctionDef)): | |
# Check if the function has @staticmethod decorator | |
for decorator in class_node.decorator_list: | |
if ( | |
isinstance(decorator, ast.Name) | |
and decorator.id == "staticmethod" | |
): | |
function_names.append(class_node.name) | |
return function_names | |
def get_all_functions_called_in_tests(base_dir: str) -> set: | |
""" | |
Returns a set of function names that are called in test functions | |
inside test files containing the word 'logging'. | |
""" | |
called_functions = set() | |
for root, _, files in os.walk(base_dir): | |
for file in files: | |
if file.endswith(".py") and "logging" in file.lower(): | |
file_path = os.path.join(root, file) | |
with open(file_path, "r") as f: | |
try: | |
tree = ast.parse(f.read()) | |
except SyntaxError: | |
print(f"Warning: Syntax error in file {file_path}") | |
continue | |
for node in ast.walk(tree): | |
if isinstance(node, ast.Call): | |
if isinstance(node.func, ast.Name): | |
called_functions.add(node.func.id) | |
elif isinstance(node.func, ast.Attribute): | |
called_functions.add(node.func.attr) | |
return called_functions | |
# Functions that can be ignored in test coverage | |
ignored_function_names = [ | |
"__init__", | |
# Add other functions to ignore here | |
] | |
def main(): | |
logging_file = "./litellm/litellm_core_utils/litellm_logging.py" | |
tests_dir = "./tests/" | |
# LOCAL TESTING | |
# logging_file = "../../litellm/litellm_core_utils/litellm_logging.py" | |
# tests_dir = "../../tests/" | |
logging_functions = get_function_names_from_file(logging_file) | |
print("logging_functions:", logging_functions) | |
called_functions_in_tests = get_all_functions_called_in_tests(tests_dir) | |
untested_functions = [ | |
fn | |
for fn in logging_functions | |
if fn not in called_functions_in_tests and fn not in ignored_function_names | |
] | |
if untested_functions: | |
untested_perc = len(untested_functions) / len(logging_functions) | |
print(f"untested_percentage: {untested_perc * 100:.2f}%") | |
raise Exception( | |
f"{untested_perc * 100:.2f}% of functions in litellm_logging.py are not tested: {untested_functions}" | |
) | |
else: | |
print("All functions in litellm_logging.py are covered by tests.") | |
if __name__ == "__main__": | |
main() | |