| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- # Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
- # For details: https://github.com/pylint-dev/pylint/blob/main/LICENSE
- # Copyright (c) https://github.com/pylint-dev/pylint/blob/main/CONTRIBUTORS.txt
- from __future__ import annotations
- import os
- from pathlib import Path
- from pylint.testutils.functional.test_file import FunctionalTestFile
- REASONABLY_DISPLAYABLE_VERTICALLY = 48
- """'Wet finger' number of files that are reasonable to display by an IDE."""
- SHOULD_BE_IN_THE_SAME_DIRECTORY = 5
- """'Wet finger' as in 'in my settings there are precisely this many'."""
- IGNORED_PARENT_DIRS = {
- "deprecated_relative_import",
- "ext",
- "regression",
- "regression_02",
- }
- """Direct parent directories that should be ignored."""
- IGNORED_PARENT_PARENT_DIRS = {
- "docparams",
- "deprecated_relative_import",
- "ext",
- }
- """Parents of direct parent directories that should be ignored."""
- def get_functional_test_files_from_directory(
- input_dir: Path | str,
- ) -> list[FunctionalTestFile]:
- """Get all functional tests in the input_dir."""
- suite = []
- _check_functional_tests_structure(Path(input_dir))
- for dirpath, dirnames, filenames in os.walk(input_dir):
- if dirpath.endswith("__pycache__"):
- continue
- dirnames.sort()
- filenames.sort()
- for filename in filenames:
- if filename != "__init__.py" and filename.endswith(".py"):
- suite.append(FunctionalTestFile(dirpath, filename))
- return suite
- def _check_functional_tests_structure(directory: Path) -> None:
- """Check if test directories follow correct file/folder structure."""
- # Ignore underscored directories
- if Path(directory).stem.startswith("_"):
- return
- files: set[Path] = set()
- dirs: set[Path] = set()
- # Collect all sub-directories and files in directory
- for file_or_dir in directory.iterdir():
- if file_or_dir.is_file():
- if file_or_dir.suffix == ".py" and not file_or_dir.stem.startswith("_"):
- files.add(file_or_dir)
- elif file_or_dir.is_dir():
- dirs.add(file_or_dir)
- _check_functional_tests_structure(file_or_dir)
- assert len(files) <= REASONABLY_DISPLAYABLE_VERTICALLY, (
- f"{directory} contains too many functional tests files "
- + f"({len(files)} > {REASONABLY_DISPLAYABLE_VERTICALLY})."
- )
- for file in files:
- possible_dir = file.parent / file.stem.split("_")[0]
- assert not possible_dir.exists(), f"{file} should go in {possible_dir}."
- # Exclude some directories as they follow a different structure
- if (
- not len(file.parent.stem) == 1 # First letter sub-directories
- and file.parent.stem not in IGNORED_PARENT_DIRS
- and file.parent.parent.stem not in IGNORED_PARENT_PARENT_DIRS
- ):
- assert file.stem.startswith(
- file.parent.stem
- ), f"{file} should not go in {file.parent}"
|