| #!/usr/bin/env python3 |
| """ |
| Touch files that must pass Sphinx nit-picky mode |
| so they are rebuilt and we can catch regressions. |
| """ |
| import argparse |
| import csv |
| import sys |
| from pathlib import Path |
| |
| wrong_directory_msg = "Must run this script from the repo root" |
| assert Path("Doc").exists() and Path("Doc").is_dir(), wrong_directory_msg |
| |
| # Exclude these whether they're dirty or clean, |
| # because they trigger a rebuild of dirty files. |
| EXCLUDE_FILES = { |
| Path("Doc/whatsnew/changelog.rst"), |
| } |
| |
| # Subdirectories of Doc/ to exclude. |
| EXCLUDE_SUBDIRS = { |
| ".env", |
| ".venv", |
| "env", |
| "includes", |
| "venv", |
| } |
| |
| ALL_RST = { |
| rst for rst in Path("Doc/").rglob("*.rst") if rst.parts[1] not in EXCLUDE_SUBDIRS |
| } |
| |
| |
| parser = argparse.ArgumentParser( |
| description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter |
| ) |
| parser.add_argument("-c", "--clean", help="Comma-separated list of clean files") |
| args = parser.parse_args() |
| |
| if args.clean: |
| clean_files = next(csv.reader([args.clean])) |
| CLEAN = { |
| Path(filename.strip()) |
| for filename in clean_files |
| if Path(filename.strip()).is_file() |
| } |
| elif args.clean is not None: |
| print( |
| "Not touching any files: an empty string `--clean` arg value passed.", |
| ) |
| sys.exit(0) |
| else: |
| with Path("Doc/tools/.nitignore").open() as ignored_files: |
| IGNORED = { |
| Path(filename.strip()) |
| for filename in ignored_files |
| if filename.strip() and not filename.startswith("#") |
| } |
| CLEAN = ALL_RST - IGNORED - EXCLUDE_FILES |
| |
| print("Touching:") |
| for filename in sorted(CLEAN): |
| print(filename) |
| filename.touch() |
| print(f"Touched {len(CLEAN)} files") |