mirror of
https://github.com/morpheus65535/bazarr.git
synced 2025-03-05 03:08:48 +08:00
no log: added test for all Bazarr imports (not libs)
This commit is contained in:
parent
8de8c2c0c1
commit
f3287561e5
1 changed files with 106 additions and 0 deletions
106
tests/bazarr/test_all_import.py
Normal file
106
tests/bazarr/test_all_import.py
Normal file
|
@ -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
|
Loading…
Reference in a new issue