quality-checks/run_all.py (48 lines of code) (raw):
#!/usr/bin/env python3
"""Run all quality check scripts under the quality-checks/ folder."""
import os
import subprocess
import sys
from typing import List
# NOTE Ideally, we should be specifying the typing annotation for 'process' to
# `subprocess.Popne[bytes]`. However, this requires Python 3.9+ and Amazon Linux 2
# is still on 3.7/3.8.
# TODO Remove support of Amazon Linux 2 from this package as soon as possible, as we
# shouldn't be relying on an EOLed Python version.
def prefix_output(file: str, process: subprocess.Popen) -> None: # type: ignore
"""Prefix each line of output with the filename."""
if not process.stdout: # type: ignore
raise RuntimeError("Process doesn't have an stdout stream.")
for line in process.stdout: # type: ignore
print(f"[{file}] {line.decode().strip()}") # type: ignore
def verify_in_repo_root() -> None:
"""Verify the script is executed from the repository root, or exit with non-zero."""
# Determine the script's directory and the parent directory (which should
# be <repo root>)
script_dir = os.path.dirname(os.path.realpath(__file__))
repo_root = os.path.abspath(os.path.join(script_dir, ".."))
# Check if the current working directory is the repo root
if os.getcwd() != repo_root:
print(
"The script must be run from the repo root. Please cd into "
"the repo root directory and then type: "
f"./quality-checks/{os.path.basename(__file__)}."
)
sys.exit(1)
def main() -> None:
"""Start execution of the script."""
verify_in_repo_root()
quality_checks_dir = "./quality-checks/"
failed_scripts: List[str] = []
# Iterate over every file in the quality-checks directory
for file in os.listdir(quality_checks_dir):
filepath = os.path.join(quality_checks_dir, file)
# Exclude README.md and run_all.sh
if file in ["README.md", "run_all.py"]:
continue
# Check if the file is executable
if os.access(filepath, os.X_OK):
print(f"Executing: {file}")
with subprocess.Popen(
filepath, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT
) as process:
prefix_output(file, process)
process.wait() # Wait for the process to complete
# Check the exit status of the script
if process.returncode != 0:
print(
f"Script {file} failed with exit status "
f"{process.returncode}."
)
failed_scripts.append(file)
print()
# Exit with a non-zero status if any script failed
if failed_scripts:
print("The following scripts failed:")
for fs in failed_scripts:
print(f"- {fs}")
sys.exit(1)
if __name__ == "__main__":
main()