Files
ansible-docs/tests/checkers.py
patchback[bot] dfdcd20af5 Skip auto-generated porting guides for rstcheck. (#2376) (#2379)
(cherry picked from commit 2ca9afc29e)

Co-authored-by: Felix Fontein <felix@fontein.de>
2025-01-28 20:20:02 +01:00

83 lines
1.9 KiB
Python
Executable File

#!/usr/bin/env python
"""Simple test runner."""
from __future__ import annotations
import argparse
import json
import os
import pathlib
import re
import subprocess
import sys
ROOT = pathlib.Path(__file__).resolve().parent.parent
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument('test', nargs='+')
args = parser.parse_args()
tests: list[str] = args.test
failed = False
for test in tests:
if run_test(test):
failed = True
if failed:
sys.exit(1)
def run_test(name: str) -> bool:
print(f'Running {name!r} checker ...', file=sys.stderr, flush=True)
checker_path = ROOT / 'tests' / 'checkers' / f'{name}.py'
checker_json = checker_path.with_suffix('.json')
try:
config = json.loads(checker_json.read_text())
except FileNotFoundError:
config = {}
paths = []
extensions = set(config.get('extensions', []))
ignore_regexs = [
re.compile(regex)
for regex in config.get('ignore_regexs', [])
]
for root, dir_names, file_names in os.walk(ROOT / 'docs'):
for file_name in file_names:
path = os.path.join(root, file_name)
ext = os.path.splitext(path)[1]
rel_path = os.path.relpath(path, ROOT)
if any(regex.match(rel_path) for regex in ignore_regexs):
continue
if ext not in extensions:
continue
paths.append(path)
cmd = [sys.executable, checker_path] + paths
try:
result = subprocess.run(cmd, check=True, capture_output=True, text=True)
except subprocess.CalledProcessError as ex:
print(ex, file=sys.stderr, flush=True)
result = ex
sys.stdout.write(result.stdout)
sys.stderr.write(result.stderr)
return bool(result.stdout or result.stderr)
if __name__ == '__main__':
main()