|
|
|
|
|
|
|
|
|
|
|
|
|
import ast |
|
from pathlib import Path |
|
from typing import List |
|
|
|
|
|
""" |
|
This module outputs a list of tests for completion. |
|
It has no dependencies. |
|
""" |
|
|
|
|
|
def get_test_files() -> List[Path]: |
|
root = Path(__file__).parent.parent |
|
dirs = ["tests", "projects/implicitron_trainer"] |
|
return [i for dir in dirs for i in (root / dir).glob("**/test*.py")] |
|
|
|
|
|
def tests_from_file(path: Path, base: str) -> List[str]: |
|
""" |
|
Returns all the tests in the given file, in format |
|
expected as arguments when running the tests. |
|
e.g. |
|
file_stem |
|
file_stem.TestFunctionality |
|
file_stem.TestFunctionality.test_f |
|
file_stem.TestFunctionality.test_g |
|
""" |
|
with open(path) as f: |
|
node = ast.parse(f.read()) |
|
out = [base] |
|
for cls in node.body: |
|
if not isinstance(cls, ast.ClassDef): |
|
continue |
|
if not cls.name.startswith("Test"): |
|
continue |
|
class_base = base + "." + cls.name |
|
out.append(class_base) |
|
for method in cls.body: |
|
if not isinstance(method, ast.FunctionDef): |
|
continue |
|
if not method.name.startswith("test"): |
|
continue |
|
out.append(class_base + "." + method.name) |
|
return out |
|
|
|
|
|
def main() -> None: |
|
files = get_test_files() |
|
test_root = Path(__file__).parent.parent |
|
all_tests = [] |
|
for f in files: |
|
file_base = str(f.relative_to(test_root))[:-3].replace("/", ".") |
|
all_tests.extend(tests_from_file(f, file_base)) |
|
for test in sorted(all_tests): |
|
print(test) |
|
|
|
|
|
if __name__ == "__main__": |
|
main() |
|
|