From f3287561e59e5c59c1c7aa7fe89e1caa373022a2 Mon Sep 17 00:00:00 2001 From: morpheus65535 Date: Wed, 8 Jun 2022 21:35:17 -0400 Subject: [PATCH] no log: added test for all Bazarr imports (not libs) --- tests/bazarr/test_all_import.py | 106 ++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 tests/bazarr/test_all_import.py diff --git a/tests/bazarr/test_all_import.py b/tests/bazarr/test_all_import.py new file mode 100644 index 000000000..1fd1feee5 --- /dev/null +++ b/tests/bazarr/test_all_import.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python3 + +import os +import ast + +from importlib.util import find_spec + +bazarr_directory = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "bazarr") +libs_directory = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), "libs") + + +def test_all_imports(): + for root, dirs, files in os.walk(bazarr_directory): + for file in files: + if file.endswith(".py"): + modules = parse_imports(file=os.path.join(root, file)) + check_for_import(imported_modules=modules, path=root, file=file) + + +def parse_imports(file): + with open(file, "r") as file: + node = ast.parse(file.read()) + parsed_imports = [n.names[0].name for n in node.body if isinstance(n, ast.Import)] + parsed_from_imports = [(n.module, [x.name for x in n.names], n.level) for n in node.body if isinstance(n, ast.ImportFrom)] + + return parsed_imports + parsed_from_imports + + +def get_valid_module_path(path, module, level): + module_file = os.path.sep.join(module.split(".")) + # if relative import + if level: + relative_path = path + deep = level - 1 + for number in range(deep): + relative_path = os.path.dirname(relative_path) + if os.path.isfile(os.path.join(relative_path, module_file + ".py")): + return os.path.join(relative_path, module_file + ".py") + else: + return os.path.join(relative_path, module_file, "__init__.py") + # elif bazarr dir + module.py isfile + elif os.path.isfile(os.path.join(bazarr_directory, module_file + ".py")): + return os.path.join(bazarr_directory, module_file + ".py") + # elif bazarr dir + module isdir + elif os.path.isdir(os.path.join(bazarr_directory, module_file)): + return os.path.join(bazarr_directory, module_file, "__init__.py") + # elif libs dir + module.py isfile + elif os.path.isfile(os.path.join(libs_directory, module_file + ".py")): + return os.path.join(libs_directory, module_file + ".py") + # elif libs dir + module isdir + elif os.path.isdir(os.path.join(libs_directory, module_file)): + return os.path.join(libs_directory, module_file, "__init__.py") + # else base module + else: + return None + + +def check_for_import(imported_modules, path, file): + print(os.path.join(path, file)) + for module in imported_modules: + if module[1] == ["*"]: + continue + + import_path = path + if type(module) == str: + module_name = module.strip() + functions_name = [] + level = None + else: + try: + module_name = module[0].strip() + except AttributeError: + continue + functions_name = [x.strip() for x in module[1]] + level = module[2] + + module_path = get_valid_module_path(import_path, module_name, level) + + if not module_path: + try: + find_spec(module_name) + print("\tSUCCESS " + module_name) + continue + except Exception: + print("\tFAILED " + module_name) + raise ImportError + else: + # this is where we look into the included functions + print("\t" + module_name + f" ({module_path})") + with open(module_path, "r") as file: + node = ast.parse(file.read()) + functions = [n.name for n in node.body if isinstance(n, ast.FunctionDef)] + classes = [n.name for n in node.body if isinstance(n, ast.ClassDef)] + assignments = [n.id for n in ast.walk(node) if isinstance(n, ast.Name)] + imports = [n.names[0].name for n in ast.walk(node) if isinstance(n, ast.Import)] + imports_from = [] + for n in ast.walk(node): + if isinstance(n, ast.ImportFrom): + imports_from += [x.name for x in n.names] + + for function in functions_name: + if [x for x in (functions, classes, assignments, imports, imports_from) if function in x]: + print("\t\tSUCCESS", function) + else: + print("\t\tFAILED", function) + raise ImportError