| |
| |
| |
| |
| |
|
|
| 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() |
|
|